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  }