Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 40d1159

Browse files
authored
Merge pull request #4131 from cambridgeconsultants/vsphere-add-folder-flag
driver/vmwarevsphere: add --vmwarevsphere-folder flag
2 parents f748ac1 + 1b3d44a commit 40d1159

1 file changed

Lines changed: 39 additions & 2 deletions

File tree

drivers/vmwarevsphere/vsphere.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ type Driver struct {
6161
Networks []string
6262
Datastore string
6363
Datacenter string
64+
Folder string
6465
Pool string
6566
HostSystem string
6667
CfgParams []string
@@ -141,6 +142,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
141142
Name: "vmwarevsphere-datacenter",
142143
Usage: "vSphere datacenter for docker VM",
143144
},
145+
mcnflag.StringFlag{
146+
EnvVar: "VSPHERE_FOLDER",
147+
Name: "vmwarevsphere-folder",
148+
Usage: "vSphere folder for the docker VM. This folder must already exist in the datacenter.",
149+
},
144150
mcnflag.StringFlag{
145151
EnvVar: "VSPHERE_POOL",
146152
Name: "vmwarevsphere-pool",
@@ -210,6 +216,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
210216
d.Networks = flags.StringSlice("vmwarevsphere-network")
211217
d.Datastore = flags.String("vmwarevsphere-datastore")
212218
d.Datacenter = flags.String("vmwarevsphere-datacenter")
219+
// Sanitize input on ingress.
220+
d.Folder = strings.Trim(flags.String("vmwarevsphere-folder"), "/")
213221
d.Pool = flags.String("vmwarevsphere-pool")
214222
d.HostSystem = flags.String("vmwarevsphere-hostsystem")
215223
d.CfgParams = flags.StringSlice("vmwarevsphere-cfgparam")
@@ -337,6 +345,24 @@ func (d *Driver) PreCreateCheck() error {
337345

338346
f.SetDatacenter(dc)
339347

348+
// Folder
349+
if d.Folder != "" {
350+
// Find the specified Folder to create the VM in.
351+
folders, err := dc.Folders(ctx)
352+
if err != nil {
353+
return err
354+
}
355+
folder, err := f.Folder(ctx, fmt.Sprintf("%s/%s", folders.VmFolder.InventoryPath, d.Folder))
356+
// It's an error to not find the folder, or for the search itself to fail.
357+
if err != nil {
358+
// The search itself failed.
359+
return err
360+
}
361+
if folder == nil {
362+
return fmt.Errorf("failed to find VM Folder '%s'", d.Folder)
363+
}
364+
}
365+
340366
if _, err := f.DatastoreOrDefault(ctx, d.Datastore); err != nil {
341367
return err
342368
}
@@ -485,7 +511,14 @@ func (d *Driver) Create() error {
485511

486512
log.Infof("Creating VM...")
487513
folders, err := dc.Folders(ctx)
488-
task, err := folders.VmFolder.CreateVM(ctx, spec, rp, hs)
514+
folder := folders.VmFolder
515+
if d.Folder != "" {
516+
folder, err = f.Folder(ctx, fmt.Sprintf("%s/%s", folders.VmFolder.InventoryPath, d.Folder))
517+
if err != nil {
518+
return err
519+
}
520+
}
521+
task, err := folder.CreateVM(ctx, spec, rp, hs)
489522
if err != nil {
490523
return err
491524
}
@@ -973,7 +1006,11 @@ func (d *Driver) fetchVM(ctx context.Context, c *govmomi.Client, vmname string)
9731006

9741007
f.SetDatacenter(dc)
9751008

976-
vm, err = f.VirtualMachine(ctx, vmname)
1009+
vmPath := vmname
1010+
if d.Folder != "" {
1011+
vmPath = fmt.Sprintf("%s/%s", d.Folder, vmname)
1012+
}
1013+
vm, err = f.VirtualMachine(ctx, vmPath)
9771014
if err != nil {
9781015
return vm, err
9791016
}

0 commit comments

Comments
 (0)