summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2018-03-27 12:03:39 -0600
committerChad Smith <chad.smith@canonical.com>2018-03-27 12:03:39 -0600
commit5e4641a3cd5eac5cbf8ffd13d32514fbb9424077 (patch)
treeeca255cd66360acb6c867530d4adf278d7c98fce
parent5b9dc4bc6a02acb26d568ab4633661a621d83620 (diff)
downloadvyos-cloud-init-5e4641a3cd5eac5cbf8ffd13d32514fbb9424077.tar.gz
vyos-cloud-init-5e4641a3cd5eac5cbf8ffd13d32514fbb9424077.zip
Hetzner: Exit early if dmi system-manufacturer is not Hetzner.
This takes the same basic check that is in ds-identify. If the DMI system manufacturer (aka sys_vendor) is not 'Hetzner', then exit out of the datasource's get_data quickly.
-rw-r--r--cloudinit/sources/DataSourceHetzner.py6
-rw-r--r--tests/unittests/test_datasource/test_hetzner.py20
2 files changed, 25 insertions, 1 deletions
diff --git a/cloudinit/sources/DataSourceHetzner.py b/cloudinit/sources/DataSourceHetzner.py
index 769fe131..5c75b65b 100644
--- a/cloudinit/sources/DataSourceHetzner.py
+++ b/cloudinit/sources/DataSourceHetzner.py
@@ -44,6 +44,8 @@ class DataSourceHetzner(sources.DataSource):
self.dsmode = sources.DSMODE_NETWORK
def get_data(self):
+ if not on_hetzner():
+ return False
nic = cloudnet.find_fallback_nic()
with cloudnet.EphemeralIPv4Network(nic, "169.254.0.1", 16,
"169.254.255.255"):
@@ -87,6 +89,10 @@ class DataSourceHetzner(sources.DataSource):
return self._network_config
+def on_hetzner():
+ return util.read_dmi_data('system-manufacturer') == "Hetzner"
+
+
# Used to match classes to dependencies
datasources = [
(DataSourceHetzner, (sources.DEP_FILESYSTEM, )),
diff --git a/tests/unittests/test_datasource/test_hetzner.py b/tests/unittests/test_datasource/test_hetzner.py
index f1d1525e..a9c12597 100644
--- a/tests/unittests/test_datasource/test_hetzner.py
+++ b/tests/unittests/test_datasource/test_hetzner.py
@@ -73,7 +73,10 @@ class TestDataSourceHetzner(CiTestCase):
@mock.patch('cloudinit.net.find_fallback_nic')
@mock.patch('cloudinit.sources.helpers.hetzner.read_metadata')
@mock.patch('cloudinit.sources.helpers.hetzner.read_userdata')
- def test_read_data(self, m_usermd, m_readmd, m_fallback_nic, m_net):
+ @mock.patch('cloudinit.sources.DataSourceHetzner.on_hetzner')
+ def test_read_data(self, m_on_hetzner, m_usermd, m_readmd, m_fallback_nic,
+ m_net):
+ m_on_hetzner.return_value = True
m_readmd.return_value = METADATA.copy()
m_usermd.return_value = USERDATA
m_fallback_nic.return_value = 'eth0'
@@ -97,3 +100,18 @@ class TestDataSourceHetzner(CiTestCase):
self.assertIsInstance(ds.get_public_ssh_keys(), list)
self.assertEqual(ds.get_userdata_raw(), USERDATA)
self.assertEqual(ds.get_vendordata_raw(), METADATA.get('vendor_data'))
+
+ @mock.patch('cloudinit.sources.helpers.hetzner.read_metadata')
+ @mock.patch('cloudinit.net.find_fallback_nic')
+ @mock.patch('cloudinit.sources.DataSourceHetzner.on_hetzner')
+ def test_not_on_hetzner_returns_false(self, m_on_hetzner, m_find_fallback,
+ m_read_md):
+ """If helper 'on_hetzner' returns False, return False from get_data."""
+ m_on_hetzner.return_value = False
+ ds = self.get_ds()
+ ret = ds.get_data()
+
+ self.assertFalse(ret)
+ # These are a white box attempt to ensure it did not search.
+ m_find_fallback.assert_not_called()
+ m_read_md.assert_not_called()