podman pull should always try to pull

In the case where you have an image local, if the the user runs
podman pull, we should always attempt to pull an updated image.

Added a forceRemote bool to New (image) so we can differentiate
between "pull" or run because the actions differ.  Run does not
need to pull the latest -- only run.

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

Closes: #618
Approved by: baude
This commit is contained in:
baude
2018-04-14 15:34:48 -05:00
committed by Atomic Bot
parent 62b59df053
commit fa8442e4a0
6 changed files with 18 additions and 16 deletions

View File

@ -181,7 +181,7 @@ func createCmd(c *cli.Context) error {
rtc := runtime.GetConfig() rtc := runtime.GetConfig()
newImage, err := runtime.ImageRuntime().New(c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}) newImage, err := runtime.ImageRuntime().New(c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false)
if err != nil { if err != nil {
return err return err
} }

View File

@ -99,17 +99,17 @@ func loadCmd(c *cli.Context) error {
} }
src := libpod.DockerArchive + ":" + input src := libpod.DockerArchive + ":" + input
newImage, err := runtime.ImageRuntime().New(src, c.String("signature-policy"), "", writer, &libpodImage.DockerRegistryOptions{}, libpodImage.SigningOptions{}) newImage, err := runtime.ImageRuntime().New(src, c.String("signature-policy"), "", writer, &libpodImage.DockerRegistryOptions{}, libpodImage.SigningOptions{}, false)
if err != nil { if err != nil {
// generate full src name with specified image:tag // generate full src name with specified image:tag
fullSrc := libpod.OCIArchive + ":" + input fullSrc := libpod.OCIArchive + ":" + input
if image != "" { if image != "" {
fullSrc = fullSrc + ":" + image fullSrc = fullSrc + ":" + image
} }
newImage, err = runtime.ImageRuntime().New(fullSrc, c.String("signature-policy"), "", writer, &libpodImage.DockerRegistryOptions{}, libpodImage.SigningOptions{}) newImage, err = runtime.ImageRuntime().New(fullSrc, c.String("signature-policy"), "", writer, &libpodImage.DockerRegistryOptions{}, libpodImage.SigningOptions{}, false)
if err != nil { if err != nil {
src = libpod.DirTransport + ":" + input src = libpod.DirTransport + ":" + input
newImage, err = runtime.ImageRuntime().New(src, c.String("signature-policy"), "", writer, &libpodImage.DockerRegistryOptions{}, libpodImage.SigningOptions{}) newImage, err = runtime.ImageRuntime().New(src, c.String("signature-policy"), "", writer, &libpodImage.DockerRegistryOptions{}, libpodImage.SigningOptions{}, false)
if err != nil { if err != nil {
return errors.Wrapf(err, "error pulling %q", src) return errors.Wrapf(err, "error pulling %q", src)
} }

View File

@ -99,7 +99,7 @@ func pullCmd(c *cli.Context) error {
DockerInsecureSkipTLSVerify: !c.BoolT("tls-verify"), DockerInsecureSkipTLSVerify: !c.BoolT("tls-verify"),
} }
newImage, err := runtime.ImageRuntime().New(image, c.String("signature-policy"), c.String("authfile"), writer, &dockerRegistryOptions, image2.SigningOptions{}) newImage, err := runtime.ImageRuntime().New(image, c.String("signature-policy"), c.String("authfile"), writer, &dockerRegistryOptions, image2.SigningOptions{}, true)
if err != nil { if err != nil {
return errors.Wrapf(err, "error pulling image %q", image) return errors.Wrapf(err, "error pulling image %q", image)
} }

View File

@ -56,7 +56,7 @@ func runCmd(c *cli.Context) error {
} }
rtc := runtime.GetConfig() rtc := runtime.GetConfig()
newImage, err := runtime.ImageRuntime().New(c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}) newImage, err := runtime.ImageRuntime().New(c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false)
if err != nil { if err != nil {
return errors.Wrapf(err, "unable to find image") return errors.Wrapf(err, "unable to find image")
} }

View File

@ -117,19 +117,21 @@ func (ir *Runtime) NewFromLocal(name string) (*Image, error) {
// New creates a new image object where the image could be local // New creates a new image object where the image could be local
// or remote // or remote
func (ir *Runtime) New(name, signaturePolicyPath, authfile string, writer io.Writer, dockeroptions *DockerRegistryOptions, signingoptions SigningOptions) (*Image, error) { func (ir *Runtime) New(name, signaturePolicyPath, authfile string, writer io.Writer, dockeroptions *DockerRegistryOptions, signingoptions SigningOptions, forcePull bool) (*Image, error) {
// We don't know if the image is local or not ... check local first // We don't know if the image is local or not ... check local first
newImage := Image{ newImage := Image{
InputName: name, InputName: name,
Local: false, Local: false,
imageruntime: ir, imageruntime: ir,
} }
if !forcePull {
localImage, err := newImage.getLocalImage() localImage, err := newImage.getLocalImage()
if err == nil { if err == nil {
newImage.Local = true newImage.Local = true
newImage.image = localImage newImage.image = localImage
return &newImage, nil return &newImage, nil
} }
}
// The image is not local // The image is not local
if signaturePolicyPath == "" { if signaturePolicyPath == "" {

View File

@ -81,9 +81,9 @@ func TestImage_NewFromLocal(t *testing.T) {
// Need images to be present for this test // Need images to be present for this test
ir, err := NewImageRuntimeFromOptions(so) ir, err := NewImageRuntimeFromOptions(so)
assert.NoError(t, err) assert.NoError(t, err)
bb, err := ir.New("docker.io/library/busybox:latest", "", "", writer, nil, SigningOptions{}) bb, err := ir.New("docker.io/library/busybox:latest", "", "", writer, nil, SigningOptions{}, false)
assert.NoError(t, err) assert.NoError(t, err)
bbglibc, err := ir.New("docker.io/library/busybox:glibc", "", "", writer, nil, SigningOptions{}) bbglibc, err := ir.New("docker.io/library/busybox:glibc", "", "", writer, nil, SigningOptions{}, false)
assert.NoError(t, err) assert.NoError(t, err)
tm, err := makeLocalMatrix(bb, bbglibc) tm, err := makeLocalMatrix(bb, bbglibc)
@ -126,7 +126,7 @@ func TestImage_New(t *testing.T) {
// Iterate over the names and delete the image // Iterate over the names and delete the image
// after the pull // after the pull
for _, img := range names { for _, img := range names {
newImage, err := ir.New(img, "", "", writer, nil, SigningOptions{}) newImage, err := ir.New(img, "", "", writer, nil, SigningOptions{}, false)
assert.NoError(t, err) assert.NoError(t, err)
assert.NotEqual(t, newImage.ID(), "") assert.NotEqual(t, newImage.ID(), "")
err = newImage.Remove(false) err = newImage.Remove(false)
@ -150,7 +150,7 @@ func TestImage_MatchRepoTag(t *testing.T) {
} }
ir, err := NewImageRuntimeFromOptions(so) ir, err := NewImageRuntimeFromOptions(so)
assert.NoError(t, err) assert.NoError(t, err)
newImage, err := ir.New("busybox", "", "", os.Stdout, nil, SigningOptions{}) newImage, err := ir.New("busybox", "", "", os.Stdout, nil, SigningOptions{}, false)
assert.NoError(t, err) assert.NoError(t, err)
err = newImage.TagImage("foo:latest") err = newImage.TagImage("foo:latest")
assert.NoError(t, err) assert.NoError(t, err)