Skip to content

Commit

Permalink
cosalib/container_manifest.py: account for images that are repo:tag
Browse files Browse the repository at this point in the history
enhance the garbage collection for the repo:tag we are trying
to create a container image manifest for. In this case we were
getting an error because someone had pulled the
quay.io/coreos-assembler/coreos-assembler:main image down from
quay. It wasn't a manifest listed repo:tag so `podman manifest exists`
wasn't returning true, but the create would fail.

The updated code here should handle this case.

This enhances the previous effort in 01e4e55.
  • Loading branch information
dustymabe committed Jan 25, 2025
1 parent 7dd4b4d commit 69f5874
Showing 1 changed file with 24 additions and 19 deletions.
43 changes: 24 additions & 19 deletions src/cosalib/container_manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,31 +20,36 @@ def create_local_container_manifest(repo, tag, images) -> dict:
return json.loads(manifest_info)


def local_container_manifest_exists(repo, tag):
def local_container_manifest_or_image_exists(repo, tag):
'''
Delete local manifest list
Delete local manifest list or image associated with repo:tag
@param repo str registry repository
@param tag str manifest tag
@param tag str tag
'''
cmd = ["podman", "manifest", "exists", f"{repo}:{tag}"]
cp = runcmd(cmd, check=False)
# The commands returns 0 (exists), 1 (doesn't exist), 125 (other error)
if cp.returncode == 125:
if cp.stdout:
print(f" STDOUT: {cp.stdout.decode()}")
if cp.stderr:
print(f" STDERR: {cp.stderr.decode()}")
raise Exception("Error encountered when checking if manifest exists")
return cp.returncode == 0
cmds = [["podman", "manifest", "exists", f"{repo}:{tag}"],
["podman", "image", "exists", f"{repo}:{tag}"]]
for cmd in cmds:
cp = runcmd(cmd, check=False)
# The commands returns 0 (exists), 1 (doesn't exist), 125 (other error)
if cp.returncode == 125:
if cp.stdout:
print(f" STDOUT: {cp.stdout.decode()}")
if cp.stderr:
print(f" STDERR: {cp.stderr.decode()}")
raise Exception("Error encountered when checking if manifest exists")
if cp.returncode == 0:
return True
return False


def delete_local_container_manifest(repo, tag):
def delete_local_container_imgref(repo, tag):
'''
Delete local manifest list
Delete local manifest list or image associated with repo:tag
@param repo str registry repository
@param tag str manifest tag
'''
cmd = ["podman", "manifest", "rm", f"{repo}:{tag}"]
# Note `podman image rm` will delete a manifest or plain image
cmd = ["podman", "image", "rm", f"{repo}:{tag}"]
runcmd(cmd)


Expand Down Expand Up @@ -74,10 +79,10 @@ def create_and_push_container_manifest(repo, tags, images, v2s2) -> dict:
@param images list of image specifications (including transport)
@param v2s2 boolean use to force v2s2 format
'''
if local_container_manifest_exists(repo, tags[0]):
if local_container_manifest_or_image_exists(repo, tags[0]):
# perhaps left over from a previous failed run -> delete
delete_local_container_manifest(repo, tags[0])
delete_local_container_imgref(repo, tags[0])
manifest_info = create_local_container_manifest(repo, tags[0], images)
push_container_manifest(repo, tags, v2s2)
delete_local_container_manifest(repo, tags[0])
delete_local_container_imgref(repo, tags[0])
return manifest_info

0 comments on commit 69f5874

Please sign in to comment.