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  }