diff --git a/src/config/api-server/vnc_addr_mgmt.py b/src/config/api-server/vnc_addr_mgmt.py index d069d821024..8f0b5a7b021 100644 --- a/src/config/api-server/vnc_addr_mgmt.py +++ b/src/config/api-server/vnc_addr_mgmt.py @@ -878,7 +878,7 @@ def ip_alloc_req(self, vn_fq_name, vn_dict=None, sub=None, asked_ip_addr=None, should_persist=False) self._subnet_objs[vn_fq_name_str][subnet_name] = subnet_obj - if asked_ip_version != subnet_obj.get_version(): + if asked_ip_version and asked_ip_version != subnet_obj.get_version(): continue if asked_ip_addr == str(subnet_obj.gw_ip): return asked_ip_addr diff --git a/src/config/api-server/vnc_cfg_types.py b/src/config/api-server/vnc_cfg_types.py index 931444615db..b077ec061d1 100644 --- a/src/config/api-server/vnc_cfg_types.py +++ b/src/config/api-server/vnc_cfg_types.py @@ -1070,7 +1070,10 @@ def drop_ref(obj_uuid): @classmethod def ip_alloc(cls, vn_fq_name, subnet_name, count, family=None): - ip_version = 6 if family == 'v6' else 4 + if family: + ip_version = 6 if family == 'v6' else 4 + else: + ip_version = None ip_list = [cls.addr_mgmt.ip_alloc_req(vn_fq_name, sub=subnet_name, asked_ip_version=ip_version, alloc_id=str(uuid.uuid4())) diff --git a/src/config/device-manager/device_manager/db.py b/src/config/device-manager/device_manager/db.py index 6f151e93145..2db302c11bb 100644 --- a/src/config/device-manager/device_manager/db.py +++ b/src/config/device-manager/device_manager/db.py @@ -238,7 +238,7 @@ def free_ip(self, vn_uuid, subnet_prefix, ip_addr): def get_vn_irb_ip_map(self): irb_ips = {} for vn_subnet, ip_addr in self.vn_ip_map.items(): - (vn_uuid, subnet_prefix) = vn_subnet.split(':') + (vn_uuid, subnet_prefix) = vn_subnet.split(':', 1) vn = VirtualNetworkDM.get(vn_uuid) if vn_uuid not in irb_ips: irb_ips[vn_uuid] = set() @@ -260,7 +260,7 @@ def evaluate_vn_irb_ip_map(self, vn_set): delete_set = old_set.difference(new_vn_ip_set) create_set = new_vn_ip_set.difference(old_set) for vn_subnet in delete_set: - (vn_uuid, subnet_prefix) = vn_subnet.split(':') + (vn_uuid, subnet_prefix) = vn_subnet.split(':', 1) ret = self.free_ip( vn_uuid, subnet_prefix, self.vn_ip_map[vn_subnet]) if ret == False: @@ -283,7 +283,7 @@ def evaluate_vn_irb_ip_map(self, vn_set): del self.vn_ip_map[vn_subnet] for vn_subnet in create_set: - (vn_uuid, subnet_prefix) = vn_subnet.split(':') + (vn_uuid, subnet_prefix) = vn_subnet.split(':', 1) (sub, length) = subnet_prefix.split('/') ip_addr = self.reserve_ip(vn_uuid, subnet_prefix) if ip_addr is None: diff --git a/src/config/device-manager/device_manager/physical_router_config.py b/src/config/device-manager/device_manager/physical_router_config.py index 34e677256b1..d674e009756 100644 --- a/src/config/device-manager/device_manager/physical_router_config.py +++ b/src/config/device-manager/device_manager/physical_router_config.py @@ -304,10 +304,23 @@ def add_routing_instance(self, ri_name, is_l2, is_l2_l3, if not is_l2: if ri_opt is None: ri_opt = etree.SubElement(ri, "routing-options") + has_ipv6_prefixes = False + has_ipv4_prefixes = False if prefixes and fip_map is None: static_config = etree.SubElement(ri_opt, "static") + rib_config_v6 = None + static_config_v6 = None for prefix in prefixes: - route_config = etree.SubElement(static_config, "route") + if ':' in prefix and not rib_config_v6: + rib_config_v6 = etree.SubElement(ri_opt, "rib") + etree.SubElement(rib_config_v6, "name").text = ri_name + ".inet6.0" + static_config_v6 = etree.SubElement(rib_config_v6, "static") + has_ipv6_prefixes = True + if ':' in prefix: + route_config = etree.SubElement(static_config_v6, "route") + else: + route_config = etree.SubElement(static_config, "route") + has_ipv4_prefixes = True etree.SubElement(route_config, "name").text = prefix etree.SubElement(route_config, "discard") if router_external: @@ -324,10 +337,16 @@ def add_routing_instance(self, ri_name, is_l2, is_l2_l3, ri_opt = etree.SubElement(ri, "routing-options") if static_routes: self.add_static_routes(ri_opt, static_routes) - auto_export = """ + if has_ipv4_prefixes: + auto_export = """ """ - ri_opt.append(etree.fromstring(auto_export)) + ri_opt.append(etree.fromstring(auto_export)) + if has_ipv6_prefixes: + auto_export = """ + + """ + ri_opt.append(etree.fromstring(auto_export)) else: etree.SubElement(ri, "instance-type").text = "virtual-switch" @@ -496,9 +515,17 @@ def add_routing_instance(self, ri_name, is_l2, is_l2_l3, intf_unit = etree.SubElement(irb_intf, "unit") etree.SubElement(intf_unit, "name").text = str(network_id) family = etree.SubElement(intf_unit, "family") - inet = etree.SubElement(family, "inet") + inet = None + inet6 = None for (irb_ip, gateway) in gateways: - addr = etree.SubElement(inet, "address") + if ':' in irb_ip: + if not inet6: + inet6 = etree.SubElement(family, "inet6") + addr = etree.SubElement(inet6, "address") + else: + if not inet: + inet = etree.SubElement(family, "inet") + addr = etree.SubElement(inet, "address") etree.SubElement(addr, "name").text = irb_ip if len(gateway) and gateway != '0.0.0.0': etree.SubElement( @@ -791,7 +818,7 @@ def _get_neighbor_config_xml(self, bgp_config, peers): def send_bgp_config(self): bgp_config = self._get_bgp_config_xml() if bgp_config is None: - return + return 0 proto_config = etree.Element("protocols") bgp = etree.SubElement(proto_config, "bgp") bgp.append(bgp_config) @@ -857,4 +884,4 @@ def is_untagged(self): return False # end is_untagged -# end JunosInterface \ No newline at end of file +# end JunosInterface