Skip to content

Commit 5cde1c8

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

File tree

1 file changed

+40
-29
lines changed

1 file changed

+40
-29
lines changed

samples/clone_vm.py

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
from add_nic_to_vm import add_nic
1616

1717

18+
SUCCESS = True
19+
FAILURE = False
20+
1821
def get_args():
1922
""" Get arguments from CLI """
2023
parser = argparse.ArgumentParser(
@@ -122,24 +125,27 @@ def get_args():
122125

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

155161
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):
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

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

Comments
 (0)