1515from add_nic_to_vm import add_nic
1616
1717
18+ SUCCESS = True
19+ FAILURE = False
20+
1821def get_args ():
1922 """ Get arguments from CLI """
2023 parser = argparse .ArgumentParser (
@@ -122,24 +125,27 @@ def get_args():
122125
123126def wait_for_task (task ):
124127 """ wait for a vCenter task to finish """
125- task_done = False
126- while not task_done :
128+ while True :
127129 if task .info .state == 'success' :
128130 return task .info .result
129131
130132 if task .info .state == 'error' :
131133 print ("there was an error" )
132- task_done = True
134+ return FAILURE
133135
134136
135- def get_obj (content , vimtype , name ):
137+ def get_obj (content , vimtype , name , datacenter = None ):
136138 """
137139 Return an object by name, if name is None the
138140 first found object is returned
139141 """
140142 obj = None
141- container = content .viewManager .CreateContainerView (
142- content .rootFolder , vimtype , True )
143+ if datacenter is None :
144+ container = content .viewManager .CreateContainerView (
145+ content .rootFolder , vimtype , True )
146+ else :
147+ container = content .viewManager .CreateContainerView (
148+ datacenter , vimtype , True )
143149 for c in container .view :
144150 if name :
145151 if c .name == name :
@@ -153,9 +159,9 @@ def get_obj(content, vimtype, name):
153159
154160
155161def clone_vm (
156- content , template , vm_name , si ,
157- datacenter_name , vm_folder , datastore_name ,
158- cluster_name , resource_pool , power_on , datastorecluster_name ):
162+ content , template , vm_name ,
163+ datacenter_name , vm_folder_name , datastore_name ,
164+ cluster_name , resource_pool_name , power_on , datastorecluster_name ):
159165 """
160166 Clone a VM from a template/VM, datacenter_name, vm_folder, datastore_name
161167 cluster_name, resource_pool, and power_on are all optional.
@@ -164,30 +170,29 @@ def clone_vm(
164170 # if none git the first one
165171 datacenter = get_obj (content , [vim .Datacenter ], datacenter_name )
166172
167- if vm_folder :
168- destfolder = get_obj (content , [vim .Folder ], vm_folder )
173+ if vm_folder_name :
174+ destfolder = get_obj (content , [vim .Folder ], vm_folder_name , datacenter = datacenter )
169175 else :
170176 destfolder = datacenter .vmFolder
171177
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-
178178 # if None, get the first one
179- cluster = get_obj (content , [vim .ClusterComputeResource ], cluster_name )
179+ cluster = get_obj (content , [vim .ClusterComputeResource ], cluster_name , datacenter = datacenter )
180180
181- if resource_pool :
182- resource_pool = get_obj (content , [vim .ResourcePool ], resource_pool )
183- else :
181+ resource_pool = None
182+ if resource_pool_name :
183+ resource_pool = get_obj (content , [vim .ResourcePool ], resource_pool_name , datacenter = datacenter )
184+ elif cluster : # if cluster is not none, take it from there
184185 resource_pool = cluster .resourcePool
185186
187+ if resource_pool is None :
188+ print ("Not able to find resource pool for cloning VM" )
189+ return FAILURE
190+
186191 vmconf = vim .vm .ConfigSpec ()
187192
188193 if datastorecluster_name :
189194 podsel = vim .storageDrs .PodSelectionSpec ()
190- pod = get_obj (content , [vim .StoragePod ], datastorecluster_name )
195+ pod = get_obj (content , [vim .StoragePod ], datastorecluster_name , datacenter = datacenter )
191196 podsel .storagePod = pod
192197
193198 storagespec = vim .storageDrs .StoragePlacementSpec ()
@@ -205,7 +210,15 @@ def clone_vm(
205210 except :
206211 real_datastore_name = template .datastore [0 ].info .name
207212
208- datastore = get_obj (content , [vim .Datastore ], real_datastore_name )
213+ elif datastore_name :
214+ real_datastore_name = datastore_name
215+ else :
216+ real_datastore_name = template .datastore [0 ].info .name
217+
218+ datastore = get_obj (content , [vim .Datastore ], real_datastore_name , datacenter = datacenter )
219+ if datastore is None :
220+ print ("Not able to find datastore for cloning vm" )
221+ return FAILURE
209222
210223 # set relospec
211224 relospec = vim .vm .RelocateSpec ()
@@ -218,7 +231,7 @@ def clone_vm(
218231
219232 print ("cloning VM..." )
220233 task = template .Clone (folder = destfolder , name = vm_name , spec = clonespec )
221- wait_for_task (task )
234+ return wait_for_task (task )
222235
223236
224237def main ():
@@ -228,7 +241,6 @@ def main():
228241 args = get_args ()
229242
230243 # connect this thing
231- si = None
232244 if args .no_ssl :
233245 si = SmartConnectNoSSL (
234246 host = args .host ,
@@ -245,17 +257,16 @@ def main():
245257 atexit .register (Disconnect , si )
246258
247259 content = si .RetrieveContent ()
248- template = None
249260
250261 template = get_obj (content , [vim .VirtualMachine ], args .template )
251262
252263 if template :
253- clone_vm (
254- content , template , args .vm_name , si ,
264+ status = clone_vm (
265+ content , template , args .vm_name ,
255266 args .datacenter_name , args .vm_folder ,
256267 args .datastore_name , args .cluster_name ,
257268 args .resource_pool , args .power_on , args .datastorecluster_name )
258- if args .opaque_network :
269+ if status and args .opaque_network :
259270 vm = get_obj (content , [vim .VirtualMachine ], args .vm_name )
260271 add_nic (si , vm , args .opaque_network )
261272 else :
0 commit comments