-
-
Save akutz/d7bc0d5b68dd32451fd2d152bff83f13 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
+1 this looks good if it passes CI