diff options
author | Radostin Stoyanov <radostin@redhat.com> | 2022-08-27 09:47:26 +0200 |
---|---|---|
committer | Radostin Stoyanov <radostin@redhat.com> | 2022-09-29 13:23:43 +0100 |
commit | b17d8ff46d390350fb617de7456e08a8dd358753 (patch) | |
tree | dff16edb3ee1a396cdbf70ef0e2b7a4d71dd78f4 /cmd/podman/utils | |
parent | f52feded3ce6c1ad2af046ab774fbc2b9c832487 (diff) | |
download | podman-b17d8ff46d390350fb617de7456e08a8dd358753.tar.gz podman-b17d8ff46d390350fb617de7456e08a8dd358753.tar.bz2 podman-b17d8ff46d390350fb617de7456e08a8dd358753.zip |
restore: make IsCheckpointImage reusable
Podman allows to store a container checkpoints as an images.
This patch makes the check that is used to recognise such checkpoint
images reusable by moving it in utils. This functionality will be reused
in a subsequent patch to extend the `podman run` command with support
for checkpoint images.
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
Diffstat (limited to 'cmd/podman/utils')
-rw-r--r-- | cmd/podman/utils/utils.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/cmd/podman/utils/utils.go b/cmd/podman/utils/utils.go index a265faf51..8063f4309 100644 --- a/cmd/podman/utils/utils.go +++ b/cmd/podman/utils/utils.go @@ -1,9 +1,12 @@ package utils import ( + "context" "fmt" "os" + "github.com/containers/podman/v4/cmd/podman/registry" + "github.com/containers/podman/v4/libpod/define" "github.com/containers/podman/v4/pkg/domain/entities" "github.com/containers/podman/v4/pkg/domain/entities/reports" ) @@ -99,3 +102,40 @@ func PrintNetworkPruneResults(networkPruneReport []*entities.NetworkPruneReport, } return errs.PrintErrors() } + +// IsCheckpointImage returns true with no error only if all values in +// namesOrIDs correspond to checkpoint images AND these images are +// compatible with the container runtime that is currently in use, +// e.g., crun or runc. +// +// IsCheckpointImage returns false with no error when none of the values +// in namesOrIDs corresponds to an ID or name of an image. +// +// Otherwise, IsCheckpointImage returns false with appropriate error. +func IsCheckpointImage(ctx context.Context, namesOrIDs []string) (bool, error) { + inspectOpts := entities.InspectOptions{} + imgData, _, err := registry.ImageEngine().Inspect(ctx, namesOrIDs, inspectOpts) + if err != nil { + return false, err + } + if len(imgData) == 0 { + return false, nil + } + imgID := imgData[0].ID + + hostInfo, err := registry.ContainerEngine().Info(ctx) + if err != nil { + return false, err + } + + for i := range imgData { + checkpointRuntimeName, found := imgData[i].Annotations[define.CheckpointAnnotationRuntimeName] + if !found { + return false, fmt.Errorf("image is not a checkpoint: %s", imgID) + } + if hostInfo.Host.OCIRuntime.Name != checkpointRuntimeName { + return false, fmt.Errorf("container image \"%s\" requires runtime: \"%s\"", imgID, checkpointRuntimeName) + } + } + return true, nil +} |