summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHirotaka Wakabayashi <hiwkby@yahoo.com>2022-05-02 12:47:30 +0900
committerHirotaka Wakabayashi <hiwkby@yahoo.com>2022-05-02 20:47:59 +0900
commit1580c4ca562b01e502d505475d79dd7ac8caf18d (patch)
treeb853b14280614dc3908470e3840d5fdd5e34c02d
parent4741b57c09852d8ca413f8ff5ba73f763636db1f (diff)
downloadtrove-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
-rw-r--r--trove/common/cfg.py6
-rw-r--r--trove/instance/models.py35
-rw-r--r--trove/tests/unittests/taskmanager/test_models.py38
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()