summaryrefslogtreecommitdiff
path: root/vendor/github.com/mitchellh/packer/post-processor/vsphere-template/step_create_folder.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mitchellh/packer/post-processor/vsphere-template/step_create_folder.go')
-rw-r--r--vendor/github.com/mitchellh/packer/post-processor/vsphere-template/step_create_folder.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/vendor/github.com/mitchellh/packer/post-processor/vsphere-template/step_create_folder.go b/vendor/github.com/mitchellh/packer/post-processor/vsphere-template/step_create_folder.go
new file mode 100644
index 00000000..a0e64827
--- /dev/null
+++ b/vendor/github.com/mitchellh/packer/post-processor/vsphere-template/step_create_folder.go
@@ -0,0 +1,86 @@
+package vsphere_template
+
+import (
+ "context"
+ "fmt"
+ "path"
+
+ "github.com/hashicorp/packer/packer"
+ "github.com/mitchellh/multistep"
+ "github.com/vmware/govmomi"
+ "github.com/vmware/govmomi/object"
+)
+
+type stepCreateFolder struct {
+ Folder string
+}
+
+func (s *stepCreateFolder) Run(state multistep.StateBag) multistep.StepAction {
+ ui := state.Get("ui").(packer.Ui)
+ cli := state.Get("client").(*govmomi.Client)
+ dcPath := state.Get("dcPath").(string)
+
+ ui.Message("Creating or checking destination folders...")
+
+ base := path.Join(dcPath, "vm")
+ fullPath := path.Join(base, s.Folder)
+ si := object.NewSearchIndex(cli.Client)
+
+ var folders []string
+ var err error
+ var ref object.Reference
+
+ // We iterate over the path starting with full path
+ // If we don't find it, we save the folder name and continue with the previous path
+ // The iteration ends when we find an existing path otherwise it throws error
+ for {
+ ref, err = si.FindByInventoryPath(context.Background(), fullPath)
+ if err != nil {
+ state.Put("error", err)
+ ui.Error(err.Error())
+ return multistep.ActionHalt
+ }
+
+ if ref == nil {
+ dir, folder := path.Split(fullPath)
+ fullPath = path.Clean(dir)
+
+ if fullPath == dcPath {
+ err = fmt.Errorf("vSphere base path %s not found", base)
+ state.Put("error", err)
+ ui.Error(err.Error())
+ return multistep.ActionHalt
+ }
+
+ folders = append(folders, folder)
+ } else {
+ break
+ }
+ }
+
+ if root, ok := ref.(*object.Folder); ok {
+ for i := len(folders) - 1; i >= 0; i-- {
+ ui.Message(fmt.Sprintf("Creating folder: %v", folders[i]))
+
+ root, err = root.CreateFolder(context.Background(), folders[i])
+ if err != nil {
+ state.Put("error", err)
+ ui.Error(err.Error())
+ return multistep.ActionHalt
+ }
+
+ fullPath = path.Join(fullPath, folders[i])
+ }
+ root.SetInventoryPath(fullPath)
+ state.Put("folder", root)
+ } else {
+ err = fmt.Errorf("folder not found: '%v'", ref)
+ state.Put("error", err)
+ ui.Error(err.Error())
+ return multistep.ActionHalt
+ }
+
+ return multistep.ActionContinue
+}
+
+func (s *stepCreateFolder) Cleanup(multistep.StateBag) {}