diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 71e2d2514fa2..d643d2b1901a 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -21,7 +21,7 @@ iface lo {{ 'inet' if prefix | ipv4 else 'inet6' }} static # The management network interface auto eth0 {% if MGMT_INTERFACE %} -{% for (name, prefix) in MGMT_INTERFACE %} +{% for (name, prefix) in MGMT_INTERFACE|sort_by_prefix %} iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 2495bc89fe06..96c9d2218aa5 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -33,6 +33,13 @@ from swsssdk import ConfigDBConnector from collections import OrderedDict from natsort import natsorted +# Sort by interface name. For configs to the same interface (name), +# sort by prefix to put v4 address ahead of v6 address in the list +def sort_by_prefix(value): + if not value: + return None + return sorted(value.keys(), key = lambda k: (k[0], 4) if is_ipv4(k[1]) else (k[0], 6)) + def is_ipv4(value): if not value: return False @@ -210,6 +217,7 @@ def main(): loader = jinja2.FileSystemLoader(paths) env = jinja2.Environment(loader=loader, trim_blocks=True) + env.filters['sort_by_prefix'] = sort_by_prefix env.filters['ipv4'] = is_ipv4 env.filters['ipv6'] = is_ipv6 env.filters['unique_name'] = unique_name diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index c8da2fee8f76..c70a9bd47f60 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -30,17 +30,17 @@ iface eth0 inet static down ip -4 route delete 10.0.0.0/24 dev eth0 table default down ip -4 rule delete from 10.0.0.100/32 table default iface eth0 inet6 static - address 2603:10e2:0:2902::8 + address 603:10e2:0:2902::8 netmask 64 ########## management network policy routing rules # management port up rules - up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default - up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default - up ip -6 rule add from 2603:10e2:0:2902::8/128 table default + up ip -6 route add default via 603:10e2:0:2902::1 dev eth0 table default + up ip -6 route add 603:10e2:0:2902::/64 dev eth0 table default + up ip -6 rule add from 603:10e2:0:2902::8/128 table default # management port down rules - down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default - down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default - down ip -6 rule delete from 2603:10e2:0:2902::8/128 table default + down ip -6 route delete default via 603:10e2:0:2902::1 dev eth0 table default + down ip -6 route delete 603:10e2:0:2902::/64 dev eth0 table default + down ip -6 rule delete from 603:10e2:0:2902::8/128 table default # # The switch front panel interfaces # "|| true" is added to suppress the error when interface is already a member of LAG diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index bda5517771e5..0806d278cc7a 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -167,9 +167,9 @@ HostIP eth0 - 2603:10e2:0:2902::8/64 + 603:10e2:0:2902::8/64 - 2603:10e2:0:2902::8/64 + 603:10e2:0:2902::8/64