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:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user