Skip to content

Commit f611fe2

Browse files
committed
Fixed Clone VM sample
1 parent 5ca4a50 commit f611fe2

File tree

1 file changed

+52
-33
lines changed

1 file changed

+52
-33
lines changed

samples/clone_vm.py

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
from add_nic_to_vm import add_nic
1616

1717

18+
SUCCESS = True
19+
FAILURE = False
20+
21+
1822
def 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

123128
def 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

155163
def 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

224245
def 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

Comments
 (0)