diff options
Diffstat (limited to 'tests/unittests/test_ds_identify.py')
-rw-r--r-- | tests/unittests/test_ds_identify.py | 1634 |
1 files changed, 1120 insertions, 514 deletions
diff --git a/tests/unittests/test_ds_identify.py b/tests/unittests/test_ds_identify.py index 1d8aaf18..0b0de395 100644 --- a/tests/unittests/test_ds_identify.py +++ b/tests/unittests/test_ds_identify.py @@ -1,27 +1,34 @@ # This file is part of cloud-init. See LICENSE file for license information. -from collections import namedtuple import copy import os +from collections import namedtuple from uuid import uuid4 -from cloudinit import safeyaml -from cloudinit import subp -from cloudinit import util -from cloudinit.tests.helpers import ( - CiTestCase, dir2dict, populate_dir, populate_dir_with_ts) - +from cloudinit import safeyaml, subp, util from cloudinit.sources import DataSourceIBMCloud as ds_ibm -from cloudinit.sources import DataSourceSmartOS as ds_smartos from cloudinit.sources import DataSourceOracle as ds_oracle - -UNAME_MYSYS = ("Linux bart 4.4.0-62-generic #83-Ubuntu " - "SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 GNU/Linux") -UNAME_PPC64EL = ("Linux diamond 4.4.0-83-generic #106-Ubuntu SMP " - "Mon Jun 26 17:53:54 UTC 2017 " - "ppc64le ppc64le ppc64le GNU/Linux") -UNAME_FREEBSD = ("FreeBSD fbsd12-1 12.1-RELEASE-p10 " - "FreeBSD 12.1-RELEASE-p10 GENERIC amd64") +from cloudinit.sources import DataSourceSmartOS as ds_smartos +from tests.unittests.helpers import ( + CiTestCase, + cloud_init_project_dir, + dir2dict, + populate_dir, + populate_dir_with_ts, +) + +UNAME_MYSYS = ( + "Linux bart 4.4.0-62-generic #83-Ubuntu " + "SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 GNU/Linux" +) +UNAME_PPC64EL = ( + "Linux diamond 4.4.0-83-generic #106-Ubuntu SMP " + "Mon Jun 26 17:53:54 UTC 2017 " + "ppc64le ppc64le ppc64le GNU/Linux" +) +UNAME_FREEBSD = ( + "FreeBSD fbsd12-1 12.1-RELEASE-p10 FreeBSD 12.1-RELEASE-p10 GENERIC amd64" +) BLKID_EFI_ROOT = """ DEVNAME=/dev/sda1 @@ -37,10 +44,16 @@ PARTUUID=30c65c77-e07d-4039-b2fb-88b1fb5fa1fc # this is a Ubuntu 18.04 disk.img output (dual uefi and bios bootable) BLKID_UEFI_UBUNTU = [ - {'DEVNAME': 'vda1', 'TYPE': 'ext4', 'PARTUUID': uuid4(), 'UUID': uuid4()}, - {'DEVNAME': 'vda14', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vda15', 'TYPE': 'vfat', 'LABEL': 'UEFI', 'PARTUUID': uuid4(), - 'UUID': '5F55-129B'}] + {"DEVNAME": "vda1", "TYPE": "ext4", "PARTUUID": uuid4(), "UUID": uuid4()}, + {"DEVNAME": "vda14", "PARTUUID": uuid4()}, + { + "DEVNAME": "vda15", + "TYPE": "vfat", + "LABEL": "UEFI", + "PARTUUID": uuid4(), + "UUID": "5F55-129B", + }, +] POLICY_FOUND_ONLY = "search,found=all,maybe=none,notfound=disabled" @@ -48,7 +61,7 @@ POLICY_FOUND_OR_MAYBE = "search,found=all,maybe=all,notfound=disabled" DI_DEFAULT_POLICY = "search,found=all,maybe=all,notfound=disabled" DI_DEFAULT_POLICY_NO_DMI = "search,found=all,maybe=all,notfound=enabled" DI_EC2_STRICT_ID_DEFAULT = "true" -OVF_MATCH_STRING = 'http://schemas.dmtf.org/ovf/environment/1' +OVF_MATCH_STRING = "http://schemas.dmtf.org/ovf/environment/1" SHELL_MOCK_TMPL = """\ %(name)s() { @@ -62,7 +75,7 @@ SHELL_MOCK_TMPL = """\ RC_FOUND = 0 RC_NOT_FOUND = 1 -DS_NONE = 'None' +DS_NONE = "None" P_CHASSIS_ASSET_TAG = "sys/class/dmi/id/chassis_asset_tag" P_PRODUCT_NAME = "sys/class/dmi/id/product_name" @@ -74,31 +87,45 @@ P_DSID_CFG = "etc/cloud/ds-identify.cfg" IBM_CONFIG_UUID = "9796-932E" -MOCK_VIRT_IS_CONTAINER_OTHER = {'name': 'detect_virt', - 'RET': 'container-other', 'ret': 0} -MOCK_VIRT_IS_KVM = {'name': 'detect_virt', 'RET': 'kvm', 'ret': 0} -MOCK_VIRT_IS_VMWARE = {'name': 'detect_virt', 'RET': 'vmware', 'ret': 0} +MOCK_VIRT_IS_CONTAINER_OTHER = { + "name": "detect_virt", + "RET": "container-other", + "ret": 0, +} +MOCK_NOT_LXD_DATASOURCE = {"name": "dscheck_LXD", "ret": 1} +MOCK_VIRT_IS_KVM = {"name": "detect_virt", "RET": "kvm", "ret": 0} +MOCK_VIRT_IS_VMWARE = {"name": "detect_virt", "RET": "vmware", "ret": 0} # currenty' SmartOS hypervisor "bhyve" is unknown by systemd-detect-virt. -MOCK_VIRT_IS_VM_OTHER = {'name': 'detect_virt', 'RET': 'vm-other', 'ret': 0} -MOCK_VIRT_IS_XEN = {'name': 'detect_virt', 'RET': 'xen', 'ret': 0} -MOCK_UNAME_IS_PPC64 = {'name': 'uname', 'out': UNAME_PPC64EL, 'ret': 0} -MOCK_UNAME_IS_FREEBSD = {'name': 'uname', 'out': UNAME_FREEBSD, 'ret': 0} +MOCK_VIRT_IS_VM_OTHER = {"name": "detect_virt", "RET": "vm-other", "ret": 0} +MOCK_VIRT_IS_XEN = {"name": "detect_virt", "RET": "xen", "ret": 0} +MOCK_UNAME_IS_PPC64 = {"name": "uname", "out": UNAME_PPC64EL, "ret": 0} +MOCK_UNAME_IS_FREEBSD = {"name": "uname", "out": UNAME_FREEBSD, "ret": 0} + +DEFAULT_MOCKS = [MOCK_NOT_LXD_DATASOURCE] shell_true = 0 shell_false = 1 -CallReturn = namedtuple('CallReturn', - ['rc', 'stdout', 'stderr', 'cfg', 'files']) +CallReturn = namedtuple( + "CallReturn", ["rc", "stdout", "stderr", "cfg", "files"] +) class DsIdentifyBase(CiTestCase): - dsid_path = os.path.realpath('tools/ds-identify') - allowed_subp = ['sh'] - - def call(self, rootd=None, mocks=None, func="main", args=None, files=None, - policy_dmi=DI_DEFAULT_POLICY, - policy_no_dmi=DI_DEFAULT_POLICY_NO_DMI, - ec2_strict_id=DI_EC2_STRICT_ID_DEFAULT): + dsid_path = cloud_init_project_dir("tools/ds-identify") + allowed_subp = ["sh"] + + def call( + self, + rootd=None, + mocks=None, + func="main", + args=None, + files=None, + policy_dmi=DI_DEFAULT_POLICY, + policy_no_dmi=DI_DEFAULT_POLICY_NO_DMI, + ec2_strict_id=DI_EC2_STRICT_ID_DEFAULT, + ): if args is None: args = [] if mocks is None: @@ -110,7 +137,7 @@ class DsIdentifyBase(CiTestCase): if rootd is None: rootd = self.tmp_dir() - unset = '_unset' + unset = "_unset" wrap = self.tmp_path(path="_shwrap", dir=rootd) populate_dir(rootd, files) @@ -126,11 +153,11 @@ class DsIdentifyBase(CiTestCase): 'DI_DEFAULT_POLICY="%s"' % policy_dmi, 'DI_DEFAULT_POLICY_NO_DMI="%s"' % policy_no_dmi, 'DI_EC2_STRICT_ID_DEFAULT="%s"' % ec2_strict_id, - "" + "", ] def write_mock(data): - ddata = {'out': None, 'err': None, 'ret': 0, 'RET': None} + ddata = {"out": None, "err": None, "ret": 0, "RET": None} ddata.update(data) for k in ddata: if ddata[k] is None: @@ -139,68 +166,88 @@ class DsIdentifyBase(CiTestCase): mocklines = [] defaults = [ - {'name': 'detect_virt', 'RET': 'none', 'ret': 1}, - {'name': 'uname', 'out': UNAME_MYSYS}, - {'name': 'blkid', 'out': BLKID_EFI_ROOT}, - {'name': 'ovf_vmware_transport_guestinfo', - 'out': 'No value found', 'ret': 1}, - {'name': 'dmi_decode', 'ret': 1, - 'err': 'No dmidecode program. ERROR.'}, - {'name': 'get_kenv_field', 'ret': 1, - 'err': 'No kenv program. ERROR.'}, + {"name": "detect_virt", "RET": "none", "ret": 1}, + {"name": "uname", "out": UNAME_MYSYS}, + {"name": "blkid", "out": BLKID_EFI_ROOT}, + { + "name": "ovf_vmware_transport_guestinfo", + "out": "No value found", + "ret": 1, + }, + { + "name": "dmi_decode", + "ret": 1, + "err": "No dmidecode program. ERROR.", + }, + { + "name": "get_kenv_field", + "ret": 1, + "err": "No kenv program. ERROR.", + }, ] - written = [d['name'] for d in mocks] + written = [d["name"] for d in mocks] for data in mocks: mocklines.append(write_mock(data)) for d in defaults: - if d['name'] not in written: + if d["name"] not in written: mocklines.append(write_mock(d)) - endlines = [ - func + ' ' + ' '.join(['"%s"' % s for s in args]) - ] + endlines = [func + " " + " ".join(['"%s"' % s for s in args])] with open(wrap, "w") as fp: - fp.write('\n'.join(head + mocklines + endlines) + "\n") + fp.write("\n".join(head + mocklines + endlines) + "\n") rc = 0 try: - out, err = subp.subp(['sh', '-c', '. %s' % wrap], capture=True) + out, err = subp.subp(["sh", "-c", ". %s" % wrap], capture=True) except subp.ProcessExecutionError as e: rc = e.exit_code out = e.stdout err = e.stderr cfg = None - cfg_out = os.path.join(rootd, 'run/cloud-init/cloud.cfg') + cfg_out = os.path.join(rootd, "run/cloud-init/cloud.cfg") if os.path.exists(cfg_out): contents = util.load_file(cfg_out) try: cfg = safeyaml.load(contents) except Exception as e: - cfg = {"_INVALID_YAML": contents, - "_EXCEPTION": str(e)} + cfg = {"_INVALID_YAML": contents, "_EXCEPTION": str(e)} return CallReturn(rc, out, err, cfg, dir2dict(rootd)) def _call_via_dict(self, data, rootd=None, **kwargs): # return output of self.call with a dict input like VALID_CFG[item] - xwargs = {'rootd': rootd} - passthrough = ('mocks', 'func', 'args', 'policy_dmi', - 'policy_no_dmi', 'files') + xwargs = {"rootd": rootd} + passthrough = ( + "mocks", + "func", + "args", + "policy_dmi", + "policy_no_dmi", + "files", + ) for k in passthrough: if k in data: xwargs[k] = data[k] if k in kwargs: xwargs[k] = kwargs[k] + if "mocks" not in xwargs: + xwargs["mocks"] = DEFAULT_MOCKS + else: + mocked_funcs = [m["name"] for m in xwargs["mocks"]] + for default_mock in DEFAULT_MOCKS: + if default_mock["name"] not in mocked_funcs: + xwargs["mocks"].append(default_mock) return self.call(**xwargs) def _test_ds_found(self, name): data = copy.deepcopy(VALID_CFG[name]) return self._check_via_dict( - data, RC_FOUND, dslist=[data.get('ds'), DS_NONE]) + data, RC_FOUND, dslist=[data.get("ds"), DS_NONE] + ) def _test_ds_not_found(self, name): data = copy.deepcopy(VALID_CFG[name]) @@ -212,87 +259,104 @@ class DsIdentifyBase(CiTestCase): try: self.assertEqual(rc, ret.rc) if dslist is not None: - self.assertEqual(dslist, ret.cfg['datasource_list']) + self.assertEqual(dslist, ret.cfg["datasource_list"]) good = True finally: if not good: - _print_run_output(ret.rc, ret.stdout, ret.stderr, ret.cfg, - ret.files) + _print_run_output( + ret.rc, ret.stdout, ret.stderr, ret.cfg, ret.files + ) return ret class TestDsIdentify(DsIdentifyBase): def test_wb_print_variables(self): """_print_info reports an array of discovered variables to stderr.""" - data = VALID_CFG['Azure-dmi-detection'] + data = VALID_CFG["Azure-dmi-detection"] _, _, err, _, _ = self._call_via_dict(data) expected_vars = [ - 'DMI_PRODUCT_NAME', 'DMI_SYS_VENDOR', 'DMI_PRODUCT_SERIAL', - 'DMI_PRODUCT_UUID', 'PID_1_PRODUCT_NAME', 'DMI_CHASSIS_ASSET_TAG', - 'FS_LABELS', 'KERNEL_CMDLINE', 'VIRT', 'UNAME_KERNEL_NAME', - 'UNAME_KERNEL_RELEASE', 'UNAME_KERNEL_VERSION', 'UNAME_MACHINE', - 'UNAME_NODENAME', 'UNAME_OPERATING_SYSTEM', 'DSNAME', 'DSLIST', - 'MODE', 'ON_FOUND', 'ON_MAYBE', 'ON_NOTFOUND'] + "DMI_PRODUCT_NAME", + "DMI_SYS_VENDOR", + "DMI_PRODUCT_SERIAL", + "DMI_PRODUCT_UUID", + "PID_1_PRODUCT_NAME", + "DMI_CHASSIS_ASSET_TAG", + "FS_LABELS", + "KERNEL_CMDLINE", + "VIRT", + "UNAME_KERNEL_NAME", + "UNAME_KERNEL_RELEASE", + "UNAME_KERNEL_VERSION", + "UNAME_MACHINE", + "UNAME_NODENAME", + "UNAME_OPERATING_SYSTEM", + "DSNAME", + "DSLIST", + "MODE", + "ON_FOUND", + "ON_MAYBE", + "ON_NOTFOUND", + ] for var in expected_vars: - self.assertIn('{0}='.format(var), err) + self.assertIn("{0}=".format(var), err) def test_azure_dmi_detection_from_chassis_asset_tag(self): """Azure datasource is detected from DMI chassis-asset-tag""" - self._test_ds_found('Azure-dmi-detection') + self._test_ds_found("Azure-dmi-detection") def test_azure_seed_file_detection(self): """Azure datasource is detected due to presence of a seed file. The seed file tested is /var/lib/cloud/seed/azure/ovf-env.xml.""" - self._test_ds_found('Azure-seed-detection') + self._test_ds_found("Azure-seed-detection") def test_aws_ec2_hvm(self): """EC2: hvm instances use dmi serial and uuid starting with 'ec2'.""" - self._test_ds_found('Ec2-hvm') + self._test_ds_found("Ec2-hvm") def test_aws_ec2_xen(self): """EC2: sys/hypervisor/uuid starts with ec2.""" - self._test_ds_found('Ec2-xen') + self._test_ds_found("Ec2-xen") def test_brightbox_is_ec2(self): """EC2: product_serial ends with '.brightbox.com'""" - self._test_ds_found('Ec2-brightbox') + self._test_ds_found("Ec2-brightbox") def test_bobrightbox_is_not_brightbox(self): """EC2: bobrightbox.com in product_serial is not brightbox'""" - self._test_ds_not_found('Ec2-brightbox-negative') + self._test_ds_not_found("Ec2-brightbox-negative") def test_freebsd_nocloud(self): """NoCloud identified on FreeBSD via label by geom.""" - self._test_ds_found('NoCloud-fbsd') + self._test_ds_found("NoCloud-fbsd") def test_gce_by_product_name(self): """GCE identifies itself with product_name.""" - self._test_ds_found('GCE') + self._test_ds_found("GCE") def test_gce_by_serial(self): """Older gce compute instances must be identified by serial.""" - self._test_ds_found('GCE-serial') + self._test_ds_found("GCE-serial") def test_config_drive(self): """ConfigDrive datasource has a disk with LABEL=config-2.""" - self._test_ds_found('ConfigDrive') + self._test_ds_found("ConfigDrive") def test_rbx_cloud(self): """Rbx datasource has a disk with LABEL=CLOUDMD.""" - self._test_ds_found('RbxCloud') + self._test_ds_found("RbxCloud") def test_rbx_cloud_lower(self): """Rbx datasource has a disk with LABEL=cloudmd.""" - self._test_ds_found('RbxCloudLower') + self._test_ds_found("RbxCloudLower") def test_config_drive_upper(self): """ConfigDrive datasource has a disk with LABEL=CONFIG-2.""" - self._test_ds_found('ConfigDriveUpper') + self._test_ds_found("ConfigDriveUpper") def test_config_drive_seed(self): """Config Drive seed directory.""" - self._test_ds_found('ConfigDrive-seed') + self._test_ds_found("ConfigDrive-seed") def test_config_drive_interacts_with_ibmcloud_config_disk(self): """Verify ConfigDrive interaction with IBMCloud. @@ -300,34 +364,35 @@ class TestDsIdentify(DsIdentifyBase): If ConfigDrive is enabled and not IBMCloud, then ConfigDrive should claim the ibmcloud 'config-2' disk. If IBMCloud is enabled, then ConfigDrive should skip.""" - data = copy.deepcopy(VALID_CFG['IBMCloud-config-2']) - files = data.get('files', {}) + data = copy.deepcopy(VALID_CFG["IBMCloud-config-2"]) + files = data.get("files", {}) if not files: - data['files'] = files - cfgpath = 'etc/cloud/cloud.cfg.d/99_networklayer_common.cfg' + data["files"] = files + cfgpath = "etc/cloud/cloud.cfg.d/99_networklayer_common.cfg" # with list including IBMCloud, config drive should be not found. - files[cfgpath] = 'datasource_list: [ ConfigDrive, IBMCloud ]\n' + files[cfgpath] = "datasource_list: [ ConfigDrive, IBMCloud ]\n" ret = self._check_via_dict(data, shell_true) - self.assertEqual( - ret.cfg.get('datasource_list'), ['IBMCloud', 'None']) + self.assertEqual(ret.cfg.get("datasource_list"), ["IBMCloud", "None"]) # But if IBMCloud is not enabled, config drive should claim this. - files[cfgpath] = 'datasource_list: [ ConfigDrive, NoCloud ]\n' + files[cfgpath] = "datasource_list: [ ConfigDrive, NoCloud ]\n" ret = self._check_via_dict(data, shell_true) self.assertEqual( - ret.cfg.get('datasource_list'), ['ConfigDrive', 'None']) + ret.cfg.get("datasource_list"), ["ConfigDrive", "None"] + ) def test_ibmcloud_template_userdata_in_provisioning(self): """Template provisioned with user-data during provisioning stage. Template provisioning with user-data has METADATA disk, datasource should return not found.""" - data = copy.deepcopy(VALID_CFG['IBMCloud-metadata']) + data = copy.deepcopy(VALID_CFG["IBMCloud-metadata"]) # change the 'is_ibm_provisioning' mock to return 1 (false) - isprov_m = [m for m in data['mocks'] - if m["name"] == "is_ibm_provisioning"][0] - isprov_m['ret'] = shell_true + isprov_m = [ + m for m in data["mocks"] if m["name"] == "is_ibm_provisioning" + ][0] + isprov_m["ret"] = shell_true return self._check_via_dict(data, RC_NOT_FOUND) def test_ibmcloud_template_userdata(self): @@ -335,58 +400,61 @@ class TestDsIdentify(DsIdentifyBase): Template provisioning with user-data has METADATA disk. datasource should return found.""" - self._test_ds_found('IBMCloud-metadata') + self._test_ds_found("IBMCloud-metadata") def test_ibmcloud_template_no_userdata_in_provisioning(self): """Template provisioned with no user-data during provisioning. no disks attached. Datasource should return not found.""" - data = copy.deepcopy(VALID_CFG['IBMCloud-nodisks']) - data['mocks'].append( - {'name': 'is_ibm_provisioning', 'ret': shell_true}) + data = copy.deepcopy(VALID_CFG["IBMCloud-nodisks"]) + data["mocks"].append( + {"name": "is_ibm_provisioning", "ret": shell_true} + ) return self._check_via_dict(data, RC_NOT_FOUND) def test_ibmcloud_template_no_userdata(self): """Template provisioned with no user-data first boot. no disks attached. Datasource should return found.""" - self._check_via_dict(VALID_CFG['IBMCloud-nodisks'], RC_NOT_FOUND) + self._check_via_dict(VALID_CFG["IBMCloud-nodisks"], RC_NOT_FOUND) def test_ibmcloud_os_code(self): """Launched by os code always has config-2 disk.""" - self._test_ds_found('IBMCloud-config-2') + self._test_ds_found("IBMCloud-config-2") def test_ibmcloud_os_code_different_uuid(self): """IBM cloud config-2 disks must be explicit match on UUID. If the UUID is not 9796-932E then we actually expect ConfigDrive.""" - data = copy.deepcopy(VALID_CFG['IBMCloud-config-2']) + data = copy.deepcopy(VALID_CFG["IBMCloud-config-2"]) offset = None - for m, d in enumerate(data['mocks']): - if d.get('name') == "blkid": + for m, d in enumerate(data["mocks"]): + if d.get("name") == "blkid": offset = m break if not offset: raise ValueError("Expected to find 'blkid' mock, but did not.") - data['mocks'][offset]['out'] = d['out'].replace(ds_ibm.IBM_CONFIG_UUID, - "DEAD-BEEF") + data["mocks"][offset]["out"] = d["out"].replace( + ds_ibm.IBM_CONFIG_UUID, "DEAD-BEEF" + ) self._check_via_dict( - data, rc=RC_FOUND, dslist=['ConfigDrive', DS_NONE]) + data, rc=RC_FOUND, dslist=["ConfigDrive", DS_NONE] + ) def test_ibmcloud_with_nocloud_seed(self): """NoCloud seed should be preferred over IBMCloud. A nocloud seed should be preferred over IBMCloud even if enabled. Ubuntu 16.04 images have <vlc>/seed/nocloud-net. LP: #1766401.""" - data = copy.deepcopy(VALID_CFG['IBMCloud-config-2']) - files = data.get('files', {}) + data = copy.deepcopy(VALID_CFG["IBMCloud-config-2"]) + files = data.get("files", {}) if not files: - data['files'] = files - files.update(VALID_CFG['NoCloud-seed']['files']) + data["files"] = files + files.update(VALID_CFG["NoCloud-seed"]["files"]) ret = self._check_via_dict(data, shell_true) self.assertEqual( - ['NoCloud', 'IBMCloud', 'None'], - ret.cfg.get('datasource_list')) + ["NoCloud", "IBMCloud", "None"], ret.cfg.get("datasource_list") + ) def test_ibmcloud_with_configdrive_seed(self): """ConfigDrive seed should be preferred over IBMCloud. @@ -394,28 +462,28 @@ class TestDsIdentify(DsIdentifyBase): A ConfigDrive seed should be preferred over IBMCloud even if enabled. Ubuntu 16.04 images have a fstab entry that mounts the METADATA disk into <vlc>/seed/config_drive. LP: ##1766401.""" - data = copy.deepcopy(VALID_CFG['IBMCloud-config-2']) - files = data.get('files', {}) + data = copy.deepcopy(VALID_CFG["IBMCloud-config-2"]) + files = data.get("files", {}) if not files: - data['files'] = files - files.update(VALID_CFG['ConfigDrive-seed']['files']) + data["files"] = files + files.update(VALID_CFG["ConfigDrive-seed"]["files"]) ret = self._check_via_dict(data, shell_true) self.assertEqual( - ['ConfigDrive', 'IBMCloud', 'None'], - ret.cfg.get('datasource_list')) + ["ConfigDrive", "IBMCloud", "None"], ret.cfg.get("datasource_list") + ) def test_policy_disabled(self): """A Builtin policy of 'disabled' should return not found. Even though a search would find something, the builtin policy of disabled should cause the return of not found.""" - mydata = copy.deepcopy(VALID_CFG['Ec2-hvm']) + mydata = copy.deepcopy(VALID_CFG["Ec2-hvm"]) self._check_via_dict(mydata, rc=RC_NOT_FOUND, policy_dmi="disabled") def test_policy_config_disable_overrides_builtin(self): """explicit policy: disabled in config file should cause not found.""" - mydata = copy.deepcopy(VALID_CFG['Ec2-hvm']) - mydata['files'][P_DSID_CFG] = '\n'.join(['policy: disabled', '']) + mydata = copy.deepcopy(VALID_CFG["Ec2-hvm"]) + mydata["files"][P_DSID_CFG] = "\n".join(["policy: disabled", ""]) self._check_via_dict(mydata, rc=RC_NOT_FOUND) def test_single_entry_defines_datasource(self): @@ -424,54 +492,55 @@ class TestDsIdentify(DsIdentifyBase): Test the valid Ec2-hvm, but provide a config file that specifies a single entry in datasource_list. The configured value should be used.""" - mydata = copy.deepcopy(VALID_CFG['Ec2-hvm']) - cfgpath = 'etc/cloud/cloud.cfg.d/myds.cfg' - mydata['files'][cfgpath] = 'datasource_list: ["NoCloud"]\n' - self._check_via_dict(mydata, rc=RC_FOUND, dslist=['NoCloud', DS_NONE]) + mydata = copy.deepcopy(VALID_CFG["Ec2-hvm"]) + cfgpath = "etc/cloud/cloud.cfg.d/myds.cfg" + mydata["files"][cfgpath] = 'datasource_list: ["NoCloud"]\n' + self._check_via_dict(mydata, rc=RC_FOUND, dslist=["NoCloud", DS_NONE]) def test_configured_list_with_none(self): """When datasource_list already contains None, None is not added. The explicitly configured datasource_list has 'None' in it. That should not have None automatically added.""" - mydata = copy.deepcopy(VALID_CFG['GCE']) - cfgpath = 'etc/cloud/cloud.cfg.d/myds.cfg' - mydata['files'][cfgpath] = 'datasource_list: ["Ec2", "None"]\n' - self._check_via_dict(mydata, rc=RC_FOUND, dslist=['Ec2', DS_NONE]) + mydata = copy.deepcopy(VALID_CFG["GCE"]) + cfgpath = "etc/cloud/cloud.cfg.d/myds.cfg" + mydata["files"][cfgpath] = 'datasource_list: ["Ec2", "None"]\n' + self._check_via_dict(mydata, rc=RC_FOUND, dslist=["Ec2", DS_NONE]) def test_aliyun_identified(self): """Test that Aliyun cloud is identified by product id.""" - self._test_ds_found('AliYun') + self._test_ds_found("AliYun") def test_aliyun_over_ec2(self): """Even if all other factors identified Ec2, AliYun should be used.""" - mydata = copy.deepcopy(VALID_CFG['Ec2-xen']) - self._test_ds_found('AliYun') - prod_name = VALID_CFG['AliYun']['files'][P_PRODUCT_NAME] - mydata['files'][P_PRODUCT_NAME] = prod_name + mydata = copy.deepcopy(VALID_CFG["Ec2-xen"]) + self._test_ds_found("AliYun") + prod_name = VALID_CFG["AliYun"]["files"][P_PRODUCT_NAME] + mydata["files"][P_PRODUCT_NAME] = prod_name policy = "search,found=first,maybe=none,notfound=disabled" - self._check_via_dict(mydata, rc=RC_FOUND, dslist=['AliYun', DS_NONE], - policy_dmi=policy) + self._check_via_dict( + mydata, rc=RC_FOUND, dslist=["AliYun", DS_NONE], policy_dmi=policy + ) def test_default_openstack_intel_is_found(self): """On Intel, openstack must be identified.""" - self._test_ds_found('OpenStack') + self._test_ds_found("OpenStack") def test_openstack_open_telekom_cloud(self): """Open Telecom identification.""" - self._test_ds_found('OpenStack-OpenTelekom') + self._test_ds_found("OpenStack-OpenTelekom") def test_openstack_sap_ccloud(self): """SAP Converged Cloud identification""" - self._test_ds_found('OpenStack-SAPCCloud') + self._test_ds_found("OpenStack-SAPCCloud") def test_openstack_asset_tag_nova(self): """OpenStack identification via asset tag OpenStack Nova.""" - self._test_ds_found('OpenStack-AssetTag-Nova') + self._test_ds_found("OpenStack-AssetTag-Nova") def test_openstack_asset_tag_copute(self): """OpenStack identification via asset tag OpenStack Compute.""" - self._test_ds_found('OpenStack-AssetTag-Compute') + self._test_ds_found("OpenStack-AssetTag-Compute") def test_openstack_on_non_intel_is_maybe(self): """On non-Intel, openstack without dmi info is maybe. @@ -479,175 +548,282 @@ class TestDsIdentify(DsIdentifyBase): nova does not identify itself on platforms other than intel. https://bugs.launchpad.net/cloud-init/+bugs?field.tag=dsid-nova""" - data = copy.deepcopy(VALID_CFG['OpenStack']) - del data['files'][P_PRODUCT_NAME] - data.update({'policy_dmi': POLICY_FOUND_OR_MAYBE, - 'policy_no_dmi': POLICY_FOUND_OR_MAYBE}) + data = copy.deepcopy(VALID_CFG["OpenStack"]) + del data["files"][P_PRODUCT_NAME] + data.update( + { + "policy_dmi": POLICY_FOUND_OR_MAYBE, + "policy_no_dmi": POLICY_FOUND_OR_MAYBE, + } + ) # this should show not found as default uname in tests is intel. # and intel openstack requires positive identification. self._check_via_dict(data, RC_NOT_FOUND, dslist=None) # updating the uname to ppc64 though should get a maybe. - data.update({'mocks': [MOCK_VIRT_IS_KVM, MOCK_UNAME_IS_PPC64]}) + data.update({"mocks": [MOCK_VIRT_IS_KVM, MOCK_UNAME_IS_PPC64]}) (_, _, err, _, _) = self._check_via_dict( - data, RC_FOUND, dslist=['OpenStack', 'None']) + data, RC_FOUND, dslist=["OpenStack", "None"] + ) self.assertIn("check for 'OpenStack' returned maybe", err) def test_default_ovf_is_found(self): """OVF is identified found when ovf/ovf-env.xml seed file exists.""" - self._test_ds_found('OVF-seed') + self._test_ds_found("OVF-seed") def test_default_ovf_with_detect_virt_none_not_found(self): """OVF identifies not found when detect_virt returns "none".""" self._check_via_dict( - {'ds': 'OVF'}, rc=RC_NOT_FOUND, policy_dmi="disabled") + {"ds": "OVF"}, rc=RC_NOT_FOUND, policy_dmi="disabled" + ) def test_default_ovf_returns_not_found_on_azure(self): """OVF datasource won't be found as false positive on Azure.""" - ovfonazure = copy.deepcopy(VALID_CFG['OVF']) + ovfonazure = copy.deepcopy(VALID_CFG["OVF"]) # Set azure asset tag to assert OVF content not found - ovfonazure['files'][P_CHASSIS_ASSET_TAG] = ( - '7783-7084-3265-9085-8269-3286-77\n') - self._check_via_dict( - ovfonazure, RC_FOUND, dslist=['Azure', DS_NONE]) + ovfonazure["files"][ + P_CHASSIS_ASSET_TAG + ] = "7783-7084-3265-9085-8269-3286-77\n" + self._check_via_dict(ovfonazure, RC_FOUND, dslist=["Azure", DS_NONE]) def test_ovf_on_vmware_iso_found_by_cdrom_with_ovf_schema_match(self): """OVF is identified when iso9660 cdrom path contains ovf schema.""" - self._test_ds_found('OVF') + self._test_ds_found("OVF") def test_ovf_on_vmware_guestinfo_found(self): """OVF guest info is found on vmware.""" - self._test_ds_found('OVF-guestinfo') + self._test_ds_found("OVF-guestinfo") def test_ovf_on_vmware_iso_found_when_vmware_customization(self): """OVF is identified when vmware customization is enabled.""" - self._test_ds_found('OVF-vmware-customization') + self._test_ds_found("OVF-vmware-customization") def test_ovf_on_vmware_iso_found_open_vm_tools_64(self): """OVF is identified when open-vm-tools installed in /usr/lib64.""" - cust64 = copy.deepcopy(VALID_CFG['OVF-vmware-customization']) - p32 = 'usr/lib/vmware-tools/plugins/vmsvc/libdeployPkgPlugin.so' - open64 = 'usr/lib64/open-vm-tools/plugins/vmsvc/libdeployPkgPlugin.so' - cust64['files'][open64] = cust64['files'][p32] - del cust64['files'][p32] + cust64 = copy.deepcopy(VALID_CFG["OVF-vmware-customization"]) + p32 = "usr/lib/vmware-tools/plugins/vmsvc/libdeployPkgPlugin.so" + open64 = "usr/lib64/open-vm-tools/plugins/vmsvc/libdeployPkgPlugin.so" + cust64["files"][open64] = cust64["files"][p32] + del cust64["files"][p32] + return self._check_via_dict( + cust64, RC_FOUND, dslist=[cust64.get("ds"), DS_NONE] + ) + + def test_ovf_on_vmware_iso_found_open_vm_tools_x86_64_linux_gnu(self): + """OVF is identified when open-vm-tools installed in + /usr/lib/x86_64-linux-gnu.""" + cust64 = copy.deepcopy(VALID_CFG["OVF-vmware-customization"]) + p32 = "usr/lib/vmware-tools/plugins/vmsvc/libdeployPkgPlugin.so" + x86 = ( + "usr/lib/x86_64-linux-gnu/open-vm-tools/plugins/vmsvc/" + "libdeployPkgPlugin.so" + ) + cust64["files"][x86] = cust64["files"][p32] + del cust64["files"][p32] + return self._check_via_dict( + cust64, RC_FOUND, dslist=[cust64.get("ds"), DS_NONE] + ) + + def test_ovf_on_vmware_iso_found_open_vm_tools_aarch64_linux_gnu(self): + """OVF is identified when open-vm-tools installed in + /usr/lib/aarch64-linux-gnu.""" + cust64 = copy.deepcopy(VALID_CFG["OVF-vmware-customization"]) + p32 = "usr/lib/vmware-tools/plugins/vmsvc/libdeployPkgPlugin.so" + aarch64 = ( + "usr/lib/aarch64-linux-gnu/open-vm-tools/plugins/vmsvc/" + "libdeployPkgPlugin.so" + ) + cust64["files"][aarch64] = cust64["files"][p32] + del cust64["files"][p32] return self._check_via_dict( - cust64, RC_FOUND, dslist=[cust64.get('ds'), DS_NONE]) + cust64, RC_FOUND, dslist=[cust64.get("ds"), DS_NONE] + ) def test_ovf_on_vmware_iso_found_by_cdrom_with_matching_fs_label(self): """OVF is identified by well-known iso9660 labels.""" - ovf_cdrom_by_label = copy.deepcopy(VALID_CFG['OVF']) + ovf_cdrom_by_label = copy.deepcopy(VALID_CFG["OVF"]) # Unset matching cdrom ovf schema content - ovf_cdrom_by_label['files']['dev/sr0'] = 'No content match' + ovf_cdrom_by_label["files"]["dev/sr0"] = "No content match" self._check_via_dict( - ovf_cdrom_by_label, rc=RC_NOT_FOUND, policy_dmi="disabled") + ovf_cdrom_by_label, rc=RC_NOT_FOUND, policy_dmi="disabled" + ) # Add recognized labels - valid_ovf_labels = ['ovf-transport', 'OVF-TRANSPORT', - "OVFENV", "ovfenv", "OVF ENV", "ovf env"] + valid_ovf_labels = [ + "ovf-transport", + "OVF-TRANSPORT", + "OVFENV", + "ovfenv", + "OVF ENV", + "ovf env", + ] for valid_ovf_label in valid_ovf_labels: - ovf_cdrom_by_label['mocks'][0]['out'] = blkid_out([ - {'DEVNAME': 'sda1', 'TYPE': 'ext4', 'LABEL': 'rootfs'}, - {'DEVNAME': 'sr0', 'TYPE': 'iso9660', - 'LABEL': valid_ovf_label}, - {'DEVNAME': 'vda1', 'TYPE': 'ntfs', 'LABEL': 'data'}]) + ovf_cdrom_by_label["mocks"][0]["out"] = blkid_out( + [ + {"DEVNAME": "sda1", "TYPE": "ext4", "LABEL": "rootfs"}, + { + "DEVNAME": "sr0", + "TYPE": "iso9660", + "LABEL": valid_ovf_label, + }, + {"DEVNAME": "vda1", "TYPE": "ntfs", "LABEL": "data"}, + ] + ) self._check_via_dict( - ovf_cdrom_by_label, rc=RC_FOUND, dslist=['OVF', DS_NONE]) + ovf_cdrom_by_label, rc=RC_FOUND, dslist=["OVF", DS_NONE] + ) def test_ovf_on_vmware_iso_found_by_cdrom_with_different_size(self): """OVF is identified by well-known iso9660 labels.""" - ovf_cdrom_with_size = copy.deepcopy(VALID_CFG['OVF']) + ovf_cdrom_with_size = copy.deepcopy(VALID_CFG["OVF"]) # Set cdrom size to 20480 (10MB in 512 byte units) - ovf_cdrom_with_size['files']['sys/class/block/sr0/size'] = '20480\n' + ovf_cdrom_with_size["files"]["sys/class/block/sr0/size"] = "20480\n" self._check_via_dict( - ovf_cdrom_with_size, rc=RC_NOT_FOUND, policy_dmi="disabled") + ovf_cdrom_with_size, rc=RC_NOT_FOUND, policy_dmi="disabled" + ) # Set cdrom size to 204800 (100MB in 512 byte units) - ovf_cdrom_with_size['files']['sys/class/block/sr0/size'] = '204800\n' + ovf_cdrom_with_size["files"]["sys/class/block/sr0/size"] = "204800\n" self._check_via_dict( - ovf_cdrom_with_size, rc=RC_NOT_FOUND, policy_dmi="disabled") + ovf_cdrom_with_size, rc=RC_NOT_FOUND, policy_dmi="disabled" + ) # Set cdrom size to 18432 (9MB in 512 byte units) - ovf_cdrom_with_size['files']['sys/class/block/sr0/size'] = '18432\n' + ovf_cdrom_with_size["files"]["sys/class/block/sr0/size"] = "18432\n" self._check_via_dict( - ovf_cdrom_with_size, rc=RC_FOUND, dslist=['OVF', DS_NONE]) + ovf_cdrom_with_size, rc=RC_FOUND, dslist=["OVF", DS_NONE] + ) # Set cdrom size to 2048 (1MB in 512 byte units) - ovf_cdrom_with_size['files']['sys/class/block/sr0/size'] = '2048\n' + ovf_cdrom_with_size["files"]["sys/class/block/sr0/size"] = "2048\n" self._check_via_dict( - ovf_cdrom_with_size, rc=RC_FOUND, dslist=['OVF', DS_NONE]) + ovf_cdrom_with_size, rc=RC_FOUND, dslist=["OVF", DS_NONE] + ) def test_default_nocloud_as_vdb_iso9660(self): """NoCloud is found with iso9660 filesystem on non-cdrom disk.""" - self._test_ds_found('NoCloud') + self._test_ds_found("NoCloud") def test_nocloud_upper(self): """NoCloud is found with uppercase filesystem label.""" - self._test_ds_found('NoCloudUpper') + self._test_ds_found("NoCloudUpper") def test_nocloud_fatboot(self): """NoCloud fatboot label - LP: #184166.""" - self._test_ds_found('NoCloud-fatboot') + self._test_ds_found("NoCloud-fatboot") def test_nocloud_seed(self): """Nocloud seed directory.""" - self._test_ds_found('NoCloud-seed') + self._test_ds_found("NoCloud-seed") def test_nocloud_seed_ubuntu_core_writable(self): """Nocloud seed directory ubuntu core writable""" - self._test_ds_found('NoCloud-seed-ubuntu-core') + self._test_ds_found("NoCloud-seed-ubuntu-core") def test_hetzner_found(self): """Hetzner cloud is identified in sys_vendor.""" - self._test_ds_found('Hetzner') + self._test_ds_found("Hetzner") def test_smartos_bhyve(self): """SmartOS cloud identified by SmartDC in dmi.""" - self._test_ds_found('SmartOS-bhyve') + self._test_ds_found("SmartOS-bhyve") def test_smartos_lxbrand(self): """SmartOS cloud identified on lxbrand container.""" - self._test_ds_found('SmartOS-lxbrand') + self._test_ds_found("SmartOS-lxbrand") def test_smartos_lxbrand_requires_socket(self): """SmartOS cloud should not be identified if no socket file.""" - mycfg = copy.deepcopy(VALID_CFG['SmartOS-lxbrand']) - del mycfg['files'][ds_smartos.METADATA_SOCKFILE] + mycfg = copy.deepcopy(VALID_CFG["SmartOS-lxbrand"]) + del mycfg["files"][ds_smartos.METADATA_SOCKFILE] self._check_via_dict(mycfg, rc=RC_NOT_FOUND, policy_dmi="disabled") def test_path_env_gets_set_from_main(self): """PATH environment should always have some tokens when main is run. We explicitly call main as we want to ensure it updates PATH.""" - cust = copy.deepcopy(VALID_CFG['NoCloud']) + cust = copy.deepcopy(VALID_CFG["NoCloud"]) rootd = self.tmp_dir() - mpp = 'main-printpath' + mpp = "main-printpath" pre = "MYPATH=" - cust['files'][mpp] = ( - 'PATH="/mycust/path"; main; r=$?; echo ' + pre + '$PATH; exit $r;') + cust["files"][mpp] = ( + 'PATH="/mycust/path"; main; r=$?; echo ' + pre + "$PATH; exit $r;" + ) ret = self._check_via_dict( - cust, RC_FOUND, - func=".", args=[os.path.join(rootd, mpp)], rootd=rootd) + cust, + RC_FOUND, + func=".", + args=[os.path.join(rootd, mpp)], + rootd=rootd, + ) match = [ line for line in ret.stdout.splitlines() if line.startswith(pre) ][0] toks = match.replace(pre, "").split(":") expected = ["/sbin", "/bin", "/usr/sbin", "/usr/bin", "/mycust/path"] - self.assertEqual(expected, [p for p in expected if p in toks], - "path did not have expected tokens") + self.assertEqual( + expected, + [p for p in expected if p in toks], + "path did not have expected tokens", + ) def test_zstack_is_ec2(self): """EC2: chassis asset tag ends with 'zstack.io'""" - self._test_ds_found('Ec2-ZStack') + self._test_ds_found("Ec2-ZStack") def test_e24cloud_is_ec2(self): """EC2: e24cloud identified by sys_vendor""" - self._test_ds_found('Ec2-E24Cloud') + self._test_ds_found("Ec2-E24Cloud") def test_e24cloud_not_active(self): """EC2: bobrightbox.com in product_serial is not brightbox'""" - self._test_ds_not_found('Ec2-E24Cloud-negative') + self._test_ds_not_found("Ec2-E24Cloud-negative") + + def test_vmware_no_valid_transports(self): + """VMware: no valid transports""" + self._test_ds_not_found("VMware-NoValidTransports") + + def test_vmware_envvar_no_data(self): + """VMware: envvar transport no data""" + self._test_ds_not_found("VMware-EnvVar-NoData") + + def test_vmware_envvar_no_virt_id(self): + """VMware: envvar transport success if no virt id""" + self._test_ds_found("VMware-EnvVar-NoVirtID") + + def test_vmware_envvar_activated_by_metadata(self): + """VMware: envvar transport activated by metadata""" + self._test_ds_found("VMware-EnvVar-Metadata") + + def test_vmware_envvar_activated_by_userdata(self): + """VMware: envvar transport activated by userdata""" + self._test_ds_found("VMware-EnvVar-Userdata") + + def test_vmware_envvar_activated_by_vendordata(self): + """VMware: envvar transport activated by vendordata""" + self._test_ds_found("VMware-EnvVar-Vendordata") + + def test_vmware_guestinfo_no_data(self): + """VMware: guestinfo transport no data""" + self._test_ds_not_found("VMware-GuestInfo-NoData") + + def test_vmware_guestinfo_no_virt_id(self): + """VMware: guestinfo transport fails if no virt id""" + self._test_ds_not_found("VMware-GuestInfo-NoVirtID") + + def test_vmware_guestinfo_activated_by_metadata(self): + """VMware: guestinfo transport activated by metadata""" + self._test_ds_found("VMware-GuestInfo-Metadata") + + def test_vmware_guestinfo_activated_by_userdata(self): + """VMware: guestinfo transport activated by userdata""" + self._test_ds_found("VMware-GuestInfo-Userdata") + + def test_vmware_guestinfo_activated_by_vendordata(self): + """VMware: guestinfo transport activated by vendordata""" + self._test_ds_found("VMware-GuestInfo-Vendordata") class TestBSDNoSys(DsIdentifyBase): @@ -663,14 +839,14 @@ class TestBSDNoSys(DsIdentifyBase): This will be used on FreeBSD systems. """ - self._test_ds_found('Hetzner-kenv') + self._test_ds_found("Hetzner-kenv") def test_dmi_dmidecode(self): """Test that dmidecode(8) works on systems which don't have /sys This will be used on all other BSD systems. """ - self._test_ds_found('Hetzner-dmidecode') + self._test_ds_found("Hetzner-dmidecode") class TestIsIBMProvisioning(DsIdentifyBase): @@ -694,9 +870,11 @@ class TestIsIBMProvisioning(DsIdentifyBase): def test_config_with_old_log(self): """A config with a log from previous boot is not provisioning.""" rootd = self.tmp_dir() - data = {self.prov_cfg: ("key=value\nkey2=val2\n", -10), - self.inst_log: ("log data\n", -30), - self.boot_ref: ("PWD=/", 0)} + data = { + self.prov_cfg: ("key=value\nkey2=val2\n", -10), + self.inst_log: ("log data\n", -30), + self.boot_ref: ("PWD=/", 0), + } populate_dir_with_ts(rootd, data) ret = self.call(rootd=rootd, func=self.funcname) self.assertEqual(shell_false, ret.rc) @@ -705,9 +883,11 @@ class TestIsIBMProvisioning(DsIdentifyBase): def test_config_with_new_log(self): """A config with a log from this boot is provisioning.""" rootd = self.tmp_dir() - data = {self.prov_cfg: ("key=value\nkey2=val2\n", -10), - self.inst_log: ("log data\n", 30), - self.boot_ref: ("PWD=/", 0)} + data = { + self.prov_cfg: ("key=value\nkey2=val2\n", -10), + self.inst_log: ("log data\n", 30), + self.boot_ref: ("PWD=/", 0), + } populate_dir_with_ts(rootd, data) ret = self.call(rootd=rootd, func=self.funcname) self.assertEqual(shell_true, ret.rc) @@ -717,12 +897,12 @@ class TestIsIBMProvisioning(DsIdentifyBase): class TestOracle(DsIdentifyBase): def test_found_by_chassis(self): """Simple positive test of Oracle by chassis id.""" - self._test_ds_found('Oracle') + self._test_ds_found("Oracle") def test_not_found(self): """Simple negative test of Oracle.""" - mycfg = copy.deepcopy(VALID_CFG['Oracle']) - mycfg['files'][P_CHASSIS_ASSET_TAG] = "Not Oracle" + mycfg = copy.deepcopy(VALID_CFG["Oracle"]) + mycfg["files"][P_CHASSIS_ASSET_TAG] = "Not Oracle" self._check_via_dict(mycfg, rc=RC_NOT_FOUND) @@ -739,7 +919,7 @@ def blkid_out(disks=None): for key in [d for d in disk if d != "DEVNAME"]: lines.append("%s=%s" % (key, disk[key])) lines.append("") - return '\n'.join(lines) + return "\n".join(lines) def geom_out(disks=None): @@ -756,387 +936,813 @@ def geom_out(disks=None): disks = [] lines = [] for disk in disks: - lines.append("%s/%s N/A %s" % ( - disk["TYPE"], disk["LABEL"], disk["DEVNAME"])) + lines.append( + "%s/%s N/A %s" % (disk["TYPE"], disk["LABEL"], disk["DEVNAME"]) + ) lines.append("") - return '\n'.join(lines) + return "\n".join(lines) def _print_run_output(rc, out, err, cfg, files): """A helper to print return of TestDsIdentify. - _print_run_output(self.call())""" - print('\n'.join([ - '-- rc = %s --' % rc, - '-- out --', str(out), - '-- err --', str(err), - '-- cfg --', util.json_dumps(cfg)])) - print('-- files --') + _print_run_output(self.call())""" + print( + "\n".join( + [ + "-- rc = %s --" % rc, + "-- out --", + str(out), + "-- err --", + str(err), + "-- cfg --", + util.json_dumps(cfg), + ] + ) + ) + print("-- files --") for k, v in files.items(): if "/_shwrap" in k: continue - print(' === %s ===' % k) + print(" === %s ===" % k) for line in v.splitlines(): print(" " + line) VALID_CFG = { - 'AliYun': { - 'ds': 'AliYun', - 'files': {P_PRODUCT_NAME: 'Alibaba Cloud ECS\n'}, + "AliYun": { + "ds": "AliYun", + "files": {P_PRODUCT_NAME: "Alibaba Cloud ECS\n"}, }, - 'Azure-dmi-detection': { - 'ds': 'Azure', - 'files': { - P_CHASSIS_ASSET_TAG: '7783-7084-3265-9085-8269-3286-77\n', - } + "Azure-dmi-detection": { + "ds": "Azure", + "files": { + P_CHASSIS_ASSET_TAG: "7783-7084-3265-9085-8269-3286-77\n", + }, }, - 'Azure-seed-detection': { - 'ds': 'Azure', - 'files': { - P_CHASSIS_ASSET_TAG: 'No-match\n', - os.path.join(P_SEED_DIR, 'azure', 'ovf-env.xml'): 'present\n', - } + "Azure-seed-detection": { + "ds": "Azure", + "files": { + P_CHASSIS_ASSET_TAG: "No-match\n", + os.path.join(P_SEED_DIR, "azure", "ovf-env.xml"): "present\n", + }, }, - 'Ec2-hvm': { - 'ds': 'Ec2', - 'mocks': [{'name': 'detect_virt', 'RET': 'kvm', 'ret': 0}], - 'files': { - P_PRODUCT_SERIAL: 'ec23aef5-54be-4843-8d24-8c819f88453e\n', - P_PRODUCT_UUID: 'EC23AEF5-54BE-4843-8D24-8C819F88453E\n', - } + "Ec2-hvm": { + "ds": "Ec2", + "mocks": [{"name": "detect_virt", "RET": "kvm", "ret": 0}], + "files": { + P_PRODUCT_SERIAL: "ec23aef5-54be-4843-8d24-8c819f88453e\n", + P_PRODUCT_UUID: "EC23AEF5-54BE-4843-8D24-8C819F88453E\n", + }, }, - 'Ec2-xen': { - 'ds': 'Ec2', - 'mocks': [MOCK_VIRT_IS_XEN], - 'files': { - 'sys/hypervisor/uuid': 'ec2c6e2f-5fac-4fc7-9c82-74127ec14bbb\n' + "Ec2-xen": { + "ds": "Ec2", + "mocks": [MOCK_VIRT_IS_XEN], + "files": { + "sys/hypervisor/uuid": "ec2c6e2f-5fac-4fc7-9c82-74127ec14bbb\n" }, }, - 'Ec2-brightbox': { - 'ds': 'Ec2', - 'files': {P_PRODUCT_SERIAL: 'srv-otuxg.gb1.brightbox.com\n'}, + "Ec2-brightbox": { + "ds": "Ec2", + "files": {P_PRODUCT_SERIAL: "srv-otuxg.gb1.brightbox.com\n"}, }, - 'Ec2-brightbox-negative': { - 'ds': 'Ec2', - 'files': {P_PRODUCT_SERIAL: 'tricky-host.bobrightbox.com\n'}, + "Ec2-brightbox-negative": { + "ds": "Ec2", + "files": {P_PRODUCT_SERIAL: "tricky-host.bobrightbox.com\n"}, }, - 'GCE': { - 'ds': 'GCE', - 'files': {P_PRODUCT_NAME: 'Google Compute Engine\n'}, - 'mocks': [MOCK_VIRT_IS_KVM], + "GCE": { + "ds": "GCE", + "files": {P_PRODUCT_NAME: "Google Compute Engine\n"}, + "mocks": [MOCK_VIRT_IS_KVM], }, - 'GCE-serial': { - 'ds': 'GCE', - 'files': {P_PRODUCT_SERIAL: 'GoogleCloud-8f2e88f\n'}, - 'mocks': [MOCK_VIRT_IS_KVM], + "GCE-serial": { + "ds": "GCE", + "files": {P_PRODUCT_SERIAL: "GoogleCloud-8f2e88f\n"}, + "mocks": [MOCK_VIRT_IS_KVM], }, - 'NoCloud': { - 'ds': 'NoCloud', - 'mocks': [ + "NoCloud": { + "ds": "NoCloud", + "mocks": [ MOCK_VIRT_IS_KVM, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - BLKID_UEFI_UBUNTU + - [{'DEVNAME': 'vdb', 'TYPE': 'iso9660', 'LABEL': 'cidata'}])}, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + BLKID_UEFI_UBUNTU + + [ + { + "DEVNAME": "vdb", + "TYPE": "iso9660", + "LABEL": "cidata", + } + ] + ), + }, ], - 'files': { - 'dev/vdb': 'pretend iso content for cidata\n', - } + "files": { + "dev/vdb": "pretend iso content for cidata\n", + }, }, - 'NoCloud-fbsd': { - 'ds': 'NoCloud', - 'mocks': [ + "NoCloud-fbsd": { + "ds": "NoCloud", + "mocks": [ MOCK_VIRT_IS_KVM, MOCK_UNAME_IS_FREEBSD, - {'name': 'geom', 'ret': 0, - 'out': geom_out( - [{'DEVNAME': 'vtbd', 'TYPE': 'iso9660', 'LABEL': 'cidata'}])}, + { + "name": "geom", + "ret": 0, + "out": geom_out( + [{"DEVNAME": "vtbd", "TYPE": "iso9660", "LABEL": "cidata"}] + ), + }, ], - 'files': { - '/dev/vtdb': 'pretend iso content for cidata\n', - } + "files": { + "/dev/vtdb": "pretend iso content for cidata\n", + }, }, - 'NoCloudUpper': { - 'ds': 'NoCloud', - 'mocks': [ + "NoCloudUpper": { + "ds": "NoCloud", + "mocks": [ MOCK_VIRT_IS_KVM, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - BLKID_UEFI_UBUNTU + - [{'DEVNAME': 'vdb', 'TYPE': 'iso9660', 'LABEL': 'CIDATA'}])}, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + BLKID_UEFI_UBUNTU + + [ + { + "DEVNAME": "vdb", + "TYPE": "iso9660", + "LABEL": "CIDATA", + } + ] + ), + }, ], - 'files': { - 'dev/vdb': 'pretend iso content for cidata\n', - } + "files": { + "dev/vdb": "pretend iso content for cidata\n", + }, }, - 'NoCloud-fatboot': { - 'ds': 'NoCloud', - 'mocks': [ + "NoCloud-fatboot": { + "ds": "NoCloud", + "mocks": [ MOCK_VIRT_IS_XEN, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - BLKID_UEFI_UBUNTU + - [{'DEVNAME': 'xvdb', 'TYPE': 'vfat', 'SEC_TYPE': 'msdos', - 'UUID': '355a-4FC2', 'LABEL_FATBOOT': 'cidata'}])}, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + BLKID_UEFI_UBUNTU + + [ + { + "DEVNAME": "xvdb", + "TYPE": "vfat", + "SEC_TYPE": "msdos", + "UUID": "355a-4FC2", + "LABEL_FATBOOT": "cidata", + } + ] + ), + }, ], - 'files': { - 'dev/vdb': 'pretend iso content for cidata\n', - } + "files": { + "dev/vdb": "pretend iso content for cidata\n", + }, }, - 'NoCloud-seed': { - 'ds': 'NoCloud', - 'files': { - os.path.join(P_SEED_DIR, 'nocloud', 'user-data'): 'ud\n', - os.path.join(P_SEED_DIR, 'nocloud', 'meta-data'): 'md\n', - } + "NoCloud-seed": { + "ds": "NoCloud", + "files": { + os.path.join(P_SEED_DIR, "nocloud", "user-data"): "ud\n", + os.path.join(P_SEED_DIR, "nocloud", "meta-data"): "md\n", + }, }, - 'NoCloud-seed-ubuntu-core': { - 'ds': 'NoCloud', - 'files': { - os.path.join('writable/system-data', P_SEED_DIR, - 'nocloud-net', 'user-data'): 'ud\n', - os.path.join('writable/system-data', P_SEED_DIR, - 'nocloud-net', 'meta-data'): 'md\n', - } + "NoCloud-seed-ubuntu-core": { + "ds": "NoCloud", + "files": { + os.path.join( + "writable/system-data", P_SEED_DIR, "nocloud-net", "user-data" + ): "ud\n", + os.path.join( + "writable/system-data", P_SEED_DIR, "nocloud-net", "meta-data" + ): "md\n", + }, }, - 'OpenStack': { - 'ds': 'OpenStack', - 'files': {P_PRODUCT_NAME: 'OpenStack Nova\n'}, - 'mocks': [MOCK_VIRT_IS_KVM], - 'policy_dmi': POLICY_FOUND_ONLY, - 'policy_no_dmi': POLICY_FOUND_ONLY, + "OpenStack": { + "ds": "OpenStack", + "files": {P_PRODUCT_NAME: "OpenStack Nova\n"}, + "mocks": [MOCK_VIRT_IS_KVM], + "policy_dmi": POLICY_FOUND_ONLY, + "policy_no_dmi": POLICY_FOUND_ONLY, }, - 'OpenStack-OpenTelekom': { + "OpenStack-OpenTelekom": { # OTC gen1 (Xen) hosts use OpenStack datasource, LP: #1756471 - 'ds': 'OpenStack', - 'files': {P_CHASSIS_ASSET_TAG: 'OpenTelekomCloud\n'}, - 'mocks': [MOCK_VIRT_IS_XEN], + "ds": "OpenStack", + "files": {P_CHASSIS_ASSET_TAG: "OpenTelekomCloud\n"}, + "mocks": [MOCK_VIRT_IS_XEN], }, - 'OpenStack-SAPCCloud': { + "OpenStack-SAPCCloud": { # SAP CCloud hosts use OpenStack on VMware - 'ds': 'OpenStack', - 'files': {P_CHASSIS_ASSET_TAG: 'SAP CCloud VM\n'}, - 'mocks': [MOCK_VIRT_IS_VMWARE], + "ds": "OpenStack", + "files": {P_CHASSIS_ASSET_TAG: "SAP CCloud VM\n"}, + "mocks": [MOCK_VIRT_IS_VMWARE], }, - 'OpenStack-AssetTag-Nova': { + "OpenStack-AssetTag-Nova": { # VMware vSphere can't modify product-name, LP: #1669875 - 'ds': 'OpenStack', - 'files': {P_CHASSIS_ASSET_TAG: 'OpenStack Nova\n'}, - 'mocks': [MOCK_VIRT_IS_XEN], + "ds": "OpenStack", + "files": {P_CHASSIS_ASSET_TAG: "OpenStack Nova\n"}, + "mocks": [MOCK_VIRT_IS_XEN], }, - 'OpenStack-AssetTag-Compute': { + "OpenStack-AssetTag-Compute": { # VMware vSphere can't modify product-name, LP: #1669875 - 'ds': 'OpenStack', - 'files': {P_CHASSIS_ASSET_TAG: 'OpenStack Compute\n'}, - 'mocks': [MOCK_VIRT_IS_XEN], + "ds": "OpenStack", + "files": {P_CHASSIS_ASSET_TAG: "OpenStack Compute\n"}, + "mocks": [MOCK_VIRT_IS_XEN], }, - 'OVF-seed': { - 'ds': 'OVF', - 'files': { - os.path.join(P_SEED_DIR, 'ovf', 'ovf-env.xml'): 'present\n', - } + "OVF-seed": { + "ds": "OVF", + "files": { + os.path.join(P_SEED_DIR, "ovf", "ovf-env.xml"): "present\n", + }, }, - 'OVF-vmware-customization': { - 'ds': 'OVF', - 'mocks': [ + "OVF-vmware-customization": { + "ds": "OVF", + "mocks": [ # Include a mockes iso9660 potential, even though content not ovf - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'sr0', 'TYPE': 'iso9660', 'LABEL': ''}]) - }, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [{"DEVNAME": "sr0", "TYPE": "iso9660", "LABEL": ""}] + ), + }, MOCK_VIRT_IS_VMWARE, ], - 'files': { - 'dev/sr0': 'no match', + "files": { + "dev/sr0": "no match", # Setup vmware customization enabled - 'usr/lib/vmware-tools/plugins/vmsvc/libdeployPkgPlugin.so': 'here', - 'etc/cloud/cloud.cfg': 'disable_vmware_customization: false\n', - } + "usr/lib/vmware-tools/plugins/vmsvc/libdeployPkgPlugin.so": "here", + "etc/cloud/cloud.cfg": "disable_vmware_customization: false\n", + }, }, - 'OVF': { - 'ds': 'OVF', - 'mocks': [ - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'sr0', 'TYPE': 'iso9660', 'LABEL': ''}, - {'DEVNAME': 'sr1', 'TYPE': 'iso9660', 'LABEL': 'ignoreme'}, - {'DEVNAME': 'vda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}]), - }, + "OVF": { + "ds": "OVF", + "mocks": [ + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + {"DEVNAME": "sr0", "TYPE": "iso9660", "LABEL": ""}, + { + "DEVNAME": "sr1", + "TYPE": "iso9660", + "LABEL": "ignoreme", + }, + { + "DEVNAME": "vda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + ] + ), + }, MOCK_VIRT_IS_VMWARE, ], - 'files': { - 'dev/sr0': 'pretend ovf iso has ' + OVF_MATCH_STRING + '\n', - 'sys/class/block/sr0/size': '2048\n', - } + "files": { + "dev/sr0": "pretend ovf iso has " + OVF_MATCH_STRING + "\n", + "sys/class/block/sr0/size": "2048\n", + }, }, - 'OVF-guestinfo': { - 'ds': 'OVF', - 'mocks': [ - {'name': 'ovf_vmware_transport_guestinfo', 'ret': 0, - 'out': '<?xml version="1.0" encoding="UTF-8"?>\n<Environment'}, + "OVF-guestinfo": { + "ds": "OVF", + "mocks": [ + { + "name": "ovf_vmware_transport_guestinfo", + "ret": 0, + "out": '<?xml version="1.0" encoding="UTF-8"?>\n<Environment', + }, MOCK_VIRT_IS_VMWARE, ], }, - 'ConfigDrive': { - 'ds': 'ConfigDrive', - 'mocks': [ - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'vda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vdb', 'TYPE': 'vfat', 'LABEL': 'config-2'}]) - }, + "ConfigDrive": { + "ds": "ConfigDrive", + "mocks": [ + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "vda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "vda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "vdb", + "TYPE": "vfat", + "LABEL": "config-2", + }, + ] + ), + }, ], }, - 'ConfigDriveUpper': { - 'ds': 'ConfigDrive', - 'mocks': [ - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'vda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vdb', 'TYPE': 'vfat', 'LABEL': 'CONFIG-2'}]) - }, + "ConfigDriveUpper": { + "ds": "ConfigDrive", + "mocks": [ + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "vda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "vda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "vdb", + "TYPE": "vfat", + "LABEL": "CONFIG-2", + }, + ] + ), + }, ], }, - 'ConfigDrive-seed': { - 'ds': 'ConfigDrive', - 'files': { - os.path.join(P_SEED_DIR, 'config_drive', 'openstack', - 'latest', 'meta_data.json'): 'md\n'}, + "ConfigDrive-seed": { + "ds": "ConfigDrive", + "files": { + os.path.join( + P_SEED_DIR, + "config_drive", + "openstack", + "latest", + "meta_data.json", + ): "md\n" + }, }, - 'RbxCloud': { - 'ds': 'RbxCloud', - 'mocks': [ - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'vda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vdb', 'TYPE': 'vfat', 'LABEL': 'CLOUDMD'}] - )}, + "RbxCloud": { + "ds": "RbxCloud", + "mocks": [ + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "vda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "vda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + }, + {"DEVNAME": "vdb", "TYPE": "vfat", "LABEL": "CLOUDMD"}, + ] + ), + }, ], }, - 'RbxCloudLower': { - 'ds': 'RbxCloud', - 'mocks': [ - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'vda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4()}, - {'DEVNAME': 'vdb', 'TYPE': 'vfat', 'LABEL': 'cloudmd'}] - )}, + "RbxCloudLower": { + "ds": "RbxCloud", + "mocks": [ + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "vda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "vda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + }, + {"DEVNAME": "vdb", "TYPE": "vfat", "LABEL": "cloudmd"}, + ] + ), + }, ], }, - 'Hetzner': { - 'ds': 'Hetzner', - 'files': {P_SYS_VENDOR: 'Hetzner\n'}, + "Hetzner": { + "ds": "Hetzner", + "files": {P_SYS_VENDOR: "Hetzner\n"}, }, - 'Hetzner-kenv': { - 'ds': 'Hetzner', - 'mocks': [ + "Hetzner-kenv": { + "ds": "Hetzner", + "mocks": [ MOCK_UNAME_IS_FREEBSD, - {'name': 'get_kenv_field', 'ret': 0, 'RET': 'Hetzner'} + {"name": "get_kenv_field", "ret": 0, "RET": "Hetzner"}, ], }, - 'Hetzner-dmidecode': { - 'ds': 'Hetzner', - 'mocks': [ - {'name': 'dmi_decode', 'ret': 0, 'RET': 'Hetzner'} - ], + "Hetzner-dmidecode": { + "ds": "Hetzner", + "mocks": [{"name": "dmi_decode", "ret": 0, "RET": "Hetzner"}], }, - 'IBMCloud-metadata': { - 'ds': 'IBMCloud', - 'mocks': [ + "IBMCloud-metadata": { + "ds": "IBMCloud", + "mocks": [ MOCK_VIRT_IS_XEN, - {'name': 'is_ibm_provisioning', 'ret': shell_false}, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'xvda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}, - {'DEVNAME': 'xvda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4()}, - {'DEVNAME': 'xvdb', 'TYPE': 'vfat', 'LABEL': 'METADATA'}]), - }, + {"name": "is_ibm_provisioning", "ret": shell_false}, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "xvda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "xvda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "xvdb", + "TYPE": "vfat", + "LABEL": "METADATA", + }, + ] + ), + }, ], }, - 'IBMCloud-config-2': { - 'ds': 'IBMCloud', - 'mocks': [ + "IBMCloud-config-2": { + "ds": "IBMCloud", + "mocks": [ MOCK_VIRT_IS_XEN, - {'name': 'is_ibm_provisioning', 'ret': shell_false}, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'xvda1', 'TYPE': 'ext3', 'PARTUUID': uuid4(), - 'UUID': uuid4(), 'LABEL': 'cloudimg-bootfs'}, - {'DEVNAME': 'xvdb', 'TYPE': 'vfat', 'LABEL': 'config-2', - 'UUID': ds_ibm.IBM_CONFIG_UUID}, - {'DEVNAME': 'xvda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4(), - 'UUID': uuid4()}, - ]), - }, + {"name": "is_ibm_provisioning", "ret": shell_false}, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "xvda1", + "TYPE": "ext3", + "PARTUUID": uuid4(), + "UUID": uuid4(), + "LABEL": "cloudimg-bootfs", + }, + { + "DEVNAME": "xvdb", + "TYPE": "vfat", + "LABEL": "config-2", + "UUID": ds_ibm.IBM_CONFIG_UUID, + }, + { + "DEVNAME": "xvda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + "UUID": uuid4(), + }, + ] + ), + }, ], }, - 'IBMCloud-nodisks': { - 'ds': 'IBMCloud', - 'mocks': [ + "IBMCloud-nodisks": { + "ds": "IBMCloud", + "mocks": [ MOCK_VIRT_IS_XEN, - {'name': 'is_ibm_provisioning', 'ret': shell_false}, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'xvda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()}, - {'DEVNAME': 'xvda2', 'TYPE': 'ext4', - 'LABEL': 'cloudimg-rootfs', 'PARTUUID': uuid4()}]), - }, + {"name": "is_ibm_provisioning", "ret": shell_false}, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "xvda1", + "TYPE": "vfat", + "PARTUUID": uuid4(), + }, + { + "DEVNAME": "xvda2", + "TYPE": "ext4", + "LABEL": "cloudimg-rootfs", + "PARTUUID": uuid4(), + }, + ] + ), + }, ], }, - 'Oracle': { - 'ds': 'Oracle', - 'files': { - P_CHASSIS_ASSET_TAG: ds_oracle.CHASSIS_ASSET_TAG + '\n', - } + "Oracle": { + "ds": "Oracle", + "files": { + P_CHASSIS_ASSET_TAG: ds_oracle.CHASSIS_ASSET_TAG + "\n", + }, }, - 'SmartOS-bhyve': { - 'ds': 'SmartOS', - 'mocks': [ + "SmartOS-bhyve": { + "ds": "SmartOS", + "mocks": [ MOCK_VIRT_IS_VM_OTHER, - {'name': 'blkid', 'ret': 0, - 'out': blkid_out( - [{'DEVNAME': 'vda1', 'TYPE': 'ext4', - 'PARTUUID': '49ec635a-01'}, - {'DEVNAME': 'vda2', 'TYPE': 'swap', - 'LABEL': 'cloudimg-swap', 'PARTUUID': '49ec635a-02'}]), - }, + { + "name": "blkid", + "ret": 0, + "out": blkid_out( + [ + { + "DEVNAME": "vda1", + "TYPE": "ext4", + "PARTUUID": "49ec635a-01", + }, + { + "DEVNAME": "vda2", + "TYPE": "swap", + "LABEL": "cloudimg-swap", + "PARTUUID": "49ec635a-02", + }, + ] + ), + }, ], - 'files': {P_PRODUCT_NAME: 'SmartDC HVM\n'}, + "files": {P_PRODUCT_NAME: "SmartDC HVM\n"}, }, - 'SmartOS-lxbrand': { - 'ds': 'SmartOS', - 'mocks': [ + "SmartOS-lxbrand": { + "ds": "SmartOS", + "mocks": [ MOCK_VIRT_IS_CONTAINER_OTHER, - {'name': 'uname', 'ret': 0, - 'out': ("Linux d43da87a-daca-60e8-e6d4-d2ed372662a3 4.3.0 " - "BrandZ virtual linux x86_64 GNU/Linux")}, - {'name': 'blkid', 'ret': 2, 'out': ''}, + { + "name": "uname", + "ret": 0, + "out": ( + "Linux d43da87a-daca-60e8-e6d4-d2ed372662a3 4.3.0 " + "BrandZ virtual linux x86_64 GNU/Linux" + ), + }, + {"name": "blkid", "ret": 2, "out": ""}, + ], + "files": {ds_smartos.METADATA_SOCKFILE: "would be a socket\n"}, + }, + "Ec2-ZStack": { + "ds": "Ec2", + "files": {P_CHASSIS_ASSET_TAG: "123456.zstack.io\n"}, + }, + "Ec2-E24Cloud": { + "ds": "Ec2", + "files": {P_SYS_VENDOR: "e24cloud\n"}, + }, + "Ec2-E24Cloud-negative": { + "ds": "Ec2", + "files": {P_SYS_VENDOR: "e24cloudyday\n"}, + }, + "VMware-NoValidTransports": { + "ds": "VMware", + "mocks": [ + MOCK_VIRT_IS_VMWARE, + ], + }, + "VMware-EnvVar-NoData": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_envvar_vmx_guestinfo", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_metadata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_vendordata", + "ret": 1, + }, + MOCK_VIRT_IS_VMWARE, ], - 'files': {ds_smartos.METADATA_SOCKFILE: 'would be a socket\n'}, }, - 'Ec2-ZStack': { - 'ds': 'Ec2', - 'files': {P_CHASSIS_ASSET_TAG: '123456.zstack.io\n'}, + "VMware-EnvVar-NoVirtID": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_envvar_vmx_guestinfo", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_metadata", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_vendordata", + "ret": 1, + }, + ], + }, + "VMware-EnvVar-Metadata": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_envvar_vmx_guestinfo", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_metadata", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_vendordata", + "ret": 1, + }, + MOCK_VIRT_IS_VMWARE, + ], + }, + "VMware-EnvVar-Userdata": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_envvar_vmx_guestinfo", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_metadata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_userdata", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_vendordata", + "ret": 1, + }, + MOCK_VIRT_IS_VMWARE, + ], + }, + "VMware-EnvVar-Vendordata": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_envvar_vmx_guestinfo", + "ret": 0, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_metadata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_has_envvar_vmx_guestinfo_vendordata", + "ret": 0, + }, + MOCK_VIRT_IS_VMWARE, + ], }, - 'Ec2-E24Cloud': { - 'ds': 'Ec2', - 'files': {P_SYS_VENDOR: 'e24cloud\n'}, + "VMware-GuestInfo-NoData": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_rpctool", + "ret": 0, + "out": "/usr/bin/vmware-rpctool", + }, + { + "name": "vmware_rpctool_guestinfo_metadata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_vendordata", + "ret": 1, + }, + MOCK_VIRT_IS_VMWARE, + ], + }, + "VMware-GuestInfo-NoVirtID": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_rpctool", + "ret": 0, + "out": "/usr/bin/vmware-rpctool", + }, + { + "name": "vmware_rpctool_guestinfo_metadata", + "ret": 0, + "out": "---", + }, + { + "name": "vmware_rpctool_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_vendordata", + "ret": 1, + }, + ], + }, + "VMware-GuestInfo-Metadata": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_rpctool", + "ret": 0, + "out": "/usr/bin/vmware-rpctool", + }, + { + "name": "vmware_rpctool_guestinfo_metadata", + "ret": 0, + "out": "---", + }, + { + "name": "vmware_rpctool_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_vendordata", + "ret": 1, + }, + MOCK_VIRT_IS_VMWARE, + ], + }, + "VMware-GuestInfo-Userdata": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_rpctool", + "ret": 0, + "out": "/usr/bin/vmware-rpctool", + }, + { + "name": "vmware_rpctool_guestinfo_metadata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_userdata", + "ret": 0, + "out": "---", + }, + { + "name": "vmware_rpctool_guestinfo_vendordata", + "ret": 1, + }, + MOCK_VIRT_IS_VMWARE, + ], + }, + "VMware-GuestInfo-Vendordata": { + "ds": "VMware", + "mocks": [ + { + "name": "vmware_has_rpctool", + "ret": 0, + "out": "/usr/bin/vmware-rpctool", + }, + { + "name": "vmware_rpctool_guestinfo_metadata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_userdata", + "ret": 1, + }, + { + "name": "vmware_rpctool_guestinfo_vendordata", + "ret": 0, + "out": "---", + }, + MOCK_VIRT_IS_VMWARE, + ], }, - 'Ec2-E24Cloud-negative': { - 'ds': 'Ec2', - 'files': {P_SYS_VENDOR: 'e24cloudyday\n'}, - } } # vi: ts=4 expandtab |