github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/builder/googlecompute/step_create_image.go (about) 1 package googlecompute 2 3 import ( 4 "errors" 5 "fmt" 6 "time" 7 8 "github.com/mitchellh/multistep" 9 "github.com/mitchellh/packer/packer" 10 ) 11 12 // StepCreateImage represents a Packer build step that creates GCE machine 13 // images. 14 type StepCreateImage int 15 16 // Run executes the Packer build step that creates a GCE machine image. 17 // 18 // The image is created from the persistent disk used by the instance. The 19 // instance must be deleted and the disk retained before doing this step. 20 func (s *StepCreateImage) Run(state multistep.StateBag) multistep.StepAction { 21 config := state.Get("config").(*Config) 22 driver := state.Get("driver").(Driver) 23 ui := state.Get("ui").(packer.Ui) 24 25 if config.PackerForce && config.imageAlreadyExists { 26 ui.Say("Deleting previous image...") 27 28 errCh := driver.DeleteImage(config.ImageName) 29 err := <-errCh 30 if err != nil { 31 err := fmt.Errorf("Error deleting image: %s", err) 32 state.Put("error", err) 33 ui.Error(err.Error()) 34 return multistep.ActionHalt 35 } 36 } 37 38 ui.Say("Creating image...") 39 40 imageCh, errCh := driver.CreateImage( 41 config.ImageName, config.ImageDescription, config.ImageFamily, config.Zone, 42 config.DiskName) 43 var err error 44 select { 45 case err = <-errCh: 46 case <-time.After(config.stateTimeout): 47 err = errors.New("time out while waiting for image to register") 48 } 49 50 if err != nil { 51 err := fmt.Errorf("Error waiting for image: %s", err) 52 state.Put("error", err) 53 ui.Error(err.Error()) 54 return multistep.ActionHalt 55 } 56 57 state.Put("image", <-imageCh) 58 return multistep.ActionContinue 59 } 60 61 // Cleanup. 62 func (s *StepCreateImage) Cleanup(state multistep.StateBag) {}