github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/builder/oneandone/step_create_server.go (about) 1 package oneandone 2 3 import ( 4 "fmt" 5 "github.com/1and1/oneandone-cloudserver-sdk-go" 6 "github.com/mitchellh/multistep" 7 "github.com/mitchellh/packer/packer" 8 "strings" 9 "time" 10 ) 11 12 type stepCreateServer struct{} 13 14 func (s *stepCreateServer) Run(state multistep.StateBag) multistep.StepAction { 15 ui := state.Get("ui").(packer.Ui) 16 c := state.Get("config").(*Config) 17 18 if sshkey, ok := state.GetOk("publicKey"); ok { 19 c.SSHKey = sshkey.(string) 20 } 21 22 token := oneandone.SetToken(c.Token) 23 24 //Create an API client 25 api := oneandone.New(token, c.Url) 26 27 // List server appliances 28 saps, _ := api.ListServerAppliances() 29 30 time.Sleep(time.Second * 10) 31 32 var sa oneandone.ServerAppliance 33 for _, a := range saps { 34 35 if a.Type == "IMAGE" && strings.Contains(strings.ToLower(a.Name), strings.ToLower(c.Image)) { 36 sa = a 37 break 38 } 39 } 40 41 if c.DiskSize < sa.MinHddSize { 42 ui.Error(fmt.Sprintf("Minimum required disk size %d", sa.MinHddSize)) 43 } 44 45 ui.Say("Creating Server...") 46 47 // Create a server 48 req := oneandone.ServerRequest{ 49 Name: c.SnapshotName, 50 Description: "Example server description.", 51 ApplianceId: sa.Id, 52 PowerOn: true, 53 Hardware: oneandone.Hardware{ 54 Vcores: 1, 55 CoresPerProcessor: 1, 56 Ram: 2, 57 Hdds: []oneandone.Hdd{ 58 { 59 Size: c.DiskSize, 60 IsMain: true, 61 }, 62 }, 63 }, 64 } 65 66 if c.DataCenterId != "" { 67 req.DatacenterId = c.DataCenterId 68 } 69 70 if c.Comm.SSHPassword != "" { 71 req.Password = c.Comm.SSHPassword 72 } 73 if c.SSHKey != "" { 74 req.SSHKey = c.SSHKey 75 } 76 77 server_id, server, err := api.CreateServer(&req) 78 79 if err == nil { 80 // Wait until server is created and powered on for at most 60 x 10 seconds 81 err = api.WaitForState(server, "POWERED_ON", 10, c.Retries) 82 } else { 83 ui.Error(err.Error()) 84 return multistep.ActionHalt 85 } 86 87 // Get a server 88 server, err = api.GetServer(server_id) 89 if err != nil { 90 ui.Error(err.Error()) 91 return multistep.ActionHalt 92 } 93 94 state.Put("server_id", server_id) 95 96 state.Put("server_ip", server.Ips[0].Ip) 97 98 return multistep.ActionContinue 99 } 100 101 func (s *stepCreateServer) Cleanup(state multistep.StateBag) { 102 c := state.Get("config").(*Config) 103 ui := state.Get("ui").(packer.Ui) 104 105 ui.Say("Removing Server...") 106 107 token := oneandone.SetToken(c.Token) 108 //Create an API client 109 api := oneandone.New(token, oneandone.BaseUrl) 110 111 var serverId string 112 if temp, ok := state.GetOk("server_id"); ok { 113 serverId = temp.(string) 114 } 115 116 if serverId != "" { 117 server, err := api.ShutdownServer(serverId, false) 118 if err != nil { 119 ui.Error(fmt.Sprintf("Error shutting down 1and1 server. Please destroy it manually: %s", serverId)) 120 ui.Error(err.Error()) 121 } 122 err = api.WaitForState(server, "POWERED_OFF", 10, c.Retries) 123 124 server, err = api.DeleteServer(server.Id, false) 125 126 if err != nil { 127 ui.Error(fmt.Sprintf("Error deleting 1and1 server. Please destroy it manually: %s", serverId)) 128 ui.Error(err.Error()) 129 } 130 } 131 }