Allow sha256: prefix for input

We should allow users to pass in image ids with the sha256: prefix
for local images.

Resolves: #493

Signed-off-by: baude <bbaude@redhat.com>

Closes: #560
Approved by: baude
This commit is contained in:
baude 2018-03-28 09:15:55 -05:00 committed by Atomic Bot
parent 8a96b4acbc
commit 1e59053cc5
3 changed files with 35 additions and 2 deletions

View File

@ -102,7 +102,6 @@ func (ir *Runtime) newFromStorage(img *storage.Image) *Image {
// to only deal with local images already in the store (or // to only deal with local images already in the store (or
// its aliases) // its aliases)
func (ir *Runtime) NewFromLocal(name string) (*Image, error) { func (ir *Runtime) NewFromLocal(name string) (*Image, error) {
image := Image{ image := Image{
InputName: name, InputName: name,
Local: true, Local: true,
@ -166,6 +165,14 @@ func (i *Image) reloadImage() error {
return nil return nil
} }
// stringSha256 strips sha256 from user input
func stripSha256(name string) string {
if strings.HasPrefix(name, "sha256:") && len(name) > 7 {
return name[7:]
}
return name
}
// getLocalImage resolves an unknown input describing an image and // getLocalImage resolves an unknown input describing an image and
// returns a storage.Image or an error. It is used by NewFromLocal. // returns a storage.Image or an error. It is used by NewFromLocal.
func (i *Image) getLocalImage() (*storage.Image, error) { func (i *Image) getLocalImage() (*storage.Image, error) {
@ -174,7 +181,7 @@ func (i *Image) getLocalImage() (*storage.Image, error) {
return nil, errors.Errorf("input name is blank") return nil, errors.Errorf("input name is blank")
} }
var taggedName string var taggedName string
img, err := i.imageruntime.getImage(i.InputName) img, err := i.imageruntime.getImage(stripSha256(i.InputName))
if err == nil { if err == nil {
return img.image, err return img.image, err
} }

View File

@ -165,6 +165,7 @@ func TestImage_MatchRepoTag(t *testing.T) {
} }
// Test against tagged images of busybox // Test against tagged images of busybox
// foo should resolve to foo:latest // foo should resolve to foo:latest
repoTag, err := newImage.MatchRepoTag("foo") repoTag, err := newImage.MatchRepoTag("foo")
assert.NoError(t, err) assert.NoError(t, err)
@ -185,3 +186,14 @@ func Test_splitString(t *testing.T) {
assert.Equal(t, splitString("a/foo/bar"), "bar") assert.Equal(t, splitString("a/foo/bar"), "bar")
assert.Equal(t, splitString("bar"), "bar") assert.Equal(t, splitString("bar"), "bar")
} }
// Test_stripSha256 tests test the stripSha256 function which removes
// the prefix "sha256:" from a string if it is present
func Test_stripSha256(t *testing.T) {
assert.Equal(t, stripSha256(""), "")
assert.Equal(t, stripSha256("test1"), "test1")
assert.Equal(t, stripSha256("sha256:9110ae7f579f35ee0c3938696f23fe0f5fbe641738ea52eb83c2df7e9995fa17"), "9110ae7f579f35ee0c3938696f23fe0f5fbe641738ea52eb83c2df7e9995fa17")
assert.Equal(t, stripSha256("sha256:9110ae7f"), "9110ae7f")
assert.Equal(t, stripSha256("sha256:"), "sha256:")
assert.Equal(t, stripSha256("sha256:a"), "a")
}

View File

@ -3,6 +3,7 @@ package integration
import ( import (
"os" "os"
"fmt"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
) )
@ -129,4 +130,17 @@ var _ = Describe("Podman images", func() {
Expect(result.ExitCode()).To(Equal(0)) Expect(result.ExitCode()).To(Equal(0))
Expect(len(result.OutputToStringArray())).To(Equal(1)) Expect(len(result.OutputToStringArray())).To(Equal(1))
}) })
It("podman check for image with sha256: prefix", func() {
session := podmanTest.Podman([]string{"inspect", "--format=json", ALPINE})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
Expect(session.IsJSONOutputValid()).To(BeTrue())
imageData := session.InspectImageJSON()
result := podmanTest.Podman([]string{"images", fmt.Sprintf("sha256:%s", imageData[0].ID)})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
})
}) })