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