github.com/StackPointCloud/packer@v0.10.2-0.20180716202532-b28098e0f79b/builder/hyperv/common/step_export_vm.go (about) 1 package common 2 3 import ( 4 "context" 5 "fmt" 6 "io/ioutil" 7 "path/filepath" 8 9 "github.com/hashicorp/packer/helper/multistep" 10 "github.com/hashicorp/packer/packer" 11 ) 12 13 const ( 14 vhdDir string = "Virtual Hard Disks" 15 vmDir string = "Virtual Machines" 16 ) 17 18 type StepExportVm struct { 19 OutputDir string 20 SkipCompaction bool 21 SkipExport bool 22 } 23 24 func (s *StepExportVm) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 25 driver := state.Get("driver").(Driver) 26 ui := state.Get("ui").(packer.Ui) 27 var err error 28 var errorMsg string 29 30 vmName := state.Get("vmName").(string) 31 tmpPath := state.Get("packerTempDir").(string) 32 outputPath := s.OutputDir 33 expPath := s.OutputDir 34 35 // create temp path to export vm 36 errorMsg = "Error creating temp export path: %s" 37 vmExportPath, err := ioutil.TempDir(tmpPath, "export") 38 if err != nil { 39 err := fmt.Errorf(errorMsg, err) 40 state.Put("error", err) 41 ui.Error(err.Error()) 42 return multistep.ActionHalt 43 } 44 if !s.SkipExport { 45 ui.Say("Exporting vm...") 46 47 err = driver.ExportVirtualMachine(vmName, vmExportPath) 48 if err != nil { 49 errorMsg = "Error exporting vm: %s" 50 err := fmt.Errorf(errorMsg, err) 51 state.Put("error", err) 52 ui.Error(err.Error()) 53 return multistep.ActionHalt 54 } 55 // copy to output dir 56 expPath = filepath.Join(vmExportPath, vmName) 57 } 58 59 if s.SkipCompaction { 60 ui.Say("Skipping disk compaction...") 61 } else { 62 ui.Say("Compacting disks...") 63 err = driver.CompactDisks(expPath, vhdDir) 64 if err != nil { 65 errorMsg = "Error compacting disks: %s" 66 err := fmt.Errorf(errorMsg, err) 67 state.Put("error", err) 68 ui.Error(err.Error()) 69 return multistep.ActionHalt 70 } 71 } 72 73 if !s.SkipExport { 74 ui.Say("Copying to output dir...") 75 err = driver.CopyExportedVirtualMachine(expPath, outputPath, vhdDir, vmDir) 76 if err != nil { 77 errorMsg = "Error exporting vm: %s" 78 err := fmt.Errorf(errorMsg, err) 79 state.Put("error", err) 80 ui.Error(err.Error()) 81 return multistep.ActionHalt 82 } 83 } 84 return multistep.ActionContinue 85 } 86 87 func (s *StepExportVm) Cleanup(state multistep.StateBag) { 88 // do nothing 89 }