diff --git a/packetnetworking/distros/debian/conftest.py b/packetnetworking/distros/debian/conftest.py index 55463b6..47c4e11 100644 --- a/packetnetworking/distros/debian/conftest.py +++ b/packetnetworking/distros/debian/conftest.py @@ -39,6 +39,7 @@ def expected_file_etc_network_interfaces_dhcp_2(): "1bond2nics", "1bond4nics", "2bonds2nics", + "2bonds2nics_unsorted", ], params=[ [ @@ -57,13 +58,19 @@ def expected_file_etc_network_interfaces_dhcp_2(): {"name": "eth2", "mac": "00:0c:29:51:53:a2", "bond": "bond1"}, {"name": "eth3", "mac": "00:0c:29:51:53:a3", "bond": "bond1"}, ], + [ + {"name": "eth2", "mac": "00:0c:29:51:53:a2", "bond": "bond1"}, + {"name": "eth3", "mac": "00:0c:29:51:53:a3", "bond": "bond1"}, + {"name": "eth0", "mac": "00:0c:29:51:53:a0", "bond": "bond0"}, + {"name": "eth1", "mac": "00:0c:29:51:53:a1", "bond": "bond0"}, + ], ], ) def debianbuilder(mockit, fake, metadata, patch_dict, request): gen_metadata = metadata def _builder(metadata=None, public=True, post_gen_metadata=None): - resolvers = ("1.2.3.4", "2.3.4.5") + resolvers = reversed([fake.ipv4(), fake.ipv4()]) meta_interfaces = request.param phys_interfaces = [ {"name": iface["name"].replace("eth", "enp"), "mac": iface["mac"]} diff --git a/packetnetworking/distros/debian/templates/bonded/etc_network_interfaces.j2 b/packetnetworking/distros/debian/templates/bonded/etc_network_interfaces.j2 index 426f7b6..36d8371 100644 --- a/packetnetworking/distros/debian/templates/bonded/etc_network_interfaces.j2 +++ b/packetnetworking/distros/debian/templates/bonded/etc_network_interfaces.j2 @@ -2,7 +2,7 @@ auto lo iface lo inet loopback {% if osinfo.distro == 'ubuntu' %} -{% for iface in interfaces %} +{% for iface in interfaces | sort(attribute="name") %} auto {{ iface.name }} iface {{ iface.name }} inet manual @@ -13,10 +13,10 @@ iface {{ iface.name }} inet manual {% endfor %} {% endif %} -{% for bond in bonds %} +{% for bond in bonds | sort %} auto {{ bond }} -iface {{ bond }} inet static +iface {{ bond }} inet {% if bond == "bond0" %}static{% else %}manual{% endif +%} {% if bond == "bond0" %} {% if ip4pub %} address {{ ip4pub.address }} @@ -27,7 +27,7 @@ iface {{ bond }} inet static netmask {{ ip4priv.netmask }} gateway {{ ip4priv.gateway }} {% endif %} - dns-nameservers {{ resolvers | join(" ") }} + dns-nameservers {{ resolvers | sort | join(" ") }} {% endif %} bond-downdelay 200 @@ -53,7 +53,7 @@ auto bond0:0 iface bond0:0 inet static address {{ ip4priv.address }} netmask {{ ip4priv.netmask }} - {% for subnet in private_subnets %} + {% for subnet in private_subnets | sort %} post-up route add -net {{ subnet }} gw {{ ip4priv.gateway }} post-down route del -net {{ subnet }} gw {{ ip4priv.gateway }} {% endfor %} diff --git a/packetnetworking/distros/debian/templates/individual/etc_network_interfaces.j2 b/packetnetworking/distros/debian/templates/individual/etc_network_interfaces.j2 index d7a140f..79230cf 100644 --- a/packetnetworking/distros/debian/templates/individual/etc_network_interfaces.j2 +++ b/packetnetworking/distros/debian/templates/individual/etc_network_interfaces.j2 @@ -12,7 +12,7 @@ iface {{ iface0.name }} inet static netmask {{ ip4priv.netmask }} gateway {{ ip4priv.gateway }} {% endif %} - dns-nameservers {{ resolvers | join(" ") }} + dns-nameservers {{ resolvers | sort | join(" ") }} {% if ip6pub %} iface {{ iface0.name }} inet6 static @@ -26,7 +26,7 @@ auto {{ iface0.name }}:0 iface {{ iface0.name }}:0 inet static address {{ ip4priv.address }} netmask {{ ip4priv.netmask }} - {% for subnet in private_subnets %} + {% for subnet in private_subnets | sort %} post-up route add -net {{ subnet }} gw {{ ip4priv.gateway }} post-down route del -net {{ subnet }} gw {{ ip4priv.gateway }} {% endfor %} diff --git a/packetnetworking/distros/debian/test_bonded.py b/packetnetworking/distros/debian/test_bonded.py index f4cf3c7..d9fb62d 100644 --- a/packetnetworking/distros/debian/test_bonded.py +++ b/packetnetworking/distros/debian/test_bonded.py @@ -21,8 +21,6 @@ def test_public_bonded_task_etc_network_interfaces( tasks = builder.render() bonding_mode = builder.network.bonding.mode - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] ipv4priv = builder.ipv4priv.first ipv4pub = builder.ipv4pub.first ipv6pub = builder.ipv6pub.first @@ -32,28 +30,28 @@ def test_public_bonded_task_etc_network_interfaces( """ result = dedent(partial) if distro == "ubuntu": - partial = f""" - auto {builder.network.interfaces[0].name} - iface {builder.network.interfaces[0].name} inet manual - bond-master bond0 - """ - result += dedent(partial) - for iface in builder.network.interfaces[1:]: - partial = f""" - auto {iface.name} - iface {iface.name} inet manual - pre-up sleep 4 - bond-master bond0 - """ + for iface in sorted(builder.network.interfaces, key=lambda iface: iface.name): + if iface.name != builder.network.interfaces[0].name: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + pre-up sleep 4 + bond-master bond0 + """ + else: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + bond-master bond0 + """ result += dedent(partial) - partial = f""" auto bond0 iface bond0 inet static address {ipv4pub.address} netmask {ipv4pub.netmask} gateway {ipv4pub.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} bond-downdelay 200 bond-miimon 100 @@ -87,7 +85,7 @@ def test_public_bonded_task_etc_network_interfaces( partial = f""" auto {bond} - iface {bond} inet static + iface {bond} inet manual bond-downdelay 200 bond-miimon 100 bond-mode {bonding_mode} @@ -113,8 +111,6 @@ def test_private_bonded_task_etc_network_interfaces( tasks = builder.render() bonding_mode = builder.network.bonding.mode - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] ipv4priv = builder.ipv4priv.first partial = """\ auto lo @@ -122,28 +118,28 @@ def test_private_bonded_task_etc_network_interfaces( """ result = dedent(partial) if distro == "ubuntu": - partial = f""" - auto {builder.network.interfaces[0].name} - iface {builder.network.interfaces[0].name} inet manual - bond-master bond0 - """ - result += dedent(partial) - for iface in builder.network.interfaces[1:]: - partial = f""" - auto {iface.name} - iface {iface.name} inet manual - pre-up sleep 4 - bond-master bond0 - """ + for iface in sorted(builder.network.interfaces, key=lambda iface: iface.name): + if iface.name != builder.network.interfaces[0].name: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + pre-up sleep 4 + bond-master bond0 + """ + else: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + bond-master bond0 + """ result += dedent(partial) - partial = f""" auto bond0 iface bond0 inet static address {ipv4priv.address} netmask {ipv4priv.netmask} gateway {ipv4priv.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} bond-downdelay 200 bond-miimon 100 @@ -162,7 +158,7 @@ def test_private_bonded_task_etc_network_interfaces( partial = f""" auto {bond} - iface {bond} inet static + iface {bond} inet manual bond-downdelay 200 bond-miimon 100 bond-mode {bonding_mode} @@ -181,13 +177,11 @@ def test_public_bonded_task_etc_network_interfaces_with_custom_private_ip_space( bonded_network_builder, distro, version ): """Validates /etc/network/interfaces for a public bond""" - subnets = {"private_subnets": ["192.168.5.0/24", "172.16.0.0/12"]} + subnets = {"private_subnets": reversed(["192.168.5.0/24", "172.16.0.0/12"])} builder = bonded_network_builder(distro, version, public=True, metadata=subnets) tasks = builder.render() bonding_mode = builder.network.bonding.mode - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] ipv4priv = builder.ipv4priv.first ipv4pub = builder.ipv4pub.first ipv6pub = builder.ipv6pub.first @@ -197,28 +191,28 @@ def test_public_bonded_task_etc_network_interfaces_with_custom_private_ip_space( """ result = dedent(partial) if distro == "ubuntu": - partial = f""" - auto {builder.network.interfaces[0].name} - iface {builder.network.interfaces[0].name} inet manual - bond-master bond0 - """ - result += dedent(partial) - for iface in builder.network.interfaces[1:]: - partial = f""" - auto {iface.name} - iface {iface.name} inet manual - pre-up sleep 4 - bond-master bond0 - """ + for iface in sorted(builder.network.interfaces, key=lambda iface: iface.name): + if iface.name != builder.network.interfaces[0].name: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + pre-up sleep 4 + bond-master bond0 + """ + else: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + bond-master bond0 + """ result += dedent(partial) - partial = f""" auto bond0 iface bond0 inet static address {ipv4pub.address} netmask {ipv4pub.netmask} gateway {ipv4pub.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} bond-downdelay 200 bond-miimon 100 @@ -241,10 +235,10 @@ def test_public_bonded_task_etc_network_interfaces_with_custom_private_ip_space( iface bond0:0 inet static address {ipv4priv.address} netmask {ipv4priv.netmask} - post-up route add -net 192.168.5.0/24 gw {ipv4priv.gateway} - post-down route del -net 192.168.5.0/24 gw {ipv4priv.gateway} post-up route add -net 172.16.0.0/12 gw {ipv4priv.gateway} post-down route del -net 172.16.0.0/12 gw {ipv4priv.gateway} + post-up route add -net 192.168.5.0/24 gw {ipv4priv.gateway} + post-down route del -net 192.168.5.0/24 gw {ipv4priv.gateway} """ result += dedent(partial) @@ -254,7 +248,7 @@ def test_public_bonded_task_etc_network_interfaces_with_custom_private_ip_space( partial = f""" auto {bond} - iface {bond} inet static + iface {bond} inet manual bond-downdelay 200 bond-miimon 100 bond-mode {bonding_mode} @@ -276,13 +270,10 @@ def test_private_bonded_task_etc_network_interfaces_with_custom_private_ip_space When no public ip is assigned, we should see the private ip details in the /etc/network/interfaces file. """ - subnets = {"private_subnets": ["192.168.5.0/24", "172.16.0.0/12"]} - builder = bonded_network_builder(distro, version, public=False, metadata=subnets) + builder = bonded_network_builder(distro, version, public=False) tasks = builder.render() bonding_mode = builder.network.bonding.mode - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] ipv4priv = builder.ipv4priv.first partial = """\ auto lo @@ -290,28 +281,28 @@ def test_private_bonded_task_etc_network_interfaces_with_custom_private_ip_space """ result = dedent(partial) if distro == "ubuntu": - partial = f""" - auto {builder.network.interfaces[0].name} - iface {builder.network.interfaces[0].name} inet manual - bond-master bond0 - """ - result += dedent(partial) - for iface in builder.network.interfaces[1:]: - partial = f""" - auto {iface.name} - iface {iface.name} inet manual - pre-up sleep 4 - bond-master bond0 - """ + for iface in sorted(builder.network.interfaces, key=lambda iface: iface.name): + if iface.name != builder.network.interfaces[0].name: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + pre-up sleep 4 + bond-master bond0 + """ + else: + partial = f""" + auto {iface.name} + iface {iface.name} inet manual + bond-master bond0 + """ result += dedent(partial) - partial = f""" auto bond0 iface bond0 inet static address {ipv4priv.address} netmask {ipv4priv.netmask} gateway {ipv4priv.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} bond-downdelay 200 bond-miimon 100 @@ -331,7 +322,7 @@ def test_private_bonded_task_etc_network_interfaces_with_custom_private_ip_space partial = f""" auto {bond} - iface {bond} inet static + iface {bond} inet manual bond-downdelay 200 bond-miimon 100 bond-mode {bonding_mode} diff --git a/packetnetworking/distros/debian/test_individual.py b/packetnetworking/distros/debian/test_individual.py index 1560084..1157ace 100644 --- a/packetnetworking/distros/debian/test_individual.py +++ b/packetnetworking/distros/debian/test_individual.py @@ -20,8 +20,7 @@ def test_public_individual_task_etc_network_interfaces( builder = individual_network_builder(distro, version, public=True) tasks = builder.render() - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] + iface0 = builder.network.interfaces[0].name ipv4priv = builder.ipv4priv.first ipv4pub = builder.ipv4pub.first ipv6pub = builder.ipv6pub.first @@ -29,20 +28,20 @@ def test_public_individual_task_etc_network_interfaces( auto lo iface lo inet loopback - auto enp0 - iface enp0 inet static + auto {iface0} + iface {iface0} inet static address {ipv4pub.address} netmask {ipv4pub.netmask} gateway {ipv4pub.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} - iface enp0 inet6 static + iface {iface0} inet6 static address {ipv6pub.address} netmask {ipv6pub.cidr} gateway {ipv6pub.gateway} - auto enp0:0 - iface enp0:0 inet static + auto {iface0}:0 + iface {iface0}:0 inet static address {ipv4priv.address} netmask {ipv4priv.netmask} post-up route add -net 10.0.0.0/8 gw {ipv4priv.gateway} @@ -62,19 +61,18 @@ def test_private_individual_task_etc_network_interfaces( builder = individual_network_builder(distro, version, public=False) tasks = builder.render() - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] + iface0 = builder.network.interfaces[0].name ipv4priv = builder.ipv4priv.first result = f"""\ auto lo iface lo inet loopback - auto enp0 - iface enp0 inet static + auto {iface0} + iface {iface0} inet static address {ipv4priv.address} netmask {ipv4priv.netmask} gateway {ipv4priv.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} """ assert tasks["etc/network/interfaces"] == dedent(result) @@ -84,12 +82,11 @@ def test_public_individual_task_etc_network_interfaces_with_custom_private_ip_sp individual_network_builder, distro, version ): """Validates /etc/network/interfaces for a public bond""" - subnets = {"private_subnets": ["192.168.5.0/24", "172.16.0.0/12"]} + subnets = {"private_subnets": reversed(["192.168.5.0/24", "172.16.0.0/12"])} builder = individual_network_builder(distro, version, public=True, metadata=subnets) tasks = builder.render() - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] + iface0 = builder.network.interfaces[0].name ipv4priv = builder.ipv4priv.first ipv4pub = builder.ipv4pub.first ipv6pub = builder.ipv6pub.first @@ -97,26 +94,26 @@ def test_public_individual_task_etc_network_interfaces_with_custom_private_ip_sp auto lo iface lo inet loopback - auto enp0 - iface enp0 inet static + auto {iface0} + iface {iface0} inet static address {ipv4pub.address} netmask {ipv4pub.netmask} gateway {ipv4pub.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} - iface enp0 inet6 static + iface {iface0} inet6 static address {ipv6pub.address} netmask {ipv6pub.cidr} gateway {ipv6pub.gateway} - auto enp0:0 - iface enp0:0 inet static + auto {iface0}:0 + iface {iface0}:0 inet static address {ipv4priv.address} netmask {ipv4priv.netmask} - post-up route add -net 192.168.5.0/24 gw {ipv4priv.gateway} - post-down route del -net 192.168.5.0/24 gw {ipv4priv.gateway} post-up route add -net 172.16.0.0/12 gw {ipv4priv.gateway} post-down route del -net 172.16.0.0/12 gw {ipv4priv.gateway} + post-up route add -net 192.168.5.0/24 gw {ipv4priv.gateway} + post-down route del -net 192.168.5.0/24 gw {ipv4priv.gateway} """ assert tasks["etc/network/interfaces"] == dedent(result) @@ -129,25 +126,21 @@ def test_private_individual_task_etc_network_interfaces_with_custom_private_ip_s When no public ip is assigned, we should see the private ip details in the /etc/network/interfaces file. """ - subnets = {"private_subnets": ["192.168.5.0/24", "172.16.0.0/12"]} - builder = individual_network_builder( - distro, version, public=False, metadata=subnets - ) + builder = individual_network_builder(distro, version, public=False) tasks = builder.render() - dns1 = builder.network.resolvers[0] - dns2 = builder.network.resolvers[1] + iface0 = builder.network.interfaces[0].name ipv4priv = builder.ipv4priv.first result = f"""\ auto lo iface lo inet loopback - auto enp0 - iface enp0 inet static + auto {iface0} + iface {iface0} inet static address {ipv4priv.address} netmask {ipv4priv.netmask} gateway {ipv4priv.gateway} - dns-nameservers {dns1} {dns2} + dns-nameservers {" ".join(sorted(builder.network.resolvers))} """ assert tasks["etc/network/interfaces"] == dedent(result)