From a418853c4168b8141cf7d8ebca6c1d10dddab470 Mon Sep 17 00:00:00 2001 From: Pavel Abalikhin Date: Mon, 16 Nov 2020 17:48:18 +0300 Subject: [PATCH 1/3] net: Fix static routes to host in eni renderer Route '-net' parameter is incompatible with /32 IPv4 addresses so we have to use '-host' in that case. --- cloudinit/net/eni.py | 2 ++ tests/unittests/test_net.py | 7 +++++++ tools/.github-cla-signers | 1 + 3 files changed, 10 insertions(+) diff --git a/cloudinit/net/eni.py b/cloudinit/net/eni.py index 0074691b676..a89e5ad23c1 100644 --- a/cloudinit/net/eni.py +++ b/cloudinit/net/eni.py @@ -387,6 +387,8 @@ def _render_route(self, route, indent=""): if k == 'network': if ':' in route[k]: route_line += ' -A inet6' + elif route.get('prefix') == 32: + route_line += ' -host' else: route_line += ' -net' if 'prefix' in route: diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py index 70453683d0c..d386f11a76d 100644 --- a/tests/unittests/test_net.py +++ b/tests/unittests/test_net.py @@ -4819,6 +4819,9 @@ def test_routes_rendered(self): {'type': 'route', 'id': 6, 'metric': 1, 'destination': '10.0.200.0/16', 'gateway': '172.23.31.1'}, + {'type': 'route', 'id': 7, + 'metric': 1, 'destination': '10.0.0.100/32', + 'gateway': '172.23.31.1'}, ] files = self._render_and_read( @@ -4842,6 +4845,10 @@ def test_routes_rendered(self): '172.23.31.1 metric 1 || true'), ('pre-down route del -net 10.0.200.0/16 gw ' '172.23.31.1 metric 1 || true'), + ('post-up route add -host 10.0.0.100/32 gw ' + '172.23.31.1 metric 1 || true'), + ('pre-down route del -host 10.0.0.100/32 gw ' + '172.23.31.1 metric 1 || true'), ] found = files['/etc/network/interfaces'].splitlines() diff --git a/tools/.github-cla-signers b/tools/.github-cla-signers index 2090dc2a185..87df5f56e70 100644 --- a/tools/.github-cla-signers +++ b/tools/.github-cla-signers @@ -25,6 +25,7 @@ slyon smoser sshedi TheRealFalcon +tnt-dev tomponline tsanghan WebSpider From a032850724647c6eadc14f2c4597b8efcd993ab0 Mon Sep 17 00:00:00 2001 From: Pavel Abalikhin Date: Mon, 11 Jan 2021 18:44:37 +0300 Subject: [PATCH 2/3] Add integration test for #668 --- tests/integration_tests/bugs/test_gh668.py | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/integration_tests/bugs/test_gh668.py diff --git a/tests/integration_tests/bugs/test_gh668.py b/tests/integration_tests/bugs/test_gh668.py new file mode 100644 index 00000000000..d37d55ab5c1 --- /dev/null +++ b/tests/integration_tests/bugs/test_gh668.py @@ -0,0 +1,36 @@ +"""Integration test for gh-668. + +Ensure that static route to host is working correctly. +""" + +import pytest + +from tests.integration_tests.instances import IntegrationInstance + + +DESTINATION_IP = "172.16.0.10" +GATEWAY_IP = "10.0.0.100" + +NETWORK_CONFIG = """\ +version: 2 +ethernets: + eth0: + addresses: [10.0.0.10/8] + dhcp4: false + routes: + - to: {}/32 + via: {} +""".format(DESTINATION_IP, GATEWAY_IP) + +EXPECTED_ROUTE = "{} via {}".format(DESTINATION_IP, GATEWAY_IP) + + +@pytest.mark.sru_2020_11 +@pytest.mark.lxd_container +@pytest.mark.lxd_vm +@pytest.mark.lxd_config_dict({ + "user.network-config": NETWORK_CONFIG, +}) +def test_eni_static_route_to_host(client: IntegrationInstance): + route = client.execute("ip route | grep {}".format(DESTINATION_IP)) + assert route.startswith(EXPECTED_ROUTE) From 8f14846db57940cde9cbf41fd597484c8c62e66e Mon Sep 17 00:00:00 2001 From: Pavel Abalikhin Date: Wed, 13 Jan 2021 17:17:22 +0300 Subject: [PATCH 3/3] Update integration test for #668 --- tests/integration_tests/bugs/test_gh668.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/integration_tests/bugs/test_gh668.py b/tests/integration_tests/bugs/test_gh668.py index d37d55ab5c1..a3a0c3743ed 100644 --- a/tests/integration_tests/bugs/test_gh668.py +++ b/tests/integration_tests/bugs/test_gh668.py @@ -1,6 +1,8 @@ """Integration test for gh-668. Ensure that static route to host is working correctly. +The original problem is specific to the ENI renderer but that test is suitable +for all network configuration outputs. """ import pytest @@ -25,12 +27,11 @@ EXPECTED_ROUTE = "{} via {}".format(DESTINATION_IP, GATEWAY_IP) -@pytest.mark.sru_2020_11 @pytest.mark.lxd_container @pytest.mark.lxd_vm @pytest.mark.lxd_config_dict({ "user.network-config": NETWORK_CONFIG, }) -def test_eni_static_route_to_host(client: IntegrationInstance): +def test_static_route_to_host(client: IntegrationInstance): route = client.execute("ip route | grep {}".format(DESTINATION_IP)) assert route.startswith(EXPECTED_ROUTE)