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 ' help=_('ID of the datastore image in Glance. This can be empty '
'string if --image-tags is specified.'), '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( parser.add_argument(
'--active', '--active',
action='store_true', action='store_true',
@@ -229,6 +243,8 @@ class CreateDatastoreVersion(command.Command):
parsed_args.datastore_manager, parsed_args.datastore_manager,
parsed_args.image_id, parsed_args.image_id,
image_tags=image_tags, image_tags=image_tags,
registry_ext=parsed_args.registry_ext,
repl_strategy=parsed_args.repl_strategy,
active='true' if parsed_args.active else 'false', active='true' if parsed_args.active else 'false',
default='true' if parsed_args.default else 'false', default='true' if parsed_args.default else 'false',
version=parsed_args.version_number version=parsed_args.version_number
@@ -263,6 +279,20 @@ class UpdateDatastoreVersion(command.Command):
default=None, default=None,
help=_('List of image tags separated by comma, e.g. trove,mysql'), 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( parser.add_argument(
'--version-name', '--version-name',
help=_('New datastore version name.'), help=_('New datastore version name.'),
@@ -303,6 +333,8 @@ class UpdateDatastoreVersion(command.Command):
datastore_manager=parsed_args.datastore_manager, datastore_manager=parsed_args.datastore_manager,
image=parsed_args.image, image=parsed_args.image,
image_tags=image_tags, image_tags=image_tags,
registry_ext=parsed_args.registry_ext,
repl_strategy=parsed_args.repl_strategy,
active=parsed_args.enable, default=parsed_args.default, active=parsed_args.enable, default=parsed_args.default,
name=parsed_args.version_name name=parsed_args.version_name
) )

View File

@@ -166,7 +166,9 @@ class TestCreateDatastoreVersion(TestDatastores):
def test_create_datastore_version(self): def test_create_datastore_version(self):
image_id = uuidutils.generate_uuid() image_id = uuidutils.generate_uuid()
args = ['new_name', 'ds_name', 'ds_manager', image_id, '--active', 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, []) parsed_args = self.check_parser(self.cmd, args, [])
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
@@ -174,7 +176,8 @@ class TestCreateDatastoreVersion(TestDatastores):
self.dsversion_mgmt_client.create.assert_called_once_with( self.dsversion_mgmt_client.create.assert_called_once_with(
'new_name', 'ds_name', 'ds_manager', image_id, active='true', 'new_name', 'ds_name', 'ds_manager', image_id, active='true',
default='true', image_tags=['trove', 'mysql'], default='true', image_tags=['trove', 'mysql'],
version=None) registry_ext="registry-ext",
repl_strategy="repl_strategy", version=None)
class TestUpdateDatastoreVersion(TestDatastores): class TestUpdateDatastoreVersion(TestDatastores):
@@ -184,8 +187,9 @@ class TestUpdateDatastoreVersion(TestDatastores):
def test_update_datastore_version(self): def test_update_datastore_version(self):
version_id = uuidutils.generate_uuid() version_id = uuidutils.generate_uuid()
args = [version_id, '--image-tags', 'trove,mysql', '--enable', args = [version_id, '--registry-ext', 'registry-ext',
'--non-default'] '--repl-strategy', 'repl_strategy',
'--image-tags', 'trove,mysql', '--enable', '--non-default']
parsed_args = self.check_parser(self.cmd, args, []) parsed_args = self.check_parser(self.cmd, args, [])
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
@@ -193,4 +197,5 @@ class TestUpdateDatastoreVersion(TestDatastores):
self.dsversion_mgmt_client.edit.assert_called_once_with( self.dsversion_mgmt_client.edit.assert_called_once_with(
version_id, datastore_manager=None, image=None, version_id, datastore_manager=None, image=None,
active='true', default='false', image_tags=['trove', 'mysql'], 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) self.ds_version._create = mock.Mock(side_effect=side_effect_func)
p, b, = self.ds_version.create( p, b, = self.ds_version.create(
"ds-version1", "mysql", "mysql", "image-id", "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("/mgmt/datastore-versions", p)
self.assertEqual("ds-version1", b["version"]["name"]) self.assertEqual("ds-version1", b["version"]["name"])
self.assertEqual("mysql", b["version"]["datastore_name"]) self.assertEqual("mysql", b["version"]["datastore_name"])
self.assertEqual("mysql", b["version"]["datastore_manager"]) self.assertEqual("mysql", b["version"]["datastore_manager"])
self.assertEqual("image-id", b["version"]["image"]) 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.assertEqual(["mysql-server-5.5"], b["version"]["packages"])
self.assertTrue(b["version"]["active"]) self.assertTrue(b["version"]["active"])
self.assertTrue(b["version"]["default"]) self.assertTrue(b["version"]["default"])

View File

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