github.com/jerryclinesmith/packer@v0.3.7/builder/openstack/step_run_source_server.go (about)

     1  package openstack
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/mitchellh/multistep"
     6  	"github.com/mitchellh/packer/packer"
     7  	"github.com/rackspace/gophercloud"
     8  	"log"
     9  )
    10  
    11  type StepRunSourceServer struct {
    12  	Flavor      string
    13  	Name        string
    14  	SourceImage string
    15  
    16  	server *gophercloud.Server
    17  }
    18  
    19  func (s *StepRunSourceServer) Run(state multistep.StateBag) multistep.StepAction {
    20  	csp := state.Get("csp").(gophercloud.CloudServersProvider)
    21  	keyName := state.Get("keyPair").(string)
    22  	ui := state.Get("ui").(packer.Ui)
    23  
    24  	// XXX - validate image and flavor is available
    25  
    26  	server := gophercloud.NewServer{
    27  		Name:        s.Name,
    28  		ImageRef:    s.SourceImage,
    29  		FlavorRef:   s.Flavor,
    30  		KeyPairName: keyName,
    31  	}
    32  
    33  	serverResp, err := csp.CreateServer(server)
    34  	if err != nil {
    35  		err := fmt.Errorf("Error launching source server: %s", err)
    36  		state.Put("error", err)
    37  		ui.Error(err.Error())
    38  		return multistep.ActionHalt
    39  	}
    40  
    41  	s.server, err = csp.ServerById(serverResp.Id)
    42  	log.Printf("server id: %s", s.server.Id)
    43  
    44  	ui.Say(fmt.Sprintf("Waiting for server (%s) to become ready...", s.server.Id))
    45  	stateChange := StateChangeConf{
    46  		Pending:   []string{"BUILD"},
    47  		Target:    "ACTIVE",
    48  		Refresh:   ServerStateRefreshFunc(csp, s.server),
    49  		StepState: state,
    50  	}
    51  	latestServer, err := WaitForState(&stateChange)
    52  	if err != nil {
    53  		err := fmt.Errorf("Error waiting for server (%s) to become ready: %s", s.server.Id, err)
    54  		state.Put("error", err)
    55  		ui.Error(err.Error())
    56  		return multistep.ActionHalt
    57  	}
    58  
    59  	s.server = latestServer.(*gophercloud.Server)
    60  	state.Put("server", s.server)
    61  
    62  	return multistep.ActionContinue
    63  }
    64  
    65  func (s *StepRunSourceServer) Cleanup(state multistep.StateBag) {
    66  	if s.server == nil {
    67  		return
    68  	}
    69  
    70  	csp := state.Get("csp").(gophercloud.CloudServersProvider)
    71  	ui := state.Get("ui").(packer.Ui)
    72  
    73  	ui.Say("Terminating the source server...")
    74  	if err := csp.DeleteServerById(s.server.Id); err != nil {
    75  		ui.Error(fmt.Sprintf("Error terminating server, may still be around: %s", err))
    76  		return
    77  	}
    78  
    79  	stateChange := StateChangeConf{
    80  		Pending: []string{"ACTIVE", "BUILD", "REBUILD", "SUSPENDED"},
    81  		Refresh: ServerStateRefreshFunc(csp, s.server),
    82  		Target:  "DELETED",
    83  	}
    84  
    85  	WaitForState(&stateChange)
    86  }