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
Пример #2
0
 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)
Пример #3
0
    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