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