diff options
Diffstat (limited to 'libpod/image_inspect.go')
-rw-r--r-- | libpod/image_inspect.go | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/libpod/image_inspect.go b/libpod/image_inspect.go new file mode 100644 index 000000000..a08665434 --- /dev/null +++ b/libpod/image_inspect.go @@ -0,0 +1,81 @@ +package libpod + +import ( + "encoding/json" + "strings" + + "github.com/containers/image/types" + "github.com/containers/storage" + digest "github.com/opencontainers/go-digest" + ociv1 "github.com/opencontainers/image-spec/specs-go/v1" + "github.com/pkg/errors" + "github.com/projectatomic/libpod/libpod/driver" +) + +func getImageData(img storage.Image, imgRef types.Image, size int64, driver *driver.Data) (*ImageData, error) { + imgSize, err := imgRef.Size() + if err != nil { + return nil, errors.Wrapf(err, "error reading size of image %q", img.ID) + } + manifest, manifestType, err := imgRef.Manifest() + if err != nil { + return nil, errors.Wrapf(err, "error reading manifest for image %q", img.ID) + } + imgDigest := digest.Digest("") + if len(manifest) > 0 { + imgDigest = digest.Canonical.FromBytes(manifest) + } + annotations := annotations(manifest, manifestType) + + ociv1Img, err := imgRef.OCIConfig() + if err != nil { + return nil, errors.Wrapf(err, "error getting oci image info %q", img.ID) + } + info, err := imgRef.Inspect() + if err != nil { + return nil, errors.Wrapf(err, "error getting image info %q", img.ID) + } + + var repoDigests []string + for _, name := range img.Names { + repoDigests = append(repoDigests, strings.SplitN(name, ":", 2)[0]+"@"+imgDigest.String()) + } + + data := &ImageData{ + ID: img.ID, + RepoTags: img.Names, + RepoDigests: repoDigests, + Comment: ociv1Img.History[0].Comment, + Created: ociv1Img.Created, + Author: ociv1Img.History[0].Author, + Architecture: ociv1Img.Architecture, + Os: ociv1Img.OS, + Config: &ociv1Img.Config, + Version: info.DockerVersion, + Size: size, + VirtualSize: size + imgSize, + Annotations: annotations, + Digest: imgDigest, + Labels: info.Labels, + RootFS: &RootFS{ + Type: ociv1Img.RootFS.Type, + Layers: ociv1Img.RootFS.DiffIDs, + }, + GraphDriver: driver, + } + return data, nil +} + +func annotations(manifest []byte, manifestType string) map[string]string { + annotations := make(map[string]string) + switch manifestType { + case ociv1.MediaTypeImageManifest: + var m ociv1.Manifest + if err := json.Unmarshal(manifest, &m); err == nil { + for k, v := range m.Annotations { + annotations[k] = v + } + } + } + return annotations +} |