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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 4
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