From 61e0ab4f47b63039152a5576a2f9a1741d45b654 Mon Sep 17 00:00:00 2001 From: baude Date: Mon, 27 Nov 2017 10:12:24 -0600 Subject: Create|Run container from Image ID As reported in Issue #50, we need to be able to run or create a container based on an image ID (as well as name). Signed-off-by: baude Closes: #76 Approved by: rhatdan --- cmd/kpod/create.go | 12 ++++++++++++ cmd/kpod/run.go | 12 ++++++++++++ libpod/runtime_img.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/cmd/kpod/create.go b/cmd/kpod/create.go index 2684f8927..30837e7df 100644 --- a/cmd/kpod/create.go +++ b/cmd/kpod/create.go @@ -171,6 +171,18 @@ func createCmd(c *cli.Context) error { return err } if createImage.LocalName != "" { + nameIsID, err := runtime.IsImageID(createImage.LocalName) + if err != nil { + return err + } + if nameIsID { + // If the input from the user is an ID, then we need to get the image + // name for cstorage + createImage.LocalName, err = createImage.GetNameByID() + if err != nil { + return err + } + } imageName = createImage.LocalName } else { imageName, err = createImage.GetFQName() diff --git a/cmd/kpod/run.go b/cmd/kpod/run.go index 275654f65..b79ba5121 100644 --- a/cmd/kpod/run.go +++ b/cmd/kpod/run.go @@ -54,6 +54,18 @@ func runCmd(c *cli.Context) error { logrus.Debug("spec is ", runtimeSpec) if createImage.LocalName != "" { + nameIsID, err := runtime.IsImageID(createImage.LocalName) + if err != nil { + return err + } + if nameIsID { + // If the input from the user is an ID, then we need to get the image + // name for cstorage + createImage.LocalName, err = createImage.GetNameByID() + if err != nil { + return err + } + } imageName = createImage.LocalName } else { imageName, err = createImage.GetFQName() diff --git a/libpod/runtime_img.go b/libpod/runtime_img.go index eb9976d9b..873679b0a 100644 --- a/libpod/runtime_img.go +++ b/libpod/runtime_img.go @@ -138,6 +138,36 @@ func (r *Runtime) NewImage(name string) Image { } } +// IsImageID determines if the input is a valid image ID. +// The input can be a full or partial image ID +func (r *Runtime) IsImageID(input string) (bool, error) { + images, err := r.GetImages(&ImageFilterParams{}) + if err != nil { + return false, errors.Wrapf(err, "unable to get images") + } + for _, image := range images { + if strings.HasPrefix(image.ID, input) { + return true, nil + } + } + return false, nil +} + +// GetNameByID returns the name of the image when supplied +// the full or partion ID +func (k *Image) GetNameByID() (string, error) { + images, err := k.runtime.GetImages(&ImageFilterParams{}) + if err != nil { + return "", errors.Wrapf(err, "unable to get images") + } + for _, image := range images { + if strings.HasPrefix(image.ID, k.Name) { + return image.Names[0], nil + } + } + return "", errors.Errorf("unable to determine image for %s", k.Name) +} + // GetImageID returns the image ID of the image func (k *Image) GetImageID() (string, error) { // If the ID field is already populated, then @@ -309,6 +339,9 @@ func (k *Image) GetLocalImageName() (string, error) { return "", err } for _, image := range localImages { + if strings.HasPrefix(image.ID, k.Name) { + return image.ID, nil + } for _, name := range image.Names { imgRef, err := reference.Parse(name) if err != nil { -- cgit v1.2.3-54-g00ecf