@@ -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