Beispiel #1
0
 def __init__(self, uuid, obj_dict=None):
     self.uuid = uuid
     self.virtual_networks = set()
     self.bgp_router = None
     self.config_manager = None
     self.nc_q = queue.Queue(maxsize=1)
     self.vn_ip_map = {}
     self.init_cs_state()
     self.update(obj_dict)
     self.config_manager = PhysicalRouterConfig(
         self.management_ip, self.user_credentials, self.vendor,
         self.product, self._logger)
     self.set_conf_sent_state(False)
     self.config_repush_interval = PushConfigState.get_repush_interval()
     self.nc_handler_gl = gevent.spawn(self.nc_handler)
     self.uve_send()
Beispiel #2
0
 def delete_config(self):
     if not self.is_vnc_managed() and self.is_conf_sent():
         # user must have unset the vnc managed property
         self.config_manager.delete_bgp_config()
         if self.config_manager.retry():
             #failed commit: set repush interval upto max value
             self.config_repush_interval = min([2 * self.config_repush_interval,
                                           PushConfigState.get_repush_max_interval()])
             self.block_and_set_config_state(self.config_repush_interval)
             return True
         #succesful commit: reset repush interval
         self.config_repush_interval = PushConfigState.get_repush_interval()
         self.set_conf_sent_state(False)
         self.uve_send()
         return True
     return False
Beispiel #3
0
    def push_config(self):

        if self.delete_config() or not self.is_vnc_managed():
            return

        self.config_manager.reset_bgp_config()
        bgp_router = BgpRouterDM.get(self.bgp_router)
        if bgp_router:
            for peer_uuid, attr in bgp_router.bgp_routers.items():
                peer = BgpRouterDM.get(peer_uuid)
                if peer is None:
                    continue
                external = (bgp_router.params['autonomous_system'] !=
                            peer.params['autonomous_system'])
                self.config_manager.add_bgp_peer(peer.params['address'],
                                                 peer.params, attr, external)
            self.config_manager.set_bgp_config(bgp_router.params)
            self.config_manager.set_global_routing_options(bgp_router.params)
            bgp_router_ips = bgp_router.get_all_bgp_router_ips()
            if self.dataplane_ip is not None and self.is_valid_ip(self.dataplane_ip):
                self.config_manager.add_dynamic_tunnels(self.dataplane_ip,
                              GlobalSystemConfigDM.ip_fabric_subnets, bgp_router_ips)

        self.config_manager.add_mpls_protocol()

        vn_dict = self.get_vn_li_map()
        self.evaluate_vn_irb_ip_map(set(vn_dict.keys()))
        vn_irb_ip_map = self.get_vn_irb_ip_map()
        for vn_id, interfaces in vn_dict.items():
            vn_obj = VirtualNetworkDM.get(vn_id)
            if vn_obj is None or vn_obj.vxlan_vni is None or vn_obj.vn_network_id is None:
                continue
            export_set = None
            import_set = None
            for ri_id in vn_obj.routing_instances:
                # Find the primary RI by matching the name
                ri_obj = RoutingInstanceDM.get(ri_id)
                if ri_obj is None:
                    continue
                if ri_obj.fq_name[-1] == vn_obj.fq_name[-1]:
                    vrf_name_l2 = vn_obj.get_vrf_name(vrf_type='l2')
                    vrf_name_l3 = vn_obj.get_vrf_name(vrf_type='l3')
                    export_set = copy.copy(ri_obj.export_targets)
                    import_set = copy.copy(ri_obj.import_targets)
                    for ri2_id in ri_obj.routing_instances:
                        ri2 = RoutingInstanceDM.get(ri2_id)
                        if ri2 is None:
                            continue
                        import_set |= ri2.export_targets

                    if vn_obj.forwarding_mode in ['l2', 'l2_l3']:
                        irb_ips = None
                        if vn_obj.forwarding_mode == 'l2_l3':
                            irb_ips = vn_irb_ip_map.get(vn_id, [])
                        self.config_manager.add_routing_instance(vrf_name_l2,
                                                             True,
                                                             vn_obj.forwarding_mode == 'l2_l3',
                                                             import_set,
                                                             export_set,
                                                             vn_obj.get_prefixes(),
                                                             irb_ips,
                                                             vn_obj.router_external,
                                                             interfaces,
                                                             vn_obj.vxlan_vni,
                                                             None, vn_obj.vn_network_id)

                    if vn_obj.forwarding_mode in ['l3', 'l2_l3']:
                        interfaces = [JunosInterface('irb.'+ str(vn_obj.vn_network_id), 'l3', 0)]
                        self.config_manager.add_routing_instance(vrf_name_l3,
                                                             False,
                                                             vn_obj.forwarding_mode == 'l2_l3',
                                                             import_set,
                                                             export_set,
                                                             vn_obj.get_prefixes(),
                                                             None,
                                                             vn_obj.router_external,
                                                             interfaces)

                    break

            if export_set is not None and self.is_junos_service_ports_enabled() and len(vn_obj.instance_ip_map) > 0:
                service_port_id = 2*vn_obj.vn_network_id - 1
                if self.is_service_port_id_valid(service_port_id) == False:
                    self._logger.error("DM can't allocate service interfaces for \
                                          (vn, vn-id)=(%s,%s)" % (vn_obj.fq_name, vn_obj.vn_network_id))
                else:
                    vrf_name = vrf_name_l3[:123] + '-nat'
                    interfaces = []
                    service_ports = self.junos_service_ports.get('service_port')
                    interfaces.append(JunosInterface(service_ports[0] + "." + str(service_port_id), 'l3', 0))
                    interfaces.append(JunosInterface(service_ports[0] + "." + str(service_port_id + 1), 'l3', 0))
                    self.config_manager.add_routing_instance(vrf_name,
                                                         False,
                                                         False,
                                                         import_set,
                                                         set(),
                                                         None,
                                                         None,
                                                         False,
                                                         interfaces,
                                                         None,
                                                         vn_obj.instance_ip_map, vn_obj.vn_network_id)

        config_size = self.config_manager.send_bgp_config()
        self.set_conf_sent_state(True)
        self.uve_send()
        if self.config_manager.retry():
            #failed commit: set repush interval upto max value
            self.config_repush_interval = min([2 * self.config_repush_interval,
                                               PushConfigState.get_repush_max_interval()])
            self.block_and_set_config_state(self.config_repush_interval)
        else:
            #successful commit: reset repush interval to base
            self.config_repush_interval = PushConfigState.get_repush_interval()
            if PushConfigState.get_push_delay_enable():
                # sleep, delay=compute max delay between two successive commits
                gevent.sleep(self.get_push_config_interval(config_size))