package/cloudshell/cp/vcenter/vm/vnic_to_network_mapper.py
class VnicToNetworkMapper(object):
def __init__(self, quali_name_generator):
self.quali_name_generator = quali_name_generator
def map_request_to_vnics(self, requests, vnics, existing_network, default_network, reserved_networks):
"""
gets the requests for connecting netwoks and maps it the suitable vnic of specific is not specified
:param reserved_networks: array of reserved networks
:param requests:
:param vnics:
:param existing_network:
:param default_network:
:return:
"""
mapping = dict()
reserved_networks = reserved_networks if reserved_networks else []
vnics_to_network_mapping = self._map_vnic_to_network(vnics, existing_network, default_network, reserved_networks)
for request in requests:
if request.vnic_name:
if request.vnic_name not in vnics_to_network_mapping:
raise ValueError('No vNIC by that name "{0}" exist'.format(request.vnic_name))
net_at_requsted_vnic = vnics_to_network_mapping[request.vnic_name]
if self.quali_name_generator.is_generated_name(net_at_requsted_vnic):
raise ValueError('The vNIC: "{0}" is already set with: "{1}"'.format(request.vnic_name,
net_at_requsted_vnic))
mapping[request.vnic_name] = (request.network, request.vnic_name)
vnics_to_network_mapping.pop(request.vnic_name)
else:
vnic_name = self._find_available_vnic(vnics_to_network_mapping, default_network)
mapping[vnic_name] = (request.network, request.vnic_name)
vnics_to_network_mapping.pop(vnic_name)
return mapping
def _find_available_vnic(self, vnics_to_network_mapping, default_network):
for vnic_name, network_name in vnics_to_network_mapping.items():
if network_name == default_network.name:
return vnic_name
raise ValueError('No vNIC available')
def _map_vnic_to_network(self, vnics, existing_network, default_network, reserved_networks):
mapping = dict()
for vnic_name, vnic in vnics.items():
network_to_map = ''
if hasattr(vnic, 'backing'):
if hasattr(vnic.backing, 'network') and hasattr(vnic.backing.network, 'name'):
network_to_map = vnic.backing.network.name
elif hasattr(vnic.backing, 'port') and hasattr(vnic.backing.port, 'portgroupKey'):
network_to_map = self._get_network_name_from_key(vnic.backing.port.portgroupKey,
existing_network, default_network)
if not self.quali_name_generator.is_generated_name(network_to_map) and\
network_to_map not in reserved_networks:
network_to_map = default_network.name
mapping[vnic_name] = network_to_map
if mapping:
return mapping
raise ValueError('The cannot map vNICs to networks')
@staticmethod
def _get_network_name_from_key(key, existing_network, default_network):
for network in existing_network:
if hasattr(network, 'name') and hasattr(network, 'key') and network.key == key:
return network.name
return default_network