@@ -373,6 +373,25 @@ def find_host_portgroup_by_name(host, portgroup_name):
373
373
return None
374
374
375
375
376
+ def get_folder_abs_path (dcpath , dcname , folder ):
377
+ if not dcpath .endswith ('/' ):
378
+ dcpath += '/'
379
+
380
+ folder = folder .rstrip ('/' )
381
+
382
+ # Check for full path first in case it was already supplied
383
+ if (folder .startswith (dcpath + dcname + '/vm' ) or
384
+ folder .startswith (dcpath + '/' + dcname + '/vm' )):
385
+ fullpath = folder
386
+ elif folder .startswith ('/vm/' ) or folder == '/vm' :
387
+ fullpath = "%s%s%s" % (dcpath , dcname , folder )
388
+ elif folder .startswith ('/' ):
389
+ fullpath = "%s%s/vm%s" % (dcpath , dcname , folder )
390
+ else :
391
+ fullpath = "%s%s/vm/%s" % (dcpath , dcname , folder )
392
+ return fullpath
393
+
394
+
376
395
def compile_folder_path_for_object (vobj ):
377
396
""" make a /vm/foo/bar/baz like folder path for an object """
378
397
@@ -1217,62 +1236,44 @@ def get_vm(self):
1217
1236
1218
1237
# get_managed_objects_properties may return multiple virtual machine,
1219
1238
# following code tries to find user desired one depending upon the folder specified.
1220
- if len (vms ) > 1 :
1221
- # We have found multiple virtual machines, decide depending upon folder value
1222
- if self .params ['folder' ] is None :
1223
- self .module .fail_json (msg = "Multiple virtual machines with same name [%s] found, "
1224
- "Folder value is a required parameter to find uniqueness "
1225
- "of the virtual machine" % self .params ['name' ],
1226
- details = "Please see documentation of the vmware_guest module "
1227
- "for folder parameter." )
1228
-
1239
+ if len (vms ) >= 1 :
1229
1240
# Get folder path where virtual machine is located
1230
1241
# User provided folder where user thinks virtual machine is present
1231
- user_folder = self .params ['folder' ]
1232
- # User defined datacenter
1233
- user_defined_dc = self .params ['datacenter' ]
1234
- # User defined datacenter's object
1235
- datacenter_obj = find_datacenter_by_name (self .content , self .params ['datacenter' ])
1236
- # Get Path for Datacenter
1237
- dcpath = compile_folder_path_for_object (vobj = datacenter_obj )
1238
-
1239
- # Nested folder does not return trailing /
1240
- if not dcpath .endswith ('/' ):
1241
- dcpath += '/'
1242
-
1242
+ user_folder = self .params .get ('folder' )
1243
+ # We have found multiple virtual machines, decide depending upon folder value
1243
1244
if user_folder in [None , '' , '/' ]:
1244
- # User provided blank value or
1245
- # User provided only root value, we fail
1246
- self .module .fail_json (msg = "vmware_guest found multiple virtual machines with same "
1247
- "name [%s], please specify folder path other than blank "
1248
- "or '/'" % self .params ['name' ])
1249
- elif user_folder .startswith ('/vm/' ):
1250
- # User provided nested folder under VMware default vm folder i.e. folder = /vm/india/finance
1251
- user_desired_path = "%s%s%s" % (dcpath , user_defined_dc , user_folder )
1245
+ if len (vms ) == 1 :
1246
+ vm_obj = vms [0 ]
1247
+ else :
1248
+ # User provided blank value or
1249
+ # User provided only root value, we fail
1250
+ self .module .fail_json (msg = "Multiple virtual machines with same name [%s] found, "
1251
+ "Folder value is a required parameter to find uniqueness "
1252
+ "of the virtual machine" % self .params ['name' ],
1253
+ details = "Please see documentation of the vmware_guest module "
1254
+ "for folder parameter." )
1252
1255
else :
1253
- # User defined datacenter is not nested i.e. dcpath = '/' , or
1254
- # User defined datacenter is nested i.e. dcpath = '/F0/DC0' or
1255
- # User provided folder starts with / and datacenter i.e. folder = /ha-datacenter/ or
1256
- # User defined folder starts with datacenter without '/' i.e.
1257
- # folder = DC0/vm/india/finance or
1258
- # folder = DC0/vm
1259
- user_desired_path = user_folder
1260
-
1261
- for vm in vms :
1262
- # Check if user has provided same path as virtual machine
1263
- actual_vm_folder_path = self .get_vm_path (content = self .content , vm_name = vm )
1264
- if not actual_vm_folder_path .startswith ("%s%s" % (dcpath , user_defined_dc )):
1265
- continue
1266
- if user_desired_path in actual_vm_folder_path :
1267
- vm_obj = vm
1268
- break
1269
- elif vms :
1270
- # Unique virtual machine found.
1271
- actual_vm_folder_path = self .get_vm_path (content = self .content , vm_name = vms [0 ])
1272
- if self .params .get ('folder' ) is None :
1273
- vm_obj = vms [0 ]
1274
- elif self .params ['folder' ] in actual_vm_folder_path :
1275
- vm_obj = vms [0 ]
1256
+ # User defined datacenter
1257
+ user_defined_dc = self .params ['datacenter' ]
1258
+ # User defined datacenter's object
1259
+ datacenter_obj = find_datacenter_by_name (self .content , self .params ['datacenter' ])
1260
+ # Get Path for Datacenter
1261
+ dcpath = compile_folder_path_for_object (vobj = datacenter_obj )
1262
+
1263
+ # Nested folder does not return trailing /
1264
+ if not dcpath .endswith ('/' ):
1265
+ dcpath += '/'
1266
+
1267
+ user_desired_path = get_folder_abs_path (dcpath , user_defined_dc , user_folder )
1268
+
1269
+ for vm in vms :
1270
+ # Check if user has provided same path as virtual machine
1271
+ actual_vm_folder_path = self .get_vm_path (content = self .content , vm_name = vm )
1272
+ if not actual_vm_folder_path .startswith ("%s%s" % (dcpath , user_defined_dc )):
1273
+ continue
1274
+ if user_desired_path == actual_vm_folder_path :
1275
+ vm_obj = vm
1276
+ break
1276
1277
elif 'moid' in self .params and self .params ['moid' ]:
1277
1278
vm_obj = VmomiSupport .templateOf ('VirtualMachine' )(self .params ['moid' ], self .si ._stub )
1278
1279
try :
0 commit comments