github.com/emc-advanced-dev/unik@v0.0.0-20190717152701-a58d3e8e33b7/pkg/providers/qemu/pull_image.go (about) 1 package qemu 2 3 import ( 4 "github.com/sirupsen/logrus" 5 "github.com/emc-advanced-dev/pkg/errors" 6 "github.com/solo-io/unik/pkg/providers/common" 7 "github.com/solo-io/unik/pkg/types" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 ) 12 13 func (p *QemuProvider) PullImage(params types.PullImagePararms) error { 14 images, err := p.ListImages() 15 if err != nil { 16 return errors.New("retrieving image list for existing image", err) 17 } 18 for _, image := range images { 19 if image.Name == params.ImageName { 20 if !params.Force { 21 return errors.New("an image already exists with name '"+params.ImageName+"', try again with --force", nil) 22 } else { 23 logrus.WithField("image", image).Warnf("force: deleting previous image with name " + params.ImageName) 24 if err := p.DeleteImage(image.Id, true); err != nil { 25 logrus.Warn(errors.New("failed removing previously existing image", err)) 26 } 27 } 28 } 29 } 30 31 tmpImage, err := ioutil.TempFile("", "tmp-pull-image-"+params.ImageName) 32 if err != nil { 33 return errors.New("creating tmp file", err) 34 } 35 defer os.RemoveAll(tmpImage.Name()) 36 image, err := common.PullImage(params.Config, params.ImageName, tmpImage) 37 if err != nil { 38 return errors.New("pulling image", err) 39 } 40 imagePath := getImagePath(image.Name) 41 os.MkdirAll(filepath.Dir(imagePath), 0755) 42 if err := os.Rename(tmpImage.Name(), imagePath); err != nil { 43 return errors.New("renaming tmp image to "+imagePath, err) 44 } 45 46 if err := p.state.ModifyImages(func(images map[string]*types.Image) error { 47 images[image.Name] = image 48 return nil 49 }); err != nil { 50 return errors.New("modifying image map in state", err) 51 } 52 logrus.Infof("image %v pulled successfully from %v", err) 53 return nil 54 }