Пример #1
0
    def update_bgp_peer(self, context, bgp_peer_id, bgp_peer):
        password = bgp_peer['bgp_peer'].get('password')
        old_bgp_peer = self._plugin.get_bgp_peer(context, bgp_peer_id)

        # Only password update is relevant for backend.
        if old_bgp_peer['password'] == password:
            return

        bgp_speaker_ids = self._get_bgp_speakers_by_bgp_peer(context,
                                                             bgp_peer_id)
        # Update the password for the old bgp peer and update NSX
        old_bgp_peer['password'] = password
        neighbour = bgp_neighbour_from_peer(old_bgp_peer)
        for bgp_speaker_id in bgp_speaker_ids:
            with locking.LockManager.get_lock(bgp_speaker_id):
                peers = self._plugin.get_bgp_peers_by_bgp_speaker(
                    context, bgp_speaker_id)
                if bgp_peer_id not in [p['id'] for p in peers]:
                    continue
                bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
                    context.session, bgp_speaker_id)
                for binding in bgp_bindings:
                    try:
                        # Neighbours are identified by their ip address
                        self._nsxv.update_bgp_neighbours(binding['edge_id'],
                                                         [neighbour],
                                                         [neighbour])
                    except vcns_exc.VcnsApiException:
                        LOG.error("Failed to update BGP neighbor '%s' on "
                                  "edge '%s'", old_bgp_peer['peer_ip'],
                                  binding['edge_id'])
Пример #2
0
    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):
        bgp_peer_id = bgp_peer_info['bgp_peer_id']
        bgp_peer_obj = self._plugin.get_bgp_peer(context, bgp_peer_id)
        nbr = bgp_neighbour_from_peer(bgp_peer_obj)
        bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
            context.session, bgp_speaker_id)
        speaker = self._plugin.get_bgp_speaker(context, bgp_speaker_id)
        # list of tenant edge routers to be removed as bgp-neighbours to this
        # peer if it's associated with specific ESG.
        neighbours = []
        for binding in bgp_bindings:
            try:
                self._nsxv.remove_bgp_neighbours(binding['edge_id'], [nbr])
            except vcns_exc.VcnsApiException:
                LOG.error("Failed to remove BGP neighbour on '%s'",
                          binding['edge_id'])
            else:
                gw_nbr = gw_bgp_neighbour(binding['bgp_identifier'],
                                          speaker['local_as'],
                                          bgp_peer_obj['password'])
                neighbours.append(gw_nbr)
                LOG.debug("Succesfully removed BGP neighbor '%s' on '%s'",
                          bgp_peer_obj['peer_ip'], binding['edge_id'])

        if bgp_peer_obj.get('esg_id'):
            edge_gw = bgp_peer_obj['esg_id']
            try:
                self._nsxv.remove_bgp_neighbours(edge_gw, neighbours)
            except vcns_exc.VcnsApiException:
                LOG.error("Failed to remove BGP neighbour on GW Edge '%s'",
                          edge_gw)
Пример #3
0
    def remove_bgp_peer(self, context, bgp_speaker_id, bgp_peer_info):
        bgp_peer_id = bgp_peer_info['bgp_peer_id']
        bgp_peer_obj = self._plugin.get_bgp_peer(context, bgp_peer_id)
        nbr = bgp_neighbour_from_peer(bgp_peer_obj)
        bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
            context.session, bgp_speaker_id)
        speaker = self._plugin.get_bgp_speaker(context, bgp_speaker_id)
        # list of tenant edge routers to be removed as bgp-neighbours to this
        # peer if it's associated with specific ESG.
        neighbours = []
        for binding in bgp_bindings:
            try:
                self._nsxv.remove_bgp_neighbours(binding['edge_id'], [nbr])
            except vcns_exc.VcnsApiException:
                LOG.error("Failed to remove BGP neighbour on '%s'",
                          binding['edge_id'])
            else:
                gw_nbr = gw_bgp_neighbour(binding['bgp_identifier'],
                                          speaker['local_as'],
                                          bgp_peer_obj['password'])
                neighbours.append(gw_nbr)
                LOG.debug("Succesfully removed BGP neighbor '%s' on '%s'",
                          bgp_peer_obj['peer_ip'], binding['edge_id'])

        if bgp_peer_obj.get('esg_id'):
            edge_gw = bgp_peer_obj['esg_id']
            try:
                self._nsxv.remove_bgp_neighbours(edge_gw, neighbours)
            except vcns_exc.VcnsApiException:
                LOG.error("Failed to remove BGP neighbour on GW Edge '%s'",
                          edge_gw)
Пример #4
0
    def _get_dynamic_routing_edge_list(self, context,
                                       gateway_network_id, bgp_speaker_id):
        # Filter the routers attached this network as gateway interface
        filters = {'network_id': [gateway_network_id],
                   'device_owner': [n_const.DEVICE_OWNER_ROUTER_GW]}
        fields = ['device_id', 'fixed_ips']
        gateway_ports = self._core_plugin.get_ports(context, filters=filters,
                                                    fields=fields)

        bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
            context.session, bgp_speaker_id)
        binding_info = {bgp_binding['edge_id']: bgp_binding['bgp_identifier']
                        for bgp_binding in bgp_bindings}

        edge_router_dict = {}
        for port in gateway_ports:
            router_id = port['device_id']
            router = self._core_plugin._get_router(context, router_id)
            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
                continue

            if edge_id not in edge_router_dict:
                bgp_identifier = binding_info.get(
                    edge_id, port['fixed_ips'][0]['ip_address'])
                edge_router_dict[edge_id] = {'no_snat_routers': [],
                                             'bgp_identifier':
                                             bgp_identifier,
                                             'advertise_static_routes':
                                             advertise_static_routes}
            if not router.enable_snat:
                edge_router_dict[edge_id]['no_snat_routers'].append(router_id)
        return edge_router_dict
Пример #5
0
    def update_bgp_peer(self, context, bgp_peer_id, bgp_peer):
        password = bgp_peer['bgp_peer'].get('password')
        old_bgp_peer = self._plugin.get_bgp_peer(context, bgp_peer_id)

        # Only password update is relevant for backend.
        if old_bgp_peer['password'] == password:
            return

        bgp_speaker_ids = self._get_bgp_speakers_by_bgp_peer(
            context, bgp_peer_id)
        # Update the password for the old bgp peer and update NSX
        old_bgp_peer['password'] = password
        neighbour = bgp_neighbour_from_peer(old_bgp_peer)
        for bgp_speaker_id in bgp_speaker_ids:
            with locking.LockManager.get_lock(bgp_speaker_id):
                peers = self._plugin.get_bgp_peers_by_bgp_speaker(
                    context, bgp_speaker_id)
                if bgp_peer_id not in [p['id'] for p in peers]:
                    continue
                bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
                    context.session, bgp_speaker_id)
                for binding in bgp_bindings:
                    try:
                        # Neighbours are identified by their ip address
                        self._nsxv.update_bgp_neighbours(
                            binding['edge_id'], [neighbour], [neighbour])
                    except vcns_exc.VcnsApiException:
                        LOG.error(
                            "Failed to update BGP neighbor '%s' on "
                            "edge '%s'", old_bgp_peer['peer_ip'],
                            binding['edge_id'])
Пример #6
0
    def _get_dynamic_routing_edge_list(self, context,
                                       gateway_network_id, bgp_speaker_id):
        # Filter the routers attached this network as gateway interface
        filters = {'network_id': [gateway_network_id],
                   'device_owner': [n_const.DEVICE_OWNER_ROUTER_GW]}
        fields = ['device_id', 'fixed_ips']
        gateway_ports = self._core_plugin.get_ports(context, filters=filters,
                                                    fields=fields)

        bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
            context.session, bgp_speaker_id)
        binding_info = {bgp_binding['edge_id']: bgp_binding['bgp_identifier']
                        for bgp_binding in bgp_bindings}

        edge_router_dict = {}
        for port in gateway_ports:
            router_id = port['device_id']
            router = self._core_plugin._get_router(context, router_id)
            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
                continue

            if edge_id not in edge_router_dict:
                bgp_identifier = binding_info.get(
                    edge_id, port['fixed_ips'][0]['ip_address'])
                edge_router_dict[edge_id] = {'no_snat_routers': [],
                                             'bgp_identifier':
                                             bgp_identifier,
                                             'advertise_static_routes':
                                             advertise_static_routes}
            if not router.enable_snat:
                edge_router_dict[edge_id]['no_snat_routers'].append(router_id)
        return edge_router_dict
Пример #7
0
    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):
        bgp_obj = bgp_speaker['bgp_speaker']
        old_speaker_info = self._plugin.get_bgp_speaker(context,
                                                        bgp_speaker_id)
        enabled_state = old_speaker_info['advertise_tenant_networks']
        new_enabled_state = bgp_obj.get('advertise_tenant_networks',
                                        enabled_state)
        if new_enabled_state == enabled_state:
            return

        bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
            context.session, bgp_speaker_id)
        edge_ids = [bgp_binding['edge_id'] for bgp_binding in bgp_bindings]
        action = 'Enabling' if new_enabled_state else 'Disabling'
        LOG.info("%s BGP route redistribution on edges: %s.", action, edge_ids)
        for edge_id in edge_ids:
            try:
                self._nsxv.update_routing_redistribution(edge_id,
                                                         new_enabled_state)
            except vcns_exc.VcnsApiException:
                LOG.warning("Failed to update BGP on edge '%s'.", edge_id)
Пример #8
0
    def update_bgp_speaker(self, context, bgp_speaker_id, bgp_speaker):
        bgp_obj = bgp_speaker['bgp_speaker']
        old_speaker_info = self._plugin.get_bgp_speaker(
            context, bgp_speaker_id)
        enabled_state = old_speaker_info['advertise_tenant_networks']
        new_enabled_state = bgp_obj.get('advertise_tenant_networks',
                                        enabled_state)
        if new_enabled_state == enabled_state:
            return

        bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
            context.session, bgp_speaker_id)
        edge_ids = [bgp_binding['edge_id'] for bgp_binding in bgp_bindings]
        action = 'Enabling' if new_enabled_state else 'Disabling'
        LOG.info("%s BGP route redistribution on edges: %s.", action, edge_ids)
        for edge_id in edge_ids:
            try:
                self._nsxv.update_routing_redistribution(
                    edge_id, new_enabled_state)
            except vcns_exc.VcnsApiException:
                LOG.warning("Failed to update BGP on edge '%s'.", edge_id)
Пример #9
0
 def remove_gateway_network(self, context, bgp_speaker_id, network_info):
     bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
         context.session, bgp_speaker_id)
     self._stop_bgp_on_edges(context, bgp_bindings, bgp_speaker_id)
Пример #10
0
 def delete_bgp_speaker(self, context, bgp_speaker_id):
     bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
         context.session, bgp_speaker_id)
     self._stop_bgp_on_edges(context, bgp_bindings, bgp_speaker_id)
Пример #11
0
 def remove_gateway_network(self, context, bgp_speaker_id, network_info):
     bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
         context.session, bgp_speaker_id)
     self._stop_bgp_on_edges(context, bgp_bindings, bgp_speaker_id)
Пример #12
0
 def delete_bgp_speaker(self, context, bgp_speaker_id):
     bgp_bindings = nsxv_db.get_nsxv_bgp_speaker_bindings(
         context.session, bgp_speaker_id)
     self._stop_bgp_on_edges(context, bgp_bindings, bgp_speaker_id)