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  }