From 00106633e39465106a69e22ca6e3967be6016fd1 Mon Sep 17 00:00:00 2001 From: Pauline Ribeyre <4224001+paulineribeyre@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:52:00 -0500 Subject: [PATCH 1/7] Clarify 502 errors --- gen3/tools/download/drs_download.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/gen3/tools/download/drs_download.py b/gen3/tools/download/drs_download.py index 11989392..1f29a735 100644 --- a/gen3/tools/download/drs_download.py +++ b/gen3/tools/download/drs_download.py @@ -306,27 +306,28 @@ def wts_external_oidc(hostname: str) -> Dict[str, Any]: oidc = {} if not hostname: return oidc + url = f"https://{hostname}/wts/external_oidc/" + err_msg = "Likely no WTS service running on this Commons. Proceeding, but certain commands might fail." try: - response = requests.get(f"https://{hostname}/wts/external_oidc/") + response = requests.get(url) response.raise_for_status() + except requests.exceptions.HTTPError as exc: + resp_msg = json_loads(exc.response.text) + if "message" in resp_msg: + resp_msg = resp_msg["message"] + logger.warning( + f"HTTP Error ({exc.response.status_code}) from '{url}': {resp_msg}. {err_msg}" + ) + return {} + try: data = response.json() if "providers" not in data: - logger.warning( - 'cannot find "providers". Likely no WTS service running for this commons' - ) + logger.warning(f'No "providers" field in WTS response: {data}. {err_msg}') return oidc for item in data["providers"]: oidc[urlparse(item["base_url"]).netloc] = item - - except requests.exceptions.HTTPError as exc: - logger.critical( - f'HTTP Error ({exc.response.status_code}): {json_loads(exc.response.text).get("message", "")}' - ) except JSONDecodeError as ex: - logger.warning( - f"Unable to process WTS response. Likely no WTS service running on this commons. " - f"Certain commands might fail." - ) + logger.warning(f"Unable to process WTS response: {response.text}. {err_msg}") return oidc From 8c6a030275b06090894d3a2586528d1e70b3f4f2 Mon Sep 17 00:00:00 2001 From: Pauline Ribeyre <4224001+paulineribeyre@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:54:47 -0500 Subject: [PATCH 2/7] pass hostname instead of mds url --- gen3/tools/download/drs_download.py | 18 +++++++++--------- gen3/tools/download/drs_resolvers.py | 17 ++++++++++------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/gen3/tools/download/drs_download.py b/gen3/tools/download/drs_download.py index 1f29a735..556e39e1 100644 --- a/gen3/tools/download/drs_download.py +++ b/gen3/tools/download/drs_download.py @@ -634,7 +634,7 @@ def parse_drs_identifier(drs_candidate: str) -> Tuple[str, str, str]: def resolve_drs_hostname_from_id( - object_id: str, resolved_drs_prefix_cache: dict, mds_url: str + object_id: str, resolved_drs_prefix_cache: dict, provided_hostname: str ) -> Optional[Tuple[str, str, str]]: """Resolves and returns a DRS identifier The resolved_drs_prefix_cache is updated if needed and is a potential side effect of this @@ -642,7 +642,7 @@ def resolve_drs_hostname_from_id( Args: object_id (str): DRS object id to resolve resolved_drs_prefix_cache (dict) : cache of resolved DRS prefixes - mds_url (str): the URL for the Gen3 Aggregate MDS to use to help resolved DRS hostname + provided_hostname (str): user-provided Data Commons url Returns: the hostname of the DRS server if resolved, otherwise it returns None @@ -654,7 +654,9 @@ def resolve_drs_hostname_from_id( return prefix, identifier, identifier_type if identifier_type == "compact": if prefix not in resolved_drs_prefix_cache: - hostname = resolve_drs(prefix, object_id, metadata_service_url=mds_url) + hostname = resolve_drs( + prefix, object_id, provided_hostname=provided_hostname + ) if hostname is not None: resolved_drs_prefix_cache[prefix] = hostname else: @@ -666,7 +668,7 @@ def resolve_drs_hostname_from_id( def resolve_objects_drs_hostname( object_ids: List[Downloadable], resolved_drs_prefix_cache: dict, - mds_url: str, + provided_hostname: str, commons_url: str = None, ) -> None: """Given a list of object_ids go through list and resolve + cache any unknown hosts @@ -674,7 +676,7 @@ def resolve_objects_drs_hostname( Args: object_ids (List[Downloadable]): list of object to resolve resolved_drs_prefix_cache (dict): cache of resolved DRS prefixes - mds_url (str): Gen3 metadata service to resolve DRS prefixes + provided_hostname (str): user-provided Data Commons url hostname (str): Hostname to main Gen3 environment """ for entry in object_ids: @@ -683,7 +685,7 @@ def resolve_objects_drs_hostname( if entry.hostname is None: # if resolution fails the entry hostname will still be None entry.hostname, nid, drs_type = resolve_drs_hostname_from_id( - entry.object_id, resolved_drs_prefix_cache, mds_url + entry.object_id, resolved_drs_prefix_cache, provided_hostname ) if ( drs_type == "hostname" @@ -863,9 +865,7 @@ def resolve_objects(self, object_list: List[Downloadable], show_progress: bool): resolve_objects_drs_hostname( object_list, self.resolved_compact_drs, - mds_url=f"http://{self.hostname}/mds/aggregate/info" - if self.hostname - else None, + provided_hostname=self.hostname, commons_url=self.commons_url, ) progress_bar = ( diff --git a/gen3/tools/download/drs_resolvers.py b/gen3/tools/download/drs_resolvers.py index 59075e8e..8c04d8ff 100644 --- a/gen3/tools/download/drs_resolvers.py +++ b/gen3/tools/download/drs_resolvers.py @@ -18,7 +18,8 @@ DRS_CACHE_EXPIRE = timedelta(days=DRS_CACHE_EXPIRE_DURATION) LOCALLY_CACHE_RESOLVED_HOSTS = os.getenv("LOCALLY_CACHE_RESOLVED_HOSTS", True) DRS_RESOLUTION_ORDER = os.getenv( - "DRS_RESOLUTION_ORDER", "cache_file:commons_mds:dataguids_dist:dataguids" + "DRS_RESOLUTION_ORDER", + "cache_file:commons_mds:provided_hostname:dataguids_dist:dataguids", ) DRS_CACHE = os.getenv( @@ -213,7 +214,7 @@ def resolve_compact_drs_using_indexd_dist( def resolve_drs_using_metadata_service( identifier: str, - metadata_service_url: str, + provided_hostname: str, cache_results: bool = LOCALLY_CACHE_RESOLVED_HOSTS, ) -> Optional[str]: """Resolves a compact DRS prefix by by performing a lookup into a Gen3 AggregateMDS. @@ -223,12 +224,13 @@ def resolve_drs_using_metadata_service( Args identifier: DRS prefix to resolve - metadata_service_url: url of MDS server to query. + provided_hostname: user-provided Data Commons url. cache_results: set to true to write local cache file Returns a hostname if resolved, otherwise None """ - if not metadata_service_url: + if not provided_hostname: return None + metadata_service_url = f"http://{provided_hostname}/mds/aggregate/info" try: response = requests.get(f"{metadata_service_url}/{identifier}") response.raise_for_status() @@ -318,7 +320,7 @@ def resolve_compact_drs_using_official_resolver( def resolve_drs_using_commons_mds( identifier: str, _: str, - metadata_service_url: str, + provided_hostname: str, cache_results: bool = LOCALLY_CACHE_RESOLVED_HOSTS, ) -> Optional[str]: """Wrapper to use the resolve_drs_using_metadata_service as a DRS resolver functions @@ -326,12 +328,12 @@ def resolve_drs_using_commons_mds( Args: identifier: DRS prefix to resolve _: unused - metadata_service_url: url of MDS server to query. + provided_hostname: user-provided Data Commons url. cache_results: set to true to write local cache file Returns a hostname if resolved, otherwise None """ return resolve_drs_using_metadata_service( - identifier, metadata_service_url, cache_results + identifier, provided_hostname, cache_results ) @@ -339,6 +341,7 @@ def resolve_drs_using_commons_mds( REGISTERED_DRS_RESOLVERS = { "cache_file": resolve_drs_from_local_cache, "commons_mds": resolve_drs_using_commons_mds, + "provided_hostname": resolve_drs_using_provided_hostname, "dataguids_dist": resolve_compact_drs_using_indexd_dist, "dataguids": resolve_compact_drs_using_official_resolver, # TODO "identifiers.org" From 30ff11f5a83f5333cfb9e1be7323c35d1b5a8aae Mon Sep 17 00:00:00 2001 From: Pauline Ribeyre <4224001+paulineribeyre@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:13:44 -0500 Subject: [PATCH 3/7] both mds url and hostname --- gen3/tools/download/drs_download.py | 27 +++++++++++------ gen3/tools/download/drs_resolvers.py | 43 ++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/gen3/tools/download/drs_download.py b/gen3/tools/download/drs_download.py index 556e39e1..a1b4a640 100644 --- a/gen3/tools/download/drs_download.py +++ b/gen3/tools/download/drs_download.py @@ -634,7 +634,10 @@ def parse_drs_identifier(drs_candidate: str) -> Tuple[str, str, str]: def resolve_drs_hostname_from_id( - object_id: str, resolved_drs_prefix_cache: dict, provided_hostname: str + object_id: str, + resolved_drs_prefix_cache: dict, + mds_url: str, + provided_hostname: str, ) -> Optional[Tuple[str, str, str]]: """Resolves and returns a DRS identifier The resolved_drs_prefix_cache is updated if needed and is a potential side effect of this @@ -642,6 +645,7 @@ def resolve_drs_hostname_from_id( Args: object_id (str): DRS object id to resolve resolved_drs_prefix_cache (dict) : cache of resolved DRS prefixes + mds_url (str): the URL for the Gen3 Aggregate MDS to use to help resolved DRS hostname provided_hostname (str): user-provided Data Commons url Returns: @@ -655,7 +659,10 @@ def resolve_drs_hostname_from_id( if identifier_type == "compact": if prefix not in resolved_drs_prefix_cache: hostname = resolve_drs( - prefix, object_id, provided_hostname=provided_hostname + prefix, + object_id, + metadata_service_url=mds_url, + provided_hostname=provided_hostname, ) if hostname is not None: resolved_drs_prefix_cache[prefix] = hostname @@ -668,6 +675,7 @@ def resolve_drs_hostname_from_id( def resolve_objects_drs_hostname( object_ids: List[Downloadable], resolved_drs_prefix_cache: dict, + mds_url: str, provided_hostname: str, commons_url: str = None, ) -> None: @@ -676,6 +684,7 @@ def resolve_objects_drs_hostname( Args: object_ids (List[Downloadable]): list of object to resolve resolved_drs_prefix_cache (dict): cache of resolved DRS prefixes + mds_url (str): Gen3 metadata service to resolve DRS prefixes provided_hostname (str): user-provided Data Commons url hostname (str): Hostname to main Gen3 environment """ @@ -685,7 +694,7 @@ def resolve_objects_drs_hostname( if entry.hostname is None: # if resolution fails the entry hostname will still be None entry.hostname, nid, drs_type = resolve_drs_hostname_from_id( - entry.object_id, resolved_drs_prefix_cache, provided_hostname + entry.object_id, resolved_drs_prefix_cache, mds_url, provided_hostname ) if ( drs_type == "hostname" @@ -838,6 +847,7 @@ def __init__( self.hostname = ( hostname if hostname else get_hostname_from_endpoint(auth.endpoint) ) + self.provided_hostname = hostname self.commons_url = commons_url self.access_token = auth.get_access_token() self.metadata = Gen3Metadata(auth) @@ -865,7 +875,10 @@ def resolve_objects(self, object_list: List[Downloadable], show_progress: bool): resolve_objects_drs_hostname( object_list, self.resolved_compact_drs, - provided_hostname=self.hostname, + mds_url=f"http://{self.hostname}/mds/aggregate/info" + if self.hostname + else None, + provided_hostname=self.provided_hostname, commons_url=self.commons_url, ) progress_bar = ( @@ -994,8 +1007,7 @@ def download( if entry.hostname is None: logger.critical( - f"{entry.hostname} was not resolved, skipping {entry.object_id}." - f"Skipping {entry.file_name}" + f"Unable to resolve, skipping {entry.object_id}. Skipping" ) completed[entry.object_id].status = "error (resolving DRS host)" continue @@ -1003,8 +1015,7 @@ def download( # check to see if we have tokens if entry.hostname not in self.known_hosts: logger.critical( - f"{entry.hostname} is not present in this commons remote user access." - f"Skipping {entry.file_name}" + f"{entry.hostname} is not present in this commons remote user access. Skipping {entry.file_name}" ) completed[entry.object_id].status = "error (resolving DRS host)" continue diff --git a/gen3/tools/download/drs_resolvers.py b/gen3/tools/download/drs_resolvers.py index 8c04d8ff..44f4dbc1 100644 --- a/gen3/tools/download/drs_resolvers.py +++ b/gen3/tools/download/drs_resolvers.py @@ -214,7 +214,7 @@ def resolve_compact_drs_using_indexd_dist( def resolve_drs_using_metadata_service( identifier: str, - provided_hostname: str, + metadata_service_url: str, cache_results: bool = LOCALLY_CACHE_RESOLVED_HOSTS, ) -> Optional[str]: """Resolves a compact DRS prefix by by performing a lookup into a Gen3 AggregateMDS. @@ -224,13 +224,12 @@ def resolve_drs_using_metadata_service( Args identifier: DRS prefix to resolve - provided_hostname: user-provided Data Commons url. + metadata_service_url: url of MDS server to query. cache_results: set to true to write local cache file Returns a hostname if resolved, otherwise None """ - if not provided_hostname: + if not metadata_service_url: return None - metadata_service_url = f"http://{provided_hostname}/mds/aggregate/info" try: response = requests.get(f"{metadata_service_url}/{identifier}") response.raise_for_status() @@ -320,7 +319,7 @@ def resolve_compact_drs_using_official_resolver( def resolve_drs_using_commons_mds( identifier: str, _: str, - provided_hostname: str, + metadata_service_url: str, cache_results: bool = LOCALLY_CACHE_RESOLVED_HOSTS, ) -> Optional[str]: """Wrapper to use the resolve_drs_using_metadata_service as a DRS resolver functions @@ -328,15 +327,42 @@ def resolve_drs_using_commons_mds( Args: identifier: DRS prefix to resolve _: unused - provided_hostname: user-provided Data Commons url. + metadata_service_url: url of MDS server to query. cache_results: set to true to write local cache file Returns a hostname if resolved, otherwise None """ return resolve_drs_using_metadata_service( - identifier, provided_hostname, cache_results + identifier, metadata_service_url, cache_results ) +def resolve_drs_using_provided_hostname( + _: str, + __: str, + provided_hostname: str, + cache_results: bool = LOCALLY_CACHE_RESOLVED_HOSTS, +) -> Optional[str]: + """Resolves by directly using the hostname provided by the user + + Args: + _: unused + provided_hostname: url of MDS server to query. + cache_results: set to true to write local cache file + Returns a hostname if resolved, otherwise None + """ + if cache_results: + data = { + "identifier": { + "host": provided_hostname, + "name": provided_hostname, + "type": "indexd", + "created": datetime.now(timezone.utc).strftime("%m/%d/%Y %H:%M:%S:%z"), + } + } + append_to_local_drs_cache(data) + return provided_hostname + + # TODO: provide methods to turn this into a plugin architecture REGISTERED_DRS_RESOLVERS = { "cache_file": resolve_drs_from_local_cache, @@ -366,6 +392,7 @@ def resolve_drs_via_list( resolver = REGISTERED_DRS_RESOLVERS.get(how, None) if resolver is None: continue + logger.info(f"Attempting to resolve {identifier} with {how}...") sig = inspect.signature(resolver) filter_keys = [ param.name @@ -381,7 +408,7 @@ def resolve_drs_via_list( host = resolver(identifier, object_id, **parameters_dict) if host is not None: - logger.info(f"resolved {identifier} tried {tried}") + logger.info(f"resolved {identifier}, tried: {tried}") return host logger.warning(f"unable to resolve {identifier} or {object_id}, tried {tried}") From ca086008e80825d38e95e87b0a4ed7693765c5d6 Mon Sep 17 00:00:00 2001 From: Pauline Ribeyre <4224001+paulineribeyre@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:21:28 -0500 Subject: [PATCH 4/7] revert provided_hostname, just need commons_url --- gen3/cli/drs_pull.py | 1 + gen3/tools/download/drs_download.py | 13 +++++------ gen3/tools/download/drs_resolvers.py | 32 ++-------------------------- 3 files changed, 8 insertions(+), 38 deletions(-) diff --git a/gen3/cli/drs_pull.py b/gen3/cli/drs_pull.py index a9c73851..80c65511 100644 --- a/gen3/cli/drs_pull.py +++ b/gen3/cli/drs_pull.py @@ -91,6 +91,7 @@ def download_manifest( not no_progress, not no_unpack_packages, delete_unpacked_packages, + ctx.obj["commons_url"], ) diff --git a/gen3/tools/download/drs_download.py b/gen3/tools/download/drs_download.py index a1b4a640..71d2032a 100644 --- a/gen3/tools/download/drs_download.py +++ b/gen3/tools/download/drs_download.py @@ -637,7 +637,6 @@ def resolve_drs_hostname_from_id( object_id: str, resolved_drs_prefix_cache: dict, mds_url: str, - provided_hostname: str, ) -> Optional[Tuple[str, str, str]]: """Resolves and returns a DRS identifier The resolved_drs_prefix_cache is updated if needed and is a potential side effect of this @@ -646,7 +645,6 @@ def resolve_drs_hostname_from_id( object_id (str): DRS object id to resolve resolved_drs_prefix_cache (dict) : cache of resolved DRS prefixes mds_url (str): the URL for the Gen3 Aggregate MDS to use to help resolved DRS hostname - provided_hostname (str): user-provided Data Commons url Returns: the hostname of the DRS server if resolved, otherwise it returns None @@ -662,7 +660,6 @@ def resolve_drs_hostname_from_id( prefix, object_id, metadata_service_url=mds_url, - provided_hostname=provided_hostname, ) if hostname is not None: resolved_drs_prefix_cache[prefix] = hostname @@ -676,7 +673,6 @@ def resolve_objects_drs_hostname( object_ids: List[Downloadable], resolved_drs_prefix_cache: dict, mds_url: str, - provided_hostname: str, commons_url: str = None, ) -> None: """Given a list of object_ids go through list and resolve + cache any unknown hosts @@ -685,7 +681,6 @@ def resolve_objects_drs_hostname( object_ids (List[Downloadable]): list of object to resolve resolved_drs_prefix_cache (dict): cache of resolved DRS prefixes mds_url (str): Gen3 metadata service to resolve DRS prefixes - provided_hostname (str): user-provided Data Commons url hostname (str): Hostname to main Gen3 environment """ for entry in object_ids: @@ -694,7 +689,7 @@ def resolve_objects_drs_hostname( if entry.hostname is None: # if resolution fails the entry hostname will still be None entry.hostname, nid, drs_type = resolve_drs_hostname_from_id( - entry.object_id, resolved_drs_prefix_cache, mds_url, provided_hostname + entry.object_id, resolved_drs_prefix_cache, mds_url ) if ( drs_type == "hostname" @@ -847,7 +842,6 @@ def __init__( self.hostname = ( hostname if hostname else get_hostname_from_endpoint(auth.endpoint) ) - self.provided_hostname = hostname self.commons_url = commons_url self.access_token = auth.get_access_token() self.metadata = Gen3Metadata(auth) @@ -878,7 +872,6 @@ def resolve_objects(self, object_list: List[Downloadable], show_progress: bool): mds_url=f"http://{self.hostname}/mds/aggregate/info" if self.hostname else None, - provided_hostname=self.provided_hostname, commons_url=self.commons_url, ) progress_bar = ( @@ -1128,6 +1121,7 @@ def _download( show_progress=False, unpack_packages=True, delete_unpacked_packages=False, + commons_url=None, ) -> Optional[Dict[str, Any]]: """ A convenience function used to download a json manifest. @@ -1158,6 +1152,7 @@ def _download( auth=auth, download_list=object_list, show_progress=show_progress, + commons_url=commons_url, ) out_dir_path = ensure_dirpath_exists(Path(output_dir)) @@ -1361,6 +1356,7 @@ def download_files_in_drs_manifest( show_progress=True, unpack_packages=True, delete_unpacked_packages=False, + commons_url=None, ) -> None: """ A convenience function used to download a json manifest. @@ -1382,6 +1378,7 @@ def download_files_in_drs_manifest( show_progress, unpack_packages, delete_unpacked_packages, + commons_url, ) diff --git a/gen3/tools/download/drs_resolvers.py b/gen3/tools/download/drs_resolvers.py index 44f4dbc1..67f7bec3 100644 --- a/gen3/tools/download/drs_resolvers.py +++ b/gen3/tools/download/drs_resolvers.py @@ -19,14 +19,14 @@ LOCALLY_CACHE_RESOLVED_HOSTS = os.getenv("LOCALLY_CACHE_RESOLVED_HOSTS", True) DRS_RESOLUTION_ORDER = os.getenv( "DRS_RESOLUTION_ORDER", - "cache_file:commons_mds:provided_hostname:dataguids_dist:dataguids", + "cache_file:commons_mds:dataguids_dist:dataguids", ) DRS_CACHE = os.getenv( "DRS_CACHE", str(Path(Path.home(), ".drs_cache", "resolved_drs_hosts.json")) ) -logger = get_logger("download", log_level="warning") +logger = get_logger("download", log_level="info") def clean_dist_entry(s: str) -> str: @@ -336,38 +336,10 @@ def resolve_drs_using_commons_mds( ) -def resolve_drs_using_provided_hostname( - _: str, - __: str, - provided_hostname: str, - cache_results: bool = LOCALLY_CACHE_RESOLVED_HOSTS, -) -> Optional[str]: - """Resolves by directly using the hostname provided by the user - - Args: - _: unused - provided_hostname: url of MDS server to query. - cache_results: set to true to write local cache file - Returns a hostname if resolved, otherwise None - """ - if cache_results: - data = { - "identifier": { - "host": provided_hostname, - "name": provided_hostname, - "type": "indexd", - "created": datetime.now(timezone.utc).strftime("%m/%d/%Y %H:%M:%S:%z"), - } - } - append_to_local_drs_cache(data) - return provided_hostname - - # TODO: provide methods to turn this into a plugin architecture REGISTERED_DRS_RESOLVERS = { "cache_file": resolve_drs_from_local_cache, "commons_mds": resolve_drs_using_commons_mds, - "provided_hostname": resolve_drs_using_provided_hostname, "dataguids_dist": resolve_compact_drs_using_indexd_dist, "dataguids": resolve_compact_drs_using_official_resolver, # TODO "identifiers.org" From 13f923ab4673ef07c0a6921e07d02c5e1450a7e0 Mon Sep 17 00:00:00 2001 From: Pauline Ribeyre <4224001+paulineribeyre@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:23:51 -0500 Subject: [PATCH 5/7] clean up --- gen3/tools/download/drs_download.py | 11 +++++------ gen3/tools/download/drs_resolvers.py | 5 ++--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/gen3/tools/download/drs_download.py b/gen3/tools/download/drs_download.py index 71d2032a..2a4ec04a 100644 --- a/gen3/tools/download/drs_download.py +++ b/gen3/tools/download/drs_download.py @@ -306,8 +306,10 @@ def wts_external_oidc(hostname: str) -> Dict[str, Any]: oidc = {} if not hostname: return oidc + url = f"https://{hostname}/wts/external_oidc/" err_msg = "Likely no WTS service running on this Commons. Proceeding, but certain commands might fail." + try: response = requests.get(url) response.raise_for_status() @@ -318,7 +320,8 @@ def wts_external_oidc(hostname: str) -> Dict[str, Any]: logger.warning( f"HTTP Error ({exc.response.status_code}) from '{url}': {resp_msg}. {err_msg}" ) - return {} + return oidc + try: data = response.json() if "providers" not in data: @@ -656,11 +659,7 @@ def resolve_drs_hostname_from_id( return prefix, identifier, identifier_type if identifier_type == "compact": if prefix not in resolved_drs_prefix_cache: - hostname = resolve_drs( - prefix, - object_id, - metadata_service_url=mds_url, - ) + hostname = resolve_drs(prefix, object_id, metadata_service_url=mds_url) if hostname is not None: resolved_drs_prefix_cache[prefix] = hostname else: diff --git a/gen3/tools/download/drs_resolvers.py b/gen3/tools/download/drs_resolvers.py index 67f7bec3..18f6752e 100644 --- a/gen3/tools/download/drs_resolvers.py +++ b/gen3/tools/download/drs_resolvers.py @@ -18,15 +18,14 @@ DRS_CACHE_EXPIRE = timedelta(days=DRS_CACHE_EXPIRE_DURATION) LOCALLY_CACHE_RESOLVED_HOSTS = os.getenv("LOCALLY_CACHE_RESOLVED_HOSTS", True) DRS_RESOLUTION_ORDER = os.getenv( - "DRS_RESOLUTION_ORDER", - "cache_file:commons_mds:dataguids_dist:dataguids", + "DRS_RESOLUTION_ORDER", "cache_file:commons_mds:dataguids_dist:dataguids" ) DRS_CACHE = os.getenv( "DRS_CACHE", str(Path(Path.home(), ".drs_cache", "resolved_drs_hosts.json")) ) -logger = get_logger("download", log_level="info") +logger = get_logger("download", log_level="warning") def clean_dist_entry(s: str) -> str: From 2b7a3af619a7c57cc743cee98c4db2f9a1d4258d Mon Sep 17 00:00:00 2001 From: paulineribeyre Date: Thu, 26 Mar 2026 14:37:14 +0000 Subject: [PATCH 6/7] Apply automatic documentation changes --- docs/_build/doctrees/environment.pickle | Bin 443239 -> 443503 bytes docs/_build/doctrees/tools/drs_pull.doctree | Bin 135011 -> 135470 bytes docs/_build/doctrees/tools/indexing.doctree | Bin 100046 -> 100036 bytes docs/_build/doctrees/tools/metadata.doctree | Bin 36721 -> 36726 bytes .../gen3/tools/download/drs_download.html | 44 +++++++++++------- docs/_build/html/tools/drs_pull.html | 2 +- docs/_build/html/tools/indexing.html | 2 +- docs/_build/html/tools/metadata.html | 2 +- 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 36ec540a64fb4ec90a864d067ec5805ac2165a34..7742fdb47e91eef814879af4fe575bf5bf1321b3 100644 GIT binary patch delta 90626 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 delta 90677 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 AssI20 delta 1587 zcmY+EeN5G56vz1<-Y#i?TEvT7-gc48{r!IEnzgowOSKu8CEAG5SX?I#uEuy#q&Z8X zkqJ%VxpdZ67;ds0rLbOZYyFXHjTlI}=3B!TM4PEC8(V17%kw-xxVP>f&(8UtbDrls z=X0Om(L;{uKF6K_;xYYs0>-{afE!1U!9y33#EGLQ54Mh?4cNy0cjpyBk310U8pBL1 z=bo0a2%frx^qyavFvq?V$O*o521$TB*mM?OM4>>3#mUM=d@>)=_y6pUh^S3pi`rDb z;Ss|dmvPG^TzLHdX*@cKMGnIwbJJ=gdC5n};eRIaWKx-w{J%xYWrMPA+m`6AdsN&W zi3;{yz+s?HZI&S##+_8-5eLSd+5_94X#>fk$ z`ejQ0^R1EoRu6YKAx)JO*Cms`ntfMMw!Br{Y_q!AJ!L7kBjDd6g|2k=UPK!Iauv&H zlZX4Gu_EZYhG+uVcO7|Z#!*~-2yd#ybca3YzdfAgMj`JXKn@;Mi7RQT!B#ZwfXl91 zKPxxMHU##$WJt92xG2HktQc~UtX^^eD@65|4tb{V?ablKJ4i_?F=TTZMX9nhic(`9 zMNx3z21)@R|9%sNsN#ZK*noQFW$@*4WKor&F#p44bL+CDTZM zg&`W>ct#xi*pb+v#-zErO=&go!!xj`(y%e^o52{Uz~tkx@Q5w>nqV}?-^Aj1jD{J; zNKcu3>MIn$%fo-5g*NKC{HRp_dfBFg=ruLOLRq6A%GwabN;#JWh&xp$8e*%mG{jaj z1o68&s0HnpLYGs&r%qG9r_Mi7LhmcNh@>Rnlju4d$4}ftEe)IE`1ES}#I!*kF*QgU zvE^@V8AtfDIlMp@Z1udU;L#0JoJw6y(v#q5R_k53TYr7BC~c20xDKm6G_C<soDN&LrrsF ycfhX#Z#UOw?hfSn2YGost&!i6&GA%;)N1v~sZmRX`ny)Cr9;i3Gk7k6%JDCFj2KJ+ diff --git a/docs/_build/doctrees/tools/indexing.doctree b/docs/_build/doctrees/tools/indexing.doctree index e9b82a25eec07790e0012a60ec4be122a363ed15..13957fd83fd5883c33bd741beabc2ec74c8c66c4 100644 GIT binary patch delta 193 zcmX@t%XXxftzipe9wVdQ_IyUhKpn={+Yjn8-eTl4H!(FfwJ@^OGc_@?FxtLapYaS6 z%XvlyhV2h@8Fw>^pvvpzeN~0GBPksUKb;`d5O9Wqky@Isj;brk)@uwrHQ$znaSh^ zU7O9?nrzIB^_z`!>@gK=ZqVJ!%jhxLPS+TVX6v7f7L)ySmF3XQ)yv6GSD%u>9y=vN PveN~0FfuSqR!EWCyhPoGk>AYH!qCLn!a~o~)ZE;_aPtQZ zCuYXF&Bi+R7;=+8XxMDtr`yQO=swxO+E@flt6oliy87gamLikqSU+GipB!MVEQ?La VlnnORDH) diff --git a/docs/_build/html/_modules/gen3/tools/download/drs_download.html b/docs/_build/html/_modules/gen3/tools/download/drs_download.html index e0432677..27f9b7d3 100644 --- a/docs/_build/html/_modules/gen3/tools/download/drs_download.html +++ b/docs/_build/html/_modules/gen3/tools/download/drs_download.html @@ -363,27 +363,31 @@

Source code for gen3.tools.download.drs_download

oidc = {} if not hostname: return oidc + + url = f"https://{hostname}/wts/external_oidc/" + err_msg = "Likely no WTS service running on this Commons. Proceeding, but certain commands might fail." + try: - response = requests.get(f"https://{hostname}/wts/external_oidc/") + response = requests.get(url) response.raise_for_status() + except requests.exceptions.HTTPError as exc: + resp_msg = json_loads(exc.response.text) + if "message" in resp_msg: + resp_msg = resp_msg["message"] + logger.warning( + f"HTTP Error ({exc.response.status_code}) from '{url}': {resp_msg}. {err_msg}" + ) + return oidc + + try: data = response.json() if "providers" not in data: - logger.warning( - 'cannot find "providers". Likely no WTS service running for this commons' - ) + logger.warning(f'No "providers" field in WTS response: {data}. {err_msg}') return oidc for item in data["providers"]: oidc[urlparse(item["base_url"]).netloc] = item - - except requests.exceptions.HTTPError as exc: - logger.critical( - f'HTTP Error ({exc.response.status_code}): {json_loads(exc.response.text).get("message", "")}' - ) except JSONDecodeError as ex: - logger.warning( - f"Unable to process WTS response. Likely no WTS service running on this commons. " - f"Certain commands might fail." - ) + logger.warning(f"Unable to process WTS response: {response.text}. {err_msg}") return oidc @@ -690,7 +694,9 @@

Source code for gen3.tools.download.drs_download

def resolve_drs_hostname_from_id( - object_id: str, resolved_drs_prefix_cache: dict, mds_url: str + object_id: str, + resolved_drs_prefix_cache: dict, + mds_url: str, ) -> Optional[Tuple[str, str, str]]: """Resolves and returns a DRS identifier The resolved_drs_prefix_cache is updated if needed and is a potential side effect of this @@ -1063,8 +1069,7 @@

Source code for gen3.tools.download.drs_download

if entry.hostname is None: logger.critical( - f"{entry.hostname} was not resolved, skipping {entry.object_id}." - f"Skipping {entry.file_name}" + f"Unable to resolve, skipping {entry.object_id}. Skipping" ) completed[entry.object_id].status = "error (resolving DRS host)" continue @@ -1072,8 +1077,7 @@

Source code for gen3.tools.download.drs_download

# check to see if we have tokens if entry.hostname not in self.known_hosts: logger.critical( - f"{entry.hostname} is not present in this commons remote user access." - f"Skipping {entry.file_name}" + f"{entry.hostname} is not present in this commons remote user access. Skipping {entry.file_name}" ) completed[entry.object_id].status = "error (resolving DRS host)" continue @@ -1191,6 +1195,7 @@

Source code for gen3.tools.download.drs_download

show_progress=False, unpack_packages=True, delete_unpacked_packages=False, + commons_url=None, ) -> Optional[Dict[str, Any]]: """ A convenience function used to download a json manifest. @@ -1221,6 +1226,7 @@

Source code for gen3.tools.download.drs_download

auth=auth, download_list=object_list, show_progress=show_progress, + commons_url=commons_url, ) out_dir_path = ensure_dirpath_exists(Path(output_dir)) @@ -1432,6 +1438,7 @@

Source code for gen3.tools.download.drs_download

show_progress=True, unpack_packages=True, delete_unpacked_packages=False, + commons_url=None, ) -> None: """ A convenience function used to download a json manifest. @@ -1453,6 +1460,7 @@

Source code for gen3.tools.download.drs_download

show_progress, unpack_packages, delete_unpacked_packages, + commons_url, )
diff --git a/docs/_build/html/tools/drs_pull.html b/docs/_build/html/tools/drs_pull.html index a3e74543..21e46086 100644 --- a/docs/_build/html/tools/drs_pull.html +++ b/docs/_build/html/tools/drs_pull.html @@ -409,7 +409,7 @@
-gen3.tools.download.drs_download.download_files_in_drs_manifest(hostname, auth, infile, output_dir, show_progress=True, unpack_packages=True, delete_unpacked_packages=False) None[source]
+gen3.tools.download.drs_download.download_files_in_drs_manifest(hostname, auth, infile, output_dir, show_progress=True, unpack_packages=True, delete_unpacked_packages=False, commons_url=None) None[source]

A convenience function used to download a json manifest. :param hostname: hostname of Gen3 commons to use for access and WTS :type hostname: str diff --git a/docs/_build/html/tools/indexing.html b/docs/_build/html/tools/indexing.html index e400187f..82eada6f 100644 --- a/docs/_build/html/tools/indexing.html +++ b/docs/_build/html/tools/indexing.html @@ -382,7 +382,7 @@

Indexing Tools
-async gen3.tools.indexing.verify_manifest.async_verify_object_manifest(commons_url, manifest_file, max_concurrent_requests=24, manifest_row_parsers={'acl': <function _get_acl_from_row>, 'authz': <function _get_authz_from_row>, 'file_name': <function _get_file_name_from_row>, 'file_size': <function _get_file_size_from_row>, 'guid': <function _get_guid_from_row>, 'md5': <function _get_md5_from_row>, 'urls': <function _get_urls_from_row>}, manifest_file_delimiter=None, output_filename='verify-manifest-errors-1769814388.3190567.log')[source]
+async gen3.tools.indexing.verify_manifest.async_verify_object_manifest(commons_url, manifest_file, max_concurrent_requests=24, manifest_row_parsers={'acl': <function _get_acl_from_row>, 'authz': <function _get_authz_from_row>, 'file_name': <function _get_file_name_from_row>, 'file_size': <function _get_file_size_from_row>, 'guid': <function _get_guid_from_row>, 'md5': <function _get_md5_from_row>, 'urls': <function _get_urls_from_row>}, manifest_file_delimiter=None, output_filename='verify-manifest-errors-1774535829.54282.log')[source]

Verify all file object records into a manifest csv

Parameters:
diff --git a/docs/_build/html/tools/metadata.html b/docs/_build/html/tools/metadata.html index dcbdc3fa..d44e35ff 100644 --- a/docs/_build/html/tools/metadata.html +++ b/docs/_build/html/tools/metadata.html @@ -103,7 +103,7 @@

Metadata Tools
-async gen3.tools.metadata.ingest_manifest.async_ingest_metadata_manifest(commons_url, manifest_file, metadata_source, auth=None, max_concurrent_requests=24, manifest_row_parsers={'guid_for_row': <function _get_guid_for_row>, 'indexed_file_object_guid': <function _query_for_associated_indexd_record_guid>}, manifest_file_delimiter=None, output_filename='ingest-metadata-manifest-errors-1769814388.557701.log', get_guid_from_file=True, metadata_type=None)[source]
+async gen3.tools.metadata.ingest_manifest.async_ingest_metadata_manifest(commons_url, manifest_file, metadata_source, auth=None, max_concurrent_requests=24, manifest_row_parsers={'guid_for_row': <function _get_guid_for_row>, 'indexed_file_object_guid': <function _query_for_associated_indexd_record_guid>}, manifest_file_delimiter=None, output_filename='ingest-metadata-manifest-errors-1774535829.7947564.log', get_guid_from_file=True, metadata_type=None)[source]

Ingest all metadata records into a manifest csv

Parameters:
From a95a9c543eed5dcfd83c16e05ae4c34970ba185c Mon Sep 17 00:00:00 2001 From: paulineribeyre Date: Thu, 26 Mar 2026 14:38:49 +0000 Subject: [PATCH 7/7] Apply automatic documentation changes --- docs/_build/doctrees/environment.pickle | Bin 443503 -> 443503 bytes docs/_build/doctrees/tools/indexing.doctree | Bin 100036 -> 100041 bytes docs/_build/doctrees/tools/metadata.doctree | Bin 36726 -> 36721 bytes docs/_build/html/tools/indexing.html | 2 +- docs/_build/html/tools/metadata.html | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 7742fdb47e91eef814879af4fe575bf5bf1321b3..a6804ad1c19033498177e9ddf121aa145a8e98c2 100644 GIT binary patch delta 9213 zcma(%X<$^0mBdmOiVJ6OcYVsYN^JN z#S{5TEk&!iVA#CsRRqNrEdmNuS$rys3fhW-wQ4P*{mwaeCg^)V-kEWqB|^u$px1Bh@OFB9 z-JKo1er2B5+t%y1`EKd-xaT*ud7IsB+IP{f#xD=;>Ymr$($&@CMKx=?$LF5!_PKlg z;XbtJD(q)iyz^Q;%^1Lt%sDVr7%^Q;KO&Ekrb?UrP;2R7|^{ zZ)3mD&tMz#BiUQ|Q6z+&&Cgh_pl-K6qG`Ujxx?M=Y4UlS7P+x;clYMBhI2ph{3BYG z#IaERaq*9Xf719zv?h~dBK2&JnfYfh|5*7akAFnQg&Y$Z4nr)h)yC=J{A1ytQT!9a zKV|%*Xpa`;nU?cRdQ>&OcIKB;Eh3v9_0*2(g5nwVs8NR`#k1;BAG-B=A>*0#sQSPe zg5ufrsIwYx6co>}M^$u5@hp4P;cYX8jAz=TUM};@mD3u^XySKZ0Hg~o@%`6qDl*uz(H6F7N<2#_EoJ9QGnucnot+w$$u5;ySm@|_mS2&H zIybV{$7Het+tXP>St)zIJd^dEPh|}83CO=xHj~wtWwJHjWHSGlQdU}?3EoVS@L+i< z+k*D9%Nwv21r?ca=VIby|3Y>>hN`Q$fgMJ(0~H;j>s!xaUF0DAj$>jFniRyuAarm{ z3_>Tz#2_5RF);{>IVJ{SCC9`dtmT*(gflrNMqV?=#K`kgok}8p#Sr~1GQ0hX z&)eK3Cx`ZSWinw$k3_;xn@F@4UhUyjl=hpkn

){-{7$$~~&)ns8bYmHSkvNuVi^ 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 Ppn(5H#@E~3J+I)uvxvvO delta 9167 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 delta 154 zcmX@v%XXxftzipe9wVdQ_IyUhKpn={+Yjn8-e=^rFtXG$H8HX<+P+Gk@eC8oc}50? z?GJPr4>0n>rSx+0)73R6UsxcrJNCoVqiUOy V!5%v$L$n7XiO{lrrXQn$1ppAoEKC3Z diff --git a/docs/_build/doctrees/tools/metadata.doctree b/docs/_build/doctrees/tools/metadata.doctree index 8dd77863a36eb696857b9d61d233e5244f827254..11b34d9d47343eb17569dd6e7ba52be264a71d54 100644 GIT binary patch delta 153 zcmex1kLlw)CYA=)sc9Qo>eN~0FfuSqR!EWCyhPoRk;~G^RL|JR+}O}`^9KzlX2!bB z#yT#@!jnH}*lgaX+sMo4KH0(Af*+wlFDE};eey(0k;!wcA26Cv4zSjcK$D%4!5%v$ PL$n7hiEP(Lo7NxzpRFwq delta 149 zcmex3kLlYyCYA=)so5J@>eN~0GBPksUKb;`d5O9sBe#W-rJlK^iMgqn$>auIo6Xvq zY|M=Hn~ii_P~Indexing Tools

-async gen3.tools.indexing.verify_manifest.async_verify_object_manifest(commons_url, manifest_file, max_concurrent_requests=24, manifest_row_parsers={'acl': <function _get_acl_from_row>, 'authz': <function _get_authz_from_row>, 'file_name': <function _get_file_name_from_row>, 'file_size': <function _get_file_size_from_row>, 'guid': <function _get_guid_from_row>, 'md5': <function _get_md5_from_row>, 'urls': <function _get_urls_from_row>}, manifest_file_delimiter=None, output_filename='verify-manifest-errors-1774535829.54282.log')[source]
+async gen3.tools.indexing.verify_manifest.async_verify_object_manifest(commons_url, manifest_file, max_concurrent_requests=24, manifest_row_parsers={'acl': <function _get_acl_from_row>, 'authz': <function _get_authz_from_row>, 'file_name': <function _get_file_name_from_row>, 'file_size': <function _get_file_size_from_row>, 'guid': <function _get_guid_from_row>, 'md5': <function _get_md5_from_row>, 'urls': <function _get_urls_from_row>}, manifest_file_delimiter=None, output_filename='verify-manifest-errors-1774535925.074383.log')[source]

Verify all file object records into a manifest csv

Parameters:
diff --git a/docs/_build/html/tools/metadata.html b/docs/_build/html/tools/metadata.html index d44e35ff..2b858aca 100644 --- a/docs/_build/html/tools/metadata.html +++ b/docs/_build/html/tools/metadata.html @@ -103,7 +103,7 @@

Metadata Tools
-async gen3.tools.metadata.ingest_manifest.async_ingest_metadata_manifest(commons_url, manifest_file, metadata_source, auth=None, max_concurrent_requests=24, manifest_row_parsers={'guid_for_row': <function _get_guid_for_row>, 'indexed_file_object_guid': <function _query_for_associated_indexd_record_guid>}, manifest_file_delimiter=None, output_filename='ingest-metadata-manifest-errors-1774535829.7947564.log', get_guid_from_file=True, metadata_type=None)[source]
+async gen3.tools.metadata.ingest_manifest.async_ingest_metadata_manifest(commons_url, manifest_file, metadata_source, auth=None, max_concurrent_requests=24, manifest_row_parsers={'guid_for_row': <function _get_guid_for_row>, 'indexed_file_object_guid': <function _query_for_associated_indexd_record_guid>}, manifest_file_delimiter=None, output_filename='ingest-metadata-manifest-errors-1774535925.327315.log', get_guid_from_file=True, metadata_type=None)[source]

Ingest all metadata records into a manifest csv

Parameters: