def _remove_interface_by_port(self, context, router_id, port_id, subnet_id, owner): qry = context.session.query(l3_db.RouterPort) qry = qry.filter_by(port_id=port_id, router_id=router_id, port_type=owner) try: port_db = qry.one().port except exc.NoResultFound: raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) port_subnet_ids = [ fixed_ip['subnet_id'] for fixed_ip in port_db['fixed_ips'] ] if subnet_id and subnet_id not in port_subnet_ids: raise q_exc.SubnetMismatchForPort(port_id=port_id, subnet_id=subnet_id) subnets = [ self._core_plugin._get_subnet(context, port_subnet_id) for port_subnet_id in port_subnet_ids ] for port_subnet_id in port_subnet_ids: self._confirm_router_interface_not_in_use(context, router_id, port_subnet_id) return port_db, subnets, True
def _remove_interface_by_port(self, context, router_id, port_id, subnet_id, owner): port_db = self._core_plugin._get_port(context, port_id) if not (port_db['device_owner'] == owner and port_db['device_id'] == router_id): raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) port_subnet_id = port_db['fixed_ips'][0]['subnet_id'] if subnet_id and port_subnet_id != subnet_id: raise n_exc.SubnetMismatchForPort(port_id=port_id, subnet_id=subnet_id) subnet = self._core_plugin._get_subnet(context, port_subnet_id) self._confirm_router_interface_not_in_use(context, router_id, port_subnet_id) self._core_plugin.delete_port(context, port_db['id'], l3_port_check=False) return (port_db, subnet)
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