示例#1
0
    def _update_router_gw_info(self, context, router_id, info, router=None):
        LOG.debug(_("update_router_gw_info called in l3_db.py context: %s"),
                  context)
        LOG.debug(_("update_router_gw_info called in l3_db.py router_id: %s"),
                  router_id)
        LOG.debug(_("update_router_gw_info called in l3_db.py info: %s"), info)
        LOG.debug(_("update_router_gw_info called in l3_db.py router: %s"),
                  router)

        # TODO(salvatore-orlando): guarantee atomic behavior also across
        # operations that span beyond the model classes handled by this
        # class (e.g.: delete_port)
        router = router or self._get_router(context, router_id)
        gw_port = router.gw_port
        # network_id attribute is required by API, so it must be present
        network_id = info['network_id'] if info else None
        if network_id:
            network_db = self._core_plugin._get_network(context, network_id)
            if not network_db.external:
                msg = _("Network %s is not a valid external "
                        "network") % network_id
                raise q_exc.BadRequest(resource='router', msg=msg)

        # figure out if we need to delete existing port
        if gw_port and gw_port['network_id'] != network_id:
            fip_count = self.get_floatingips_count(context.elevated(),
                                                   {'router_id': [router_id]})
            if fip_count:
                raise l3.RouterExternalGatewayInUseByFloatingIp(
                    router_id=router_id, net_id=gw_port['network_id'])
            if gw_port and gw_port['network_id'] != network_id:
                with context.session.begin(subtransactions=True):
                    router.gw_port = None
                    context.session.add(router)
                self._core_plugin.delete_port(context.elevated(),
                                              gw_port['id'],
                                              l3_port_check=False)

        if network_id is not None and (gw_port is None
                                       or gw_port['network_id'] != network_id):
            subnets = self._core_plugin._get_subnets_by_network(
                context, network_id)
            for subnet in subnets:
                self._check_for_dup_router_subnet(context, router_id,
                                                  network_id, subnet['id'],
                                                  subnet['cidr'])
            self._create_router_gw_port(context, router, network_id)
示例#2
0
 def _delete_current_gw_port(self, context, router_id, router, new_network):
     """Delete gw port, if it is attached to an old network."""
     is_gw_port_attached_to_existing_network = (
         router.gw_port and router.gw_port['network_id'] != new_network)
     admin_ctx = context.elevated()
     if is_gw_port_attached_to_existing_network:
         if self.get_floatingips_count(admin_ctx,
                                       {'router_id': [router_id]}):
             raise l3.RouterExternalGatewayInUseByFloatingIp(
                 router_id=router_id, net_id=router.gw_port['network_id'])
         with context.session.begin(subtransactions=True):
             gw_port_id = router.gw_port['id']
             router.gw_port = None
             context.session.add(router)
         self._core_plugin.delete_port(admin_ctx,
                                       gw_port_id,
                                       l3_port_check=False)
    def _delete_current_gw_port(self, context, router_id, router, new_network):
        """Delete gw port if attached to an old network or IPs changed."""
        port_requires_deletion = (router.gw_port and
                                  router.gw_port['network_id'] != new_network)
        if not port_requires_deletion:
            return
        admin_ctx = context.elevated()
        if self.get_floatingips_count(admin_ctx, {'router_id': [router_id]}):
            raise l3.RouterExternalGatewayInUseByFloatingIp(
                router_id=router_id, net_id=router.gw_port['network_id'])

        gw_port = router.gw_port

        with context.session.begin(subtransactions=True):
            router.gw_port = None
            context.session.add(router)
            context.session.expire(gw_port)
            self._check_router_gw_port_in_use(context, router_id)

        self._delete_router_port(context, router_id, gw_port, external_gw=True)