Skip to content

Commit 08bf052

Browse files
committed
Merge remote-tracking branch 'origin/bugfix_173764' into bugfix_173764
2 parents 0f233e8 + c5195cf commit 08bf052

6 files changed

Lines changed: 76 additions & 39 deletions

File tree

package/cloudshell/cp/vcenter/common/vcenter/model_auto_discovery.py

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from cloudshell.cp.vcenter.common.utilites.common_utils import back_slash_to_front_converter
1818

19+
1920
DOMAIN = 'Global'
2021
ADDRESS = 'address'
2122
USER = 'User'
@@ -36,8 +37,16 @@
3637
VM_RESOURCE_POOL, VM_CLUSTER]
3738

3839

40+
class ResourcePoolParams(object):
41+
def __init__(self):
42+
self.cluster_name = ''
43+
self.resource_pool = ''
44+
self.si = None
45+
46+
3947
class VCenterAutoModelDiscovery(object):
4048
def __init__(self):
49+
self.dc = None
4150
self.parser = ResourceModelParser()
4251
self.pv_service = pyVmomiService(SmartConnect, Disconnect, SynchronousTaskWaiter())
4352
self.context_based_logger_factory = ContextBasedLoggerFactory()
@@ -76,6 +85,7 @@ def validate_and_discover(self, context):
7685
try:
7786
all_dc = self.pv_service.get_all_items_in_vcenter(si, vim.Datacenter)
7887
dc = self._validate_datacenter(si, all_dc, auto_attr, resource.attributes)
88+
self.dc = dc
7989

8090
all_items_in_dc = self.pv_service.get_all_items_in_vcenter(si, None, dc)
8191
dc_name = dc.name
@@ -136,9 +146,7 @@ def _validate_default_dvswitch(self, si, all_items_in_vc, auto_att, dc_name, att
136146

137147
def _validate_attribute(self, si, attributes, vim_type, name, prefix=''):
138148
if name in attributes and attributes[name]:
139-
att_value = attributes[name]
140-
if prefix:
141-
att_value = '{0}/{1}'.format(prefix, att_value)
149+
att_value = self._get_attribute_value(attributes, name, prefix)
142150

143151
obj = self.pv_service.get_folder(si, att_value)
144152
if not obj or isinstance(obj, str):
@@ -148,6 +156,12 @@ def _validate_attribute(self, si, attributes, vim_type, name, prefix=''):
148156
return obj
149157
return False
150158

159+
def _get_attribute_value(self, attributes, name, prefix):
160+
att_value = attributes[name]
161+
if prefix:
162+
att_value = '{0}/{1}'.format(prefix, att_value)
163+
return att_value
164+
151165
def _get_default(self, all_item_in_vc, vim_type, key):
152166
obj = self._get_default_from_vc_by_type_and_name(all_item_in_vc, vim_type)
153167
if isinstance(obj, str):
@@ -218,8 +232,19 @@ def _validate_vm_location(self, si, all_items_in_vc, auto_att, dc_name, attribut
218232
auto_att.append(AutoLoadAttribute('', key, f_name))
219233

220234
def _validate_vm_cluster(self, si, all_items_in_vc, auto_att, dc_name, attributes, key):
221-
accepted_types = (vim.ClusterComputeResource, vim.HostSystem)
222-
cluster = self._validate_attribute(si, attributes, accepted_types, key, dc_name)
235+
"""
236+
237+
:param si:
238+
:param all_items_in_vc:
239+
:param auto_att:
240+
:param dc_name:
241+
:param attributes:
242+
:param key:
243+
:return:
244+
"""
245+
accepted_types = [[vim.ClusterComputeResource], [vim.HostSystem]]
246+
cluster_name = attributes[key]
247+
cluster = self.pv_service.get_obj(si.content, accepted_types, cluster_name)
223248
if not cluster:
224249
cluster = self._get_default(all_items_in_vc, accepted_types, key)
225250
c_name = self.get_full_name(dc_name, cluster)
@@ -231,12 +256,19 @@ def _validate_vm_cluster(self, si, all_items_in_vc, auto_att, dc_name, attribute
231256
return cluster
232257

233258
def _validate_vm_resource_pool(self, si, all_items_in_vc, auto_att, dc_name, attributes, key):
234-
cluster = self._validate_vm_cluster(si, all_items_in_vc, auto_att, dc_name, attributes, VM_CLUSTER)
235-
236259
if key not in attributes or not attributes[key]:
237260
return
261+
262+
cluster = self._validate_vm_cluster(si, all_items_in_vc, auto_att, dc_name, attributes, VM_CLUSTER)
263+
238264
pool_name = attributes[key]
239-
pool = self._find_resource_pool_by_path(pool_name, cluster)
265+
266+
rp_params = ResourcePoolParams()
267+
rp_params.cluster_name = cluster.name
268+
rp_params.resource_pool = pool_name
269+
rp_params.si = si
270+
271+
pool = self.pv_service.get_resource_pool(self.dc, rp_params)
240272
if pool:
241273
auto_att.append(AutoLoadAttribute('', key, pool_name))
242274
return

package/cloudshell/cp/vcenter/common/vcenter/vmomi_service.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def find_obj_by_path(self, si, path, name, type_name):
227227
'#searches for the specific vm in the folder'
228228
return search_index.FindChild(look_in, name)
229229

230-
def find_dvs_by_path(self,si ,path):
230+
def find_dvs_by_path(self, si, path):
231231
"""
232232
Finds vm in the vCenter or returns "None"
233233
:param si: pyvmomi 'ServiceInstance'
@@ -312,35 +312,36 @@ def get_network_by_full_name(self, si, default_network_full_name):
312312
path, name = get_path_and_name(default_network_full_name)
313313
return self.find_network_by_name(si, path, name) if name else None
314314

315-
def get_obj(self, content, vimtype, name):
315+
def get_obj(self, content, vimtypes, name):
316316
"""
317317
Return an object by name for a specific type, if name is None the
318318
first found object is returned
319319
320320
:param content: pyvmomi content object
321-
:param vimtype: the type of object too search
321+
:param vimtypes: the types of object to search
322322
:param name: the object name to return
323323
"""
324324
obj = None
325325

326-
container = self._get_all_objects_by_type(content, vimtype)
326+
for vim_type in vimtypes:
327+
container = self._get_all_objects_by_type(content, vim_type)
327328

328-
# If no name was given will return the first object from list of a objects matching the given vimtype type
329-
for c in container.view:
330-
if name:
331-
if c.name == name:
329+
# If no name was given will return the first object from list of a objects matching the given vimtype type
330+
for c in container.view:
331+
if name:
332+
if c.name == name:
333+
obj = c
334+
break
335+
else:
332336
obj = c
333337
break
334-
else:
335-
obj = c
336-
break
337338

338339
return obj
339340

340341
@staticmethod
341342
def _get_all_objects_by_type(content, vimtype):
342343
container = content.viewManager.CreateContainerView(
343-
content.rootFolder, vimtype, True)
344+
content.rootFolder, vimtype, True)
344345
return container
345346

346347
@staticmethod
@@ -418,6 +419,7 @@ def clone_vm(self, clone_params, logger, cancellation_context):
418419
:param clone_params: CloneVmParameters =
419420
:param logger:
420421
"""
422+
421423
result = self.CloneVmResult()
422424

423425
if not isinstance(clone_params.si, self.vim.ServiceInstance):
@@ -446,7 +448,7 @@ def clone_vm(self, clone_params, logger, cancellation_context):
446448

447449
snapshot = self._get_snapshot(clone_params, template)
448450

449-
resource_pool, host = self._get_resource_pool(datacenter.name, clone_params)
451+
resource_pool, host = self.get_resource_pool(datacenter.name, clone_params)
450452

451453
if not resource_pool and not host:
452454
raise ValueError('The specifed host, cluster or resource pool could not be found')
@@ -522,11 +524,11 @@ def _get_datastore(self, clone_params):
522524
name = parts[len(parts) - 1]
523525
if name:
524526
datastore = self.get_obj(clone_params.si.content,
525-
[self.vim.Datastore],
527+
[[self.vim.Datastore]],
526528
name)
527529
if not datastore:
528530
datastore = self.get_obj(clone_params.si.content,
529-
[self.vim.StoragePod],
531+
[[self.vim.StoragePod]],
530532
name)
531533
if datastore:
532534
datastore = sorted(datastore.childEntity,
@@ -537,12 +539,14 @@ def _get_datastore(self, clone_params):
537539
raise ValueError('Could not find Datastore: "{0}"'.format(clone_params.datastore_name))
538540
return datastore
539541

540-
def _get_resource_pool(self, datacenter_name, clone_params):
542+
def get_resource_pool(self, datacenter_name, clone_params):
541543

542-
resource_full_path = '{0}/{1}/{2}'.format(datacenter_name,
543-
clone_params.cluster_name,
544-
clone_params.resource_pool)
545-
obj = self.get_folder(clone_params.si, resource_full_path)
544+
obj_name = '{0}/{1}/{2}'.format(datacenter_name,
545+
clone_params.cluster_name,
546+
clone_params.resource_pool).rstrip('/').split('/')[-1]
547+
# obj = self.get_folder(clone_params.si, resource_full_path)
548+
accepted_types = [[vim.ResourcePool], [vim.ClusterComputeResource], [vim.HostSystem]]
549+
obj = self.get_obj(clone_params.si.content, accepted_types, obj_name)
546550

547551
resource_pool = None
548552
host = None
@@ -738,7 +742,8 @@ def get_vm_full_path(self, si, vm):
738742
folder_name = folder.name
739743
folder_parent = folder.parent
740744

741-
while folder_parent and folder_parent.name and folder_parent != si.content.rootFolder and not isinstance(folder_parent, vim.Datacenter):
745+
while folder_parent and folder_parent.name and folder_parent != si.content.rootFolder and not isinstance(
746+
folder_parent, vim.Datacenter):
742747
folder_name = folder_parent.name + '/' + folder_name
743748
try:
744749
folder_parent = folder_parent.parent
@@ -754,4 +759,4 @@ def get_vm_full_path(self, si, vm):
754759
def vm_has_no_vnics(vm):
755760
# Is there any network device on vm
756761
return next((False for device in vm.config.hardware.device
757-
if isinstance(device, vim.vm.device.VirtualEthernetCard) and hasattr(device, 'macAddress')), True)
762+
if isinstance(device, vim.vm.device.VirtualEthernetCard) and hasattr(device, 'macAddress')), True)

package/cloudshell/tests/test_common/test_vcenter/test_vmomi_service.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def test_clone_vm_power_on_false(self):
6969
pv_service.get_obj = Mock()
7070
pv_service.get_folder = Mock(return_value=datacenter)
7171
pv_service._get_datastore = Mock(return_value=Mock(spec=vim.Datastore))
72-
pv_service._get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
72+
pv_service.get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
7373

7474
params = pv_service.CloneVmParameters(si=si,
7575
template_name='my_temp',
@@ -111,7 +111,7 @@ def test_clone_vm_resource_pool_is_not_empty(self):
111111
pv_service.get_obj = Mock()
112112
pv_service.get_folder = Mock(return_value=datacenter)
113113
pv_service._get_datastore = Mock(return_value=Mock(spec=vim.Datastore))
114-
pv_service._get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
114+
pv_service.get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
115115

116116
params = pv_service.CloneVmParameters(si=si,
117117
template_name='my_temp',
@@ -153,7 +153,7 @@ def test_clone_vm_datastore_name_is_not_none(self):
153153
pv_service.get_obj = Mock()
154154
pv_service.get_folder = Mock(return_value=datacenter)
155155
pv_service._get_datastore = Mock(return_value=Mock(spec=vim.Datastore))
156-
pv_service._get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
156+
pv_service.get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
157157

158158
params = pv_service.CloneVmParameters(si=si,
159159
template_name='my_temp',
@@ -195,7 +195,7 @@ def test_clone_vm_destenation_folder_is_unsupported(self):
195195
pv_service.get_obj = Mock()
196196
pv_service.get_folder = Mock(return_value=folder)
197197
pv_service._get_datastore = Mock(return_value=Mock(spec=vim.Datastore))
198-
pv_service._get_resource_pool = Mock(return_value=Mock(spec=vim.ResourcePool))
198+
pv_service.get_resource_pool = Mock(return_value=Mock(spec=vim.ResourcePool))
199199

200200
params = pv_service.CloneVmParameters(si=si,
201201
template_name='my_temp',
@@ -233,7 +233,7 @@ def test_clone_vm_destenation_folder_is_folder_type(self):
233233
pv_service.get_obj = Mock()
234234
pv_service.get_folder = Mock(return_value=folder)
235235
pv_service._get_datastore = Mock(return_value=Mock(spec=vim.Datastore))
236-
pv_service._get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
236+
pv_service.get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
237237

238238
params = pv_service.CloneVmParameters(si=si,
239239
template_name='my_temp',
@@ -273,7 +273,7 @@ def test_clone_vm_datastore_name_is_none(self):
273273
pv_service.get_obj = Mock()
274274
pv_service.get_folder = Mock(return_value=datacenter)
275275
pv_service._get_datastore = Mock(return_value=Mock(spec=vim.Datastore))
276-
pv_service._get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
276+
pv_service.get_resource_pool = Mock(return_value=(Mock(spec=vim.ResourcePool), None))
277277

278278
params = pv_service.CloneVmParameters(si=si,
279279
template_name='my_temp',

package/cloudshell/tests/utils/helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ def get_uuid(virtual_machine_name):
1616

1717

1818
def get_vm_uuid(py_vmomi_service, si, virtual_machine_name):
19-
vm = py_vmomi_service.get_obj(si.content, [vim.VirtualMachine], virtual_machine_name)
19+
vm = py_vmomi_service.get_obj(si.content, [[vim.VirtualMachine]], virtual_machine_name)
2020
vm_uuid = vm.config.uuid
2121
return vm_uuid

vcentershell_driver/drivermetadata.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Driver Description="this driver manage all the commands that runs at the vcenter context" MainClass="driver.VCenterShellDriver" Name="VCenter Driver" Version="1.14.0">
1+
<Driver Description="this driver manage all the commands that runs at the vcenter context" MainClass="driver.VCenterShellDriver" Name="VCenter Driver" Version="1.14.1">
22
<Layout>
33
<Category Name="Deployment">
44
<Command Description="" DisplayName="Deploy From Template" EnableCancellation="true" Name="deploy_from_template" Tags="allow_unreserved" />

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.14.0
1+
1.14.1

0 commit comments

Comments
 (0)