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 }