1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#!/usr/bin/python3
#
# Integration tests for VLAN virtual devices
#
# These need to be run in a VM and do change the system
# configuration.
#
# Copyright (C) 2018-2021 Canonical, Ltd.
# Author: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
# Author: Lukas Märdian <slyon@ubuntu.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import subprocess
import unittest
from base import IntegrationTestsBase, test_backends
class _CommonTests():
def test_vlan(self):
# we create two VLANs on e2c, and run dnsmasq on ID 2002 to test DHCP via VLAN
self.setup_eth(None, start_dnsmasq=False)
self.start_dnsmasq(None, self.dev_e2_ap)
subprocess.check_call(['ip', 'link', 'add', 'link', self.dev_e2_ap,
'name', 'nptestsrv', 'type', 'vlan', 'id', '2002'])
subprocess.check_call(['ip', 'a', 'add', '192.168.5.1/24', 'dev', 'nptestsrv'])
subprocess.check_call(['ip', 'link', 'set', 'nptestsrv', 'up'])
self.start_dnsmasq(None, 'nptestsrv')
with open(self.config, 'w') as f:
f.write('''network:
version: 2
renderer: %(r)s
ethernets:
myether:
match: {name: %(e2c)s}
dhcp4: yes
vlans:
nptestone:
id: 1001
link: myether
addresses: [10.9.8.7/24]
nptesttwo:
id: 2002
link: myether
dhcp4: true
''' % {'r': self.backend, 'e2c': self.dev_e2_client})
self.generate_and_settle([self.state_dhcp4(self.dev_e2_client),
'nptestone',
self.state_dhcp4('nptesttwo')])
self.assert_iface_up('nptestone', ['nptestone@' + self.dev_e2_client, 'inet 10.9.8.7/24'])
self.assert_iface_up('nptesttwo', ['nptesttwo@' + self.dev_e2_client, 'inet 192.168.5'])
self.assertNotIn(b'default',
subprocess.check_output(['ip', 'route', 'show', 'dev', 'nptestone']))
self.assertIn(b'default via 192.168.5.1', # from DHCP
subprocess.check_output(['ip', 'route', 'show', 'dev', 'nptesttwo']))
def test_vlan_mac_address(self):
self.setup_eth(None)
self.addCleanup(subprocess.call, ['ip', 'link', 'delete', 'myvlan'], stderr=subprocess.DEVNULL)
with open(self.config, 'w') as f:
f.write('''network:
renderer: %(r)s
ethernets:
ethbn:
match: {name: %(ec)s}
vlans:
myvlan:
id: 101
link: ethbn
macaddress: aa:bb:cc:dd:ee:22
''' % {'r': self.backend, 'ec': self.dev_e_client})
self.generate_and_settle([self.dev_e_client, 'myvlan'])
self.assert_iface_up('myvlan', ['myvlan@' + self.dev_e_client])
with open('/sys/class/net/myvlan/address') as f:
self.assertEqual(f.read().strip(), 'aa:bb:cc:dd:ee:22')
@unittest.skipIf("networkd" not in test_backends,
"skipping as networkd backend tests are disabled")
class TestNetworkd(IntegrationTestsBase, _CommonTests):
backend = 'networkd'
@unittest.skipIf("NetworkManager" not in test_backends,
"skipping as NetworkManager backend tests are disabled")
class TestNetworkManager(IntegrationTestsBase, _CommonTests):
backend = 'NetworkManager'
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))
|