Skip to content

Commit

Permalink
Propagate headers from config to Metadata API for regions fetch
Browse files Browse the repository at this point in the history
  • Loading branch information
randomir committed Oct 18, 2021
1 parent 4e868f7 commit 6019484
Showing 1 changed file with 23 additions and 22 deletions.
45 changes: 23 additions & 22 deletions dwave/cloud/client/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,26 @@ def __init__(self, endpoint=None, token=None, solver=None, **kwargs):
# configure MetadataAPI access -- needed by Client.get_regions()
self.metadata_api_endpoint = options['metadata_api_endpoint']

# parse headers as they might be needed by Client.get_regions()
headers = options['headers']
if not headers:
headers_dict = {}
elif isinstance(headers, abc.Mapping):
headers_dict = headers
elif isinstance(headers, str):
try:
# valid headers = "Field-1: value-1\nField-2: value-2"
headers_dict = {key.strip(): val.strip()
for key, val in [line.split(':')
for line in headers.strip().split('\n')]}
except Exception as e:
logger.debug("Invalid headers: %r", headers)
headers_dict = {}
else:
raise ValueError("HTTP headers expected in a dict, or a string")
logger.debug("Parsed headers=%r", headers_dict)
self.headers = headers_dict

# resolve endpoint using region
region, endpoint = self._resolve_region_endpoint(
region=options.get('region'), endpoint=options.get('endpoint'))
Expand Down Expand Up @@ -464,25 +484,6 @@ def __init__(self, endpoint=None, token=None, solver=None, **kwargs):
raise ValueError("Expecting a features dictionary or a string name for 'solver'")
logger.debug("Parsed solver=%r", solver_def)

# parse headers
headers = options['headers']
if not headers:
headers_dict = {}
elif isinstance(headers, abc.Mapping):
headers_dict = headers
elif isinstance(headers, str):
try:
# valid headers = "Field-1: value-1\nField-2: value-2"
headers_dict = {key.strip(): val.strip()
for key, val in [line.split(':')
for line in headers.strip().split('\n')]}
except Exception as e:
logger.debug("Invalid headers: %r", headers)
headers_dict = {}
else:
raise ValueError("HTTP headers expected in a dict, or a string")
logger.debug("Parsed headers=%r", headers_dict)

# Store connection/session parameters
# TODO: consolidate all options under Client.options or similar
self.region = region # for record only
Expand All @@ -495,7 +496,6 @@ def __init__(self, endpoint=None, token=None, solver=None, **kwargs):
self.polling_timeout = parse_float(options['polling_timeout'])

self.proxy = options['proxy']
self.headers = headers_dict
self.permissive_ssl = parse_boolean(options['permissive_ssl'])
self.connection_close = parse_boolean(options['connection_close'])

Expand Down Expand Up @@ -734,11 +734,11 @@ def is_solver_handled(solver):

@staticmethod
@cached.ondisk(maxage=_REGIONS_CACHE_MAXAGE)
def _fetch_available_regions(metadata_api_endpoint):
def _fetch_available_regions(metadata_api_endpoint, **config):
logger.info("Fetching available regions from the Metadata API at %r",
metadata_api_endpoint)

with api.Regions(endpoint=metadata_api_endpoint) as regions:
with api.Regions(endpoint=metadata_api_endpoint, **config) as regions:
data = regions.list_regions()

logger.trace("Received region metadata: %r", data)
Expand All @@ -758,6 +758,7 @@ def get_regions(self, refresh: bool = False) -> Dict[str, Dict[str, str]]:
try:
rs = Client._fetch_available_regions(
metadata_api_endpoint=self.metadata_api_endpoint,
headers=self.headers,
refresh_=refresh)
except api.exceptions.RequestError as exc:
logger.exception("Metadata API unavailable")
Expand Down

0 comments on commit 6019484

Please sign in to comment.