1515from add_nic_to_vm import add_nic
1616
1717
18+ SUCCESS = True
19+ FAILURE = False
20+
21+
1822def get_args ():
1923 """ Get arguments from CLI """
2024 parser = argparse .ArgumentParser (
@@ -84,8 +88,9 @@ def get_args():
8488 required = False ,
8589 action = 'store' ,
8690 default = None ,
87- help = 'Datastorecluster (DRS Storagepod) you wish the VM to end up on \
88- Will override the datastore-name parameter.' )
91+ help = 'Datastorecluster (DRS Storagepod) you wish '
92+ 'the VM to end up on Will override the '
93+ 'datastore-name parameter.' )
8994
9095 parser .add_argument ('--cluster-name' ,
9196 required = False ,
@@ -122,24 +127,27 @@ def get_args():
122127
123128def wait_for_task (task ):
124129 """ wait for a vCenter task to finish """
125- task_done = False
126- while not task_done :
130+ while True :
127131 if task .info .state == 'success' :
128132 return task .info .result
129133
130134 if task .info .state == 'error' :
131135 print ("there was an error" )
132- task_done = True
136+ return FAILURE
133137
134138
135- def get_obj (content , vimtype , name ):
139+ def get_obj (content , vimtype , name , datacenter = None ):
136140 """
137141 Return an object by name, if name is None the
138142 first found object is returned
139143 """
140144 obj = None
141- container = content .viewManager .CreateContainerView (
142- content .rootFolder , vimtype , True )
145+ if datacenter is None :
146+ container = content .viewManager .CreateContainerView (
147+ content .rootFolder , vimtype , True )
148+ else :
149+ container = content .viewManager .CreateContainerView (
150+ datacenter , vimtype , True )
143151 for c in container .view :
144152 if name :
145153 if c .name == name :
@@ -153,9 +161,9 @@ def get_obj(content, vimtype, name):
153161
154162
155163def clone_vm (
156- content , template , vm_name , si ,
157- datacenter_name , vm_folder , datastore_name ,
158- cluster_name , resource_pool , power_on , datastorecluster_name ):
164+ content , template , vm_name ,
165+ datacenter_name , vm_folder_name , datastore_name ,
166+ cluster_name , resource_pool_name , power_on , datastorecluster_name ):
159167 """
160168 Clone a VM from a template/VM, datacenter_name, vm_folder, datastore_name
161169 cluster_name, resource_pool, and power_on are all optional.
@@ -164,30 +172,34 @@ def clone_vm(
164172 # if none git the first one
165173 datacenter = get_obj (content , [vim .Datacenter ], datacenter_name )
166174
167- if vm_folder :
168- destfolder = get_obj (content , [vim .Folder ], vm_folder )
175+ if vm_folder_name :
176+ destfolder = get_obj (content , [vim .Folder ], vm_folder_name ,
177+ datacenter = datacenter )
169178 else :
170179 destfolder = datacenter .vmFolder
171180
172- if datastore_name :
173- datastore = get_obj (content , [vim .Datastore ], datastore_name )
174- else :
175- datastore = get_obj (
176- content , [vim .Datastore ], template .datastore [0 ].info .name )
177-
178181 # if None, get the first one
179- cluster = get_obj (content , [vim .ClusterComputeResource ], cluster_name )
180-
181- if resource_pool :
182- resource_pool = get_obj (content , [vim .ResourcePool ], resource_pool )
183- else :
182+ cluster = get_obj (content , [vim .ClusterComputeResource ], cluster_name ,
183+ datacenter = datacenter )
184+
185+ resource_pool = None
186+ if resource_pool_name :
187+ resource_pool = get_obj (content , [vim .ResourcePool ],
188+ resource_pool_name ,
189+ datacenter = datacenter )
190+ elif cluster : # if cluster is not none, take it from there
184191 resource_pool = cluster .resourcePool
185192
193+ if resource_pool is None :
194+ print ("Not able to find resource pool for cloning VM" )
195+ return FAILURE
196+
186197 vmconf = vim .vm .ConfigSpec ()
187198
188199 if datastorecluster_name :
189200 podsel = vim .storageDrs .PodSelectionSpec ()
190- pod = get_obj (content , [vim .StoragePod ], datastorecluster_name )
201+ pod = get_obj (content , [vim .StoragePod ], datastorecluster_name ,
202+ datacenter = datacenter )
191203 podsel .storagePod = pod
192204
193205 storagespec = vim .storageDrs .StoragePlacementSpec ()
@@ -202,10 +214,19 @@ def clone_vm(
202214 storageSpec = storagespec )
203215 rec_action = rec .recommendations [0 ].action [0 ]
204216 real_datastore_name = rec_action .destination .name
205- except :
217+ except Exception :
206218 real_datastore_name = template .datastore [0 ].info .name
207219
208- datastore = get_obj (content , [vim .Datastore ], real_datastore_name )
220+ elif datastore_name :
221+ real_datastore_name = datastore_name
222+ else :
223+ real_datastore_name = template .datastore [0 ].info .name
224+
225+ datastore = get_obj (content , [vim .Datastore ], real_datastore_name ,
226+ datacenter = datacenter )
227+ if datastore is None :
228+ print ("Not able to find datastore for cloning vm" )
229+ return FAILURE
209230
210231 # set relospec
211232 relospec = vim .vm .RelocateSpec ()
@@ -218,7 +239,7 @@ def clone_vm(
218239
219240 print ("cloning VM..." )
220241 task = template .Clone (folder = destfolder , name = vm_name , spec = clonespec )
221- wait_for_task (task )
242+ return wait_for_task (task )
222243
223244
224245def main ():
@@ -228,7 +249,6 @@ def main():
228249 args = get_args ()
229250
230251 # connect this thing
231- si = None
232252 if args .no_ssl :
233253 si = SmartConnectNoSSL (
234254 host = args .host ,
@@ -245,17 +265,16 @@ def main():
245265 atexit .register (Disconnect , si )
246266
247267 content = si .RetrieveContent ()
248- template = None
249268
250269 template = get_obj (content , [vim .VirtualMachine ], args .template )
251270
252271 if template :
253- clone_vm (
254- content , template , args .vm_name , si ,
272+ status = clone_vm (
273+ content , template , args .vm_name ,
255274 args .datacenter_name , args .vm_folder ,
256275 args .datastore_name , args .cluster_name ,
257276 args .resource_pool , args .power_on , args .datastorecluster_name )
258- if args .opaque_network :
277+ if status and args .opaque_network :
259278 vm = get_obj (content , [vim .VirtualMachine ], args .vm_name )
260279 add_nic (si , vm , args .opaque_network )
261280 else :
0 commit comments