From ec944cb3c76ed7b148d22e7285c5f3acac03a5ef Mon Sep 17 00:00:00 2001 From: Cristian Matiut Date: Tue, 28 Apr 2026 19:15:52 +0000 Subject: [PATCH] Remove cloud_etc_hosts module when DHCP is disabled --- coriolis/osmorphing/base.py | 15 ++++++++++++++ coriolis/tests/osmorphing/test_base.py | 27 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/coriolis/osmorphing/base.py b/coriolis/osmorphing/base.py index c3ccc74a..1c3be879 100644 --- a/coriolis/osmorphing/base.py +++ b/coriolis/osmorphing/base.py @@ -429,6 +429,20 @@ def _ensure_cloud_init_not_disabled(self): def _reset_cloud_init_run(self): self._exec_cmd_chroot("cloud-init clean --logs") + def _disable_cloud_manage_etc_hosts(self): + cloud_cfg_path = 'etc/cloud/cloud.cfg' + if not self._test_path(cloud_cfg_path): + return + cloud_cfg_content = self._read_file_sudo(cloud_cfg_path) + cloud_cfg = yaml.load(cloud_cfg_content, Loader=yaml.SafeLoader) + modules = cloud_cfg.get('cloud_init_modules', []) + + if 'update_etc_hosts' in modules: + modules = [m for m in modules if m != 'update_etc_hosts'] + cloud_cfg['cloud_init_modules'] = modules + new_cloud_cfg = yaml.dump(cloud_cfg, Dumper=yaml.SafeDumper) + self._write_file_sudo(cloud_cfg_path, new_cloud_cfg) + def _get_default_cloud_user(self): cloud_cfg_path = 'etc/cloud/cloud.cfg' if not self._test_path(cloud_cfg_path): @@ -468,6 +482,7 @@ def _configure_cloud_init(self): if not self._osmorphing_parameters.get('set_dhcp', True): disabled_network_config = {"network": {"config": "disabled"}} cloud_cfg_mods.update(disabled_network_config) + self._disable_cloud_manage_etc_hosts() self._write_cloud_init_mods_config(cloud_cfg_mods) diff --git a/coriolis/tests/osmorphing/test_base.py b/coriolis/tests/osmorphing/test_base.py index 3ab3d082..42b6f924 100644 --- a/coriolis/tests/osmorphing/test_base.py +++ b/coriolis/tests/osmorphing/test_base.py @@ -661,6 +661,30 @@ def test__reset_cloud_init_run(self, mock__exec_cmd_chroot): mock__exec_cmd_chroot.assert_called_once_with( "cloud-init clean --logs") + @ddt.data( + (False, None, None), + (True, "cloud_init_modules:\n - set_hostname\n - update_etc_hosts\n", + "cloud_init_modules:\n- set_hostname\n"), + (True, "cloud_config_modules:\n - update_etc_hosts\n", None) + ) + @ddt.unpack + @mock.patch.object(base.BaseLinuxOSMorphingTools, "_write_file_sudo") + @mock.patch.object(base.BaseLinuxOSMorphingTools, "_read_file_sudo") + @mock.patch.object(base.BaseLinuxOSMorphingTools, "_test_path") + def test__disable_cloud_manage_etc_hosts( + self, test_path_result, file_content, expected_file_content, + mock__test_path, mock__read_file_sudo, mock__write_file_sudo): + mock__test_path.return_value = test_path_result + mock__read_file_sudo.return_value = file_content + + self.os_morphing_tools._disable_cloud_manage_etc_hosts() + + if expected_file_content: + mock__write_file_sudo.assert_called_once_with( + mock.ANY, expected_file_content) + else: + mock__write_file_sudo.assert_not_called() + @ddt.data( (False, None, base.DEFAULT_CLOUD_USER), (True, "system_info:\n default_user:\n name: mock_user\n", @@ -740,6 +764,8 @@ def test__create_cloudinit_user_already_exists( @mock.patch.object(base.BaseLinuxOSMorphingTools, '_enable_systemd_service') @mock.patch.object(base.BaseLinuxOSMorphingTools, '_has_systemd_chroot') + @mock.patch.object(base.BaseLinuxOSMorphingTools, + '_disable_cloud_manage_etc_hosts') @mock.patch.object(base.BaseLinuxOSMorphingTools, '_write_cloud_init_mods_config') @mock.patch.object(base.BaseLinuxOSMorphingTools, '_create_cloudinit_user') @@ -755,6 +781,7 @@ def test__configure_cloud_init( mock__disable_installer_cloud_config, mock__ensure_cloud_init_not_disabled, mock__reset_cloud_init_run, mock__create_cloudinit_user, mock__write_cloud_init_mods_config, + mock__disable_cloud_manage_etc_hosts, mock__has_systemd_chroot, mock__enable_systemd_service ): mock_get_packages.return_value = returned_packages