docker_publisher.py: Add option to remove archs from published images
Set a fetcher to None to explicitly remove this arch from a manifest list.
This commit is contained in:
parent
d0f75c36cc
commit
71a07b9013
@ -126,14 +126,20 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
|
|||||||
|
|
||||||
return self.cached_manifestlist
|
return self.cached_manifestlist
|
||||||
|
|
||||||
|
def _manifestIsForArch(self, manifest, docker_arch, docker_variant):
|
||||||
|
if 'variant' in manifest['platform'] and manifest['platform']['variant'] != docker_variant:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return manifest['platform']['architecture'] == docker_arch
|
||||||
|
|
||||||
def releasedDockerImageVersion(self, arch):
|
def releasedDockerImageVersion(self, arch):
|
||||||
docker_arch, docker_variant = self.getDockerArch(arch)
|
docker_arch, docker_variant = self.getDockerArch(arch)
|
||||||
|
|
||||||
manifestlist = self._getManifestlist()
|
manifestlist = self._getManifestlist()
|
||||||
|
|
||||||
if manifestlist is None:
|
if manifestlist is None:
|
||||||
# No manifest -> force outdated version
|
# No manifest
|
||||||
return "0"
|
return None
|
||||||
|
|
||||||
for manifest in manifestlist['manifests']:
|
for manifest in manifestlist['manifests']:
|
||||||
if docker_variant is not None:
|
if docker_variant is not None:
|
||||||
@ -144,8 +150,7 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
|
|||||||
if 'vnd-opensuse-version' in manifest:
|
if 'vnd-opensuse-version' in manifest:
|
||||||
return manifest['vnd-opensuse-version']
|
return manifest['vnd-opensuse-version']
|
||||||
|
|
||||||
# Arch not in the manifest -> force outdated version
|
return None
|
||||||
return "0"
|
|
||||||
|
|
||||||
def prepareReleasing(self):
|
def prepareReleasing(self):
|
||||||
if self.new_manifestlist is not None:
|
if self.new_manifestlist is not None:
|
||||||
@ -192,6 +197,12 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
|
|||||||
"application/vnd.docker.container.image.v1+json"),
|
"application/vnd.docker.container.image.v1+json"),
|
||||||
'layers': layers}
|
'layers': layers}
|
||||||
|
|
||||||
|
def removeImage(self, arch):
|
||||||
|
docker_arch, docker_variant = self.getDockerArch(arch)
|
||||||
|
|
||||||
|
self.new_manifestlist['manifests'] = [m for m in self.new_manifestlist['manifests']
|
||||||
|
if not self._manifestIsForArch(m, docker_arch, docker_variant)]
|
||||||
|
|
||||||
def addImage(self, version, arch, image_path):
|
def addImage(self, version, arch, image_path):
|
||||||
docker_arch, docker_variant = self.getDockerArch(arch)
|
docker_arch, docker_variant = self.getDockerArch(arch)
|
||||||
|
|
||||||
@ -221,18 +232,17 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
|
|||||||
# Register the manifest in the list
|
# Register the manifest in the list
|
||||||
replaced = False
|
replaced = False
|
||||||
for manifest in self.new_manifestlist['manifests']:
|
for manifest in self.new_manifestlist['manifests']:
|
||||||
if 'variant' in manifest['platform'] and manifest['platform']['variant'] != docker_variant:
|
if not self._manifestIsForArch(manifest, docker_arch, docker_variant):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if manifest['platform']['architecture'] == docker_arch:
|
manifest['mediaType'] = manifest_v2['mediaType']
|
||||||
manifest['mediaType'] = manifest_v2['mediaType']
|
manifest['size'] = len(manifest_content)
|
||||||
manifest['size'] = len(manifest_content)
|
manifest['digest'] = manifest_digest
|
||||||
manifest['digest'] = manifest_digest
|
manifest['vnd-opensuse-version'] = version
|
||||||
manifest['vnd-opensuse-version'] = version
|
if docker_variant is not None:
|
||||||
if docker_variant is not None:
|
manifest['platform']['variant'] = docker_variant
|
||||||
manifest['platform']['variant'] = docker_variant
|
|
||||||
|
|
||||||
replaced = True
|
replaced = True
|
||||||
|
|
||||||
if not replaced:
|
if not replaced:
|
||||||
# Add it instead
|
# Add it instead
|
||||||
@ -423,7 +433,7 @@ def run():
|
|||||||
for arch in fetchers:
|
for arch in fetchers:
|
||||||
print(f"\tArchitecture {arch}")
|
print(f"\tArchitecture {arch}")
|
||||||
try:
|
try:
|
||||||
current = fetchers[arch].currentVersion()
|
current = fetchers[arch].currentVersion() if fetchers[arch] else None
|
||||||
print(f"\t\tAvailable version: {current}")
|
print(f"\t\tAvailable version: {current}")
|
||||||
|
|
||||||
released = publisher.releasedDockerImageVersion(arch)
|
released = publisher.releasedDockerImageVersion(arch)
|
||||||
@ -446,6 +456,12 @@ def run():
|
|||||||
need_to_upload = False
|
need_to_upload = False
|
||||||
|
|
||||||
for arch, version in archs_to_update.items():
|
for arch, version in archs_to_update.items():
|
||||||
|
if fetchers[arch] is None:
|
||||||
|
print(f"\tRemoving {arch} image")
|
||||||
|
publisher.removeImage(arch)
|
||||||
|
need_to_upload = True
|
||||||
|
continue
|
||||||
|
|
||||||
print(f"\tUpdating {arch} image to version {version}")
|
print(f"\tUpdating {arch} image to version {version}")
|
||||||
try:
|
try:
|
||||||
fetchers[arch].getDockerImage(lambda image_path: publisher.addImage(version=version,
|
fetchers[arch].getDockerImage(lambda image_path: publisher.addImage(version=version,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user