github.phpd.cn/hashicorp/packer@v1.3.2/builder/vmware/common/step_upload_tools.go (about) 1 package common 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 8 "github.com/hashicorp/packer/helper/multistep" 9 "github.com/hashicorp/packer/packer" 10 "github.com/hashicorp/packer/template/interpolate" 11 ) 12 13 type toolsUploadPathTemplate struct { 14 Flavor string 15 } 16 17 type StepUploadTools struct { 18 RemoteType string 19 ToolsUploadFlavor string 20 ToolsUploadPath string 21 Ctx interpolate.Context 22 } 23 24 func (c *StepUploadTools) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 25 driver := state.Get("driver").(Driver) 26 27 if c.ToolsUploadFlavor == "" { 28 return multistep.ActionContinue 29 } 30 31 if c.RemoteType == "esx5" { 32 if err := driver.ToolsInstall(); err != nil { 33 state.Put("error", fmt.Errorf("Couldn't mount VMware tools ISO. Please check the 'guest_os_type' in your template.json.")) 34 } 35 return multistep.ActionContinue 36 } 37 38 comm := state.Get("communicator").(packer.Communicator) 39 tools_source := state.Get("tools_upload_source").(string) 40 ui := state.Get("ui").(packer.Ui) 41 42 ui.Say(fmt.Sprintf("Uploading the '%s' VMware Tools", c.ToolsUploadFlavor)) 43 f, err := os.Open(tools_source) 44 if err != nil { 45 state.Put("error", fmt.Errorf("Error opening VMware Tools ISO: %s", err)) 46 return multistep.ActionHalt 47 } 48 defer f.Close() 49 50 c.Ctx.Data = &toolsUploadPathTemplate{ 51 Flavor: c.ToolsUploadFlavor, 52 } 53 c.ToolsUploadPath, err = interpolate.Render(c.ToolsUploadPath, &c.Ctx) 54 if err != nil { 55 err := fmt.Errorf("Error preparing upload path: %s", err) 56 state.Put("error", err) 57 ui.Error(err.Error()) 58 return multistep.ActionHalt 59 } 60 61 if err := comm.Upload(c.ToolsUploadPath, f, nil); err != nil { 62 err := fmt.Errorf("Error uploading VMware Tools: %s", err) 63 state.Put("error", err) 64 ui.Error(err.Error()) 65 return multistep.ActionHalt 66 } 67 68 return multistep.ActionContinue 69 } 70 71 func (c *StepUploadTools) Cleanup(multistep.StateBag) {}