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