Add Datastore Version Registry Extension

Current, users can config default datastore registry for managers not by
verions. This make you can flexible when have some experimental
datastore.

With this patch, users with the administrator role can configure the
datastore registry external for each datastore version using a command,
without editing configuration files.

Story: #2010860
Task: #48536
Change-Id: I7ee47dd1bb6e52991f0e0028a01e81252a1718c3
This commit is contained in:
Bo Tran 2023-08-07 11:42:21 +07:00
parent 0415e4bc88
commit e32a0b0c9c
4 changed files with 59 additions and 10 deletions

View File

@ -194,6 +194,20 @@ class CreateDatastoreVersion(command.Command):
help=_('ID of the datastore image in Glance. This can be empty '
'string if --image-tags is specified.'),
)
parser.add_argument(
'--registry-ext',
help=_('Extension for default datastore managers. '
'Allows the use of custom managers for each of '
'the datastores supported by Trove.'
'This can be empty string.'),
)
parser.add_argument(
'--repl-strategy',
help=_('Extension for default strategy for replication. '
'Allows the use of custom replication strategy '
'for each of the datastores supported by Trove.'
'This can be empty string.'),
)
parser.add_argument(
'--active',
action='store_true',
@ -229,6 +243,8 @@ class CreateDatastoreVersion(command.Command):
parsed_args.datastore_manager,
parsed_args.image_id,
image_tags=image_tags,
registry_ext=parsed_args.registry_ext,
repl_strategy=parsed_args.repl_strategy,
active='true' if parsed_args.active else 'false',
default='true' if parsed_args.default else 'false',
version=parsed_args.version_number
@ -263,6 +279,20 @@ class UpdateDatastoreVersion(command.Command):
default=None,
help=_('List of image tags separated by comma, e.g. trove,mysql'),
)
parser.add_argument(
'--registry-ext',
help=_('Extension for default datastore managers. '
'Allows the use of custom managers for each of '
'the datastores supported by Trove.'
'This can be empty string.'),
)
parser.add_argument(
'--repl-strategy',
help=_('Extension for default strategy for replication. '
'Allows the use of custom replication strategy '
'for each of the datastores supported by Trove.'
'This can be empty string.'),
)
parser.add_argument(
'--version-name',
help=_('New datastore version name.'),
@ -303,6 +333,8 @@ class UpdateDatastoreVersion(command.Command):
datastore_manager=parsed_args.datastore_manager,
image=parsed_args.image,
image_tags=image_tags,
registry_ext=parsed_args.registry_ext,
repl_strategy=parsed_args.repl_strategy,
active=parsed_args.enable, default=parsed_args.default,
name=parsed_args.version_name
)

View File

@ -166,7 +166,9 @@ class TestCreateDatastoreVersion(TestDatastores):
def test_create_datastore_version(self):
image_id = uuidutils.generate_uuid()
args = ['new_name', 'ds_name', 'ds_manager', image_id, '--active',
'--default', '--image-tags', 'trove,mysql']
'--default', '--image-tags', 'trove,mysql',
'--registry-ext', 'registry-ext',
'--repl-strategy', 'repl_strategy']
parsed_args = self.check_parser(self.cmd, args, [])
self.cmd.take_action(parsed_args)
@ -174,7 +176,8 @@ class TestCreateDatastoreVersion(TestDatastores):
self.dsversion_mgmt_client.create.assert_called_once_with(
'new_name', 'ds_name', 'ds_manager', image_id, active='true',
default='true', image_tags=['trove', 'mysql'],
version=None)
registry_ext="registry-ext",
repl_strategy="repl_strategy", version=None)
class TestUpdateDatastoreVersion(TestDatastores):
@ -184,8 +187,9 @@ class TestUpdateDatastoreVersion(TestDatastores):
def test_update_datastore_version(self):
version_id = uuidutils.generate_uuid()
args = [version_id, '--image-tags', 'trove,mysql', '--enable',
'--non-default']
args = [version_id, '--registry-ext', 'registry-ext',
'--repl-strategy', 'repl_strategy',
'--image-tags', 'trove,mysql', '--enable', '--non-default']
parsed_args = self.check_parser(self.cmd, args, [])
self.cmd.take_action(parsed_args)
@ -193,4 +197,5 @@ class TestUpdateDatastoreVersion(TestDatastores):
self.dsversion_mgmt_client.edit.assert_called_once_with(
version_id, datastore_manager=None, image=None,
active='true', default='false', image_tags=['trove', 'mysql'],
name=None)
registry_ext="registry-ext",
repl_strategy="repl_strategy", name=None)

View File

@ -235,12 +235,15 @@ class MgmtDatastoreVersionsTest(testtools.TestCase):
self.ds_version._create = mock.Mock(side_effect=side_effect_func)
p, b, = self.ds_version.create(
"ds-version1", "mysql", "mysql", "image-id",
["mysql-server-5.5"], "true", "true")
["mysql-server-5.5"], "registry-ext",
"repl-strategy", "true", "true")
self.assertEqual("/mgmt/datastore-versions", p)
self.assertEqual("ds-version1", b["version"]["name"])
self.assertEqual("mysql", b["version"]["datastore_name"])
self.assertEqual("mysql", b["version"]["datastore_manager"])
self.assertEqual("image-id", b["version"]["image"])
self.assertEqual("registry-ext", b["version"]["registry_ext"])
self.assertEqual("repl-strategy", b["version"]["repl_strategy"])
self.assertEqual(["mysql-server-5.5"], b["version"]["packages"])
self.assertTrue(b["version"]["active"])
self.assertTrue(b["version"]["default"])

View File

@ -268,8 +268,8 @@ class MgmtDatastoreVersions(base.ManagerWithFind):
"version")
def create(self, name, datastore_name, datastore_manager, image,
packages=None, active='true', default='false', image_tags=[],
version=None):
packages=None, registry_ext=None, repl_strategy=None,
active='true', default='false', image_tags=[], version=None):
"""Create a new datastore version."""
packages = packages or []
body = {
@ -285,14 +285,19 @@ class MgmtDatastoreVersions(base.ManagerWithFind):
}
if image:
body['version']['image'] = image
if registry_ext:
body['version']['registry_ext'] = registry_ext
if repl_strategy:
body['version']['repl_strategy'] = repl_strategy
if version:
body['version']['version'] = version
return self._create("/mgmt/datastore-versions", body, None, True)
def edit(self, datastore_version_id, datastore_manager=None, image=None,
packages=None, active=None, default=None, image_tags=None,
name=None):
packages=None, registry_ext=None, repl_strategy=None,
active=None, default=None, image_tags=None, name=None):
"""Update a datastore-version."""
packages = packages or []
body = {}
@ -302,6 +307,10 @@ class MgmtDatastoreVersions(base.ManagerWithFind):
body['image'] = image
if packages:
body['packages'] = packages
if registry_ext:
body['registry_ext'] = registry_ext
if repl_strategy:
body['repl_strategy'] = repl_strategy
if active is not None:
body['active'] = json.loads(active)
if default is not None: