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)
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)