github.com/homburg/packer@v0.6.1-0.20140528012651-1dcaf1716848/builder/openstack/step_run_source_server.go (about) 1 package openstack 2 3 import ( 4 "fmt" 5 "github.com/mitchellh/multistep" 6 "github.com/mitchellh/packer/packer" 7 "github.com/rackspace/gophercloud" 8 "log" 9 ) 10 11 type StepRunSourceServer struct { 12 Flavor string 13 Name string 14 SourceImage string 15 SecurityGroups []string 16 17 server *gophercloud.Server 18 } 19 20 func (s *StepRunSourceServer) Run(state multistep.StateBag) multistep.StepAction { 21 csp := state.Get("csp").(gophercloud.CloudServersProvider) 22 keyName := state.Get("keyPair").(string) 23 ui := state.Get("ui").(packer.Ui) 24 25 // XXX - validate image and flavor is available 26 27 securityGroups := make([]map[string]interface{}, len(s.SecurityGroups)) 28 for i, groupName := range s.SecurityGroups { 29 securityGroups[i] = make(map[string]interface{}) 30 securityGroups[i]["name"] = groupName 31 } 32 33 server := gophercloud.NewServer{ 34 Name: s.Name, 35 ImageRef: s.SourceImage, 36 FlavorRef: s.Flavor, 37 KeyPairName: keyName, 38 SecurityGroup: securityGroups, 39 } 40 41 serverResp, err := csp.CreateServer(server) 42 if err != nil { 43 err := fmt.Errorf("Error launching source server: %s", err) 44 state.Put("error", err) 45 ui.Error(err.Error()) 46 return multistep.ActionHalt 47 } 48 49 s.server, err = csp.ServerById(serverResp.Id) 50 log.Printf("server id: %s", s.server.Id) 51 52 ui.Say(fmt.Sprintf("Waiting for server (%s) to become ready...", s.server.Id)) 53 stateChange := StateChangeConf{ 54 Pending: []string{"BUILD"}, 55 Target: "ACTIVE", 56 Refresh: ServerStateRefreshFunc(csp, s.server), 57 StepState: state, 58 } 59 latestServer, err := WaitForState(&stateChange) 60 if err != nil { 61 err := fmt.Errorf("Error waiting for server (%s) to become ready: %s", s.server.Id, err) 62 state.Put("error", err) 63 ui.Error(err.Error()) 64 return multistep.ActionHalt 65 } 66 67 s.server = latestServer.(*gophercloud.Server) 68 state.Put("server", s.server) 69 70 return multistep.ActionContinue 71 } 72 73 func (s *StepRunSourceServer) Cleanup(state multistep.StateBag) { 74 if s.server == nil { 75 return 76 } 77 78 csp := state.Get("csp").(gophercloud.CloudServersProvider) 79 ui := state.Get("ui").(packer.Ui) 80 81 ui.Say("Terminating the source server...") 82 if err := csp.DeleteServerById(s.server.Id); err != nil { 83 ui.Error(fmt.Sprintf("Error terminating server, may still be around: %s", err)) 84 return 85 } 86 87 stateChange := StateChangeConf{ 88 Pending: []string{"ACTIVE", "BUILD", "REBUILD", "SUSPENDED"}, 89 Refresh: ServerStateRefreshFunc(csp, s.server), 90 Target: "DELETED", 91 } 92 93 WaitForState(&stateChange) 94 }