sources/skopeo: check containers-storage

Update the skopeo sources stage to check other container-transports [1]
for downloading container images. This commit adds a transport for
`containers-storage` in addition to the existing `docker://`
transport.

Jira: https://issues.redhat.com/browse/HMS-3235

[1] CONTAINERS-TRANSPORTS(5)
This commit is contained in:
Gianluca Zuccarelli 2023-12-07 16:00:30 +00:00 committed by Brian C. Lane
parent 2141168e44
commit 2ec88bdb32
2 changed files with 38 additions and 2 deletions

View file

@ -54,6 +54,12 @@ SCHEMA = """
"tls-verify": {
"type": "boolean",
"description": "Require https (default true)."
},
"containers-transport": {
"type": "string",
"enum": ["docker", "containers-storage" ],
"description": "The containers transport from which to copy the container",
"default": "docker"
}
}
}
@ -73,6 +79,9 @@ SCHEMA = """
}]
"""
DOCKER_TRANSPORT = "docker"
CONTAINERS_STORAGE_TRANSPORT = "containers-storage"
class SkopeoSource(sources.SourceService):
@ -80,19 +89,28 @@ class SkopeoSource(sources.SourceService):
dir_name = "image"
def get_source(self, transport, reference):
if transport == DOCKER_TRANSPORT:
return f"docker://{reference}"
if transport == CONTAINERS_STORAGE_TRANSPORT:
return f"containers-storage:{reference}"
raise RuntimeError("Unrecognized containers transport")
def fetch_one(self, checksum, desc):
image_id = checksum
image = desc["image"]
imagename = image["name"]
digest = image["digest"]
tls_verify = image.get("tls-verify", True)
transport = image.get("containers-transport", DOCKER_TRANSPORT)
with tempfile.TemporaryDirectory(prefix="tmp-download-", dir=self.cache) as tmpdir:
archive_dir = os.path.join(tmpdir, "container-archive")
os.makedirs(archive_dir)
os.chmod(archive_dir, 0o755)
source = f"docker://{imagename}@{digest}"
reference = f"{imagename}@{digest}"
source = self.get_source(transport, reference)
# We use the dir format because it is the most powerful in terms of feature support and is the closest to a
# direct serialisation of the registry data.

View file

@ -41,6 +41,12 @@ SCHEMA = """
"tls-verify": {
"type": "boolean",
"description": "Require https (default true)."
},
"containers-transport": {
"type": "string",
"enum": ["docker", "containers-storage" ],
"description": "The containers transport from which to copy the container",
"default": "docker"
}
}
}
@ -60,23 +66,35 @@ SCHEMA = """
}]
"""
DOCKER_TRANSPORT = "docker"
CONTAINERS_STORAGE_TRANSPORT = "containers-storage"
class SkopeoIndexSource(sources.SourceService):
content_type = "org.osbuild.files"
def get_source(self, transport, reference):
if transport == DOCKER_TRANSPORT:
return f"docker://{reference}"
if transport == CONTAINERS_STORAGE_TRANSPORT:
return f"containers-storage:{reference}"
raise RuntimeError("Unrecognized containers transport")
def fetch_one(self, checksum, desc):
digest = checksum
image = desc["image"]
imagename = image["name"]
tls_verify = image.get("tls-verify", True)
transport = image.get("containers-transport", DOCKER_TRANSPORT)
with tempfile.TemporaryDirectory(prefix="tmp-download-", dir=self.cache) as tmpdir:
archive_dir = os.path.join(tmpdir, "index")
os.makedirs(archive_dir)
os.chmod(archive_dir, 0o755)
source = f"docker://{imagename}@{digest}"
reference = f"{imagename}@{digest}"
source = self.get_source(transport, reference)
destination = f"dir:{archive_dir}"