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  }