Parse out image names as repotags and repodigests

Parse the set of image names as tagged references, canonical references,
or repository names to which we add the default tag, and return them in
libkpod.ImageData reports.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
This commit is contained in:
Nalin Dahyabhai 2017-07-25 15:39:16 -04:00
parent 120af8ef01
commit 8957156c41

View file

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"time" "time"
"github.com/containers/image/docker/reference"
"github.com/containers/storage" "github.com/containers/storage"
"github.com/kubernetes-incubator/cri-o/libkpod/driver" "github.com/kubernetes-incubator/cri-o/libkpod/driver"
digest "github.com/opencontainers/go-digest" digest "github.com/opencontainers/go-digest"
@ -15,8 +16,8 @@ import (
// nolint // nolint
type ImageData struct { type ImageData struct {
ID string ID string
Names []string Tags []string
Digests []digest.Digest Digests []string
Parent string Parent string
Comment string Comment string
Created *time.Time Created *time.Time
@ -58,6 +59,32 @@ type rootFS struct {
Layers []string Layers []string
} }
// ParseImageNames parses the names we've stored with an image into a list of
// tagged references and a list of references which contain digests.
func ParseImageNames(names []string) (tags, digests []string, err error) {
for _, name := range names {
if named, err := reference.ParseNamed(name); err == nil {
if digested, ok := named.(reference.Digested); ok {
canonical, err := reference.WithDigest(named, digested.Digest())
if err == nil {
digests = append(digests, canonical.String())
}
} else {
if reference.IsNameOnly(named) {
named = reference.TagNameOnly(named)
}
if tagged, ok := named.(reference.Tagged); ok {
namedTagged, err := reference.WithTag(named, tagged.Tag())
if err == nil {
tags = append(tags, namedTagged.String())
}
}
}
}
}
return tags, digests, nil
}
// GetImageData gets the ImageData for a container with the given name in the given store. // GetImageData gets the ImageData for a container with the given name in the given store.
func GetImageData(store storage.Store, name string) (*ImageData, error) { func GetImageData(store storage.Store, name string) (*ImageData, error) {
img, err := FindImage(store, name) img, err := FindImage(store, name)
@ -69,7 +96,7 @@ func GetImageData(store storage.Store, name string) (*ImageData, error) {
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "error reading image %q", name) return nil, errors.Wrapf(err, "error reading image %q", name)
} }
digests, err := getDigests(*img) blobDigests, err := getDigests(*img)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -77,8 +104,8 @@ func GetImageData(store storage.Store, name string) (*ImageData, error) {
var bigData interface{} var bigData interface{}
ctrConfig := containerConfig{} ctrConfig := containerConfig{}
container := "" container := ""
if len(digests) > 0 { if len(blobDigests) > 0 {
bd, err := store.ImageBigData(img.ID, string(digests[len(digests)-1])) bd, err := store.ImageBigData(img.ID, string(blobDigests[len(blobDigests)-1]))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -98,6 +125,11 @@ func GetImageData(store storage.Store, name string) (*ImageData, error) {
} }
} }
tags, digests, err := ParseImageNames(img.Names)
if err != nil {
return nil, errors.Wrapf(err, "error parsing image names for %q", name)
}
driverName, err := driver.GetDriverName(store) driverName, err := driver.GetDriverName(store)
if err != nil { if err != nil {
return nil, err return nil, err
@ -107,6 +139,7 @@ func GetImageData(store storage.Store, name string) (*ImageData, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
driverMetadata, err := driver.GetDriverMetadata(store, topLayerID) driverMetadata, err := driver.GetDriverMetadata(store, topLayerID)
if err != nil { if err != nil {
return nil, err return nil, err
@ -128,7 +161,7 @@ func GetImageData(store storage.Store, name string) (*ImageData, error) {
return &ImageData{ return &ImageData{
ID: img.ID, ID: img.ID,
Names: img.Names, Tags: tags,
Digests: digests, Digests: digests,
Parent: string(cid.Docker.Parent), Parent: string(cid.Docker.Parent),
Comment: cid.OCIv1.History[0].Comment, Comment: cid.OCIv1.History[0].Comment,