def _remove_interface_by_subnet(self, context, router_id, subnet_id, owner): self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._core_plugin._get_subnet(context, subnet_id) try: rport_qry = context.session.query(models_v2.Port).join( l3_db.RouterPort) ports = rport_qry.filter( l3_db.RouterPort.router_id == router_id, l3_db.RouterPort.port_type == owner, models_v2.Port.network_id == subnet['network_id']) for p in ports: port_subnets = [fip['subnet_id'] for fip in p['fixed_ips']] if subnet_id in port_subnets and len(port_subnets) > 1: # multiple prefix port - delete prefix from port fixed_ips = [ fip for fip in p['fixed_ips'] if fip['subnet_id'] != subnet_id ] p = self._core_plugin.update_port( context, p['id'], {'port': { 'fixed_ips': fixed_ips }}) return p, [subnet], False elif subnet_id in port_subnets: return p, [subnet], True except exc.NoResultFound: pass raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id)
def _remove_interface_by_subnet(self, context, router_id, subnet_id, owner): self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._core_plugin._get_subnet(context, subnet_id) try: rport_qry = context.session.query(models_v2.Port) ports = rport_qry.filter_by(device_id=router_id, device_owner=owner, network_id=subnet['network_id']) for p in ports: if p['fixed_ips'][0]['subnet_id'] == subnet_id: self._core_plugin.delete_port(context, p['id'], l3_port_check=False) return (p, subnet) except exc.NoResultFound: pass raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id)
def remove_interface_by_subnet(self, context, router_id, subnet_id, owner): self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._core_plugin._get_subnet(context, subnet_id) try: rport_qry = context.session.query(models_v2.Port).join( l3_db.RouterPort) ports = rport_qry.filter( l3_db.RouterPort.router_id == router_id, l3_db.RouterPort.port_type == owner, models_v2.Port.network_id == subnet['network_id']) for p in ports: port_subnets = [fip['subnet_id'] for fip in p['fixed_ips']] if subnet_id in port_subnets: port_neutron = p return port_neutron, [subnet] except exc.NoResultFound: pass raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id)
def remove_router_interface(self, context, router_id, interface_info): if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource='router', msg=msg) if 'port_id' in interface_info: port_id = interface_info['port_id'] port_db = self._core_plugin._get_port(context, port_id) if not (port_db['device_owner'] == DEVICE_OWNER_ROUTER_INTF and port_db['device_id'] == router_id): raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) if 'subnet_id' in interface_info: port_subnet_id = port_db['fixed_ips'][0]['subnet_id'] if port_subnet_id != interface_info['subnet_id']: raise q_exc.SubnetMismatchForPort( port_id=port_id, subnet_id=interface_info['subnet_id']) subnet_id = port_db['fixed_ips'][0]['subnet_id'] subnet = self._core_plugin._get_subnet(context, subnet_id) self._confirm_router_interface_not_in_use(context, router_id, subnet_id) self._core_plugin.delete_port(context, port_db['id'], l3_port_check=False) elif 'subnet_id' in interface_info: subnet_id = interface_info['subnet_id'] self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._core_plugin._get_subnet(context, subnet_id) found = False try: rport_qry = context.session.query(models_v2.Port) ports = rport_qry.filter_by( device_id=router_id, device_owner=DEVICE_OWNER_ROUTER_INTF, network_id=subnet['network_id']) for p in ports: if p['fixed_ips'][0]['subnet_id'] == subnet_id: port_id = p['id'] self._core_plugin.delete_port(context, p['id'], l3_port_check=False) found = True break except exc.NoResultFound: pass if not found: raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id) self.l3_rpc_notifier.routers_updated(context, [router_id], 'remove_router_interface') info = { 'id': router_id, 'tenant_id': subnet['tenant_id'], 'port_id': port_id, 'subnet_id': subnet_id } notifier_api.notify(context, notifier_api.publisher_id('network'), 'router.interface.delete', notifier_api.CONF.default_notification_level, {'router.interface': info}) return info