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