diff options
| author | Scott Moser <smoser@ubuntu.com> | 2018-05-09 17:40:56 -0600 | 
|---|---|---|
| committer | Chad Smith <chad.smith@canonical.com> | 2018-05-09 17:40:56 -0600 | 
| commit | 23a84d2ce4ec44a0a0c2edbc3b1948c59bb0afbb (patch) | |
| tree | 84496c78ef0777cf538e7f556c78ad9151d68208 | |
| parent | 323eb30940cae2069daf74517089220fccc4afb9 (diff) | |
| download | vyos-cloud-init-23a84d2ce4ec44a0a0c2edbc3b1948c59bb0afbb.tar.gz vyos-cloud-init-23a84d2ce4ec44a0a0c2edbc3b1948c59bb0afbb.zip | |
SmartOS: fix get_interfaces for nics that do not have addr_assign_type.
When attempting to apply network configuration for SmartOS's container
platform, cloud-init would not identify nics.  The nics on provided
in this container service do not have 'addr_assign_type'.  That
was being interpreted as being a "stolen" mac, and would be filtered
out by get_interfaces.
| -rw-r--r-- | cloudinit/net/__init__.py | 8 | ||||
| -rw-r--r-- | tests/unittests/test_net.py | 46 | 
2 files changed, 46 insertions, 8 deletions
| diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py index 43226bd0..3ffde52c 100644 --- a/cloudinit/net/__init__.py +++ b/cloudinit/net/__init__.py @@ -359,8 +359,12 @@ def interface_has_own_mac(ifname, strict=False):        1: randomly generated   3: set using dev_set_mac_address"""      assign_type = read_sys_net_int(ifname, "addr_assign_type") -    if strict and assign_type is None: -        raise ValueError("%s had no addr_assign_type.") +    if assign_type is None: +        # None is returned if this nic had no 'addr_assign_type' entry. +        # if strict, raise an error, if not return True. +        if strict: +            raise ValueError("%s had no addr_assign_type.") +        return True      return assign_type in (0, 1, 3) diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py index fac82678..31807e13 100644 --- a/tests/unittests/test_net.py +++ b/tests/unittests/test_net.py @@ -2,12 +2,9 @@  from cloudinit import net  from cloudinit.net import cmdline -from cloudinit.net import eni -from cloudinit.net import natural_sort_key -from cloudinit.net import netplan -from cloudinit.net import network_state -from cloudinit.net import renderers -from cloudinit.net import sysconfig +from cloudinit.net import ( +    eni, interface_has_own_mac, natural_sort_key, netplan, network_state, +    renderers, sysconfig)  from cloudinit.sources.helpers import openstack  from cloudinit import temp_utils  from cloudinit import util @@ -2691,6 +2688,43 @@ class TestGetInterfaces(CiTestCase):              any_order=True) +class TestInterfaceHasOwnMac(CiTestCase): +    """Test interface_has_own_mac.  This is admittedly a bit whitebox.""" + +    @mock.patch('cloudinit.net.read_sys_net_int', return_value=None) +    def test_non_strict_with_no_addr_assign_type(self, m_read_sys_net_int): +        """If nic does not have addr_assign_type, it is not "stolen". + +        SmartOS containers do not provide the addr_assign_type in /sys. + +            $ ( cd /sys/class/net/eth0/ && grep -r . *) +            address:90:b8:d0:20:e1:b0 +            addr_len:6 +            flags:0x1043 +            ifindex:2 +            mtu:1500 +            tx_queue_len:1 +            type:1 +        """ +        self.assertTrue(interface_has_own_mac("eth0")) + +    @mock.patch('cloudinit.net.read_sys_net_int', return_value=None) +    def test_strict_with_no_addr_assign_type_raises(self, m_read_sys_net_int): +        with self.assertRaises(ValueError): +            interface_has_own_mac("eth0", True) + +    @mock.patch('cloudinit.net.read_sys_net_int') +    def test_expected_values(self, m_read_sys_net_int): +        msg = "address_assign_type=%d said to not have own mac" +        for address_assign_type in (0, 1, 3): +            m_read_sys_net_int.return_value = address_assign_type +            self.assertTrue( +                interface_has_own_mac("eth0", msg % address_assign_type)) + +        m_read_sys_net_int.return_value = 2 +        self.assertFalse(interface_has_own_mac("eth0")) + +  class TestGetInterfacesByMac(CiTestCase):      _data = {'bonds': ['bond1'],               'bridges': ['bridge1'], | 
