def set_internal_vn_irb_config(self): if self.internal_vn_ris and self.irb_interfaces: for int_ri in self.internal_vn_ris: lr_uuid = DMUtils.extract_lr_uuid_from_internal_vn_name(int_ri.name) lr = LogicalRouterDM.get(lr_uuid) if not lr: continue vn_list = lr.get_connected_networks(include_internal=False) for vn in vn_list: vn_obj = VirtualNetworkDM.get(vn) irb_name = "irb." + str(vn_obj.vn_network_id) if irb_name in self.irb_interfaces: int_ri.add_routing_interfaces(LogicalInterface(name=irb_name))
def set_internal_vn_irb_config(self): if self.internal_vn_ris and self.irb_interfaces: for int_ri in self.internal_vn_ris: lr_uuid = DMUtils.extract_lr_uuid_from_internal_vn_name(int_ri.name) lr = LogicalRouterDM.get(lr_uuid) if not lr: continue vn_list = lr.get_connected_networks(include_internal=False) for vn in vn_list: vn_obj = VirtualNetworkDM.get(vn) if vn_obj is None or vn_obj.vn_network_id is None: continue irb_name = "irb." + str(vn_obj.vn_network_id) if irb_name in self.irb_interfaces: self.add_ref_to_list(int_ri.get_routing_interfaces(), irb_name)
def build_ri_config(self): vn_dict = self.get_vn_li_map() vn_irb_ip_map = None if self.is_gateway(): 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() for vn_id, interfaces in self.get_sorted_key_value_pairs(vn_dict): 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') if vn_obj.route_targets: export_set = vn_obj.route_targets & ri_obj.export_targets import_set = vn_obj.route_targets & ri_obj.import_targets else: 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.get_forwarding_mode() in ['l2', 'l2_l3']: irb_ips = None if vn_obj.get_forwarding_mode( ) == 'l2_l3' and self.is_gateway(): irb_ips = vn_irb_ip_map['irb'].get(vn_id, []) ri_conf = { 'ri_name': vrf_name_l2, 'vn': vn_obj, 'is_l2': True, 'is_l2_l3': (vn_obj.get_forwarding_mode() == 'l2_l3'), 'import_targets': import_set, 'export_targets': export_set, 'prefixes': vn_obj.get_prefixes(), 'gateways': irb_ips, 'router_external': vn_obj.router_external, 'interfaces': interfaces, 'vni': vn_obj.get_vxlan_vni(), 'network_id': vn_obj.vn_network_id, 'encapsulation_priorities': GlobalVRouterConfigDM. global_encapsulation_priorities } 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) ] elif self.is_gateway(): lo0_ips = vn_irb_ip_map['lo0'].get(vn_id, []) is_internal_vn = True if '_contrail_lr_internal_vn_' in vn_obj.name else False is_dci_vn = True if '_contrail_dci_internal_vn_' in vn_obj.name else False ri_conf = { 'ri_name': vrf_name_l3, 'vn': vn_obj, 'is_l2': False, 'is_l2_l3': vn_obj.get_forwarding_mode() == 'l2_l3', 'import_targets': import_set, 'export_targets': export_set, 'prefixes': vn_obj.get_prefixes(), 'router_external': vn_obj.router_external, 'interfaces': interfaces, 'gateways': lo0_ips, 'network_id': vn_obj.vn_network_id } if is_dci_vn: ri_conf["prefixes"] = vn_obj.get_prefixes( self.physical_router.uuid) ri_conf['vni'] = vn_obj.get_vxlan_vni( is_dci_vn=is_dci_vn) ri_conf['is_dci_network'] = True elif is_internal_vn: ri_conf['vni'] = vn_obj.get_vxlan_vni( is_internal_vn=is_internal_vn) lr_uuid = DMUtils.extract_lr_uuid_from_internal_vn_name( vrf_name_l3) lr = LogicalRouterDM.get(lr_uuid) if lr: ri_conf[ 'router_external'] = lr.logical_router_gateway_external if lr.data_center_interconnect: ri_conf[ 'connected_dci_network'] = lr.data_center_interconnect self.add_routing_instance(ri_conf) break if export_set 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 not self.physical_router \ .is_service_port_id_valid(service_port_ids[0]): 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, 'import_targets': import_set, 'interfaces': interfaces, 'fip_map': vn_obj.instance_ip_map, 'network_id': vn_obj.vn_network_id, 'restrict_proxy_arp': vn_obj.router_external } self.add_routing_instance(ri_conf) return
def set_logical_router(self, name): if DMUtils.get_lr_internal_vn_prefix() in name: lr_uuid = DMUtils.extract_lr_uuid_from_internal_vn_name(name) lr_obj = LogicalRouterDM.get(lr_uuid) if lr_obj: self.logical_router = lr_obj.uuid
def add_routing_instance(self, ri_conf): ri_name = ri_conf.get("ri_name") vn = ri_conf.get("vn") is_l2 = ri_conf.get("is_l2", False) is_l2_l3 = ri_conf.get("is_l2_l3", False) import_targets = ri_conf.get("import_targets", set()) export_targets = ri_conf.get("export_targets", set()) prefixes = ri_conf.get("prefixes", []) gateways = ri_conf.get("gateways", []) interfaces = ri_conf.get("interfaces", []) vni = ri_conf.get("vni", None) network_id = ri_conf.get("network_id", None) is_internal_vn = True if '_contrail_lr_internal_vn_' in vn.name else False self.routing_instances[ri_name] = ri_conf ri_config = None policy_config = self.policy_config or \ PolicyOptions(comment=DMUtils.policy_options_comment()) ri = None ri_opt = None ri_config = self.ri_config or \ RoutingInstances(comment=DMUtils.routing_instances_comment()) ri = Instance(name=ri_name) if not is_l2: ri_config.add_instance(ri) ri.set_vrf_import(DMUtils.make_import_name(ri_name)) ri.set_vrf_export(DMUtils.make_export_name(ri_name)) has_ipv6_prefixes = DMUtils.has_ipv6_prefixes(prefixes) has_ipv4_prefixes = DMUtils.has_ipv4_prefixes(prefixes) if not is_l2: if ri_opt is None: ri_opt = RoutingInstanceRoutingOptions() ri.set_routing_options(ri_opt) ri.set_instance_type("vrf") for interface in interfaces: ri.add_interface(Interface(name=interface.name)) family = Family() if has_ipv4_prefixes: family.set_inet(FamilyInet(unicast='')) if has_ipv6_prefixes: family.set_inet6(FamilyInet6(unicast='')) if has_ipv4_prefixes or has_ipv6_prefixes: auto_export = AutoExport(family=family) ri_opt.set_auto_export(auto_export) if is_internal_vn: self.internal_vn_ris.append(ri) self.add_bogus_lo0(ri, network_id, vn) if self.is_spine() and is_l2_l3: self.add_irb_config(ri_conf) self.attach_irb(ri_conf, ri) lr_uuid = None if is_internal_vn: lr_uuid = DMUtils.extract_lr_uuid_from_internal_vn_name(ri_name) # add policies for export route targets if self.is_spine(): ps = PolicyStatement(name=DMUtils.make_export_name(ri_name)) ps.set_comment(DMUtils.vn_ps_comment(vn, "Export")) then = Then() ps.add_term(Term(name="t1", then=then)) for route_target in export_targets: comm = Community( add='', community_name=DMUtils.make_community_name(route_target)) then.add_community(comm) then.set_accept('') policy_config.add_policy_statement(ps) self.add_to_global_switch_opts(DMUtils.make_export_name(ri_name), False) # add policies for import route targets ps = PolicyStatement(name=DMUtils.make_import_name(ri_name)) ps.set_comment(DMUtils.vn_ps_comment(vn, "Import")) # add term switch policy from_ = From() term = Term(name=DMUtils.get_switch_policy_name(), fromxx=from_) ps.add_term(term) from_.add_community(DMUtils.get_switch_policy_name()) term.set_then(Then(accept='')) from_ = From() term = Term(name="t1", fromxx=from_) ps.add_term(term) for route_target in import_targets: from_.add_community(DMUtils.make_community_name(route_target)) if not is_internal_vn: self.add_vni_option(vni or network_id, route_target) term.set_then(Then(accept='')) policy_config.add_policy_statement(ps) self.add_to_global_switch_opts(DMUtils.make_import_name(ri_name), True) # add L2 EVPN and BD config interfaces_config = self.interfaces_config if (is_l2 and vni is not None and self.is_family_configured(self.bgp_params, "e-vpn")): # add vlan config vlan_conf = self.add_vlan_config(ri_name, vni, is_l2_l3, "irb." + str(network_id)) interfaces_config = self.interfaces_config or Interfaces( comment=DMUtils.interfaces_comment()) self.build_l2_evpn_interface_config(interfaces_config, interfaces, vn, vlan_conf) if (not is_l2 and (vni is not None or (is_internal_vn and lr_uuid)) and \ self.is_family_configured(self.bgp_params, "e-vpn")): evpn = self.build_evpn_config(int_vn=is_internal_vn) if evpn: ri.set_protocols(RoutingInstanceProtocols(evpn=evpn)) if is_internal_vn and lr_uuid: ip_prefix_support = IpPrefixSupport() #ip_prefix_support.set_forwarding_mode("symmetric") ip_prefix_support.set_encapsulation("vxlan") ip_prefix_support.set_vni(str(vni)) ip_prefix_support.set_advertise("direct-nexthop") evpn.set_ip_prefix_support(ip_prefix_support) else: ri.set_vtep_source_interface("lo0.0") if not is_internal_vn: #add vlans self.add_ri_vlan_config(ri, vni) if (not is_l2 and not is_l2_l3 and gateways): interfaces_config = self.interfaces_config or \ Interfaces(comment=DMUtils.interfaces_comment()) ifl_num = str(1000 + int(network_id)) lo_intf = Interface(name="lo0") interfaces_config.add_interface(lo_intf) intf_unit = Unit(name=ifl_num, comment=DMUtils.l3_lo_intf_comment(vn)) lo_intf.add_unit(intf_unit) family = Family() intf_unit.set_family(family) inet = None inet6 = None for (lo_ip, _) in gateways: subnet = lo_ip (ip, _) = lo_ip.split('/') if ':' in lo_ip: if not inet6: inet6 = FamilyInet6() family.set_inet6(inet6) addr = Address() inet6.add_address(addr) lo_ip = ip + '/' + '128' else: if not inet: inet = FamilyInet() family.set_inet(inet) addr = Address() inet.add_address(addr) lo_ip = ip + '/' + '32' addr.set_name(lo_ip) addr.set_comment(DMUtils.lo0_ip_comment(subnet)) ri.add_interface( Interface(name="lo0." + ifl_num, comment=DMUtils.lo0_ri_intf_comment(vn))) self.policy_config = policy_config self.interfaces_config = interfaces_config self.route_targets |= import_targets | export_targets self.ri_config = ri_config
def build_ri_config(self): vn_dict = self.get_vn_li_map() vn_irb_ip_map = None if self.is_gateway(): 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() for vn_id, interfaces in self.get_sorted_key_value_pairs(vn_dict): 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') if vn_obj.route_targets: export_set = vn_obj.route_targets & ri_obj.export_targets import_set = vn_obj.route_targets & ri_obj.import_targets else: 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.get_forwarding_mode() in ['l2', 'l2_l3']: irb_ips = None if vn_obj.get_forwarding_mode() == 'l2_l3' and self.is_gateway(): irb_ips = vn_irb_ip_map['irb'].get(vn_id, []) ri_conf = {'ri_name': vrf_name_l2, 'vn': vn_obj, 'is_l2': True, 'is_l2_l3': ( vn_obj.get_forwarding_mode() == 'l2_l3'), 'import_targets': import_set, 'export_targets': export_set, 'prefixes': vn_obj.get_prefixes(), 'gateways': irb_ips, 'router_external': vn_obj.router_external, 'interfaces': interfaces, 'vni': vn_obj.get_vxlan_vni(), 'network_id': vn_obj.vn_network_id, 'encapsulation_priorities': GlobalVRouterConfigDM. global_encapsulation_priorities} 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)] elif self.is_gateway(): lo0_ips = vn_irb_ip_map['lo0'].get(vn_id, []) is_internal_vn = True if '_contrail_lr_internal_vn_' in vn_obj.name else False is_dci_vn = True if '_contrail_dci_internal_vn_' in vn_obj.name else False ri_conf = {'ri_name': vrf_name_l3, 'vn': vn_obj, 'is_l2': False, 'is_l2_l3': vn_obj.get_forwarding_mode() == 'l2_l3', 'import_targets': import_set, 'export_targets': export_set, 'prefixes': vn_obj.get_prefixes(), 'router_external': vn_obj.router_external, 'interfaces': interfaces, 'gateways': lo0_ips, 'network_id': vn_obj.vn_network_id} if is_dci_vn: ri_conf["prefixes"] = vn_obj.get_prefixes(self.physical_router.uuid) ri_conf['vni'] = vn_obj.get_vxlan_vni(is_dci_vn = is_dci_vn) ri_conf['is_dci_network'] = True elif is_internal_vn: ri_conf['vni'] = vn_obj.get_vxlan_vni(is_internal_vn = is_internal_vn) lr_uuid = DMUtils.extract_lr_uuid_from_internal_vn_name(vrf_name_l3) lr = LogicalRouterDM.get(lr_uuid) if lr: ri_conf['router_external'] = lr.logical_router_gateway_external if lr.data_center_interconnect: ri_conf['connected_dci_network'] = lr.data_center_interconnect self.add_routing_instance(ri_conf) break if export_set 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 not self.physical_router \ .is_service_port_id_valid(service_port_ids[0]): 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, 'import_targets': import_set, 'interfaces': interfaces, 'fip_map': vn_obj.instance_ip_map, 'network_id': vn_obj.vn_network_id, 'restrict_proxy_arp': vn_obj.router_external} self.add_routing_instance(ri_conf) return