def _cleanup_orphan_adapters(self, vif, vswitch_name): """Finds and removes trunk VEAs that have no corresponding CNA.""" # Find and delete orphan adapters with macs matching our vif orphans = pvm_cna.find_orphaned_trunks(self.adapter, vswitch_name) for orphan in orphans: if vm.norm_mac(orphan.mac) == vif['address']: orphan.delete()
def _cleanup_orphan_adapters(self, vif, vswitch_name): """Finds and removes trunk VEAs that have no corresponding CNA.""" # Find and delete orphan adapters with macs matching our vif orphans = pvm_cna.find_orphaned_trunks(self.adapter, vswitch_name) for orphan in orphans: if vm.norm_mac(orphan.mac) == vif['address']: linux_net.delete_ovs_vif_port(vif['network']['bridge'], self.get_trunk_dev_name(vif)) orphan.delete()
def execute(self, lpar_wrap): LOG.info(_LI('Plugging the Network Interfaces to instance %s'), self.instance.name) # Get the current adapters on the system cna_w_list = vm.get_cnas(self.adapter, self.instance, self.host_uuid) # Trim the VIFs down to the ones that haven't yet been created. crt_vifs = [] for vif in self.network_info: for cna_w in cna_w_list: if vm.norm_mac(cna_w.mac) == vif['address']: break else: crt_vifs.append(vif) # If there are no vifs to create, then just exit immediately. if len(crt_vifs) == 0: return [] # Check to see if the LPAR is OK to add VIFs to. modifiable, reason = lpar_wrap.can_modify_io() if not modifiable: LOG.error(_LE('Unable to create VIF(s) for instance %(sys)s. The ' 'VM was in a state where VIF plugging is not ' 'acceptable. The reason from the system is: ' '%(reason)s'), { 'sys': self.instance.name, 'reason': reason }, instance=self.instance) raise exception.VirtualInterfaceCreateException() # For the VIFs, run the creates (and wait for the events back) try: with self.virt_api.wait_for_instance_event( self.instance, self._get_vif_events(), deadline=CONF.vif_plugging_timeout, error_callback=self._vif_callback_failed): for vif in crt_vifs: LOG.info(_LI('Creating VIF with mac %(mac)s for instance ' '%(sys)s'), { 'mac': vif['address'], 'sys': self.instance.name }, instance=self.instance) vm.crt_vif(self.adapter, self.instance, self.host_uuid, vif) except eventlet.timeout.Timeout: LOG.error(_LE('Error waiting for VIF to be created for instance ' '%(sys)s'), {'sys': self.instance.name}, instance=self.instance) raise exception.VirtualInterfaceCreateException() # Return the list of created VIFs. return cna_w_list
def execute(self, lpar_wrap): LOG.info(_LI('Unplugging the Network Interfaces to instance %s'), self.instance.name) # If the state is not in an OK state for deleting, then throw an # error up front. modifiable, reason = lpar_wrap.can_modify_io() if not modifiable: LOG.error(_LE('Unable to remove VIFs from instance %(inst)s ' 'because the system is not in a correct state. ' 'The reason reported by the system is: %(reason)s'), { 'inst': self.instance.name, 'reason': reason }, instance=self.instance) raise VirtualInterfaceUnplugException() # Get all the current Client Network Adapters (CNA) on the VM itself. cna_w_list = vm.get_cnas(self.adapter, self.instance, self.host_uuid) # Walk through the VIFs and delete the corresponding CNA on the VM. for vif in self.network_info: for cna_w in cna_w_list: # If the MAC address matched, attempt the delete. if vm.norm_mac(cna_w.mac) == vif['address']: LOG.info(_LI('Deleting VIF with mac %(mac)s for instance ' '%(inst)s.'), { 'mac': vif['address'], 'inst': self.instance.name }, instance=self.instance) try: cna_w.delete() except Exception as e: LOG.error(_LE('Unable to unplug VIF with mac %(mac)s ' 'for instance %(inst)s.'), { 'mac': vif['address'], 'inst': self.instance.name }, instance=self.instance) LOG.error(e) raise VirtualInterfaceUnplugException() # Break from the loop as we had a successful unplug. # This prevents from going to 'else' loop. break else: LOG.warn(_LW('Unable to unplug VIF with mac %(mac)s for ' 'instance %(inst)s. The VIF was not found on ' 'the instance.'), { 'mac': vif['address'], 'inst': self.instance.name }, instance=self.instance) return cna_w_list
def execute(self, lpar_wrap): LOG.info(_LI('Plugging the Network Interfaces to instance %s'), self.instance.name) # Get the current adapters on the system cna_w_list = vm.get_cnas(self.adapter, self.instance, self.host_uuid) # Trim the VIFs down to the ones that haven't yet been created. crt_vifs = [] for vif in self.network_info: for cna_w in cna_w_list: if vm.norm_mac(cna_w.mac) == vif['address']: break else: crt_vifs.append(vif) # If there are no vifs to create, then just exit immediately. if len(crt_vifs) == 0: return [] # Check to see if the LPAR is OK to add VIFs to. modifiable, reason = lpar_wrap.can_modify_io() if not modifiable: LOG.error(_LE('Unable to create VIF(s) for instance %(sys)s. The ' 'VM was in a state where VIF plugging is not ' 'acceptable. The reason from the system is: ' '%(reason)s'), {'sys': self.instance.name, 'reason': reason}, instance=self.instance) raise exception.VirtualInterfaceCreateException() # For the VIFs, run the creates (and wait for the events back) try: with self.virt_api.wait_for_instance_event( self.instance, self._get_vif_events(), deadline=CONF.vif_plugging_timeout, error_callback=self._vif_callback_failed): for vif in crt_vifs: LOG.info(_LI('Creating VIF with mac %(mac)s for instance ' '%(sys)s'), {'mac': vif['address'], 'sys': self.instance.name}, instance=self.instance) vm.crt_vif(self.adapter, self.instance, self.host_uuid, vif) except eventlet.timeout.Timeout: LOG.error(_LE('Error waiting for VIF to be created for instance ' '%(sys)s'), {'sys': self.instance.name}, instance=self.instance) raise exception.VirtualInterfaceCreateException() # Return the list of created VIFs. return cna_w_list
def _mgmt_cna_to_vif(self, cna): """Converts the mgmt CNA to VIF format for network injection.""" # See IEFT RFC 4291 appendix A for information on this algorithm mac = vm.norm_mac(cna.mac) ipv6_link_local = self._mac_to_link_local(mac) subnet = network_model.Subnet( version=6, cidr=_LLA_SUBNET, ips=[network_model.FixedIP(address=ipv6_link_local)]) network = network_model.Network(id='mgmt', subnets=[subnet], injected='yes') return network_model.VIF(id='mgmt_vif', address=mac, network=network)
def _mgmt_cna_to_vif(self, cna): """Converts the mgmt CNA to VIF format for network injection.""" # See IEFT RFC 4291 appendix A for information on this algorithm mac = vm.norm_mac(cna.mac) ipv6_link_local = self._mac_to_link_local(mac) subnet = network_model.Subnet( version=6, cidr=_LLA_SUBNET, ips=[network_model.FixedIP(address=ipv6_link_local)]) network = network_model.Network(id='mgmt', subnets=[subnet], injected='yes') return network_model.VIF(id='mgmt_vif', address=mac, network=network)
def _find_cna_for_vif(cna_w_list, vif): """Finds the PowerVM CNA for a given Nova VIF. :param cna_w_list: The list of Client Network Adapter wrappers from pypowervm. :param vif: The Nova Virtual Interface (virtual network interface). :return: The CNA that corresponds to the VIF. None if one is not part of the cna_w_list. """ for cna_w in cna_w_list: # If the MAC address matched, attempt the delete. if vm.norm_mac(cna_w.mac) == vif['address']: return cna_w return None
def _find_cna_for_vif(self, cna_w_list, vif): """Finds the PowerVM CNA for a given Nova VIF. :param cna_w_list: The list of Client Network Adapter wrappers from pypowervm. :param vif: The Nova Virtual Interface (virtual network interface). :return: The CNA that corresponds to the VIF. None if one is not part of the cna_w_list. """ for cna_w in cna_w_list: # If the MAC address matched, attempt the delete. if vm.norm_mac(cna_w.mac) == vif['address']: return cna_w return None
def execute(self, lpar_wrap): LOG.info(_LI('Unplugging the Network Interfaces to instance %s'), self.instance.name) # If the state is not in an OK state for deleting, then throw an # error up front. modifiable, reason = lpar_wrap.can_modify_io() if not modifiable: LOG.error(_LE('Unable to remove VIFs from instance %(inst)s ' 'because the system is not in a correct state. ' 'The reason reported by the system is: %(reason)s'), {'inst': self.instance.name, 'reason': reason}, instance=self.instance) raise VirtualInterfaceUnplugException() # Get all the current Client Network Adapters (CNA) on the VM itself. cna_w_list = vm.get_cnas(self.adapter, self.instance, self.host_uuid) # Walk through the VIFs and delete the corresponding CNA on the VM. for vif in self.network_info: for cna_w in cna_w_list: # If the MAC address matched, attempt the delete. if vm.norm_mac(cna_w.mac) == vif['address']: LOG.info(_LI('Deleting VIF with mac %(mac)s for instance ' '%(inst)s.'), {'mac': vif['address'], 'inst': self.instance.name}, instance=self.instance) try: cna_w.delete() except Exception as e: LOG.error(_LE('Unable to unplug VIF with mac %(mac)s ' 'for instance %(inst)s.'), {'mac': vif['address'], 'inst': self.instance.name}, instance=self.instance) LOG.error(e) raise VirtualInterfaceUnplugException() # Break from the loop as we had a successful unplug. # This prevents from going to 'else' loop. break else: LOG.warning(_LW('Unable to unplug VIF with mac %(mac)s for ' 'instance %(inst)s. The VIF was not found on ' 'the instance.'), {'mac': vif['address'], 'inst': self.instance.name}, instance=self.instance) return cna_w_list
def _vif_exists(self, network_info): """Does the instance have a CNA/VNIC (as appropriate) for a given net? :param network_info: A network information dict. This method expects it to contain keys 'vnic_type' (value is 'direct' for VNIC; otherwise assume CNA); and 'address' (MAC address). :return: True if a CNA/VNIC (as appropriate) with the network_info's MAC address exists on the instance. False otherwise. """ # Are we looking for a VNIC or a CNA? if network_info['vnic_type'] == 'direct': if self.vnics is None: self.vnics = vm.get_vnics(self.adapter, self.instance) vifs = self.vnics else: if self.cnas is None: self.cnas = vm.get_cnas(self.adapter, self.instance) vifs = self.cnas return network_info['address'] in [vm.norm_mac(v.mac) for v in vifs]
def execute_impl(self, lpar_wrap): # Get the current adapters on the system cna_w_list = vm.get_cnas(self.adapter, self.instance) # Trim the VIFs down to the ones that haven't yet been created. crt_network_infos = [] for network_info in self.network_infos: for cna_w in cna_w_list: if vm.norm_mac(cna_w.mac) == network_info['address']: break else: crt_network_infos.append(network_info) # If there are no vifs to create, then just exit immediately. if len(crt_network_infos) == 0: return [] # Check to see if the LPAR is OK to add VIFs to. modifiable, reason = lpar_wrap.can_modify_io() if not modifiable: LOG.error(_LE('Unable to create VIF(s) for instance %(sys)s. The ' 'VM was in a state where VIF plugging is not ' 'acceptable. The reason from the system is: ' '%(reason)s'), {'sys': self.instance.name, 'reason': reason}, instance=self.instance) raise exception.VirtualInterfaceCreateException() # TODO(KYLEH): We're setting up to wait for an instance event. The # event needs to come back to our compute manager so we need to ensure # the instance.host is set to our host. We shouldn't need to do this # but in the evacuate/recreate case it may reflect the old host. # See: https://bugs.launchpad.net/nova/+bug/1535918 undo_host_change = False if self.instance.host != CONF.host: LOG.warning(_LW('Instance was not assigned to this host. ' 'It was assigned to: %s'), self.instance.host, instance=self.instance) # Update the instance... old_host = self.instance.host self.instance.host = CONF.host self.instance.save() undo_host_change = True # For the VIFs, run the creates (and wait for the events back) try: with self.virt_api.wait_for_instance_event( self.instance, self._get_vif_events(), deadline=CONF.vif_plugging_timeout, error_callback=self._vif_callback_failed): for network_info in crt_network_infos: LOG.info(_LI('Creating VIF with mac %(mac)s for instance ' '%(sys)s'), {'mac': network_info['address'], 'sys': self.instance.name}, instance=self.instance) vif.plug(self.adapter, self.host_uuid, self.instance, network_info, self.slot_mgr) except eventlet.timeout.Timeout: LOG.error(_LE('Error waiting for VIF to be created for instance ' '%(sys)s'), {'sys': self.instance.name}, instance=self.instance) raise exception.VirtualInterfaceCreateException() finally: if undo_host_change: LOG.info(_LI('Undoing temporary host assignment to instance.'), instance=self.instance) self.instance.host = old_host self.instance.save() # Return the list of created VIFs. return cna_w_list
def test_norm_mac(self): EXPECTED = "12:34:56:78:90:ab" self.assertEqual(EXPECTED, vm.norm_mac("12:34:56:78:90:ab")) self.assertEqual(EXPECTED, vm.norm_mac("1234567890ab")) self.assertEqual(EXPECTED, vm.norm_mac("12:34:56:78:90:AB")) self.assertEqual(EXPECTED, vm.norm_mac("1234567890AB"))
def test_norm_mac(self): EXPECTED = "12:34:56:78:90:ab" self.assertEqual(EXPECTED, vm.norm_mac("12:34:56:78:90:ab")) self.assertEqual(EXPECTED, vm.norm_mac("1234567890ab")) self.assertEqual(EXPECTED, vm.norm_mac("12:34:56:78:90:AB")) self.assertEqual(EXPECTED, vm.norm_mac("1234567890AB"))
def execute(self, lpar_wrap): LOG.info(_LI('Plugging the Network Interfaces to instance %s'), self.instance.name) # Get the current adapters on the system cna_w_list = vm.get_cnas(self.adapter, self.instance, self.host_uuid) # Trim the VIFs down to the ones that haven't yet been created. crt_vifs = [] for vif in self.network_info: for cna_w in cna_w_list: if vm.norm_mac(cna_w.mac) == vif['address']: break else: crt_vifs.append(vif) # If there are no vifs to create, then just exit immediately. if len(crt_vifs) == 0: return [] # Check to see if the LPAR is OK to add VIFs to. modifiable, reason = lpar_wrap.can_modify_io() if not modifiable: LOG.error(_LE('Unable to create VIF(s) for instance %(sys)s. The ' 'VM was in a state where VIF plugging is not ' 'acceptable. The reason from the system is: ' '%(reason)s'), { 'sys': self.instance.name, 'reason': reason }, instance=self.instance) raise exception.VirtualInterfaceCreateException() # TODO(KYLEH): We're setting up to wait for an instance event. The # event needs to come back to our compute manager so we need to ensure # the instance.host is set to our host. We shouldn't need to do this # but in the evacuate/recreate case it may reflect the old host. # See: https://bugs.launchpad.net/nova/+bug/1535918 undo_host_change = False if self.instance.host != CONF.host: LOG.warning(_LW('Instance was not assigned to this host. ' 'It was assigned to: %s'), self.instance.host, instance=self.instance) # Update the instance... old_host = self.instance.host self.instance.host = CONF.host self.instance.save() undo_host_change = True # For the VIFs, run the creates (and wait for the events back) try: with self.virt_api.wait_for_instance_event( self.instance, self._get_vif_events(), deadline=CONF.vif_plugging_timeout, error_callback=self._vif_callback_failed): for vif in crt_vifs: LOG.info(_LI('Creating VIF with mac %(mac)s for instance ' '%(sys)s'), { 'mac': vif['address'], 'sys': self.instance.name }, instance=self.instance) vm.crt_vif(self.adapter, self.instance, self.host_uuid, vif) except eventlet.timeout.Timeout: LOG.error(_LE('Error waiting for VIF to be created for instance ' '%(sys)s'), {'sys': self.instance.name}, instance=self.instance) raise exception.VirtualInterfaceCreateException() finally: if undo_host_change: LOG.info(_LI('Undoing temporary host assignment to instance.'), instance=self.instance) self.instance.host = old_host self.instance.save() # Return the list of created VIFs. return cna_w_list