Skip to content

Commit 264e2e5

Browse files
committed
Merge pull request #111 from QualiSystems/feature/borismod_40_save_vnic
Feature/borismod 40 save vnic
2 parents 722205f + 7b07b23 commit 264e2e5

11 files changed

Lines changed: 77 additions & 32 deletions

File tree

common/vcenter/vmomi_service.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,7 @@ def find_obj_by_path(self, si, path, name, type_name):
191191

192192
search_index = si.content.searchIndex
193193
'#searches for the specific vm in the folder'
194-
res = search_index.FindChild(look_in, name)
195-
if res:
196-
return res
197-
raise KeyError('vmomi managed object not found at: {0}'.format(path))
194+
return search_index.FindChild(look_in, name)
198195

199196
def get_folder(self, si, path):
200197
"""

integration/integration_commands/integration_test_connect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def integration_test_connect_B(self):
5656
vm_uuid = py_vmomi_service.find_vm_by_name(si, 'QualiSB/Boris', 'Boris2-win7').config.uuid
5757

5858
mapping = VmNetworkMapping()
59-
mapping.vlan_id = 65
59+
mapping.vlan_id = '114'
6060
# mapping.dv_port_name = 65
6161
mapping.dv_switch_name = 'dvSwitch'
6262
mapping.dv_switch_path = 'QualiSB'

integration/integration_commands/integration_test_refresh_ip.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,29 @@ def integrationtest_refresh_ip(self):
3434
refresh_ip_command.refresh_ip(uuid, '')
3535

3636
pass
37+
38+
def integrationtest_refresh_ip(self):
39+
resource_context = Mock()
40+
resource_context.attributes = {"vCenter Template": "vCenter/Boris/Boris2-win7"}
41+
qualipy_helpers = Mock()
42+
qualipy_helpers.get_resource_context_details = Mock(return_value=resource_context)
43+
44+
credentials = TestCredentials()
45+
py_vmomi_service = pyVmomiService(SmartConnect, Disconnect)
46+
cloudshell_data_retriever_service = Mock()
47+
cloudshell_data_retriever_service.getVCenterConnectionDetails = Mock(
48+
return_value=VCenterConnectionDetails(credentials.host, credentials.username, credentials.password))
49+
50+
vm_resource = Mock()
51+
vm_resource.default_network = 'default'
52+
53+
resource_model_parser = Mock()
54+
resource_model_parser.convert_to_resource_model = Mock(return_value=vm_resource)
55+
56+
refresh_ip_command = RefreshIpCommand(py_vmomi_service, cloudshell_data_retriever_service, qualipy_helpers,
57+
resource_model_parser)
58+
59+
uuid = helpers.get_uuid('Boris2-win7')
60+
refresh_ip_command.refresh_ip(uuid, '')
61+
62+
pass

tests/test_network/vlan/test_range_parser.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66
class TestVLanIdRangeParser(TestCase):
77
def test_one_numer(self):
88
v_lan_id_range_parser = VLanIdRangeParser()
9-
vlan_id = v_lan_id_range_parser.parse_vlan_id('11')
9+
vlan_id = v_lan_id_range_parser.parse_vlan_id('Trunk', '11')
1010

1111
self.assertEqual(vlan_id[0].start, 11)
1212
self.assertEqual(vlan_id[0].end, 11)
1313

1414
def test_two_numbers_with_dash(self):
1515
v_lan_id_range_parser = VLanIdRangeParser()
16-
vlan_id = v_lan_id_range_parser.parse_vlan_id('11-100')
16+
vlan_id = v_lan_id_range_parser.parse_vlan_id('Trunk', '11-100')
1717

1818
self.assertEqual(vlan_id[0].start, 11)
1919
self.assertEqual(vlan_id[0].end, 100)
2020

21+
def test_two_numbers_with_dash(self):
22+
v_lan_id_range_parser = VLanIdRangeParser()
23+
vlan_id = v_lan_id_range_parser.parse_vlan_id('Access', '100')
24+
25+
self.assertEqual(vlan_id, 100)
26+
2127
def test_parse_vlan_id(self):
2228
v_lan_id_range_parser = VLanIdRangeParser()
23-
self.assertRaises(Exception, v_lan_id_range_parser.parse_vlan_id, None)
29+
self.assertRaises(Exception, v_lan_id_range_parser.parse_vlan_id, '', None)

vCenterShell/bootstrap.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from common.cloudshell.resource_remover import CloudshellResourceRemover
77
from common.logger import getLogger
88
from common.model_factory import ResourceModelParser
9-
from common.utilites.common_name import generate_unique_name
109
from common.vcenter.data_model_retriever import VCenterDataModelRetriever
1110
from common.vcenter.task_waiter import SynchronousTaskWaiter
1211
from common.vcenter.vmomi_service import pyVmomiService
@@ -39,7 +38,7 @@ def __init__(self):
3938
cloudshell_data_retriever_service)
4039
resource_remover = CloudshellResourceRemover(helpers)
4140
command_wrapper = CommandWrapper(getLogger, py_vmomi_service)
42-
name_generator = generate_unique_name
41+
name_generator = DvPortGroupNameGenerator()
4342
template_deployer = VirtualMachineDeployer(py_vmomi_service, name_generator)
4443

4544
deploy_from_template_command = DeployFromTemplateCommand(template_deployer)

vCenterShell/command_executer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def connect(self):
4444
dv_switch_path = self.vcenter_resource_model.default_dvswitch_path
4545
dv_switch_name = self.vcenter_resource_model.default_dvswitch_name
4646
port_group_path = self.vcenter_resource_model.default_port_group_path
47+
default_network = self.vcenter_resource_model.default_network
4748

4849
vnic_to_network = VmNetworkMapping()
4950
vnic_to_network.dv_switch_path = dv_switch_path
@@ -60,7 +61,8 @@ def connect(self):
6061
connection_details,
6162
self.virtual_switch_connect_command.connect_to_networks,
6263
uuid,
63-
[vnic_to_network])
64+
[vnic_to_network],
65+
default_network)
6466

6567
def disconnect_all(self):
6668
vcener_name = self.qualipy_helpers.get_user_param('VCENTER_NAME')

vCenterShell/commands/connect_dvswitch.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,15 @@ def connect_to_networks(self, si, vm_uuid, vm_network_mappings, default_network_
3737
mappings = []
3838
# create mapping
3939
for vm_network_mapping in vm_network_mappings:
40-
vm_network_mapping.vlan_id_range = \
41-
self.vlan_id_range_parser.parse_vlan_id(vm_network_mapping.vlan_id)
4240
vm_network_mapping.dv_port_name = \
4341
self.dv_port_group_name_generator.generate_port_group_name(vm_network_mapping.vlan_id)
42+
43+
vm_network_mapping.vlan_id = \
44+
self.vlan_id_range_parser.parse_vlan_id(vm_network_mapping.vlan_spec, vm_network_mapping.vlan_id)
45+
4446
vm_network_mapping.vlan_spec = \
4547
self.vlan_spec_factory.get_vlan_spec(vm_network_mapping.vlan_spec)
48+
4649
mappings.append(vm_network_mapping)
4750

4851
return self.virtual_switch_to_machine_connector.connect_by_mapping(

vCenterShell/network/dvswitch/creator.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ def get_or_create_network(self,
7979
# if we didn't found the network on the vm
8080
if network is None:
8181
# try to get it from the vcenter
82-
network = self.pyvmomi_service.find_network_by_name(si, port_group_path, dv_port_name)
82+
try:
83+
network = self.pyvmomi_service.find_network_by_name(si, port_group_path, dv_port_name)
84+
except KeyError:
85+
network = None
8386

8487
# if we still couldn't get the network ---> create it(can't find it, play god!)
8588
if network is None:
Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
from pyVmomi import vim
22

3+
from common.utilites.common_utils import represents_int
4+
35

46
class VLanIdRangeParser(object):
57
def __init__(self):
68
pass
79

8-
def parse_vlan_id(self, vlan_id):
9-
10-
if not vlan_id:
11-
raise Exception('VLAN should be a number or range in format 1-100')
12-
vlan_parts = str(vlan_id).split("-")
13-
if len(vlan_parts) > 2:
14-
raise Exception('VLAN should be a number or range in format 1-100')
15-
if len(vlan_parts) == 1:
16-
return [vim.NumericRange(start=int(vlan_parts[0]), end=int(vlan_parts[0]))]
17-
if len(vlan_parts) == 2:
18-
start_port = int(vlan_parts[0])
19-
end_port = int(vlan_parts[1])
20-
return [vim.NumericRange(start=start_port, end=end_port)]
10+
@staticmethod
11+
def parse_vlan_id(vlan_type, vlan_id):
12+
if vlan_type == 'Access':
13+
if represents_int(vlan_id):
14+
return int(vlan_id)
15+
raise KeyError('Access supports only int vlan id')
16+
elif vlan_type == 'Trunk':
17+
if not vlan_id:
18+
raise Exception('VLAN should be a number or range in format 1-100')
19+
vlan_parts = str(vlan_id).split("-")
20+
if len(vlan_parts) > 2:
21+
raise Exception('VLAN should be a number or range in format 1-100')
22+
if len(vlan_parts) == 1:
23+
return [vim.NumericRange(start=int(vlan_parts[0]), end=int(vlan_parts[0]))]
24+
if len(vlan_parts) == 2:
25+
start_port = int(vlan_parts[0])
26+
end_port = int(vlan_parts[1])
27+
return [vim.NumericRange(start=start_port, end=end_port)]
28+
raise KeyError('vlan type: {0} is not supported'.format(vlan_type))

vCenterShell/vm/vnic_to_network_mapper.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def map_request_to_vnics(self, requests, vnics, existing_network, default_networ
2828

2929
def _find_available_vnic(self, vnics_to_network_mapping, default_network):
3030
for vnic_name, network_name in vnics_to_network_mapping.items():
31-
if network_name == default_network:
31+
if network_name == default_network.name:
3232
return vnic_name
3333
raise Exception('no vnic available')
3434

@@ -39,12 +39,12 @@ def _map_vnic_to_network(self, vnics, existing_network, default_network):
3939
if hasattr(vnic, 'backing'):
4040
if hasattr(vnic.backing, 'network') and hasattr(vnic.backing.network, 'name'):
4141
network_to_map = vnic.backing.network.name
42-
elif hasattr(vnic.backing, 'port') and hasattr(vnic.backing.port, 'key'):
43-
network_to_map = self._get_network_name_from_key(vnic.backing.port.key,
42+
elif hasattr(vnic.backing, 'port') and hasattr(vnic.backing.port, 'portgroupKey'):
43+
network_to_map = self._get_network_name_from_key(vnic.backing.port.portgroupKey,
4444
existing_network, default_network)
4545

4646
if not self.quali_name_generator.is_generated_name(network_to_map):
47-
network_to_map = default_network
47+
network_to_map = default_network.name
4848
mapping[vnic_name] = network_to_map
4949

5050
if mapping:
@@ -54,6 +54,6 @@ def _map_vnic_to_network(self, vnics, existing_network, default_network):
5454
@staticmethod
5555
def _get_network_name_from_key(key, existing_network, default_network):
5656
for network in existing_network:
57-
if hasattr(network, 'name') and hasattr(network, 'portgroupKey') and network.portgroupKey == key:
57+
if hasattr(network, 'name') and hasattr(network, 'key') and network.key == key:
5858
return network.name
5959
return default_network

0 commit comments

Comments
 (0)