summaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2021-07-03 06:17:03 -0400
committerGitHub <noreply@github.com>2021-07-03 06:17:03 -0400
commit895b8151889422aac1f9b72eebe6d62e8e15095c (patch)
tree3694e61ecedcb8c8fb1b59dd12e1e882d7ce6ae0 /libpod
parent07716133c44c9c9593364029f4b98085d1be3bdd (diff)
parent8f6a0243f4b7f861a116c0dba5967b3cfe23d61f (diff)
downloadpodman-895b8151889422aac1f9b72eebe6d62e8e15095c.tar.gz
podman-895b8151889422aac1f9b72eebe6d62e8e15095c.tar.bz2
podman-895b8151889422aac1f9b72eebe6d62e8e15095c.zip
Merge pull request #10836 from Luap99/diff
podman diff accept two images or containers
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container_internal_linux.go2
-rw-r--r--libpod/define/diff.go26
-rw-r--r--libpod/diff.go44
3 files changed, 52 insertions, 20 deletions
diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go
index 25db3cff0..850af235f 100644
--- a/libpod/container_internal_linux.go
+++ b/libpod/container_internal_linux.go
@@ -923,7 +923,7 @@ func (c *Container) exportCheckpoint(options ContainerCheckpointOptions) error {
var addToTarFiles []string
if !options.IgnoreRootfs {
// To correctly track deleted files, let's go through the output of 'podman diff'
- rootFsChanges, err := c.runtime.GetDiff("", c.ID())
+ rootFsChanges, err := c.runtime.GetDiff("", c.ID(), define.DiffContainer)
if err != nil {
return errors.Wrapf(err, "error exporting root file-system diff for %q", c.ID())
}
diff --git a/libpod/define/diff.go b/libpod/define/diff.go
new file mode 100644
index 000000000..ee492eb3a
--- /dev/null
+++ b/libpod/define/diff.go
@@ -0,0 +1,26 @@
+package define
+
+// extra type to use as enum
+type DiffType uint8
+
+const (
+ // only diff containers
+ DiffContainer DiffType = 1 << iota
+ // only diff images
+ DiffImage
+ // diff both containers and images
+ DiffAll DiffType = 0b11111111
+)
+
+func (d DiffType) String() string {
+ switch d {
+ case DiffAll:
+ return "all"
+ case DiffContainer:
+ return "container"
+ case DiffImage:
+ return "image"
+ default:
+ return "unknown"
+ }
+}
diff --git a/libpod/diff.go b/libpod/diff.go
index c5a53478b..5bd162e7b 100644
--- a/libpod/diff.go
+++ b/libpod/diff.go
@@ -2,6 +2,7 @@ package libpod
import (
"github.com/containers/common/libimage"
+ "github.com/containers/podman/v3/libpod/define"
"github.com/containers/podman/v3/libpod/layers"
"github.com/containers/storage/pkg/archive"
"github.com/pkg/errors"
@@ -21,14 +22,14 @@ var initInodes = map[string]bool{
}
// GetDiff returns the differences between the two images, layers, or containers
-func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
- toLayer, err := r.getLayerID(to)
+func (r *Runtime) GetDiff(from, to string, diffType define.DiffType) ([]archive.Change, error) {
+ toLayer, err := r.getLayerID(to, diffType)
if err != nil {
return nil, err
}
fromLayer := ""
if from != "" {
- fromLayer, err = r.getLayerID(from)
+ fromLayer, err = r.getLayerID(from, diffType)
if err != nil {
return nil, err
}
@@ -49,25 +50,30 @@ func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
// GetLayerID gets a full layer id given a full or partial id
// If the id matches a container or image, the id of the top layer is returned
// If the id matches a layer, the top layer id is returned
-func (r *Runtime) getLayerID(id string) (string, error) {
- var toLayer string
- toImage, _, err := r.libimageRuntime.LookupImage(id, &libimage.LookupImageOptions{IgnorePlatform: true})
- if err == nil {
- return toImage.TopLayer(), nil
+func (r *Runtime) getLayerID(id string, diffType define.DiffType) (string, error) {
+ var lastErr error
+ if diffType&define.DiffImage == define.DiffImage {
+ toImage, _, err := r.libimageRuntime.LookupImage(id, &libimage.LookupImageOptions{IgnorePlatform: true})
+ if err == nil {
+ return toImage.TopLayer(), nil
+ }
+ lastErr = err
}
- targetID, err := r.store.Lookup(id)
- if err != nil {
- targetID = id
+ if diffType&define.DiffContainer == define.DiffContainer {
+ toCtr, err := r.store.Container(id)
+ if err == nil {
+ return toCtr.LayerID, nil
+ }
+ lastErr = err
}
- toCtr, err := r.store.Container(targetID)
- if err != nil {
- toLayer, err = layers.FullID(r.store, targetID)
- if err != nil {
- return "", errors.Errorf("layer, image, or container %s does not exist", id)
+
+ if diffType == define.DiffAll {
+ toLayer, err := layers.FullID(r.store, id)
+ if err == nil {
+ return toLayer, nil
}
- } else {
- toLayer = toCtr.LayerID
+ lastErr = err
}
- return toLayer, nil
+ return "", errors.Wrapf(lastErr, "%s not found", id)
}