Disable ipmi monitoring without cloud-init tarball

The IPMI sel event monitoring takes time to query the sel event from
the BMC controller. It is not necessary to monitor the sel event in
the case if no additional cloud-init configuration offered. Monitoring
the sel event by default may cause additional time consumption not
expected.

This commit checks if the cloud-init config tarball existed in
dc-vault, disables the IPMI monitoring if it was not specified in
the subcloud's install values.

Test plan:
1. Verified the tasks for monitoring the IPMI events are skipped if no
   cloud-init config and ipmi_sel_event_monitoring was not specified
   in the install values.
2. Verified the tasks for monitoring the IPMI events are not skipped
   if cloud-init config are appended and ipmi_sel_event_monitoring was
   not specified in the install values.
3. Verified the tasks for monitoring the IPMI events are not skipped
   if cloud-init config are not appended and ipmi_sel_event_monitoring
   was True in the install values.

Closes-bug: 2122444
Signed-off-by: Jiang, Yuxing <Yuxing.Jiang@windriver.com>
Change-Id: Ia106f5581475bd78294a2fa327c1828019da90eb
This commit is contained in:
Jiang, Yuxing
2025-09-09 13:28:55 -04:00
parent 1f07f9015b
commit 14fdd3167c
2 changed files with 137 additions and 14 deletions

View File

@@ -4,7 +4,6 @@
#
import crypt
import json
import os
import tarfile
import tempfile
@@ -131,7 +130,7 @@ class SubcloudEnrollmentInit(object):
return True
def create_enroll_override_file(self, override_path, payload):
def create_enroll_override_file(self, override_path, payload, cloud_init_tarball):
enroll_override_file = os.path.join(override_path, "enroll_overrides.yml")
with open(enroll_override_file, "w") as f_out_override_file:
@@ -144,9 +143,20 @@ class SubcloudEnrollmentInit(object):
enroll_overrides = payload["install_values"].get("enroll_overrides", {})
# If no custom cloud-init config is provided, disable IPMI SEL event
# monitoring by default.
if (
cloud_init_tarball is None
and "ipmi_sel_event_monitoring" not in enroll_overrides
):
f_out_override_file.write("ipmi_sel_event_monitoring: false\n")
if enroll_overrides:
for k, v in enroll_overrides.items():
f_out_override_file.write(f"{k}: {json.dumps(v)}")
# Properly format boolean values with yaml.dump
f_out_override_file.write(
f"{k}: {yaml.dump(v, default_flow_style=False).strip()}\n"
)
def _build_seed_user_config(self, path, iso_values):
if not os.path.isdir(path):
@@ -245,7 +255,17 @@ class SubcloudEnrollmentInit(object):
return True
def _generate_seed_iso(self, payload):
def _get_cloud_init_config(self):
cloud_init_tarball_name = f"{self.name}_{consts.CLOUD_INIT_CONFIG}.tar"
cloud_init_tarball = os.path.join(
consts.ANSIBLE_OVERRIDES_PATH, cloud_init_tarball_name
)
if os.path.isfile(cloud_init_tarball):
LOG.info(f"Detected {cloud_init_tarball} tarball")
return cloud_init_tarball
return None
def _generate_seed_iso(self, payload, cloud_init_tarball):
LOG.info(f"Preparing seed iso generation for {self.name}")
with tempfile.TemporaryDirectory(prefix="seed_") as temp_seed_data_dir:
@@ -253,12 +273,7 @@ class SubcloudEnrollmentInit(object):
# into iso_values. For now, pass in payload.
try:
# Untar cloud_init_config if present
cloud_init_tarball_name = f"{self.name}_{consts.CLOUD_INIT_CONFIG}.tar"
cloud_init_tarball = os.path.join(
consts.ANSIBLE_OVERRIDES_PATH, cloud_init_tarball_name
)
if os.path.isfile(cloud_init_tarball):
LOG.info(f"Detected {cloud_init_tarball} tarball")
if cloud_init_tarball:
with tarfile.open(cloud_init_tarball, "r") as tar:
tar.extractall(path=temp_seed_data_dir)
LOG.info(
@@ -355,7 +370,9 @@ class SubcloudEnrollmentInit(object):
)
os.remove(self.seed_iso_path)
self._generate_seed_iso(payload)
cloud_init_tarball = self._get_cloud_init_config()
self._generate_seed_iso(payload, cloud_init_tarball)
# get the boot image url for bmc
image_base_url = SubcloudInstall.get_image_base_url(
@@ -377,7 +394,7 @@ class SubcloudEnrollmentInit(object):
SubcloudInstall.create_rvmc_config_file(override_path, bmc_values)
self.create_enroll_override_file(override_path, payload)
self.create_enroll_override_file(override_path, payload, cloud_init_tarball)
return True

View File

@@ -5019,7 +5019,7 @@ class TestSubcloudEnrollment(BaseTestSubcloudManager):
@mock.patch("os.chmod")
def test_generate_seed_iso(self, mock_chmod):
with mock.patch("os.path.isdir", side_effect=self.patched_isdir):
self.assertTrue(self.enroll_init._generate_seed_iso(self.iso_values))
self.assertTrue(self.enroll_init._generate_seed_iso(self.iso_values, None))
self.mock_log_subcloud_enrollment.info.assert_any_call(
f"Preparing seed iso generation for {self.subcloud_name}"
@@ -5083,7 +5083,7 @@ class TestSubcloudEnrollment(BaseTestSubcloudManager):
self.mock_os_makedirs.assert_called_once()
self.assertEqual(self.mock_os_makedirs.call_args.args[0], self.iso_dir)
mock_generate_seed_iso.assert_called_once_with(self.iso_values)
mock_generate_seed_iso.assert_called_once_with(self.iso_values, None)
# create rvmc config file
self.mock_builtins_open.assert_any_call(
@@ -5146,3 +5146,109 @@ class TestSubcloudEnrollment(BaseTestSubcloudManager):
)
expected_log_file = f"{subcloud_log_base_path}_playbook_output.log"
self.mock_ansible_run_playbook.assert_called_with(expected_log_file, mock.ANY)
class TestEnrollOverrides(BaseTestSubcloudManager):
"""Test class for testing enroll override file creation methods."""
def setUp(self):
super().setUp()
self.override_path = "/test/override/path"
self.rel_version = "25.09"
self.subcloud_name = "test_subcloud"
self.enroll_init = subcloud_enrollment.SubcloudEnrollmentInit(
self.subcloud_name
)
self.fake_install_values = copy.copy(fake_subcloud.FAKE_SUBCLOUD_INSTALL_VALUES)
self.iso_values = {
"software_version": self.rel_version,
"external_oam_floating_address": "10.10.10.2",
"install_values": self.fake_install_values,
}
# Base variables that can be modified in individual test cases
self.enroll_overrides = {"key2": "value2", "key3": "value3"}
self.expected_content = [
"enroll_reconfigured_oam: 10.10.10.2",
"key2: value2",
"key3: value3",
]
def _run_test_scenario(
self,
enroll_overrides,
cloud_init_tarball,
expected_content,
unexpected_content=None,
):
self.mock_builtins_open.side_effect = mock.mock_open()
test_iso_values = self.iso_values.copy()
if enroll_overrides:
test_iso_values["install_values"]["enroll_overrides"] = enroll_overrides
self.enroll_init.create_enroll_override_file(
self.override_path, test_iso_values, cloud_init_tarball
)
expected_file_path = f"{self.override_path}/enroll_overrides.yml"
self.mock_builtins_open.assert_called_with(expected_file_path, "w")
write_calls = self.mock_builtins_open().write.call_args_list
content = "".join([call[0][0] for call in write_calls])
for expected in expected_content:
self.assertIn(expected, content)
if unexpected_content:
for unexpected in unexpected_content:
self.assertNotIn(unexpected, content)
def test_create_enroll_override_file_without_cloud_tarball_and_ipmi_monitoring(
self,
):
expected_content = self.expected_content.copy()
expected_content.append("ipmi_sel_event_monitoring: false")
self._run_test_scenario(self.enroll_overrides, None, expected_content)
def test_create_enroll_override_file_no_cloud_tarball_with_ipmi_monitoring(
self,
):
self.enroll_overrides["ipmi_sel_event_monitoring"] = True
expected_content = self.expected_content.copy()
expected_content.append("ipmi_sel_event_monitoring: true")
self._run_test_scenario(self.enroll_overrides, None, expected_content)
def test_create_enroll_override_file_no_cloud_tarball_ipmi_false(
self,
):
self.enroll_overrides["ipmi_sel_event_monitoring"] = False
expected_content = self.expected_content.copy()
expected_content.append("ipmi_sel_event_monitoring: false")
self._run_test_scenario(self.enroll_overrides, None, expected_content)
def test_create_enroll_override_file_with_cloud_tarball_and_ipmi_monitoring(
self,
):
self.enroll_overrides["ipmi_sel_event_monitoring"] = True
expected_content = self.expected_content.copy()
expected_content.append("ipmi_sel_event_monitoring: true")
self._run_test_scenario(
self.enroll_overrides, "/path/to/cloud_init.tar", expected_content
)
def test_create_enroll_override_file_with_cloud_tarball_no_ipmi_override(self):
unexpected_content = ["ipmi_sel_event_monitoring"]
self._run_test_scenario(
self.enroll_overrides,
"/path/to/cloud_init.tar",
self.expected_content,
unexpected_content,
)
def test_create_enroll_override_file_with_cloud_init_tarball_ipmi_false(self):
self.enroll_overrides["ipmi_sel_event_monitoring"] = False
expected_content = self.expected_content.copy()
expected_content.append("ipmi_sel_event_monitoring: false")
self._run_test_scenario(
self.enroll_overrides, "/path/to/cloud_init.tar", expected_content
)