diff --git a/src/ai/backend/manager/container_registry/harbor.py b/src/ai/backend/manager/container_registry/harbor.py index 2a4b09c7f51..fcdb7afc0f2 100644 --- a/src/ai/backend/manager/container_registry/harbor.py +++ b/src/ai/backend/manager/container_registry/harbor.py @@ -243,15 +243,15 @@ async def _scan_image( match image_info["manifest_media_type"]: case self.MEDIA_TYPE_OCI_INDEX: await self._process_oci_index( - tg, sess, rqst_args, image, image_info + tg, sess, rqst_args, image, tag, image_info ) case self.MEDIA_TYPE_DOCKER_MANIFEST_LIST: await self._process_docker_v2_multiplatform_image( - tg, sess, rqst_args, image, image_info + tg, sess, rqst_args, image, tag, image_info ) case self.MEDIA_TYPE_DOCKER_MANIFEST: await self._process_docker_v2_image( - tg, sess, rqst_args, image, image_info + tg, sess, rqst_args, image, tag, image_info ) case _ as media_type: raise RuntimeError( @@ -292,15 +292,19 @@ async def _scan_tag( resp.raise_for_status() resp_json = await resp.json() async with aiotools.TaskGroup() as tg: + tag = resp_json["tags"][0]["name"] + match resp_json["manifest_media_type"]: case self.MEDIA_TYPE_OCI_INDEX: - await self._process_oci_index(tg, sess, rqst_args, image, resp_json) + await self._process_oci_index(tg, sess, rqst_args, image, tag, resp_json) case self.MEDIA_TYPE_DOCKER_MANIFEST_LIST: await self._process_docker_v2_multiplatform_image( - tg, sess, rqst_args, image, resp_json + tg, sess, rqst_args, image, tag, resp_json ) case self.MEDIA_TYPE_DOCKER_MANIFEST: - await self._process_docker_v2_image(tg, sess, rqst_args, image, resp_json) + await self._process_docker_v2_image( + tg, sess, rqst_args, image, tag, resp_json + ) case _ as media_type: raise RuntimeError(f"Unsupported artifact media-type: {media_type}") @@ -310,6 +314,7 @@ async def _process_oci_index( sess: aiohttp.ClientSession, _rqst_args: Mapping[str, Any], image: str, + tag: str, image_info: Mapping[str, Any], ) -> None: rqst_args = dict(_rqst_args) @@ -317,7 +322,6 @@ async def _process_oci_index( rqst_args["headers"] = {} rqst_args["headers"].update({"Accept": "application/vnd.oci.image.manifest.v1+json"}) digests: list[tuple[str, str]] = [] - tag_name = image_info["tags"][0]["name"] for reference in image_info["references"]: if ( reference["platform"]["os"] == "unknown" @@ -335,7 +339,7 @@ async def _process_oci_index( rqst_args, image, digest=digest, - tag=tag_name, + tag=tag, architecture=architecture, ) ) @@ -346,6 +350,7 @@ async def _process_docker_v2_multiplatform_image( sess: aiohttp.ClientSession, _rqst_args: Mapping[str, Any], image: str, + tag: str, image_info: Mapping[str, Any], ) -> None: rqst_args = dict(_rqst_args) @@ -355,7 +360,6 @@ async def _process_docker_v2_multiplatform_image( "Accept": "application/vnd.docker.distribution.manifest.v2+json" }) digests: list[tuple[str, str]] = [] - tag_name = image_info["tags"][0]["name"] for reference in image_info["references"]: if ( reference["platform"]["os"] == "unknown" @@ -373,7 +377,7 @@ async def _process_docker_v2_multiplatform_image( rqst_args, image, digest=digest, - tag=tag_name, + tag=tag, architecture=architecture, ) ) @@ -384,6 +388,7 @@ async def _process_docker_v2_image( sess: aiohttp.ClientSession, _rqst_args: Mapping[str, Any], image: str, + tag: str, image_info: Mapping[str, Any], ) -> None: rqst_args = dict(_rqst_args) @@ -394,14 +399,13 @@ async def _process_docker_v2_image( }) if (reporter := progress_reporter.get()) is not None: reporter.total_progress += 1 - tag_name = image_info["tags"][0]["name"] async with aiotools.TaskGroup() as tg: tg.create_task( self._harbor_scan_tag_single_arch( sess, rqst_args, image, - tag=tag_name, + tag, ) )