Merge ~blake-rouse/maas:fix-1788780-2.3 into maas:2.3

Proposed by Blake Rouse
Status: Merged
Approved by: Blake Rouse
Approved revision: 521f52cd10b854e6f71565d52c56cf0b38f7c0b9
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~blake-rouse/maas:fix-1788780-2.3
Merge into: maas:2.3
Diff against target: 98 lines (+37/-2)
4 files modified
src/provisioningserver/utils/ipaddr.py (+2/-0)
src/provisioningserver/utils/network.py (+13/-1)
src/provisioningserver/utils/tests/test_ipaddr.py (+12/-1)
src/provisioningserver/utils/tests/test_network.py (+10/-0)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+365800@code.launchpad.net

Commit message

LP: #1788780 - Ignore tunnel interfaces (such as those created by hypervisors) when gathering interfaces for MAAS management.

Backport of 842646142d42d95453f4b64c209f93b09f8aea7c

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Self-approving backport.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/provisioningserver/utils/ipaddr.py b/src/provisioningserver/utils/ipaddr.py
2index 4cf6cb2..966f4d2 100644
3--- a/src/provisioningserver/utils/ipaddr.py
4+++ b/src/provisioningserver/utils/ipaddr.py
5@@ -272,6 +272,8 @@ def get_interface_type(
6 return 'ethernet.bond'
7 if os.path.isfile(os.path.join(proc_net, "vlan", ifname)):
8 return 'ethernet.vlan'
9+ if os.path.isfile(os.path.join(sys_path, 'tun_flags')):
10+ return 'ethernet.tunnel'
11 device_path = os.path.join(sys_path, 'device')
12 if os.path.islink(device_path):
13 device_80211 = os.path.join(sys_path, 'device', 'ieee80211')
14diff --git a/src/provisioningserver/utils/network.py b/src/provisioningserver/utils/network.py
15index 960d3eb..b9c74a1 100644
16--- a/src/provisioningserver/utils/network.py
17+++ b/src/provisioningserver/utils/network.py
18@@ -1138,8 +1138,20 @@ def get_all_interfaces_definition(annotate_with_monitored: bool=True) -> dict:
19 interfaces = {}
20 dhclient_info = get_dhclient_info()
21 iproute_info = get_ip_route()
22- exclude_types = ["loopback", "ipip"]
23+ exclude_types = [
24+ # It doesn't make sense for MAAS to manage loopback interfaces.
25+ "loopback",
26+ # IPv4-in-IPv4 tunnels aren't useful for MAAS to manage.
27+ "ipip",
28+ # This type of interface is created when hypervisors create virtual
29+ # interfaces for guests. By themselves, they're not useful for MAAS to
30+ # manage.
31+ "ethernet.tunnel",
32+ ]
33 if not running_in_container():
34+ # When not running in a container, we should be able to identify
35+ # any Ethernet-variant interfaces that are specific enough to be used
36+ # with MAAS. So we can throw away any that can't be classified.
37 exclude_types.append("ethernet")
38 ipaddr_info = {
39 name: ipaddr
40diff --git a/src/provisioningserver/utils/tests/test_ipaddr.py b/src/provisioningserver/utils/tests/test_ipaddr.py
41index 8210e52..d4206f9 100644
42--- a/src/provisioningserver/utils/tests/test_ipaddr.py
43+++ b/src/provisioningserver/utils/tests/test_ipaddr.py
44@@ -365,7 +365,7 @@ class FakeSysProcTestCase(MAASTestCase):
45 def createInterfaceType(
46 self, ifname, iftype, is_bridge=False, is_vlan=False,
47 is_bond=False, is_wireless=False, is_physical=False,
48- bonded_interfaces=None):
49+ is_tunnel=False, bonded_interfaces=None):
50 ifdir = os.path.join(self.tmp_sys_net, ifname)
51 os.mkdir(ifdir)
52 type_file = os.path.join(ifdir, 'type')
53@@ -373,6 +373,9 @@ class FakeSysProcTestCase(MAASTestCase):
54 f.write("%d\n" % iftype)
55 if is_bridge:
56 os.mkdir(os.path.join(ifdir, 'bridge'))
57+ if is_tunnel:
58+ with open(os.path.join(ifdir, "tun_flags"), 'w'):
59+ pass # Just touch.
60 if is_vlan:
61 with open(os.path.join(self.tmp_proc_net, "vlan", ifname), 'w'):
62 pass # Just touch.
63@@ -415,6 +418,14 @@ class TestGetInterfaceType(FakeSysProcTestCase):
64 Equals('ethernet.bridge')
65 )
66
67+ def test__identifies_tunnel_interface(self):
68+ self.createEthernetInterface('vnet0', is_tunnel=True)
69+ self.assertThat(get_interface_type(
70+ 'vnet0', sys_class_net=self.tmp_sys_net,
71+ proc_net=self.tmp_proc_net),
72+ Equals('ethernet.tunnel')
73+ )
74+
75 def test__identifies_bond_interface(self):
76 self.createEthernetInterface('bond0', is_bond=True)
77 self.assertThat(get_interface_type(
78diff --git a/src/provisioningserver/utils/tests/test_network.py b/src/provisioningserver/utils/tests/test_network.py
79index 0b08390..5b30cd4 100644
80--- a/src/provisioningserver/utils/tests/test_network.py
81+++ b/src/provisioningserver/utils/tests/test_network.py
82@@ -1212,6 +1212,16 @@ class TestGetAllInterfacesDefinition(MAASTestCase):
83 }
84 self.assertInterfacesResult(ip_addr, {}, {}, MatchesDict({}))
85
86+ def test__ignores_tunnel(self):
87+ ip_addr = {
88+ "vnet": {
89+ "type": "ethernet.tunnel",
90+ "flags": ["UP"],
91+ "index": 2,
92+ },
93+ }
94+ self.assertInterfacesResult(ip_addr, {}, {}, MatchesDict({}))
95+
96 def test__simple(self):
97 ip_addr = {
98 "eth0": {

Subscribers

People subscribed via source and target branches