github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/builder/digitalocean/step_power_off.go (about) 1 package digitalocean 2 3 import ( 4 "fmt" 5 "github.com/mitchellh/multistep" 6 "github.com/mitchellh/packer/packer" 7 "log" 8 "time" 9 ) 10 11 type stepPowerOff struct{} 12 13 func (s *stepPowerOff) Run(state map[string]interface{}) multistep.StepAction { 14 client := state["client"].(*DigitalOceanClient) 15 c := state["config"].(config) 16 ui := state["ui"].(packer.Ui) 17 dropletId := state["droplet_id"].(uint) 18 19 // Sleep arbitrarily before sending power off request 20 // Otherwise we get "pending event" errors, even though there isn't 21 // one. 22 log.Printf("Sleeping for %v, event_delay", c.RawEventDelay) 23 time.Sleep(c.eventDelay) 24 25 // Poweroff the droplet so it can be snapshot 26 err := client.PowerOffDroplet(dropletId) 27 28 if err != nil { 29 err := fmt.Errorf("Error powering off droplet: %s", err) 30 state["error"] = err 31 ui.Error(err.Error()) 32 return multistep.ActionHalt 33 } 34 35 ui.Say("Waiting for droplet to power off...") 36 37 err = waitForDropletState("off", dropletId, client, c) 38 if err != nil { 39 err := fmt.Errorf("Error waiting for droplet to become 'off': %s", err) 40 state["error"] = err 41 ui.Error(err.Error()) 42 return multistep.ActionHalt 43 } 44 45 return multistep.ActionContinue 46 } 47 48 func (s *stepPowerOff) Cleanup(state map[string]interface{}) { 49 // no cleanup 50 }