diff options
author | Hirotaka Wakabayashi <hiwkby@yahoo.com> | 2022-05-02 12:47:30 +0900 |
---|---|---|
committer | Hirotaka Wakabayashi <hiwkby@yahoo.com> | 2022-05-02 20:47:59 +0900 |
commit | 1580c4ca562b01e502d505475d79dd7ac8caf18d (patch) | |
tree | b853b14280614dc3908470e3840d5fdd5e34c02d /trove | |
parent | 4741b57c09852d8ca413f8ff5ba73f763636db1f (diff) | |
download | trove-1580c4ca562b01e502d505475d79dd7ac8caf18d.tar.gz |
Adds new configurations for injected file owner
This PR adds configuration options for file owner information of
injected files in GuestVM to trove.conf. File owner information
should not be hardcoded as "trove" because it depends on user
environments.
Original problem is guest instance creation failure due to the lack of
guestagent configuration files because of the recent code chage[1].
That patch was introduced since Yoga.
[1]:https://review.opendev.org/c/openstack/trove/+/823632
Task: 45239
Story: 2010021
Change-Id: Iaccfe84c912025ec6d96e66ffa6ad7a4b9537b6e
Diffstat (limited to 'trove')
-rw-r--r-- | trove/common/cfg.py | 6 | ||||
-rw-r--r-- | trove/instance/models.py | 35 | ||||
-rw-r--r-- | trove/tests/unittests/taskmanager/test_models.py | 38 |
3 files changed, 63 insertions, 16 deletions
diff --git a/trove/common/cfg.py b/trove/common/cfg.py index e7d08073..6270d96d 100644 --- a/trove/common/cfg.py +++ b/trove/common/cfg.py @@ -428,6 +428,12 @@ common_opts = [ cfg.StrOpt('injected_config_location', default='/etc/trove/conf.d', help='Path to folder on the Guest where config files will be ' 'injected during instance creation.'), + cfg.StrOpt('injected_config_owner', default='trove', + help='Owner of the Guest Agent directory and files to be ' + 'injected during instance creation.'), + cfg.StrOpt('injected_config_group', default='trove', + help='Group of the Guest Agent directory and files to be ' + 'injected during instance creation.'), cfg.StrOpt('guest_config', default='/etc/trove/trove-guestagent.conf', help='Path to the Guest Agent config file to be injected ' diff --git a/trove/instance/models.py b/trove/instance/models.py index fe424bc8..afdb1ff8 100644 --- a/trove/instance/models.py +++ b/trove/instance/models.py @@ -968,23 +968,30 @@ class BaseInstance(SimpleInstance): return self._server_group def prepare_cloud_config(self, files): - userdata = ( - "#cloud-config\n" - "write_files:\n" - ) + # This method returns None if the files argument is None + userdata = None - for filename, content in files.items(): - ud = encodeutils.safe_encode(content) - body_userdata = ( - "- encoding: b64\n" - " owner: trove:trove\n" - " path: %s\n" - " content: %s\n" % ( - filename, encodeutils.safe_decode(base64.b64encode(ud))) + if files: + userdata = ( + "#cloud-config\n" + "write_files:\n" ) - userdata = userdata + body_userdata - return userdata + injected_config_owner = CONF.get('injected_config_owner') + injected_config_group = CONF.get('injected_config_group') + for filename, content in files.items(): + ud = encodeutils.safe_encode(content) + body_userdata = ( + "- encoding: b64\n" + " owner: %s:%s\n" + " path: %s\n" + " content: %s\n" % ( + injected_config_owner, injected_config_group, filename, + encodeutils.safe_decode(base64.b64encode(ud))) + ) + userdata = userdata + body_userdata + + return userdata if userdata else "" def get_injected_files(self, datastore_manager, datastore_version): injected_config_location = CONF.get('injected_config_location') diff --git a/trove/tests/unittests/taskmanager/test_models.py b/trove/tests/unittests/taskmanager/test_models.py index 5167bc04..0af1aa16 100644 --- a/trove/tests/unittests/taskmanager/test_models.py +++ b/trove/tests/unittests/taskmanager/test_models.py @@ -242,8 +242,7 @@ class FreshInstanceTasksTest(BaseFreshInstanceTasksTest): server = self.freshinstancetasks._create_server( None, None, datastore_manager, None, None, None) - userdata = self.userdata + "#cloud-config\nwrite_files:\n" - self.assertEqual(server.userdata, userdata) + self.assertEqual(server.userdata, self.userdata) def test_create_instance_with_keypair(self): cfg.CONF.set_override('nova_keypair', 'fake_keypair') @@ -317,6 +316,41 @@ class FreshInstanceTasksTest(BaseFreshInstanceTasksTest): def test_servers_create_block_device_mapping_v2(self, mock_hostname, mock_name): + # This testcase is to test create_server with config_drive=True. + # We need set use_nova_server_config_drive True explicitly + # because use_nova_server_config_drive becomes False since Yoga + cfg.CONF.set_override('use_nova_server_config_drive', True) + self.freshinstancetasks.prepare_userdata = Mock(return_value=None) + mock_nova_client = self.freshinstancetasks.nova_client = Mock() + mock_servers_create = mock_nova_client.servers.create + self.freshinstancetasks._create_server('fake-flavor', 'fake-image', + 'mysql', None, None, None) + meta = {'trove_project_id': self.freshinstancetasks.tenant_id, + 'trove_user_id': 'test_user', + 'trove_instance_id': self.freshinstancetasks.id} + mock_servers_create.assert_called_with( + 'fake-name', 'fake-image', + 'fake-flavor', files={}, + userdata=None, + block_device_mapping_v2=None, + availability_zone=None, + nics=None, + config_drive=True, + scheduler_hints=None, + key_name=None, + meta=meta, + ) + + @patch.object(taskmanager_models.FreshInstanceTasks, 'hostname', + new_callable=PropertyMock, + return_value='fake-hostname') + @patch.object(taskmanager_models.FreshInstanceTasks, 'name', + new_callable=PropertyMock, + return_value='fake-name') + def test_servers_create_block_device_mapping_v2_since_yoga( + self, mock_hostname, mock_name): + + # This testcase is for testing with config_drive=False. self.freshinstancetasks.prepare_userdata = Mock( return_value="#cloud-config\nwrite_files:\n") mock_nova_client = self.freshinstancetasks.nova_client = Mock() |