def get_vn_li_map(self): pr = self.physical_router vn_list = [] # get all logical router connected networks for lr_id in pr.logical_routers or []: lr = LogicalRouterDM.get(lr_id) if not lr: continue vn_list += lr.get_connected_networks(include_internal=True) vn_dict = {} for vn_id in vn_list: vn_dict[vn_id] = [] li_set = pr.logical_interfaces for pi_uuid in pr.physical_interfaces: pi = PhysicalInterfaceDM.get(pi_uuid) if pi is None: continue li_set |= pi.logical_interfaces for li_uuid in li_set: li = LogicalInterfaceDM.get(li_uuid) if li is None: continue vmi_id = li.virtual_machine_interface vmi = VirtualMachineInterfaceDM.get(vmi_id) if vmi is None: continue vn_id = vmi.virtual_network vn_dict.setdefault(vn_id, []).append( JunosInterface(li.name, li.li_type, li.vlan_tag)) return vn_dict
def config_pnf_logical_interface(self): pnf_dict = {} pnf_ris = set() # make it fake for now # sholud save to the database, the allocation self.vlan_alloc = {"max": 1} self.ip_alloc = {"max": -1} self.li_alloc = {} for pi_uuid in self.physical_router.physical_interfaces: pi = PhysicalInterfaceDM.get(pi_uuid) if pi is None: continue for pi_pi_uuid in pi.physical_interfaces: pi_pi = PhysicalInterfaceDM.get(pi_pi_uuid) for pi_vmi_uuid in pi_pi.virtual_machine_interfaces: allocate_li = False pi_vmi = VirtualMachineInterfaceDM.get(pi_vmi_uuid) if (pi_vmi is None or pi_vmi.service_instance is None or pi_vmi.service_interface_type is None): continue if pi_vmi.routing_instances: for ri_id in pi_vmi.routing_instances: ri_obj = RoutingInstanceDM.get(ri_id) if ri_obj and ri_obj.routing_instances and ri_obj.service_chain_address: pnf_ris.add(ri_obj) # If this service is on a service chain, we need allocate # a logic interface for its VMI allocate_li = True if allocate_li: resources = self.physical_router.allocate_pnf_resources(pi_vmi) if (not resources or not resources["ip_address"] or not resources["vlan_id"] or not resources["unit_id"]): self._logger.error( "Cannot allocate PNF resources for " "Virtual Machine Interface" + pi_vmi_uuid) return logical_interface = JunosInterface( pi.name + '.' + resources["unit_id"], "l3", resources["vlan_id"], resources["ip_address"]) self.add_pnf_logical_interface( logical_interface) lis = pnf_dict.setdefault( pi_vmi.service_instance, {"left": [], "right": [], "mgmt": [], "other": []} )[pi_vmi.service_interface_type] lis.append(logical_interface) return (pnf_dict, pnf_ris)
def get_vn_li_map(self): pr = self.physical_router vn_list = [] # get all logical router connected networks for lr_id in pr.logical_routers or []: lr = LogicalRouterDM.get(lr_id) if not lr: continue vn_list += lr.get_connected_networks(include_internal=True) vn_dict = {} for vn_id in vn_list: vn_dict[vn_id] = [] li_set = pr.logical_interfaces for pi_uuid in pr.physical_interfaces: pi = PhysicalInterfaceDM.get(pi_uuid) if pi is None: continue li_set |= pi.logical_interfaces for li_uuid in li_set: li = LogicalInterfaceDM.get(li_uuid) if li is None: continue vmi_id = li.virtual_machine_interface vmi = VirtualMachineInterfaceDM.get(vmi_id) if vmi is None: continue vn_id = vmi.virtual_network if li.physical_interface: pi = PhysicalInterfaceDM.get(li.physical_interface) # ae_id = pi.get_parent_ae_id() # if ae_id and li.physical_interface: # _, unit= li.name.split('.') # ae_name = "ae" + str(ae_id) + "." + unit # vn_dict.setdefault(vn_id, []).append( # JunosInterface(ae_name, li.li_type, li.vlan_tag)) # continue vn_dict.setdefault(vn_id, []).append( JunosInterface(li.name, li.li_type, li.vlan_tag, li_uuid=li.uuid)) return vn_dict
def push_conf(self, is_delete=False): if not self.physical_router: return 0 if is_delete: return self.send_conf(is_delete=True) if not self.physical_router.bgp_router: self._logger.info("bgp router not configured for pr: " + \ self.physical_router.name) return 0 self.build_bgp_config() vn_dict = self.get_vn_li_map() self.physical_router.evaluate_vn_irb_ip_map(set(vn_dict.keys()), 'l2_l3', 'irb', False) self.physical_router.evaluate_vn_irb_ip_map(set(vn_dict.keys()), 'l3', 'lo0', True) vn_irb_ip_map = self.physical_router.get_vn_irb_ip_map() first_vrf = [] pnfs = self.config_pnf_logical_interface() pnf_dict = pnfs[0] pnf_ris = pnfs[1] for vn_id, interfaces in vn_dict.items(): vn_obj = VirtualNetworkDM.get(vn_id) if (vn_obj is None or vn_obj.get_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 = DMUtils.make_vrf_name( vn_obj.fq_name[-1], vn_obj.vn_network_id, 'l2') vrf_name_l3 = DMUtils.make_vrf_name( vn_obj.fq_name[-1], vn_obj.vn_network_id, '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 in pnf_ris: first_vrf.append(ri2) if ri2 is None: continue import_set |= ri2.export_targets if vn_obj.get_forwarding_mode() in ['l2', 'l2_l3']: irb_ips = None if vn_obj.get_forwarding_mode() == 'l2_l3': irb_ips = vn_irb_ip_map['irb'].get(vn_id, []) ri_conf = {'ri_name': vrf_name_l2, 'vn': vn_obj} ri_conf['is_l2'] = True ri_conf['is_l2_l3'] = ( vn_obj.get_forwarding_mode() == 'l2_l3') ri_conf['import_targets'] = import_set ri_conf['export_targets'] = export_set ri_conf['prefixes'] = vn_obj.get_prefixes() ri_conf['gateways'] = irb_ips ri_conf['router_external'] = vn_obj.router_external ri_conf['interfaces'] = interfaces ri_conf['vni'] = vn_obj.get_vxlan_vni() ri_conf['network_id'] = vn_obj.vn_network_id ri_conf['highest_enapsulation_priority'] = \ GlobalVRouterConfigDM.global_encapsulation_priority self.add_routing_instance(ri_conf) if vn_obj.get_forwarding_mode() in ['l3', 'l2_l3']: interfaces = [] lo0_ips = None if vn_obj.get_forwarding_mode() == 'l2_l3': interfaces = [ JunosInterface( 'irb.' + str(vn_obj.vn_network_id), 'l3', 0) ] else: lo0_ips = vn_irb_ip_map['lo0'].get(vn_id, []) ri_conf = {'ri_name': vrf_name_l3, 'vn': vn_obj} ri_conf['is_l2_l3'] = ( vn_obj.get_forwarding_mode() == 'l2_l3') ri_conf['import_targets'] = import_set ri_conf['export_targets'] = export_set ri_conf['prefixes'] = vn_obj.get_prefixes() ri_conf['router_external'] = vn_obj.router_external ri_conf['interfaces'] = interfaces ri_conf['gateways'] = lo0_ips ri_conf['network_id'] = vn_obj.vn_network_id self.add_routing_instance(ri_conf) break if (export_set is not None and self.physical_router.is_junos_service_ports_enabled() and len(vn_obj.instance_ip_map) > 0): service_port_ids = DMUtils.get_service_ports( vn_obj.vn_network_id) if self.physical_router.is_service_port_id_valid( service_port_ids[0]) == 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 = DMUtils.make_vrf_name(vn_obj.fq_name[-1], vn_obj.vn_network_id, 'l3', True) interfaces = [] service_ports = self.physical_router.junos_service_ports.get( 'service_port') interfaces.append( JunosInterface( service_ports[0] + "." + str(service_port_ids[0]), 'l3', 0)) interfaces.append( JunosInterface( service_ports[0] + "." + str(service_port_ids[1]), 'l3', 0)) ri_conf = {'ri_name': vrf_name, 'vn': vn_obj} ri_conf['import_targets'] = import_set ri_conf['interfaces'] = interfaces ri_conf['fip_map'] = vn_obj.instance_ip_map ri_conf['network_id'] = vn_obj.vn_network_id ri_conf['restrict_proxy_arp'] = vn_obj.router_external self.add_routing_instance(ri_conf) # Add PNF ri configuration self.add_pnf_vrfs(first_vrf, pnf_dict, pnf_ris) self.set_as_config() self.set_route_targets_config() self.set_bgp_group_config() return self.send_conf()