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  }