From 7f7fee3e2b98635b5836e8996ec576ffca0c2789 Mon Sep 17 00:00:00 2001 From: Julio Tain Sueiras Date: Wed, 7 Nov 2018 23:59:12 -0500 Subject: [PATCH] Added Creation of Snapshot to vSphere Template --- .../vsphere-template/post-processor.go | 6 ++ .../vsphere-template/step_create_snapshot.go | 81 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 post-processor/vsphere-template/step_create_snapshot.go diff --git a/post-processor/vsphere-template/post-processor.go b/post-processor/vsphere-template/post-processor.go index d6b4fa769..a281e33fb 100644 --- a/post-processor/vsphere-template/post-processor.go +++ b/post-processor/vsphere-template/post-processor.go @@ -31,6 +31,11 @@ type Config struct { Password string `mapstructure:"password"` Datacenter string `mapstructure:"datacenter"` Folder string `mapstructure:"folder"` + SnapshotEnable bool `mapstructure:"snapshot_enable"` + SnapshotName string `mapstructure:"snapshot_name"` + SnapshotDescription string `mapstructure:"snapshot_description"` + SnapshotMemory bool `mapstructure:"snapshot_memory"` + SnapshotQuiesce bool `mapstructure:"snapshot_quiesce"` ctx interpolate.Context } @@ -126,6 +131,7 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac &stepCreateFolder{ Folder: p.config.Folder, }, + NewStepCreateSnapshot(artifact, p), NewStepMarkAsTemplate(artifact), } runner := common.NewRunnerWithPauseFn(steps, p.config.PackerConfig, ui, state) diff --git a/post-processor/vsphere-template/step_create_snapshot.go b/post-processor/vsphere-template/step_create_snapshot.go new file mode 100644 index 000000000..e4db06c95 --- /dev/null +++ b/post-processor/vsphere-template/step_create_snapshot.go @@ -0,0 +1,81 @@ +package vsphere_template + +import ( + "context" + "strings" + + "github.com/hashicorp/packer/helper/multistep" + "github.com/hashicorp/packer/packer" + "github.com/hashicorp/packer/post-processor/vsphere" + "github.com/vmware/govmomi" +) + +type stepCreateSnapshot struct { + VMName string + RemoteFolder string + SnapshotName string + SnapshotDescription string + SnapshotMemory bool + SnapshotQuiesce bool + SnapshotEnable bool +} + +func NewStepCreateSnapshot(artifact packer.Artifact, p *PostProcessor) *stepCreateSnapshot { + remoteFolder := "Discovered virtual machine" + vmname := artifact.Id() + + if artifact.BuilderId() == vsphere.BuilderId { + id := strings.Split(artifact.Id(), "::") + remoteFolder = id[1] + vmname = id[2] + } + + return &stepCreateSnapshot{ + VMName: vmname, + RemoteFolder: remoteFolder, + SnapshotEnable: p.config.SnapshotEnable, + SnapshotName: p.config.SnapshotName, + SnapshotDescription: p.config.SnapshotDescription, + SnapshotMemory: p.config.SnapshotMemory, + SnapshotQuiesce: p.config.SnapshotQuiesce, + } +} + +func (s *stepCreateSnapshot) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { + ui := state.Get("ui").(packer.Ui) + cli := state.Get("client").(*govmomi.Client) + dcPath := state.Get("dcPath").(string) + + if !s.SnapshotEnable { + ui.Message("Snapshot Not Enabled, Continue...") + return multistep.ActionContinue + } + + ui.Message("Creating a Snapshot...") + + vm, err := findRuntimeVM(cli, dcPath, s.VMName, s.RemoteFolder) + + if err != nil { + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + task, err := vm.CreateSnapshot(context.Background(), s.SnapshotName, s.SnapshotDescription, s.SnapshotMemory, s.SnapshotQuiesce) + + if err != nil { + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + if err = task.Wait(context.Background()); err != nil { + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + return multistep.ActionContinue +} + +func (s *stepCreateSnapshot) Cleanup(multistep.StateBag) {}