81ba992e3e
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=205
225 lines
7.8 KiB
Diff
225 lines
7.8 KiB
Diff
From 1434a128559df8183c032af722dc3d187bda148a Mon Sep 17 00:00:00 2001
|
|
From: Victor Zhestkov <Victor.Zhestkov@suse.com>
|
|
Date: Thu, 1 Sep 2022 14:46:24 +0300
|
|
Subject: [PATCH] Add Amazon EC2 detection for virtual grains
|
|
(bsc#1195624)
|
|
|
|
* Add ignore_retcode to quiet run functions
|
|
|
|
* Implement Amazon EC2 detection for virtual grains
|
|
|
|
* Add test for virtual grain detection of Amazon EC2
|
|
|
|
* Also detect the product of Amazon EC2 instance
|
|
|
|
* Add changelog entry
|
|
---
|
|
changelog/62539.added | 1 +
|
|
salt/grains/core.py | 18 ++++
|
|
salt/modules/cmdmod.py | 4 +
|
|
tests/pytests/unit/grains/test_core.py | 117 +++++++++++++++++++++++++
|
|
4 files changed, 140 insertions(+)
|
|
create mode 100644 changelog/62539.added
|
|
|
|
diff --git a/changelog/62539.added b/changelog/62539.added
|
|
new file mode 100644
|
|
index 0000000000..5f402d61c2
|
|
--- /dev/null
|
|
+++ b/changelog/62539.added
|
|
@@ -0,0 +1 @@
|
|
+Implementation of Amazon EC2 instance detection and setting `virtual_subtype` grain accordingly including the product if possible to identify.
|
|
diff --git a/salt/grains/core.py b/salt/grains/core.py
|
|
index 23d8b8ea42..047c33ffd3 100644
|
|
--- a/salt/grains/core.py
|
|
+++ b/salt/grains/core.py
|
|
@@ -1171,6 +1171,24 @@ def _virtual(osdata):
|
|
if grains.get("virtual_subtype") and grains["virtual"] == "physical":
|
|
grains["virtual"] = "virtual"
|
|
|
|
+ # Try to detect if the instance is running on Amazon EC2
|
|
+ if grains["virtual"] in ("qemu", "kvm", "xen"):
|
|
+ dmidecode = salt.utils.path.which("dmidecode")
|
|
+ if dmidecode:
|
|
+ ret = __salt__["cmd.run_all"](
|
|
+ [dmidecode, "-t", "system"], ignore_retcode=True
|
|
+ )
|
|
+ output = ret["stdout"]
|
|
+ if "Manufacturer: Amazon EC2" in output:
|
|
+ grains["virtual_subtype"] = "Amazon EC2"
|
|
+ product = re.match(
|
|
+ r".*Product Name: ([^\r\n]*).*", output, flags=re.DOTALL
|
|
+ )
|
|
+ if product:
|
|
+ grains["virtual_subtype"] = "Amazon EC2 ({})".format(product[1])
|
|
+ elif re.match(r".*Version: [^\r\n]+\.amazon.*", output, flags=re.DOTALL):
|
|
+ grains["virtual_subtype"] = "Amazon EC2"
|
|
+
|
|
for command in failed_commands:
|
|
log.info(
|
|
"Although '%s' was found in path, the current user "
|
|
diff --git a/salt/modules/cmdmod.py b/salt/modules/cmdmod.py
|
|
index a26220718a..07b6e100d2 100644
|
|
--- a/salt/modules/cmdmod.py
|
|
+++ b/salt/modules/cmdmod.py
|
|
@@ -932,6 +932,7 @@ def _run_quiet(
|
|
success_retcodes=None,
|
|
success_stdout=None,
|
|
success_stderr=None,
|
|
+ ignore_retcode=None,
|
|
):
|
|
"""
|
|
Helper for running commands quietly for minion startup
|
|
@@ -958,6 +959,7 @@ def _run_quiet(
|
|
success_retcodes=success_retcodes,
|
|
success_stdout=success_stdout,
|
|
success_stderr=success_stderr,
|
|
+ ignore_retcode=ignore_retcode,
|
|
)["stdout"]
|
|
|
|
|
|
@@ -980,6 +982,7 @@ def _run_all_quiet(
|
|
success_retcodes=None,
|
|
success_stdout=None,
|
|
success_stderr=None,
|
|
+ ignore_retcode=None,
|
|
):
|
|
|
|
"""
|
|
@@ -1012,6 +1015,7 @@ def _run_all_quiet(
|
|
success_retcodes=success_retcodes,
|
|
success_stdout=success_stdout,
|
|
success_stderr=success_stderr,
|
|
+ ignore_retcode=ignore_retcode,
|
|
)
|
|
|
|
|
|
diff --git a/tests/pytests/unit/grains/test_core.py b/tests/pytests/unit/grains/test_core.py
|
|
index 5c43dbdb09..7c4ea1f17f 100644
|
|
--- a/tests/pytests/unit/grains/test_core.py
|
|
+++ b/tests/pytests/unit/grains/test_core.py
|
|
@@ -2823,3 +2823,120 @@ def test_get_server_id():
|
|
|
|
with patch.dict(core.__opts__, {"id": "otherid"}):
|
|
assert core.get_server_id() != expected
|
|
+
|
|
+
|
|
+@pytest.mark.skip_unless_on_linux
|
|
+def test_virtual_set_virtual_ec2():
|
|
+ osdata = {}
|
|
+
|
|
+ (
|
|
+ osdata["kernel"],
|
|
+ osdata["nodename"],
|
|
+ osdata["kernelrelease"],
|
|
+ osdata["kernelversion"],
|
|
+ osdata["cpuarch"],
|
|
+ _,
|
|
+ ) = platform.uname()
|
|
+
|
|
+ which_mock = MagicMock(
|
|
+ side_effect=[
|
|
+ # Check with virt-what
|
|
+ "/usr/sbin/virt-what",
|
|
+ "/usr/sbin/virt-what",
|
|
+ None,
|
|
+ "/usr/sbin/dmidecode",
|
|
+ # Check with systemd-detect-virt
|
|
+ None,
|
|
+ "/usr/bin/systemd-detect-virt",
|
|
+ None,
|
|
+ "/usr/sbin/dmidecode",
|
|
+ # Check with systemd-detect-virt when no dmidecode available
|
|
+ None,
|
|
+ "/usr/bin/systemd-detect-virt",
|
|
+ None,
|
|
+ None,
|
|
+ ]
|
|
+ )
|
|
+ cmd_run_all_mock = MagicMock(
|
|
+ side_effect=[
|
|
+ # Check with virt-what
|
|
+ {"retcode": 0, "stderr": "", "stdout": "xen"},
|
|
+ {
|
|
+ "retcode": 0,
|
|
+ "stderr": "",
|
|
+ "stdout": "\n".join(
|
|
+ [
|
|
+ "dmidecode 3.2",
|
|
+ "Getting SMBIOS data from sysfs.",
|
|
+ "SMBIOS 2.7 present.",
|
|
+ "",
|
|
+ "Handle 0x0100, DMI type 1, 27 bytes",
|
|
+ "System Information",
|
|
+ " Manufacturer: Xen",
|
|
+ " Product Name: HVM domU",
|
|
+ " Version: 4.11.amazon",
|
|
+ " Serial Number: 12345678-abcd-4321-dcba-0123456789ab",
|
|
+ " UUID: 01234567-dcba-1234-abcd-abcdef012345",
|
|
+ " Wake-up Type: Power Switch",
|
|
+ " SKU Number: Not Specified",
|
|
+ " Family: Not Specified",
|
|
+ "",
|
|
+ "Handle 0x2000, DMI type 32, 11 bytes",
|
|
+ "System Boot Information",
|
|
+ " Status: No errors detected",
|
|
+ ]
|
|
+ ),
|
|
+ },
|
|
+ # Check with systemd-detect-virt
|
|
+ {"retcode": 0, "stderr": "", "stdout": "kvm"},
|
|
+ {
|
|
+ "retcode": 0,
|
|
+ "stderr": "",
|
|
+ "stdout": "\n".join(
|
|
+ [
|
|
+ "dmidecode 3.2",
|
|
+ "Getting SMBIOS data from sysfs.",
|
|
+ "SMBIOS 2.7 present.",
|
|
+ "",
|
|
+ "Handle 0x0001, DMI type 1, 27 bytes",
|
|
+ "System Information",
|
|
+ " Manufacturer: Amazon EC2",
|
|
+ " Product Name: m5.large",
|
|
+ " Version: Not Specified",
|
|
+ " Serial Number: 01234567-dcba-1234-abcd-abcdef012345",
|
|
+ " UUID: 12345678-abcd-4321-dcba-0123456789ab",
|
|
+ " Wake-up Type: Power Switch",
|
|
+ " SKU Number: Not Specified",
|
|
+ " Family: Not Specified",
|
|
+ ]
|
|
+ ),
|
|
+ },
|
|
+ # Check with systemd-detect-virt when no dmidecode available
|
|
+ {"retcode": 0, "stderr": "", "stdout": "kvm"},
|
|
+ ]
|
|
+ )
|
|
+
|
|
+ with patch("salt.utils.path.which", which_mock), patch.dict(
|
|
+ core.__salt__,
|
|
+ {
|
|
+ "cmd.run": salt.modules.cmdmod.run,
|
|
+ "cmd.run_all": cmd_run_all_mock,
|
|
+ "cmd.retcode": salt.modules.cmdmod.retcode,
|
|
+ "smbios.get": salt.modules.smbios.get,
|
|
+ },
|
|
+ ):
|
|
+
|
|
+ virtual_grains = core._virtual(osdata.copy())
|
|
+
|
|
+ assert virtual_grains["virtual"] == "xen"
|
|
+ assert virtual_grains["virtual_subtype"] == "Amazon EC2"
|
|
+
|
|
+ virtual_grains = core._virtual(osdata.copy())
|
|
+
|
|
+ assert virtual_grains["virtual"] == "kvm"
|
|
+ assert virtual_grains["virtual_subtype"] == "Amazon EC2 (m5.large)"
|
|
+
|
|
+ virtual_grains = core._virtual(osdata.copy())
|
|
+
|
|
+ assert virtual_grains["virtual"] == "kvm"
|
|
+ assert "virtual_subtype" not in virtual_grains
|
|
--
|
|
2.37.3
|
|
|
|
|