summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Harper <ryan.harper@canonical.com>2017-06-15 15:09:17 -0500
committerScott Moser <smoser@brickies.net>2017-07-20 16:47:12 -0400
commit353c6902fb94899d410eb2f8bcc0bb81916e0e9e (patch)
tree323c2afc0b7ca1492917391f5d05e42ee1db588b
parent8317bcab7cd08f1dcd96095c0cb746b57cb27234 (diff)
downloadvyos-cloud-init-353c6902fb94899d410eb2f8bcc0bb81916e0e9e.tar.gz
vyos-cloud-init-353c6902fb94899d410eb2f8bcc0bb81916e0e9e.zip
sysconfig: enable mtu set per subnet, including ipv6 mtu
Render MTU values if present in subnet and route configurations for v4 and v6. LP: #1702513
-rw-r--r--cloudinit/net/sysconfig.py5
-rw-r--r--tests/unittests/test_net.py76
2 files changed, 81 insertions, 0 deletions
diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
index b0f2ccf5..c7df36c0 100644
--- a/cloudinit/net/sysconfig.py
+++ b/cloudinit/net/sysconfig.py
@@ -273,6 +273,7 @@ class Renderer(renderer.Renderer):
# modifying base values according to subnets
for i, subnet in enumerate(subnets, start=len(iface_cfg.children)):
+ mtu_key = 'MTU'
subnet_type = subnet.get('type')
if subnet_type == 'dhcp6':
iface_cfg['IPV6INIT'] = True
@@ -292,7 +293,11 @@ class Renderer(renderer.Renderer):
# if iface_cfg['BOOTPROTO'] == 'none':
# iface_cfg['BOOTPROTO'] = 'static'
if subnet_is_ipv6(subnet):
+ mtu_key = 'IPV6_MTU'
iface_cfg['IPV6INIT'] = True
+
+ if 'mtu' in subnet:
+ iface_cfg[mtu_key] = subnet['mtu']
else:
raise ValueError("Unknown subnet type '%s' found"
" for interface '%s'" % (subnet_type,
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
index e625934f..a9261ebd 100644
--- a/tests/unittests/test_net.py
+++ b/tests/unittests/test_net.py
@@ -482,6 +482,62 @@ NETWORK_CONFIGS = {
- {'type': 'dhcp6'}
""").rstrip(' '),
},
+ 'v4_and_v6_static': {
+ 'expected_eni': textwrap.dedent("""\
+ auto lo
+ iface lo inet loopback
+
+ auto iface0
+ iface iface0 inet static
+ address 192.168.14.2/24
+ mtu 9000
+
+ # control-alias iface0
+ iface iface0 inet6 static
+ address 2001:1::1/64
+ mtu 1500
+ """).rstrip(' '),
+ 'expected_netplan': textwrap.dedent("""
+ network:
+ version: 2
+ ethernets:
+ iface0:
+ addresses:
+ - 192.168.14.2/24
+ - 2001:1::1/64
+ mtu: 9000
+ mtu6: 1500
+ """).rstrip(' '),
+ 'yaml': textwrap.dedent("""\
+ version: 1
+ config:
+ - type: 'physical'
+ name: 'iface0'
+ subnets:
+ - type: static
+ address: 192.168.14.2/24
+ mtu: 9000
+ - type: static
+ address: 2001:1::1/64
+ mtu: 1500
+ """).rstrip(' '),
+ 'expected_sysconfig': {
+ 'ifcfg-iface0': textwrap.dedent("""\
+ BOOTPROTO=none
+ DEVICE=iface0
+ IPADDR=192.168.14.2
+ IPV6ADDR=2001:1::1/64
+ IPV6INIT=yes
+ NETMASK=255.255.255.0
+ NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+ MTU=9000
+ IPV6_MTU=1500
+ """),
+ },
+ },
'all': {
'expected_eni': ("""\
auto lo
@@ -1499,6 +1555,12 @@ USERCTL=no
self._compare_files_to_expected(entry['expected_sysconfig'], found)
self._assert_headers(found)
+ def test_v4_and_v6_static_config(self):
+ entry = NETWORK_CONFIGS['v4_and_v6_static']
+ found = self._render_and_read(network_config=yaml.load(entry['yaml']))
+ self._compare_files_to_expected(entry['expected_sysconfig'], found)
+ self._assert_headers(found)
+
class TestEniNetRendering(CiTestCase):
@@ -1892,6 +1954,13 @@ class TestNetplanRoundTrip(CiTestCase):
entry['expected_netplan'].splitlines(),
files['/etc/netplan/50-cloud-init.yaml'].splitlines())
+ def testsimple_render_v4_and_v6_static(self):
+ entry = NETWORK_CONFIGS['v4_and_v6_static']
+ files = self._render_and_read(network_config=yaml.load(entry['yaml']))
+ self.assertEqual(
+ entry['expected_netplan'].splitlines(),
+ files['/etc/netplan/50-cloud-init.yaml'].splitlines())
+
def testsimple_render_all(self):
entry = NETWORK_CONFIGS['all']
files = self._render_and_read(network_config=yaml.load(entry['yaml']))
@@ -1950,6 +2019,13 @@ class TestEniRoundTrip(CiTestCase):
entry['expected_eni'].splitlines(),
files['/etc/network/interfaces'].splitlines())
+ def testsimple_render_v4_and_v6_static(self):
+ entry = NETWORK_CONFIGS['v4_and_v6_static']
+ files = self._render_and_read(network_config=yaml.load(entry['yaml']))
+ self.assertEqual(
+ entry['expected_eni'].splitlines(),
+ files['/etc/network/interfaces'].splitlines())
+
def testsimple_render_manual(self):
entry = NETWORK_CONFIGS['manual']
files = self._render_and_read(network_config=yaml.load(entry['yaml']))