def unplug_vip(self, load_balancer, vip): try: subnet = self.get_subnet(vip.subnet_id) except base.SubnetNotFound: msg = ("Can't unplug vip because vip subnet {0} was not " "found").format(vip.subnet_id) raise base.PluggedVIPNotFound(msg) for amphora in load_balancer.amphorae: interface = self._get_plugged_interface(amphora.compute_id, subnet.network_id) if not interface: # Thought about raising PluggedVIPNotFound exception but # then that wouldn't evaluate all amphorae, so just continue continue try: self.unplug_network(amphora.compute_id, subnet.network_id) except Exception: pass try: aap_update = {'port': {'allowed_address_pairs': []}} self.neutron_client.update_port(interface.port_id, aap_update) except Exception: message = _LE('Error unplugging VIP. Could not clear ' 'allowed address pairs from port ' '{port_id}.').format(port_id=vip.port_id) LOG.exception(message) raise base.UnplugVIPException(message)
def unplug_vip(self, load_balancer, vip): try: subnet = self.get_subnet(vip.subnet_id) except base.SubnetNotFound as e: msg = ("Can't unplug vip because vip subnet {0} was not " "found").format(vip.subnet_id) LOG.exception(msg) raise base.PluggedVIPNotFound(msg) from e for amphora in filter( lambda amp: amp.status == constants.AMPHORA_ALLOCATED, load_balancer.amphorae): self.unplug_aap_port(vip, amphora, subnet)
def unplug_vip(self, load_balancer, vip): if load_balancer.topology == constants.TOPOLOGY_ACTIVE_ACTIVE: self._unplug_frontend_port(load_balancer) try: subnet = self.get_subnet(vip.subnet_id) except base.SubnetNotFound: msg = ("Can't unplug vip because vip subnet {0} was not " "found").format(vip.subnet_id) LOG.exception(msg) raise base.PluggedVIPNotFound(msg) for amphora in six.moves.filter( lambda amp: amp.status == constants.AMPHORA_ALLOCATED, load_balancer.amphorae): interface = self._get_plugged_interface( amphora.compute_id, subnet.network_id, amphora.lb_network_ip) if not interface: # Thought about raising PluggedVIPNotFound exception but # then that wouldn't evaluate all amphorae, so just continue LOG.debug('Cannot get amphora %s interface, skipped', amphora.compute_id) continue try: self.unplug_network(amphora.compute_id, subnet.network_id) except Exception: pass try: aap_update = {'port': { 'allowed_address_pairs': [] }} self.neutron_client.update_port(interface.port_id, aap_update) except Exception: message = _('Error unplugging VIP. Could not clear ' 'allowed address pairs from port ' '{port_id}.').format(port_id=vip.port_id) LOG.exception(message) raise base.UnplugVIPException(message) # Delete the VRRP port if we created it try: port = self.get_port(amphora.vrrp_port_id) if port.name.startswith('octavia-lb-vrrp-'): self.neutron_client.delete_port(amphora.vrrp_port_id) except (neutron_client_exceptions.NotFound, neutron_client_exceptions.PortNotFoundClient): pass except Exception as e: LOG.error('Failed to delete port. Resources may still be in ' 'use for port: %(port)s due to error: %s(except)s', {'port': amphora.vrrp_port_id, 'except': e})
def unplug_vip_revert(self, load_balancer, vip): "This method is called by revert flow of PlugVip" try: subnet = self.get_subnet(vip.subnet_id) except base.SubnetNotFound: msg = ("Can't unplug vip because vip subnet {0} was not " "found").format(vip.subnet_id) LOG.exception(msg) raise base.PluggedVIPNotFound(msg) for amphora in filter( lambda amp: amp.status == constants.AMPHORA_ALLOCATED, load_balancer.amphorae): self.unplug_aap_port_revert(vip, amphora, subnet)
def _unplug_amphora_frontend_port(self, amphora, load_balancer): try: frontend_subnet = load_balancer.distributor.frontend_subnet subnet = self.get_subnet(frontend_subnet) except base.SubnetNotFound: msg = ("Can't unplug frontend ip because frontend subnet {0} " "was not found").format(frontend_subnet) LOG.exception(msg) raise base.PluggedVIPNotFound(msg) if (amphora in load_balancer.amphorae and amphora.status == constants.AMPHORA_ALLOCATED): interface = self._get_plugged_interface( amphora.compute_id, subnet.network_id, amphora.lb_network_ip) if not interface: # Thought about raising PluggedVIPNotFound exception but # then that wouldn't evaluate all amphorae, so just continue LOG.debug('Cannot get amphora %s interface, skipped', amphora.compute_id) return try: self.unplug_network(amphora.compute_id, subnet.network_id) except Exception: pass try: aap_update = {'port': { 'allowed_address_pairs': [] }} self.neutron_client.update_port(interface.port_id, aap_update) except Exception: message = _('Error unplugging frontend port. Could not clear ' 'allowed address pairs from port ' '{port_id}.').format(port_id=interface.port_id) LOG.exception(message) raise base.UnplugVIPException(message) # Delete the frontend port if we created it try: port = self.get_port(amphora.frontend_port_id) if port.name.startswith('octavia-lb-frentend-'): self.neutron_client.delete_port(amphora.frontend_port_id) except (neutron_client_exceptions.NotFound, neutron_client_exceptions.PortNotFoundClient): pass except Exception as e: LOG.error('Failed to delete port. Resources may still be in ' 'use for port: %(port)s due to error: %s(except)s', {'port': amphora.frontend_port_id, 'except': e})