Skip to content

Commit 5c39867

Browse files
committed
Merge branch 'develop'
2 parents 00400b6 + e5ac99c commit 5c39867

File tree

10 files changed

+88
-46
lines changed

10 files changed

+88
-46
lines changed

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: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,13 @@ def connect(self, address, user, password, port=443):
6969

7070
try:
7171
if context:
72-
'#si = SmartConnect(host=address, user=user, pwd=password, port=port, sslContext=context)'
73-
si = self.pyvmomi_connect(host=address, user=user, pwd=password, port=port, sslContext=context)
72+
try:
73+
'#si = SmartConnect(host=address, user=user, pwd=password, port=port, sslContext=context)'
74+
si = self.pyvmomi_connect(host=address, user=user, pwd=password, port=port, sslContext=context)
75+
except ssl.SSLEOFError:
76+
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
77+
context.verify_mode = ssl.CERT_NONE
78+
si = self.pyvmomi_connect(host=address, user=user, pwd=password, port=port, sslContext=context)
7479
else:
7580
'#si = SmartConnect(host=address, user=user, pwd=password, port=port)'
7681
si = self.pyvmomi_connect(host=address, user=user, pwd=password, port=port)
@@ -222,7 +227,7 @@ def find_obj_by_path(self, si, path, name, type_name):
222227
'#searches for the specific vm in the folder'
223228
return search_index.FindChild(look_in, name)
224229

225-
def find_dvs_by_path(self,si ,path):
230+
def find_dvs_by_path(self, si, path):
226231
"""
227232
Finds vm in the vCenter or returns "None"
228233
:param si: pyvmomi 'ServiceInstance'
@@ -307,35 +312,36 @@ def get_network_by_full_name(self, si, default_network_full_name):
307312
path, name = get_path_and_name(default_network_full_name)
308313
return self.find_network_by_name(si, path, name) if name else None
309314

310-
def get_obj(self, content, vimtype, name):
315+
def get_obj(self, content, vimtypes, name):
311316
"""
312317
Return an object by name for a specific type, if name is None the
313318
first found object is returned
314319
315320
:param content: pyvmomi content object
316-
:param vimtype: the type of object too search
321+
:param vimtypes: the types of object to search
317322
:param name: the object name to return
318323
"""
319324
obj = None
320325

321-
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)
322328

323-
# If no name was given will return the first object from list of a objects matching the given vimtype type
324-
for c in container.view:
325-
if name:
326-
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:
327336
obj = c
328337
break
329-
else:
330-
obj = c
331-
break
332338

333339
return obj
334340

335341
@staticmethod
336342
def _get_all_objects_by_type(content, vimtype):
337343
container = content.viewManager.CreateContainerView(
338-
content.rootFolder, vimtype, True)
344+
content.rootFolder, vimtype, True)
339345
return container
340346

341347
@staticmethod
@@ -413,6 +419,7 @@ def clone_vm(self, clone_params, logger, cancellation_context):
413419
:param clone_params: CloneVmParameters =
414420
:param logger:
415421
"""
422+
416423
result = self.CloneVmResult()
417424

418425
if not isinstance(clone_params.si, self.vim.ServiceInstance):
@@ -441,7 +448,7 @@ def clone_vm(self, clone_params, logger, cancellation_context):
441448

442449
snapshot = self._get_snapshot(clone_params, template)
443450

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

446453
if not resource_pool and not host:
447454
raise ValueError('The specifed host, cluster or resource pool could not be found')
@@ -517,11 +524,11 @@ def _get_datastore(self, clone_params):
517524
name = parts[len(parts) - 1]
518525
if name:
519526
datastore = self.get_obj(clone_params.si.content,
520-
[self.vim.Datastore],
527+
[[self.vim.Datastore]],
521528
name)
522529
if not datastore:
523530
datastore = self.get_obj(clone_params.si.content,
524-
[self.vim.StoragePod],
531+
[[self.vim.StoragePod]],
525532
name)
526533
if datastore:
527534
datastore = sorted(datastore.childEntity,
@@ -532,12 +539,14 @@ def _get_datastore(self, clone_params):
532539
raise ValueError('Could not find Datastore: "{0}"'.format(clone_params.datastore_name))
533540
return datastore
534541

535-
def _get_resource_pool(self, datacenter_name, clone_params):
542+
def get_resource_pool(self, datacenter_name, clone_params):
536543

537-
resource_full_path = '{0}/{1}/{2}'.format(datacenter_name,
538-
clone_params.cluster_name,
539-
clone_params.resource_pool)
540-
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)
541550

542551
resource_pool = None
543552
host = None
@@ -733,7 +742,8 @@ def get_vm_full_path(self, si, vm):
733742
folder_name = folder.name
734743
folder_parent = folder.parent
735744

736-
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):
737747
folder_name = folder_parent.name + '/' + folder_name
738748
try:
739749
folder_parent = folder_parent.parent
@@ -749,4 +759,4 @@ def get_vm_full_path(self, si, vm):
749759
def vm_has_no_vnics(vm):
750760
# Is there any network device on vm
751761
return next((False for device in vm.config.hardware.device
752-
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

package/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.13.1
1+
1.14.0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
cloudshell-core>=2.0.0,<2.1.0
2-
cloudshell-cp-vcenter>=1.13.0,<1.14.0
2+
cloudshell-cp-vcenter>=1.14.0,<1.15.0
33
cloudshell-automation-api>=9.0.0.0,<9.0.1.0
44
cloudshell-shell-core>=3.1.0,<3.2.0

vCenterShellPackage/DataModel/datamodel.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
<ns0:Rule Name="Setting" />
5353
</ns0:Rules>
5454
</ns0:AttributeInfo>
55-
<ns0:AttributeInfo DefaultValue="" Description="This attribute points to a pre-define group of execution servers. Usually used for different sites or domains." IsReadOnly="false" Name="Execution Server Selector" Type="String">
55+
<ns0:AttributeInfo DefaultValue="" Description="This attribute points to a pre-defined group of execution servers. Usually used for different sites or domains." IsReadOnly="false" Name="Execution Server Selector" Type="String">
5656
<ns0:Rules>
5757
<ns0:Rule Name="Configuration" />
5858
<ns0:Rule Name="Setting" />
@@ -563,4 +563,4 @@
563563
</ns0:DriverDescriptors>
564564
<ns0:ScriptDescriptors>
565565
</ns0:ScriptDescriptors>
566-
</ns0:DataModelInfo>
566+
</ns0:DataModelInfo>

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.13.1">
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">
22
<Layout>
33
<Category Name="Deployment">
44
<Command Description="" DisplayName="Deploy From Template" EnableCancellation="true" Name="deploy_from_template" Tags="allow_unreserved" />
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
cloudshell-shell-core>=3.1.0,<3.2.0
2-
cloudshell-cp-vcenter>=1.13.0,<1.14.0
2+
cloudshell-cp-vcenter>=1.14.0,<1.15.0
33
cloudshell-cp-core>=1.0.0,<1.1.0

version.txt

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

0 commit comments

Comments
 (0)