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  }