예제 #1
0
    def process_router_gw_port_update(self, context, speaker,
                                      router, updated_port):
        router_id = router['id']
        gw_fixed_ip = router.gw_port['fixed_ips'][0]['ip_address']

        edge_id, advertise_static_routes = (
            self._get_router_edge_info(context, router_id))
        if not edge_id:
            # shared router is not attached on any edge
            return

        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(
            context.session, edge_id)

        if bgp_binding:
            new_fixed_ip = updated_port['fixed_ips'][0]['ip_address']
            fixed_ip_updated = gw_fixed_ip != new_fixed_ip
            subnets = self._query_tenant_subnets(context, [router_id])
            prefixes, redis_rules = (
                self._get_prefixes_and_redistribution_rules(
                    subnets, advertise_static_routes))
            # Handle possible snat/no-nat update
            if router.enable_snat:
                self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            else:
                self._nsxv.add_bgp_redistribution_rules(edge_id, prefixes,
                                                        redis_rules)
            if bgp_binding['bgp_identifier'] == gw_fixed_ip:
                if fixed_ip_updated:
                    self._update_edge_bgp_identifier(context,
                                                     bgp_binding,
                                                     speaker,
                                                     new_fixed_ip)
예제 #2
0
    def process_router_gw_port_update(self, context, speaker, router,
                                      updated_port):
        router_id = router['id']
        gw_fixed_ip = router.gw_port['fixed_ips'][0]['ip_address']

        edge_id, advertise_static_routes = (self._get_router_edge_info(
            context, router_id))
        if not edge_id:
            # shared router is not attached on any edge
            return

        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(
            context.session, edge_id)

        if bgp_binding:
            new_fixed_ip = updated_port['fixed_ips'][0]['ip_address']
            fixed_ip_updated = gw_fixed_ip != new_fixed_ip
            subnets = self._query_tenant_subnets(context, [router_id])
            prefixes, redis_rules = (
                self._get_prefixes_and_redistribution_rules(
                    subnets, advertise_static_routes))
            # Handle possible snat/no-nat update
            if router.enable_snat:
                self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            else:
                self._nsxv.add_bgp_redistribution_rules(
                    edge_id, prefixes, redis_rules)
            if bgp_binding['bgp_identifier'] == gw_fixed_ip:
                if fixed_ip_updated:
                    self._update_edge_bgp_identifier(context, bgp_binding,
                                                     speaker, new_fixed_ip)
예제 #3
0
    def disable_bgp_on_router(self,
                              context,
                              speaker,
                              router_id,
                              gw_ip,
                              edge_id=None):
        speaker = self._plugin.get_bgp_speaker(context, speaker['id'])
        current_edge_id, advertise_static_routes = (self._get_router_edge_info(
            context, router_id))
        edge_id = edge_id or current_edge_id

        if not edge_id:
            return

        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(
            context.session, edge_id)
        if not bgp_binding:
            return

        # Need to ensure that we do not use the metadata IP's
        md_proxy = self._get_md_proxy_for_router(context, router_id)

        routers_ids = (self._core_plugin.edge_manager.get_routers_on_same_edge(
            context, router_id))
        routers_ids.remove(router_id)

        # We need to find out what other routers are hosted on the edges and
        # whether they have a gw addresses that could replace the current
        # bgp-identifier (if required).
        filters = {
            'device_owner': [n_const.DEVICE_OWNER_ROUTER_GW],
            'device_id': routers_ids
        }
        edge_gw_ports = self._core_plugin.get_ports(context, filters=filters)
        alt_bgp_identifiers = [
            p['fixed_ips'][0]['ip_address'] for p in edge_gw_ports
            if (not md_proxy
                or not md_proxy.is_md_subnet(p['fixed_ips'][0]['subnet_id']))
        ]
        if alt_bgp_identifiers:
            # Shared router, only remove prefixes and redistribution
            # rules.
            subnets = self._query_tenant_subnets(context, [router_id])
            prefixes = [self.prefix_name(subnet['id']) for subnet in subnets]
            self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            if bgp_binding['bgp_identifier'] == gw_ip:
                self._update_edge_bgp_identifier(context, bgp_binding, speaker,
                                                 alt_bgp_identifiers[0])
        else:
            self._stop_bgp_on_edges(context, [bgp_binding], speaker['id'])
예제 #4
0
    def disable_bgp_on_router(self, context, speaker, router_id, gw_ip,
                              edge_id=None):
        speaker = self._plugin.get_bgp_speaker(context, speaker['id'])
        current_edge_id, advertise_static_routes = (
            self._get_router_edge_info(context, router_id))
        edge_id = edge_id or current_edge_id

        if not edge_id:
            return

        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(context.session,
                                                           edge_id)
        if not bgp_binding:
            return

        # Need to ensure that we do not use the metadata IP's
        md_proxy = self._get_md_proxy_for_router(context, router_id)

        routers_ids = (
            self._core_plugin.edge_manager.get_routers_on_same_edge(
                context, router_id))
        routers_ids.remove(router_id)

        # We need to find out what other routers are hosted on the edges and
        # whether they have a gw addresses that could replace the current
        # bgp-identifier (if required).
        filters = {'device_owner': [n_const.DEVICE_OWNER_ROUTER_GW],
                   'device_id': routers_ids}
        edge_gw_ports = self._core_plugin.get_ports(context, filters=filters)
        alt_bgp_identifiers = [
            p['fixed_ips'][0]['ip_address'] for p in edge_gw_ports
            if (not md_proxy or
                not md_proxy.is_md_subnet(
                    p['fixed_ips'][0]['subnet_id']))]
        if alt_bgp_identifiers:
            # Shared router, only remove prefixes and redistribution
            # rules.
            subnets = self._query_tenant_subnets(context, [router_id])
            prefixes = [self.prefix_name(subnet['id'])
                        for subnet in subnets]
            self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            if bgp_binding['bgp_identifier'] == gw_ip:
                self._update_edge_bgp_identifier(context, bgp_binding, speaker,
                                                 alt_bgp_identifiers[0])
        else:
            self._stop_bgp_on_edges(context, [bgp_binding], speaker['id'])
예제 #5
0
    def enable_bgp_on_router(self, context, speaker, router_id):
        local_as = speaker['local_as']
        edge_id, advertise_static_routes = (self._get_router_edge_info(
            context, router_id))
        if not edge_id:
            # shared router is not attached on any edge
            return
        router = self._core_plugin._get_router(context, router_id)
        subnets = self._query_tenant_subnets(context, [router_id])

        bgp_peers = self._plugin.get_bgp_peers_by_bgp_speaker(
            context, speaker['id'])
        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(
            context.session, edge_id)

        if bgp_binding and subnets:
            # Edge already configured with BGP (e.g - shared router edge),
            # Add the router attached subnets.
            if router.enable_snat:
                prefixes = [
                    self.prefix_name(subnet['id']) for subnet in subnets
                ]
                self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            else:
                prefixes, redis_rules = (
                    self._get_prefixes_and_redistribution_rules(
                        subnets, advertise_static_routes))
                self._nsxv.add_bgp_redistribution_rules(
                    edge_id, prefixes, redis_rules)
        elif not bgp_binding:
            if router.enable_snat:
                subnets = []
            bgp_identifier = router.gw_port['fixed_ips'][0]['ip_address']
            self._start_bgp_on_edge(context, edge_id, speaker, bgp_peers,
                                    bgp_identifier, subnets,
                                    advertise_static_routes)
            for gw_edge_id, password in [(peer['esg_id'], peer['password'])
                                         for peer in bgp_peers
                                         if peer.get('esg_id')]:
                nbr = gw_bgp_neighbour(bgp_identifier, local_as, password)
                self._nsxv.add_bgp_neighbours(gw_edge_id, [nbr])
예제 #6
0
    def enable_bgp_on_router(self, context, speaker, router_id):
        local_as = speaker['local_as']
        edge_id, advertise_static_routes = (
            self._get_router_edge_info(context, router_id))
        if not edge_id:
            # shared router is not attached on any edge
            return
        router = self._core_plugin._get_router(context, router_id)
        subnets = self._query_tenant_subnets(context, [router_id])

        bgp_peers = self._plugin.get_bgp_peers_by_bgp_speaker(
            context, speaker['id'])
        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(
            context.session, edge_id)

        if bgp_binding and subnets:
            # Edge already configured with BGP (e.g - shared router edge),
            # Add the router attached subnets.
            if router.enable_snat:
                prefixes = [self.prefix_name(subnet['id'])
                            for subnet in subnets]
                self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            else:
                prefixes, redis_rules = (
                    self._get_prefixes_and_redistribution_rules(
                        subnets, advertise_static_routes))
                self._nsxv.add_bgp_redistribution_rules(edge_id, prefixes,
                                                        redis_rules)
        elif not bgp_binding:
            if router.enable_snat:
                subnets = []
            bgp_identifier = router.gw_port['fixed_ips'][0]['ip_address']
            self._start_bgp_on_edge(context, edge_id, speaker, bgp_peers,
                                    bgp_identifier, subnets,
                                    advertise_static_routes)
            for gw_edge_id, password in [(peer['esg_id'], peer['password'])
                                         for peer in bgp_peers
                                         if peer.get('esg_id')]:
                nbr = gw_bgp_neighbour(bgp_identifier, local_as, password)
                self._nsxv.add_bgp_neighbours(gw_edge_id, [nbr])
예제 #7
0
    def disable_bgp_on_router(self,
                              context,
                              speaker,
                              router_id,
                              gw_ip,
                              edge_id=None):
        speaker = self._plugin.get_bgp_speaker(context, speaker['id'])
        current_edge_id, advertise_static_routes = (self._get_router_edge_info(
            context, router_id))
        edge_id = edge_id or current_edge_id

        if not edge_id:
            return

        routers_ids = (self._core_plugin.edge_manager.get_routers_on_same_edge(
            context, router_id))
        bgp_binding = nsxv_db.get_nsxv_bgp_speaker_binding(
            context.session, edge_id)
        if not bgp_binding:
            return

        if len(routers_ids) > 1:
            routers_ids.remove(router_id)
            # Shared router, only remove prefixes and redistribution
            # rules.
            subnets = self._query_tenant_subnets(context, [router_id])
            prefixes = [self.prefix_name(subnet['id']) for subnet in subnets]
            self._nsxv.remove_bgp_redistribution_rules(edge_id, prefixes)
            if bgp_binding['bgp_identifier'] == gw_ip:
                router = self._core_plugin._get_router(context, routers_ids[0])
                new_bgp_identifier = (
                    router.gw_port['fixed_ips'][0]['ip_address'])
                self._update_edge_bgp_identifier(context, bgp_binding, speaker,
                                                 new_bgp_identifier)
        else:
            self._stop_bgp_on_edges(context, [bgp_binding], speaker['id'])