github.com/askholme/packer@v0.7.2-0.20140924152349-70d9566a6852/post-processor/vagrant-cloud/step_create_provider.go (about)

     1  package vagrantcloud
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/mitchellh/multistep"
     6  	"github.com/mitchellh/packer/packer"
     7  )
     8  
     9  type Provider struct {
    10  	Name        string `json:"name"`
    11  	HostedToken string `json:"hosted_token,omitempty"`
    12  	UploadUrl   string `json:"upload_url,omitempty"`
    13  }
    14  
    15  type stepCreateProvider struct {
    16  	name string // the name of the provider
    17  }
    18  
    19  func (s *stepCreateProvider) Run(state multistep.StateBag) multistep.StepAction {
    20  	client := state.Get("client").(*VagrantCloudClient)
    21  	ui := state.Get("ui").(packer.Ui)
    22  	box := state.Get("box").(*Box)
    23  	version := state.Get("version").(*Version)
    24  	providerName := state.Get("providerName").(string)
    25  
    26  	path := fmt.Sprintf("box/%s/version/%v/providers", box.Tag, version.Number)
    27  
    28  	provider := &Provider{Name: providerName}
    29  
    30  	// Wrap the provider in a provider object for the API
    31  	wrapper := make(map[string]interface{})
    32  	wrapper["provider"] = provider
    33  
    34  	ui.Say(fmt.Sprintf("Creating provider: %s", providerName))
    35  
    36  	resp, err := client.Post(path, wrapper)
    37  
    38  	if err != nil || (resp.StatusCode != 200) {
    39  		cloudErrors := &VagrantCloudErrors{}
    40  		err = decodeBody(resp, cloudErrors)
    41  		state.Put("error", fmt.Errorf("Error creating provider: %s", cloudErrors.FormatErrors()))
    42  		return multistep.ActionHalt
    43  	}
    44  
    45  	if err = decodeBody(resp, provider); err != nil {
    46  		state.Put("error", fmt.Errorf("Error parsing provider response: %s", err))
    47  		return multistep.ActionHalt
    48  	}
    49  
    50  	// Save the name for cleanup
    51  	s.name = provider.Name
    52  
    53  	state.Put("provider", provider)
    54  
    55  	return multistep.ActionContinue
    56  }
    57  
    58  func (s *stepCreateProvider) Cleanup(state multistep.StateBag) {
    59  	client := state.Get("client").(*VagrantCloudClient)
    60  	ui := state.Get("ui").(packer.Ui)
    61  	box := state.Get("box").(*Box)
    62  	version := state.Get("version").(*Version)
    63  
    64  	// If we didn't save the provider name, it likely doesn't exist
    65  	if s.name == "" {
    66  		ui.Say("Cleaning up provider")
    67  		ui.Message("Provider was not created, not deleting")
    68  		return
    69  	}
    70  
    71  	_, cancelled := state.GetOk(multistep.StateCancelled)
    72  	_, halted := state.GetOk(multistep.StateHalted)
    73  
    74  	// Return if we didn't cancel or halt, and thus need
    75  	// no cleanup
    76  	if !cancelled && !halted {
    77  		return
    78  	}
    79  
    80  	ui.Say("Cleaning up provider")
    81  	ui.Message(fmt.Sprintf("Deleting provider: %s", s.name))
    82  
    83  	path := fmt.Sprintf("box/%s/version/%v/provider/%s", box.Tag, version.Number, s.name)
    84  
    85  	// No need for resp from the cleanup DELETE
    86  	_, err := client.Delete(path)
    87  
    88  	if err != nil {
    89  		ui.Error(fmt.Sprintf("Error destroying provider: %s", err))
    90  	}
    91  }