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