github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/builder/googlecompute/step_wait_startup_script.go (about) 1 package googlecompute 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/mitchellh/multistep" 8 "github.com/mitchellh/packer/common" 9 "github.com/mitchellh/packer/packer" 10 ) 11 12 type StepWaitStartupScript int 13 14 // Run reads the instance metadata and looks for the log entry 15 // indicating the startup script finished. 16 func (s *StepWaitStartupScript) Run(state multistep.StateBag) multistep.StepAction { 17 config := state.Get("config").(*Config) 18 driver := state.Get("driver").(Driver) 19 ui := state.Get("ui").(packer.Ui) 20 instanceName := state.Get("instance_name").(string) 21 22 ui.Say("Waiting for any running startup script to finish...") 23 24 // Keep checking the serial port output to see if the startup script is done. 25 err := common.Retry(10, 60, 0, func() (bool, error) { 26 status, err := driver.GetInstanceMetadata(config.Zone, 27 instanceName, StartupScriptStatusKey) 28 29 if err != nil { 30 err := fmt.Errorf("Error getting startup script status: %s", err) 31 return false, err 32 } 33 34 if status == StartupScriptStatusError { 35 err = errors.New("Startup script error.") 36 return false, err 37 } 38 39 done := status == StartupScriptStatusDone 40 if !done { 41 ui.Say("Startup script not finished yet. Waiting...") 42 } 43 44 return done, nil 45 }) 46 47 if err != nil { 48 err := fmt.Errorf("Error waiting for startup script to finish: %s", err) 49 state.Put("error", err) 50 ui.Error(err.Error()) 51 return multistep.ActionHalt 52 } 53 ui.Say("Startup script, if any, has finished running.") 54 return multistep.ActionContinue 55 } 56 57 // Cleanup. 58 func (s *StepWaitStartupScript) Cleanup(state multistep.StateBag) {}