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