Esempio n. 1
0
    def remove_router_from_l3_agent(self, context, agent_id, router_id):
        """Remove the router from l3 agent.

        After removal, the router will be non-hosted until there is update
        which leads to re-schedule or be added to another agent manually.
        """
        agent = self._get_agent(context, agent_id)
        agent_mode = self._get_agent_mode(agent)
        if agent_mode in [
                constants.L3_AGENT_MODE_DVR,
                constants.L3_AGENT_MODE_DVR_NO_EXTERNAL
        ]:
            raise l3agentscheduler.DVRL3CannotRemoveFromDvrAgent()

        self._unbind_router(context, router_id, agent_id)
        router = self.get_router(context, router_id)
        if router.get('ha'):
            plugin = directory.get_plugin(plugin_constants.L3)
            plugin.delete_ha_interfaces_on_host(context, router_id, agent.host)

        l3_notifier = self.agent_notifiers.get(constants.AGENT_TYPE_L3)
        if not l3_notifier:
            return
        # NOTE(Swami): Need to verify if there are DVR serviceable
        # ports owned by this agent. If owned by this agent, then
        # the routers should be retained. This flag will be used
        # to check if there are valid routers in this agent.
        retain_router = self._check_router_retain_needed(
            context, router, agent.host)
        if retain_router:
            l3_notifier.routers_updated_on_host(context, [router_id],
                                                agent.host)
        else:
            l3_notifier.router_removed_from_agent(context, router_id,
                                                  agent.host)
Esempio n. 2
0
    def remove_router_from_l3_agent(self, context, agent_id, router_id):
        """Remove the router from l3 agent.

        After removal, the router will be non-hosted until there is update
        which leads to re-schedule or be added to another agent manually.
        """
        agent = self._get_agent(context, agent_id)
        agent_mode = self._get_agent_mode(agent)
        if agent_mode == constants.L3_AGENT_MODE_DVR:
            raise l3agentscheduler.DVRL3CannotRemoveFromDvrAgent()

        self._unbind_router(context, router_id, agent_id)

        router = self.get_router(context, router_id)
        plugin = manager.NeutronManager.get_service_plugins().get(
            service_constants.L3_ROUTER_NAT)
        if router.get('ha'):
            plugin.delete_ha_interfaces_on_host(context, router_id, agent.host)
        # NOTE(Swami): Need to verify if there are DVR serviceable
        # ports owned by this agent. If owned by this agent, then
        # the routers should be retained. This flag will be used
        # to check if there are valid routers in this agent.
        retain_router = False
        if router.get('distributed'):
            subnet_ids = plugin.get_subnet_ids_on_router(context, router_id)
            if subnet_ids and agent.host:
                retain_router = plugin._check_dvr_serviceable_ports_on_host(
                    context, agent.host, subnet_ids)
        l3_notifier = self.agent_notifiers.get(constants.AGENT_TYPE_L3)
        if retain_router and l3_notifier:
            l3_notifier.routers_updated_on_host(
                context, [router_id], agent.host)
        elif l3_notifier:
            l3_notifier.router_removed_from_agent(
                context, router_id, agent.host)
Esempio n. 3
0
    def remove_router_from_l3_agent(self, context, agent_id, router_id):
        """Remove the router from l3 agent.

        After removal, the router will be non-hosted until there is update
        which leads to re-schedule or be added to another agent manually.
        """
        agent = self._get_agent(context, agent_id)
        agent_mode = self._get_agent_mode(agent)
        if agent_mode == n_const.L3_AGENT_MODE_DVR:
            raise l3agentscheduler.DVRL3CannotRemoveFromDvrAgent()

        self._unbind_router(context, router_id, agent_id)

        router = self.get_router(context, router_id)
        if router.get('ha'):
            plugin = manager.NeutronManager.get_service_plugins().get(
                service_constants.L3_ROUTER_NAT)
            plugin.delete_ha_interfaces_on_host(context, router_id, agent.host)

        l3_notifier = self.agent_notifiers.get(constants.AGENT_TYPE_L3)
        if l3_notifier:
            l3_notifier.router_removed_from_agent(context, router_id,
                                                  agent.host)