Skip to content

Instantly share code, notes, and snippets.

@akutz
Created August 9, 2021 22:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akutz/d7bc0d5b68dd32451fd2d152bff83f13 to your computer and use it in GitHub Desktop.
Save akutz/d7bc0d5b68dd32451fd2d152bff83f13 to your computer and use it in GitHub Desktop.
diff --git a/cloudinit/sources/DataSourceVMware.py b/cloudinit/sources/DataSourceVMware.py
index bfa596ad..22ca63de 100644
--- a/cloudinit/sources/DataSourceVMware.py
+++ b/cloudinit/sources/DataSourceVMware.py
@@ -70,7 +70,7 @@ import os
import socket
import time
-from cloudinit import log as logging
+from cloudinit import dmi, log as logging
from cloudinit import sources
from cloudinit import util
from cloudinit.subp import subp, ProcessExecutionError
@@ -163,6 +163,17 @@ class DataSourceVMware(sources.DataSource):
if md or ud or vd:
self.data_access_method = DATA_ACCESS_METHOD_ENVVAR
+ # At this point, all additional data transports are valid only on
+ # a VMware platform.
+ if not self.data_access_method:
+ system_type = dmi.read_dmi_data("system-product-name")
+ if system_type is None:
+ LOG.debug("No system-product-name found")
+ return False
+ if "vmware" not in system_type.lower():
+ LOG.debug("Not a VMware platform")
+ return False
+
# If no data was detected, check the guestinfo transport next.
if not self.data_access_method:
if self.vmware_rpctool:
diff --git a/tests/unittests/test_datasource/test_vmware.py b/tests/unittests/test_datasource/test_vmware.py
index a3ecb1bf..597db7c8 100644
--- a/tests/unittests/test_datasource/test_vmware.py
+++ b/tests/unittests/test_datasource/test_vmware.py
@@ -6,7 +6,7 @@
import base64
import gzip
-from cloudinit import helpers, safeyaml
+from cloudinit import dmi, helpers, safeyaml
from cloudinit import settings
from cloudinit.sources import DataSourceVMware
from cloudinit.tests.helpers import (
@@ -18,9 +18,12 @@ from cloudinit.tests.helpers import (
import os
+PRODUCT_NAME_FILE_PATH = "/sys/class/dmi/id/product_name"
+PRODUCT_NAME = "VMware7,1"
PRODUCT_UUID = "82343CED-E4C7-423B-8F6B-0D34D19067AB"
REROOT_FILES = {
DataSourceVMware.PRODUCT_UUID_FILE_PATH: PRODUCT_UUID,
+ PRODUCT_NAME_FILE_PATH: PRODUCT_NAME,
}
VMW_MULTIPLE_KEYS = [
@@ -86,11 +89,22 @@ class TestDataSourceVMwareEnvVars(FilesystemMockingTestCase):
super(TestDataSourceVMwareEnvVars, self).setUp()
self.tmp = self.tmp_dir()
os.environ[DataSourceVMware.VMX_GUESTINFO] = "1"
+ self.create_system_files()
def tearDown(self):
del os.environ[DataSourceVMware.VMX_GUESTINFO]
return super(TestDataSourceVMwareEnvVars, self).tearDown()
+ def create_system_files(self):
+ rootd = self.tmp_dir()
+ populate_dir(
+ rootd,
+ {
+ DataSourceVMware.PRODUCT_UUID_FILE_PATH: PRODUCT_UUID,
+ },
+ )
+ self.assertTrue(self.reRoot(rootd))
+
def assert_get_data_ok(self, m_fn, m_fn_call_count=6):
ds = get_ds(self.tmp)
ds.vmware_rpctool = None
@@ -106,11 +120,6 @@ class TestDataSourceVMwareEnvVars(FilesystemMockingTestCase):
ds = self.assert_get_data_ok(m_fn, m_fn_call_count)
assert_metadata(self, ds, metadata)
- def create_product_uuid_file(self):
- rootd = self.tmp_dir()
- populate_dir(rootd, REROOT_FILES)
- self.assertTrue(self.reRoot(rootd))
-
@mock.patch(
"cloudinit.sources.DataSourceVMware.guestinfo_envvar_get_value"
)
@@ -137,7 +146,6 @@ class TestDataSourceVMwareEnvVars(FilesystemMockingTestCase):
"cloudinit.sources.DataSourceVMware.guestinfo_envvar_get_value"
)
def test_get_data_userdata_only(self, m_fn):
- self.create_product_uuid_file()
m_fn.side_effect = ["", VMW_USERDATA_YAML, "", ""]
self.assert_get_data_ok(m_fn, m_fn_call_count=4)
@@ -145,7 +153,6 @@ class TestDataSourceVMwareEnvVars(FilesystemMockingTestCase):
"cloudinit.sources.DataSourceVMware.guestinfo_envvar_get_value"
)
def test_get_data_vendordata_only(self, m_fn):
- self.create_product_uuid_file()
m_fn.side_effect = ["", "", VMW_VENDORDATA_YAML, ""]
self.assert_get_data_ok(m_fn, m_fn_call_count=4)
@@ -208,12 +215,24 @@ class TestDataSourceVMwareEnvVars(FilesystemMockingTestCase):
class TestDataSourceVMwareGuestInfo(FilesystemMockingTestCase):
"""
- Test the guestinfo transport.
+ Test the guestinfo transport on a VMware platform.
"""
def setUp(self):
super(TestDataSourceVMwareGuestInfo, self).setUp()
self.tmp = self.tmp_dir()
+ self.create_system_files()
+
+ def create_system_files(self):
+ rootd = self.tmp_dir()
+ populate_dir(
+ rootd,
+ {
+ DataSourceVMware.PRODUCT_UUID_FILE_PATH: PRODUCT_UUID,
+ PRODUCT_NAME_FILE_PATH: PRODUCT_NAME,
+ },
+ )
+ self.assertTrue(self.reRoot(rootd))
def assert_get_data_ok(self, m_fn, m_fn_call_count=6):
ds = get_ds(self.tmp)
@@ -231,10 +250,9 @@ class TestDataSourceVMwareGuestInfo(FilesystemMockingTestCase):
ds = self.assert_get_data_ok(m_fn, m_fn_call_count)
assert_metadata(self, ds, metadata)
- def create_product_uuid_file(self):
- rootd = self.tmp_dir()
- populate_dir(rootd, REROOT_FILES)
- self.assertTrue(self.reRoot(rootd))
+ def test_ds_valid_on_vmware_platform(self):
+ system_type = dmi.read_dmi_data("system-product-name")
+ self.assertEqual(system_type, PRODUCT_NAME)
@mock.patch("cloudinit.sources.DataSourceVMware.guestinfo_get_value")
def test_get_subplatform(self, m_fn):
@@ -251,13 +269,11 @@ class TestDataSourceVMwareGuestInfo(FilesystemMockingTestCase):
@mock.patch("cloudinit.sources.DataSourceVMware.guestinfo_get_value")
def test_get_data_userdata_only(self, m_fn):
- self.create_product_uuid_file()
m_fn.side_effect = ["", VMW_USERDATA_YAML, "", ""]
self.assert_get_data_ok(m_fn, m_fn_call_count=4)
@mock.patch("cloudinit.sources.DataSourceVMware.guestinfo_get_value")
def test_get_data_vendordata_only(self, m_fn):
- self.create_product_uuid_file()
m_fn.side_effect = ["", "", VMW_VENDORDATA_YAML, ""]
self.assert_get_data_ok(m_fn, m_fn_call_count=4)
@@ -306,6 +322,38 @@ class TestDataSourceVMwareGuestInfo(FilesystemMockingTestCase):
self.assert_get_data_ok(m_fn, m_fn_call_count=4)
+class TestDataSourceVMwareGuestInfo_InvalidPlatform(FilesystemMockingTestCase):
+ """
+ Test the guestinfo transport on a non-VMware platform.
+ """
+
+ def setUp(self):
+ super(TestDataSourceVMwareGuestInfo_InvalidPlatform, self).setUp()
+ self.tmp = self.tmp_dir()
+ self.create_system_files()
+
+ def create_system_files(self):
+ rootd = self.tmp_dir()
+ populate_dir(
+ rootd,
+ {
+ DataSourceVMware.PRODUCT_UUID_FILE_PATH: PRODUCT_UUID,
+ },
+ )
+ self.assertTrue(self.reRoot(rootd))
+
+ @mock.patch("cloudinit.sources.DataSourceVMware.guestinfo_get_value")
+ def test_ds_invalid_on_non_vmware_platform(self, m_fn):
+ system_type = dmi.read_dmi_data("system-product-name")
+ self.assertEqual(system_type, None)
+
+ m_fn.side_effect = [VMW_METADATA_YAML, "", "", "", "", ""]
+ ds = get_ds(self.tmp)
+ ds.vmware_rpctool = "vmware-rpctool"
+ ret = ds.get_data()
+ self.assertFalse(ret)
+
+
def assert_metadata(test_obj, ds, metadata):
test_obj.assertEqual(metadata.get("instance-id"), ds.get_instance_id())
test_obj.assertEqual(metadata.get("local-hostname"), ds.get_hostname())
@blackboxsw
Copy link

+1 this looks good if it passes CI

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment