← Back to team overview

cloud-init-dev team mailing list archive

[Merge] ~smoser/cloud-init:fix/hetzner-ds-check-vendor into cloud-init:master

 

Scott Moser has proposed merging ~smoser/cloud-init:fix/hetzner-ds-check-vendor into cloud-init:master.

Commit message:
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.

Requested reviews:
  cloud-init commiters (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~smoser/cloud-init/+git/cloud-init/+merge/342226

see commit message
-- 
Your team cloud-init commiters is requested to review the proposed merge of ~smoser/cloud-init:fix/hetzner-ds-check-vendor into cloud-init:master.
diff --git a/cloudinit/sources/DataSourceHetzner.py b/cloudinit/sources/DataSourceHetzner.py
index 769fe13..5c75b65 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 f1d1525..a9c1259 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()

Follow ups