summaryrefslogtreecommitdiffstats
path: root/debian/patches/upstream/0002-skip-esoteric-interfaces.patch
blob: 49940933e04b18f7951c3989f01228745c9e917c (plain)
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
Author: Olivier Gayot <olivier.gayot@canonical.com>
Description: Skip mac2iface test for esoteric interfaces
 mac2iface takes a MAC address as argument and returns the corresponding
 interface (if any).
 The mac2iface tests will however invoke mac2iface with invalid MAC addresses
 when esoteric network interfaces are present on the system. As an example,
 armhf autopkgtest runners in Ubuntu have gre interfaces configured so the
 test-suite fails.
 .
 We now ensure that the test-suite calls mac2iface with only valid MAC
 addresses.
 .
 Furthermore, sometimes the same MAC address is assigned to more than one
 interface on the system (this is true for VLAN interfaces for instance). This
 confuses mac2iface, which returns only the first match. This scenario is
 possibly more of a nvme-stas bug than a test-suite bug, but for now we will
 just skip the interfaces that have a duplicate MAC address.
 .
 https://github.com/linux-nvme/nvme-stas/pull/411
 https://github.com/linux-nvme/nvme-stas/commit/2336eab5b4e4e2f9fd28b7efe425f86e6a23ab91

diff -Naurp nvme-stas.orig/test/test-iputil.py nvme-stas/test/test-iputil.py
--- nvme-stas.orig/test/test-iputil.py
+++ nvme-stas/test/test-iputil.py
@@ -43,11 +43,41 @@ class Test(unittest.TestCase):
         self.assertEqual('', iputil.get_interface(ifaces, ''))
         self.assertEqual('', iputil.get_interface(ifaces, None))
 
+    @staticmethod
+    def _is_ok_for_mac2iface(iface) -> bool:
+        ''' mac2iface can only work with interfaces that have a proper MAC
+        address. One can use this function to filter out other interfaces
+        configured on the system. '''
+        if iface['link_type'] != 'ether':
+            # Some esoteric interface types (e.g., gre) use the address
+            # field to store something that is not a MAC address. Skip
+            # them.
+            return False
+        if 'address' not in iface:
+            return False
+        if iface['address'] == '00:00:00:00:00:00':
+            # All 0's is an invalid MAC address so do not bother.
+            # In practice, it often appears as the address of the loopback
+            # interface but it can also appear for other things like a gretap
+            # or erspan interface.
+            return False
+        return True
+
     def test_mac2iface(self):
-        for iface in self.ifaces:
-            address = iface.get('address', None)
-            if address:
-                self.assertEqual(iface['ifname'], iputil.mac2iface(address))
+        # We only test the interfaces that have a MAC address, and a valid one.
+        candidate_ifaces = [iface for iface in self.ifaces if self._is_ok_for_mac2iface(iface)]
+
+        for iface in candidate_ifaces:
+            if len([x for x in candidate_ifaces if x['address'] == iface['address']]) >= 2:
+                # We need to be careful, sometimes we can have the same MAC address
+                # on multiple interfaces. This happens with VLAN interfaces for
+                # instance. mac2iface will obviously be confused when dealing with
+                # those so let's skip the interfaces that have duplicate MAC.
+                logging.warning('[%s] is not the only interface with address [%s]',
+                                iface['ifname'], iface['address'])
+                continue
+
+            self.assertEqual(iface['ifname'], iputil.mac2iface(iface['address']))
 
     def test_remove_invalid_addresses(self):
         good_tcp = trid.TID({'transport': 'tcp', 'traddr': '1.1.1.1', 'subsysnqn': '', 'trsvcid': '8009'})