github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/builder/digitalocean/step_snapshot.go (about) 1 package digitalocean 2 3 import ( 4 "errors" 5 "fmt" 6 "github.com/mitchellh/multistep" 7 "github.com/mitchellh/packer/packer" 8 "log" 9 ) 10 11 type stepSnapshot struct{} 12 13 func (s *stepSnapshot) Run(state map[string]interface{}) multistep.StepAction { 14 client := state["client"].(*DigitalOceanClient) 15 ui := state["ui"].(packer.Ui) 16 c := state["config"].(config) 17 dropletId := state["droplet_id"].(uint) 18 19 ui.Say(fmt.Sprintf("Creating snapshot: %v", c.SnapshotName)) 20 err := client.CreateSnapshot(dropletId, c.SnapshotName) 21 if err != nil { 22 err := fmt.Errorf("Error creating snapshot: %s", err) 23 state["error"] = err 24 ui.Error(err.Error()) 25 return multistep.ActionHalt 26 } 27 28 ui.Say("Waiting for snapshot to complete...") 29 err = waitForDropletState("active", dropletId, client, c) 30 if err != nil { 31 err := fmt.Errorf("Error waiting for snapshot to complete: %s", err) 32 state["error"] = err 33 ui.Error(err.Error()) 34 return multistep.ActionHalt 35 } 36 37 log.Printf("Looking up snapshot ID for snapshot: %s", c.SnapshotName) 38 images, err := client.Images() 39 if err != nil { 40 err := fmt.Errorf("Error looking up snapshot ID: %s", err) 41 state["error"] = err 42 ui.Error(err.Error()) 43 return multistep.ActionHalt 44 } 45 46 var imageId uint 47 for _, image := range images { 48 if image.Name == c.SnapshotName { 49 imageId = image.Id 50 break 51 } 52 } 53 54 if imageId == 0 { 55 err := errors.New("Couldn't find snapshot to get the image ID. Bug?") 56 state["error"] = err 57 ui.Error(err.Error()) 58 return multistep.ActionHalt 59 } 60 61 log.Printf("Snapshot image ID: %d", imageId) 62 63 state["snapshot_image_id"] = imageId 64 state["snapshot_name"] = c.SnapshotName 65 66 return multistep.ActionContinue 67 } 68 69 func (s *stepSnapshot) Cleanup(state map[string]interface{}) { 70 // no cleanup 71 }