From 220f13f537cba50f0fb575b0e3b5c39c85e8a0b4 Mon Sep 17 00:00:00 2001 From: Gregory Thiemonge Date: Thu, 27 Jan 2022 15:19:00 +0100 Subject: [PATCH] Restart rsyslog from cloud-init Octavia uploads a rsyslog configuration file using cloud-init but doesn't ensure that rsyslog is restarted. In some cases (CentOS 9 Stream), rsyslog is started before cloud-init and doesn't use the provided configuration file. This commit ensures that rsyslog is restarted by cloud-init. Change-Id: I550c7d2563a2d3ada07e2162383f59f104bcbbd5 (cherry picked from commit cbffae6eb684629a19844b5f2f4b7523b77a725e) --- .../templates/user_data_config_drive.template | 5 +++ .../worker/v2/tasks/compute_tasks.py | 6 +-- .../common/jinja/test_user_data_jinja_cfg.py | 18 +++++--- .../worker/v2/tasks/test_compute_tasks.py | 41 ++++++++++++------- ...g-config-is-reloaded-b4a25a98b661d0f1.yaml | 6 +++ 5 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 releasenotes/notes/ensure-rsyslog-config-is-reloaded-b4a25a98b661d0f1.yaml diff --git a/octavia/common/jinja/templates/user_data_config_drive.template b/octavia/common/jinja/templates/user_data_config_drive.template index 4635c89438..612f54ba07 100644 --- a/octavia/common/jinja/templates/user_data_config_drive.template +++ b/octavia/common/jinja/templates/user_data_config_drive.template @@ -22,13 +22,18 @@ # # Example: # {'/root/path/to/file.cfg': 'I'm a file, write things in me'} +{% if user_data -%} write_files: {%- for key, value in user_data.items() %} - path: {{ key }} content: | {{ value|indent(8) }} {%- endfor -%} +{%- endif -%} {# restart agent now that configurations are in place #} runcmd: +- systemctl restart rsyslog +{% if user_data -%} - service amphora-agent restart +{%- endif %} diff --git a/octavia/controller/worker/v2/tasks/compute_tasks.py b/octavia/controller/worker/v2/tasks/compute_tasks.py index 572bafd7e8..d1f4b3726f 100644 --- a/octavia/controller/worker/v2/tasks/compute_tasks.py +++ b/octavia/controller/worker/v2/tasks/compute_tasks.py @@ -107,10 +107,10 @@ class ComputeCreate(BaseComputeTask): config_drive_files['/etc/rsyslog.d/10-rsyslog.conf'] = ( logging_cfg.build_logging_config()) + udtemplater = user_data_jinja_cfg.UserDataJinjaCfg() + user_data = udtemplater.build_user_data_config( + config_drive_files if user_data_config_drive else {}) if user_data_config_drive: - udtemplater = user_data_jinja_cfg.UserDataJinjaCfg() - user_data = udtemplater.build_user_data_config( - config_drive_files) config_drive_files = None compute_id = self.compute.build( diff --git a/octavia/tests/unit/common/jinja/test_user_data_jinja_cfg.py b/octavia/tests/unit/common/jinja/test_user_data_jinja_cfg.py index c3860f297c..4504d4c545 100644 --- a/octavia/tests/unit/common/jinja/test_user_data_jinja_cfg.py +++ b/octavia/tests/unit/common/jinja/test_user_data_jinja_cfg.py @@ -36,10 +36,11 @@ BASE_CFG = ('#cloud-config\n' '#\n' '# Example:\n' '# {\'/root/path/to/file.cfg\': \'I\'m a file, ' - 'write things in me\'}\n' - 'write_files:\n') + 'write things in me\'}\n') +WRITE_FILES_CFG = ('write_files:\n') RUN_CMD = ('runcmd:\n' - '- service amphora-agent restart') + '- systemctl restart rsyslog\n') +WRITE_FILES_CMD = ('- service amphora-agent restart') class TestUserDataJinjaCfg(base.TestCase): @@ -48,8 +49,15 @@ class TestUserDataJinjaCfg(base.TestCase): def test_build_user_data_config(self): udc = user_data_jinja_cfg.UserDataJinjaCfg() - expected_config = (BASE_CFG + + expected_config = (BASE_CFG + WRITE_FILES_CFG + '- path: /test/config/path\n' - ' content: |\n' + EXPECTED_TEST_CONFIG + RUN_CMD) + ' content: |\n' + EXPECTED_TEST_CONFIG + + RUN_CMD + WRITE_FILES_CMD) ud_cfg = udc.build_user_data_config({'/test/config/path': TEST_CONFIG}) self.assertEqual(expected_config, ud_cfg) + + def test_build_user_data_config_no_files(self): + udc = user_data_jinja_cfg.UserDataJinjaCfg() + expected_config = (BASE_CFG + '\n' + RUN_CMD) + ud_cfg = udc.build_user_data_config({}) + self.assertEqual(expected_config, ud_cfg) diff --git a/octavia/tests/unit/controller/worker/v2/tasks/test_compute_tasks.py b/octavia/tests/unit/controller/worker/v2/tasks/test_compute_tasks.py index 2febd35782..31135b7fe3 100644 --- a/octavia/tests/unit/controller/worker/v2/tasks/test_compute_tasks.py +++ b/octavia/tests/unit/controller/worker/v2/tasks/test_compute_tasks.py @@ -102,9 +102,12 @@ class TestComputeTasks(base.TestCase): @mock.patch('octavia.amphorae.backends.agent.' 'agent_jinja_cfg.AgentJinjaTemplater.' 'build_agent_config', return_value='test_conf') + @mock.patch('octavia.common.jinja.' + 'user_data_jinja_cfg.UserDataJinjaCfg.' + 'build_user_data_config', return_value='user_data_conf') @mock.patch('stevedore.driver.DriverManager.driver') - def test_compute_create(self, mock_driver, mock_conf, mock_jinja, - mock_log_cfg): + def test_compute_create(self, mock_driver, mock_ud_conf, + mock_conf, mock_jinja, mock_log_cfg): image_owner_id = uuidutils.generate_uuid() self.conf.config( @@ -131,7 +134,7 @@ class TestComputeTasks(base.TestCase): config_drive_files={'/etc/octavia/' 'amphora-agent.conf': 'test_conf', '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG'}, - user_data=None, + user_data='user_data_conf', server_group_id=SERVER_GRPOUP_ID, availability_zone=None ) @@ -167,14 +170,13 @@ class TestComputeTasks(base.TestCase): 'build_agent_config', return_value='test_conf') @mock.patch('octavia.common.jinja.' 'user_data_jinja_cfg.UserDataJinjaCfg.' - 'build_user_data_config', return_value='test_conf') + 'build_user_data_config', return_value='user_data_conf') @mock.patch('stevedore.driver.DriverManager.driver') def test_compute_create_user_data(self, mock_driver, mock_ud_conf, mock_conf, mock_jinja): self.conf.config( group="controller_worker", user_data_config_drive=True) - mock_ud_conf.return_value = 'test_ud_conf' createcompute = compute_tasks.ComputeCreate() mock_driver.build.return_value = COMPUTE_ID @@ -193,7 +195,7 @@ class TestComputeTasks(base.TestCase): network_ids=AMP_NET, port_ids=[PORT_ID], config_drive_files=None, - user_data='test_ud_conf', + user_data='user_data_conf', server_group_id=None, availability_zone=None) @@ -228,9 +230,13 @@ class TestComputeTasks(base.TestCase): @mock.patch('octavia.amphorae.backends.agent.' 'agent_jinja_cfg.AgentJinjaTemplater.' 'build_agent_config', return_value='test_conf') + @mock.patch('octavia.common.jinja.' + 'user_data_jinja_cfg.UserDataJinjaCfg.' + 'build_user_data_config', return_value='user_data_conf') @mock.patch('stevedore.driver.DriverManager.driver') - def test_compute_create_availability_zone(self, mock_driver, mock_conf, - mock_jinja, mock_log_cfg): + def test_compute_create_availability_zone(self, mock_driver, mock_ud_conf, + mock_conf, mock_jinja, + mock_log_cfg): image_owner_id = uuidutils.generate_uuid() compute_zone = uuidutils.generate_uuid() @@ -261,7 +267,7 @@ class TestComputeTasks(base.TestCase): config_drive_files={'/etc/octavia/' 'amphora-agent.conf': 'test_conf', '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG'}, - user_data=None, + user_data='user_data_conf', server_group_id=SERVER_GRPOUP_ID, availability_zone=compute_zone) @@ -296,9 +302,13 @@ class TestComputeTasks(base.TestCase): @mock.patch('octavia.amphorae.backends.agent.' 'agent_jinja_cfg.AgentJinjaTemplater.' 'build_agent_config', return_value='test_conf') + @mock.patch('octavia.common.jinja.' + 'user_data_jinja_cfg.UserDataJinjaCfg.' + 'build_user_data_config', return_value='user_data_conf') @mock.patch('stevedore.driver.DriverManager.driver') def test_compute_create_without_ssh_access( - self, mock_driver, mock_conf, mock_jinja, mock_log_cfg): + self, mock_driver, nock_user_data_conf, + mock_conf, mock_jinja, mock_log_cfg): createcompute = compute_tasks.ComputeCreate() @@ -324,7 +334,7 @@ class TestComputeTasks(base.TestCase): config_drive_files={'/etc/octavia/' 'amphora-agent.conf': 'test_conf', '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG'}, - user_data=None, + user_data='user_data_conf', server_group_id=SERVER_GRPOUP_ID, availability_zone=None) @@ -358,9 +368,12 @@ class TestComputeTasks(base.TestCase): @mock.patch('octavia.amphorae.backends.agent.' 'agent_jinja_cfg.AgentJinjaTemplater.' 'build_agent_config', return_value='test_conf') + @mock.patch('octavia.common.jinja.' + 'user_data_jinja_cfg.UserDataJinjaCfg.' + 'build_user_data_config', return_value='user_data_conf') @mock.patch('stevedore.driver.DriverManager.driver') - def test_compute_create_cert(self, mock_driver, mock_conf, mock_jinja, - mock_log_cfg): + def test_compute_create_cert(self, mock_driver, mock_ud_conf, + mock_conf, mock_jinja, mock_log_cfg): createcompute = compute_tasks.CertComputeCreate() key = utils.get_compatible_server_certs_key_passphrase() fer = fernet.Fernet(key) @@ -387,7 +400,7 @@ class TestComputeTasks(base.TestCase): sec_groups=AMP_SEC_GROUPS, network_ids=AMP_NET, port_ids=[], - user_data=None, + user_data='user_data_conf', config_drive_files={ '/etc/rsyslog.d/10-rsyslog.conf': 'FAKE CFG', '/etc/octavia/certs/server.pem': fer.decrypt( diff --git a/releasenotes/notes/ensure-rsyslog-config-is-reloaded-b4a25a98b661d0f1.yaml b/releasenotes/notes/ensure-rsyslog-config-is-reloaded-b4a25a98b661d0f1.yaml new file mode 100644 index 0000000000..762c3453eb --- /dev/null +++ b/releasenotes/notes/ensure-rsyslog-config-is-reloaded-b4a25a98b661d0f1.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Ensure that the provided rsyslog configuration file is used by the rsyslog + by restarting the service, it fixes the log offloading feature on + distributions that start rsyslog before cloud-init.