summaryrefslogtreecommitdiff
path: root/tests/unittests/test_net.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unittests/test_net.py')
-rw-r--r--tests/unittests/test_net.py285
1 files changed, 261 insertions, 24 deletions
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
index 54cc8469..70453683 100644
--- a/tests/unittests/test_net.py
+++ b/tests/unittests/test_net.py
@@ -752,7 +752,9 @@ IPADDR=172.19.1.34
IPV6ADDR=2001:DB8::10/64
IPV6ADDR_SECONDARIES="2001:DB9::10/64 2001:DB10::10/64"
IPV6INIT=yes
+IPV6_AUTOCONF=no
IPV6_DEFAULTGW=2001:DB8::1
+IPV6_FORCE_ACCEPT_RA=no
NETMASK=255.255.252.0
NM_CONTROLLED=no
ONBOOT=yes
@@ -910,7 +912,7 @@ NETWORK_CONFIGS = {
# Physical interfaces.
- type: physical
name: eth99
- mac_address: "c0:d6:9f:2c:e8:80"
+ mac_address: c0:d6:9f:2c:e8:80
subnets:
- type: dhcp4
- type: static
@@ -926,7 +928,7 @@ NETWORK_CONFIGS = {
metric: 10000
- type: physical
name: eth1
- mac_address: "cf:d6:af:48:e8:80"
+ mac_address: cf:d6:af:48:e8:80
- type: nameserver
address:
- 1.2.3.4
@@ -1027,6 +1029,8 @@ NETWORK_CONFIGS = {
IPADDR=192.168.14.2
IPV6ADDR=2001:1::1/64
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
NETMASK=255.255.255.0
NM_CONTROLLED=no
ONBOOT=yes
@@ -1253,6 +1257,33 @@ NETWORK_CONFIGS = {
"""),
},
},
+ 'static6': {
+ 'yaml': textwrap.dedent("""\
+ version: 1
+ config:
+ - type: 'physical'
+ name: 'iface0'
+ accept-ra: 'no'
+ subnets:
+ - type: 'static6'
+ address: 2001:1::1/64
+ """).rstrip(' '),
+ 'expected_sysconfig_rhel': {
+ 'ifcfg-iface0': textwrap.dedent("""\
+ BOOTPROTO=none
+ DEVICE=iface0
+ IPV6ADDR=2001:1::1/64
+ IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
+ DEVICE=iface0
+ NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+ """),
+ },
+ },
'dhcpv6_stateless': {
'expected_eni': textwrap.dedent("""\
auto lo
@@ -1347,6 +1378,89 @@ NETWORK_CONFIGS = {
"""),
},
},
+ 'wakeonlan_disabled': {
+ 'expected_eni': textwrap.dedent("""\
+ auto lo
+ iface lo inet loopback
+
+ auto iface0
+ iface iface0 inet dhcp
+ """).rstrip(' '),
+ 'expected_netplan': textwrap.dedent("""
+ network:
+ ethernets:
+ iface0:
+ dhcp4: true
+ wakeonlan: false
+ version: 2
+ """),
+ 'expected_sysconfig_opensuse': {
+ 'ifcfg-iface0': textwrap.dedent("""\
+ BOOTPROTO=dhcp4
+ STARTMODE=auto
+ """),
+ },
+ 'expected_sysconfig_rhel': {
+ 'ifcfg-iface0': textwrap.dedent("""\
+ BOOTPROTO=dhcp
+ DEVICE=iface0
+ NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+ """),
+ },
+ 'yaml_v2': textwrap.dedent("""\
+ version: 2
+ ethernets:
+ iface0:
+ dhcp4: true
+ wakeonlan: false
+ """).rstrip(' '),
+ },
+ 'wakeonlan_enabled': {
+ 'expected_eni': textwrap.dedent("""\
+ auto lo
+ iface lo inet loopback
+
+ auto iface0
+ iface iface0 inet dhcp
+ ethernet-wol g
+ """).rstrip(' '),
+ 'expected_netplan': textwrap.dedent("""
+ network:
+ ethernets:
+ iface0:
+ dhcp4: true
+ wakeonlan: true
+ version: 2
+ """),
+ 'expected_sysconfig_opensuse': {
+ 'ifcfg-iface0': textwrap.dedent("""\
+ BOOTPROTO=dhcp4
+ ETHTOOL_OPTS="wol g"
+ STARTMODE=auto
+ """),
+ },
+ 'expected_sysconfig_rhel': {
+ 'ifcfg-iface0': textwrap.dedent("""\
+ BOOTPROTO=dhcp
+ DEVICE=iface0
+ ETHTOOL_OPTS="wol g"
+ NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+ """),
+ },
+ 'yaml_v2': textwrap.dedent("""\
+ version: 2
+ ethernets:
+ iface0:
+ dhcp4: true
+ wakeonlan: true
+ """).rstrip(' '),
+ },
'all': {
'expected_eni': ("""\
auto lo
@@ -1633,7 +1747,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
NM_CONTROLLED=no
ONBOOT=yes
PHYSDEV=bond0
- TYPE=Ethernet
USERCTL=no
VLAN=yes"""),
'ifcfg-br0': textwrap.dedent("""\
@@ -1644,6 +1757,8 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
IPADDR=192.168.14.2
IPV6ADDR=2001:1::1/64
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
IPV6_DEFAULTGW=2001:4800:78ff:1b::1
MACADDR=bb:bb:bb:bb:bb:aa
NETMASK=255.255.255.0
@@ -1677,7 +1792,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
NM_CONTROLLED=no
ONBOOT=yes
PHYSDEV=eth0
- TYPE=Ethernet
USERCTL=no
VLAN=yes"""),
'ifcfg-eth1': textwrap.dedent("""\
@@ -1745,26 +1859,26 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
# Physical interfaces.
- type: physical
name: eth0
- mac_address: "c0:d6:9f:2c:e8:80"
+ mac_address: c0:d6:9f:2c:e8:80
- type: physical
name: eth1
- mac_address: "aa:d6:9f:2c:e8:80"
+ mac_address: aa:d6:9f:2c:e8:80
- type: physical
name: eth2
- mac_address: "c0:bb:9f:2c:e8:80"
+ mac_address: c0:bb:9f:2c:e8:80
- type: physical
name: eth3
- mac_address: "66:bb:9f:2c:e8:80"
+ mac_address: 66:bb:9f:2c:e8:80
- type: physical
name: eth4
- mac_address: "98:bb:9f:2c:e8:80"
+ mac_address: 98:bb:9f:2c:e8:80
# specify how ifupdown should treat iface
# control is one of ['auto', 'hotplug', 'manual']
# with manual meaning ifup/ifdown should not affect the iface
# useful for things like iscsi root + dhcp
- type: physical
name: eth5
- mac_address: "98:bb:9f:2c:e8:8a"
+ mac_address: 98:bb:9f:2c:e8:8a
subnets:
- type: dhcp
control: manual
@@ -1795,7 +1909,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
name: bond0
# if 'mac_address' is omitted, the MAC is taken from
# the first slave.
- mac_address: "aa:bb:cc:dd:ee:ff"
+ mac_address: aa:bb:cc:dd:ee:ff
bond_interfaces:
- eth1
- eth2
@@ -1890,13 +2004,13 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
config:
- type: physical
name: bond0s0
- mac_address: "aa:bb:cc:dd:e8:00"
+ mac_address: aa:bb:cc:dd:e8:00
- type: physical
name: bond0s1
- mac_address: "aa:bb:cc:dd:e8:01"
+ mac_address: aa:bb:cc:dd:e8:01
- type: bond
name: bond0
- mac_address: "aa:bb:cc:dd:e8:ff"
+ mac_address: aa:bb:cc:dd:e8:ff
mtu: 9000
bond_interfaces:
- bond0s0
@@ -2044,12 +2158,12 @@ iface bond0 inet6 static
eth0:
match:
driver: "virtio_net"
- macaddress: "aa:bb:cc:dd:e8:00"
+ macaddress: aa:bb:cc:dd:e8:00
vf0:
set-name: vf0
match:
driver: "e1000"
- macaddress: "aa:bb:cc:dd:e8:01"
+ macaddress: aa:bb:cc:dd:e8:01
bonds:
bond0:
addresses:
@@ -2174,6 +2288,8 @@ iface bond0 inet6 static
IPADDR1=192.168.1.2
IPV6ADDR=2001:1::1/92
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
MTU=9000
NETMASK=255.255.255.0
NETMASK1=255.255.255.0
@@ -2223,7 +2339,7 @@ iface bond0 inet6 static
config:
- type: physical
name: en0
- mac_address: "aa:bb:cc:dd:e8:00"
+ mac_address: aa:bb:cc:dd:e8:00
- type: vlan
mtu: 2222
name: en0.99
@@ -2279,6 +2395,8 @@ iface bond0 inet6 static
IPADDR1=192.168.1.2
IPV6ADDR=2001:1::bbbb/96
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
IPV6_DEFAULTGW=2001:1::1
MTU=2222
NETMASK=255.255.255.0
@@ -2286,7 +2404,6 @@ iface bond0 inet6 static
NM_CONTROLLED=no
ONBOOT=yes
PHYSDEV=en0
- TYPE=Ethernet
USERCTL=no
VLAN=yes"""),
},
@@ -2297,13 +2414,13 @@ iface bond0 inet6 static
config:
- type: physical
name: eth0
- mac_address: "52:54:00:12:34:00"
+ mac_address: '52:54:00:12:34:00'
subnets:
- type: static
address: 2001:1::100/96
- type: physical
name: eth1
- mac_address: "52:54:00:12:34:01"
+ mac_address: '52:54:00:12:34:01'
subnets:
- type: static
address: 2001:1::101/96
@@ -2363,6 +2480,8 @@ iface bond0 inet6 static
HWADDR=52:54:00:12:34:00
IPV6ADDR=2001:1::100/96
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
@@ -2375,6 +2494,8 @@ iface bond0 inet6 static
HWADDR=52:54:00:12:34:01
IPV6ADDR=2001:1::101/96
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
@@ -2388,7 +2509,7 @@ iface bond0 inet6 static
config:
- type: physical
name: eth0
- mac_address: "52:54:00:12:34:00"
+ mac_address: '52:54:00:12:34:00'
subnets:
- type: static
address: 192.168.1.2/24
@@ -2396,12 +2517,12 @@ iface bond0 inet6 static
- type: physical
name: eth1
mtu: 1480
- mac_address: "52:54:00:12:34:aa"
+ mac_address: 52:54:00:12:34:aa
subnets:
- type: manual
- type: physical
name: eth2
- mac_address: "52:54:00:12:34:ff"
+ mac_address: 52:54:00:12:34:ff
subnets:
- type: manual
control: manual
@@ -3181,6 +3302,61 @@ USERCTL=no
self._compare_files_to_expected(entry[self.expected_name], found)
self._assert_headers(found)
+ def test_stattic6_from_json(self):
+ net_json = {
+ "services": [{"type": "dns", "address": "172.19.0.12"}],
+ "networks": [{
+ "network_id": "dacd568d-5be6-4786-91fe-750c374b78b4",
+ "type": "ipv4", "netmask": "255.255.252.0",
+ "link": "tap1a81968a-79",
+ "routes": [{
+ "netmask": "0.0.0.0",
+ "network": "0.0.0.0",
+ "gateway": "172.19.3.254",
+ }, {
+ "netmask": "0.0.0.0", # A second default gateway
+ "network": "0.0.0.0",
+ "gateway": "172.20.3.254",
+ }],
+ "ip_address": "172.19.1.34", "id": "network0"
+ }, {
+ "network_id": "mgmt",
+ "netmask": "ffff:ffff:ffff:ffff::",
+ "link": "interface1",
+ "mode": "link-local",
+ "routes": [],
+ "ip_address": "fe80::c096:67ff:fe5c:6e84",
+ "type": "static6",
+ "id": "network1",
+ "services": [],
+ "accept-ra": "false"
+ }],
+ "links": [
+ {
+ "ethernet_mac_address": "fa:16:3e:ed:9a:59",
+ "mtu": None, "type": "bridge", "id":
+ "tap1a81968a-79",
+ "vif_id": "1a81968a-797a-400f-8a80-567f997eb93f"
+ },
+ ],
+ }
+ macs = {'fa:16:3e:ed:9a:59': 'eth0'}
+ render_dir = self.tmp_dir()
+ network_cfg = openstack.convert_net_json(net_json, known_macs=macs)
+ ns = network_state.parse_net_config_data(network_cfg,
+ skip_broken=False)
+ renderer = self._get_renderer()
+ with self.assertRaises(ValueError):
+ renderer.render_network_state(ns, target=render_dir)
+ self.assertEqual([], os.listdir(render_dir))
+
+ def test_static6_from_yaml(self):
+ entry = NETWORK_CONFIGS['static6']
+ found = self._render_and_read(network_config=yaml.load(
+ entry['yaml']))
+ self._compare_files_to_expected(entry[self.expected_name], found)
+ self._assert_headers(found)
+
def test_dhcpv6_reject_ra_config_v2(self):
entry = NETWORK_CONFIGS['dhcpv6_reject_ra']
found = self._render_and_read(network_config=yaml.load(
@@ -3200,6 +3376,20 @@ USERCTL=no
self._compare_files_to_expected(entry[self.expected_name], found)
self._assert_headers(found)
+ def test_wakeonlan_disabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_disabled']
+ found = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self._compare_files_to_expected(entry[self.expected_name], found)
+ self._assert_headers(found)
+
+ def test_wakeonlan_enabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_enabled']
+ found = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self._compare_files_to_expected(entry[self.expected_name], found)
+ self._assert_headers(found)
+
def test_check_ifcfg_rh(self):
"""ifcfg-rh plugin is added NetworkManager.conf if conf present."""
render_dir = self.tmp_dir()
@@ -3298,6 +3488,8 @@ USERCTL=no
IPADDR=192.168.42.100
IPV6ADDR=2001:db8::100/32
IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
IPV6_DEFAULTGW=2001:db8::1
NETMASK=255.255.255.0
NM_CONTROLLED=no
@@ -3339,7 +3531,6 @@ USERCTL=no
NM_CONTROLLED=no
ONBOOT=yes
PHYSDEV=eno1
- TYPE=Ethernet
USERCTL=no
VLAN=yes
""")
@@ -3735,6 +3926,20 @@ STARTMODE=auto
self._compare_files_to_expected(entry[self.expected_name], found)
self._assert_headers(found)
+ def test_wakeonlan_disabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_disabled']
+ found = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self._compare_files_to_expected(entry[self.expected_name], found)
+ self._assert_headers(found)
+
+ def test_wakeonlan_enabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_enabled']
+ found = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self._compare_files_to_expected(entry[self.expected_name], found)
+ self._assert_headers(found)
+
def test_render_v4_and_v6(self):
entry = NETWORK_CONFIGS['v4_and_v6']
found = self._render_and_read(network_config=yaml.load(entry['yaml']))
@@ -4384,6 +4589,22 @@ class TestNetplanRoundTrip(CiTestCase):
entry['expected_netplan'].splitlines(),
files['/etc/netplan/50-cloud-init.yaml'].splitlines())
+ def testsimple_wakeonlan_disabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_disabled']
+ files = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self.assertEqual(
+ entry['expected_netplan'].splitlines(),
+ files['/etc/netplan/50-cloud-init.yaml'].splitlines())
+
+ def testsimple_wakeonlan_enabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_enabled']
+ files = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ 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']))
@@ -4551,6 +4772,22 @@ class TestEniRoundTrip(CiTestCase):
entry['expected_eni'].splitlines(),
files['/etc/network/interfaces'].splitlines())
+ def testsimple_wakeonlan_disabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_disabled']
+ files = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self.assertEqual(
+ entry['expected_eni'].splitlines(),
+ files['/etc/network/interfaces'].splitlines())
+
+ def testsimple_wakeonlan_enabled_config_v2(self):
+ entry = NETWORK_CONFIGS['wakeonlan_enabled']
+ files = self._render_and_read(network_config=yaml.load(
+ entry['yaml_v2']))
+ self.assertEqual(
+ entry['expected_eni'].splitlines(),
+ files['/etc/network/interfaces'].splitlines())
+
def testsimple_render_manual(self):
"""Test rendering of 'manual' for 'type' and 'control'.