diff options
author | Lingxian Kong <anlin.kong@gmail.com> | 2020-11-20 20:44:56 +1300 |
---|---|---|
committer | Lingxian Kong <anlin.kong@gmail.com> | 2020-11-21 23:44:42 +0000 |
commit | a57568397e58cd40269a48b777bd41cc1a1416e8 (patch) | |
tree | 2924a251a076f797e05bf9dbef4e4d116ef23342 | |
parent | f28390ee5ddf83c0dfbf886b7e99c192fa7f4ecc (diff) | |
download | python-troveclient-a57568397e58cd40269a48b777bd41cc1a1416e8.tar.gz |
Support datastore version number
- Support "--datastore-version-number" for creating configuration
- Support "--datastore-version-number" for creating instance
- Support "--version-number" for creating datastore version
- Support "--version-name" for updating datastore version
- Support showing version number for datastore version, instance and
configuration
Story: 2008358
Task: 41264
Change-Id: Ie84b4506736a82a214b0416f7e451d565552f651
-rw-r--r-- | releasenotes/notes/wallaby-datastore-version-number.yaml | 4 | ||||
-rw-r--r-- | troveclient/osc/v1/database_configurations.py | 72 | ||||
-rw-r--r-- | troveclient/osc/v1/database_instances.py | 9 | ||||
-rw-r--r-- | troveclient/osc/v1/datastores.py | 17 | ||||
-rw-r--r-- | troveclient/tests/fakes.py | 14 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_database_configurations.py | 18 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_database_instances.py | 14 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_datastores.py | 8 | ||||
-rw-r--r-- | troveclient/v1/configurations.py | 4 | ||||
-rw-r--r-- | troveclient/v1/instances.py | 4 | ||||
-rw-r--r-- | troveclient/v1/management.py | 10 |
11 files changed, 119 insertions, 55 deletions
diff --git a/releasenotes/notes/wallaby-datastore-version-number.yaml b/releasenotes/notes/wallaby-datastore-version-number.yaml new file mode 100644 index 0000000..07656dc --- /dev/null +++ b/releasenotes/notes/wallaby-datastore-version-number.yaml @@ -0,0 +1,4 @@ +--- +features: + - Support specifying and showing datastore version number for several + resources such as datastore version, instance and configuration. diff --git a/troveclient/osc/v1/database_configurations.py b/troveclient/osc/v1/database_configurations.py index 6989576..69a8bf0 100644 --- a/troveclient/osc/v1/database_configurations.py +++ b/troveclient/osc/v1/database_configurations.py @@ -13,12 +13,13 @@ """Database v1 Configurations action implementations""" import json + from osc_lib.command import command from osc_lib import utils as osc_utils +from oslo_utils import uuidutils from troveclient import exceptions from troveclient.i18n import _ -from troveclient import utils def set_attributes_for_print_detail(configuration): @@ -32,7 +33,7 @@ class ListDatabaseConfigurations(command.Lister): _description = _("List database configurations") columns = ['ID', 'Name', 'Description', 'Datastore Name', - 'Datastore Version Name'] + 'Datastore Version Name', 'Datastore Version Number'] def get_parser(self, prog_name): parser = super(ListDatabaseConfigurations, self).get_parser(prog_name) @@ -94,8 +95,9 @@ class ListDatabaseConfigurationParameters(command.Lister): parser.add_argument( 'datastore_version', metavar='<datastore_version>', - help=_('Datastore version name or ID assigned' - 'to the configuration group.') + help=_('Datastore version name or ID assigned to the ' + 'configuration group. ID is preferred if more than one ' + 'datastore versions have the same name.') ) parser.add_argument( '--datastore', @@ -110,19 +112,19 @@ class ListDatabaseConfigurationParameters(command.Lister): def take_action(self, parsed_args): db_configuration_parameters = self.app.client_manager.\ database.configuration_parameters - if parsed_args.datastore: - params = db_configuration_parameters.\ - parameters(parsed_args.datastore, - parsed_args.datastore_version) - elif utils.is_uuid_like(parsed_args.datastore_version): - params = db_configuration_parameters.\ - parameters_by_version(parsed_args.datastore_version) + + if uuidutils.is_uuid_like(parsed_args.datastore_version): + params = db_configuration_parameters.parameters_by_version( + parsed_args.datastore_version) + elif parsed_args.datastore: + params = db_configuration_parameters.parameters( + parsed_args.datastore, + parsed_args.datastore_version) else: - raise exceptions.NoUniqueMatch(_('The datastore name or id is' - ' required to retrieve the' - ' parameters for the' - ' configuration group' - ' by name.')) + raise exceptions.NoUniqueMatch(_('Either datastore version ID or ' + 'datastore name needs to be ' + 'specified.')) + for param in params: setattr(param, 'min_size', getattr(param, 'min', '-')) setattr(param, 'max_size', getattr(param, 'max', '-')) @@ -140,8 +142,9 @@ class ShowDatabaseConfigurationParameter(command.ShowOne): parser.add_argument( 'datastore_version', metavar='<datastore_version>', - help=_('Datastore version name or ID assigned to the' - ' configuration group.'), + help=_('Datastore version name or ID assigned to the ' + 'configuration group. ID is preferred if more than one ' + 'datastore versions have the same name.') ) parser.add_argument( 'parameter', @@ -159,23 +162,23 @@ class ShowDatabaseConfigurationParameter(command.ShowOne): return parser def take_action(self, parsed_args): - db_configuration_parameters = self.app.client_manager.database.\ + db_configuration_parameters = self.app.client_manager.database. \ configuration_parameters - if parsed_args.datastore: - param = db_configuration_parameters.get_parameter( - parsed_args.datastore, + + if uuidutils.is_uuid_like(parsed_args.datastore_version): + param = db_configuration_parameters.get_parameter_by_version( parsed_args.datastore_version, parsed_args.parameter) - elif utils.is_uuid_like(parsed_args.datastore_version): - param = db_configuration_parameters.get_parameter_by_version( + elif parsed_args.datastore: + param = db_configuration_parameters.get_parameter( + parsed_args.datastore, parsed_args.datastore_version, parsed_args.parameter) else: - raise exceptions.NoUniqueMatch(_('The datastore name or id is' - ' required to retrieve the' - ' parameter for the' - ' configuration group' - ' by name.')) + raise exceptions.NoUniqueMatch(_('Either datastore version ID or ' + 'datastore name needs to be ' + 'specified.')) + return zip(*sorted(param._info.items())) @@ -228,13 +231,19 @@ class CreateDatabaseConfiguration(command.ShowOne): 'if default datastore is not configured.'), ) parser.add_argument( - '--datastore_version', + '--datastore-version', metavar='<datastore_version>', default=None, help=_('Datastore version ID assigned to the ' 'configuration group.'), ) parser.add_argument( + '--datastore-version-number', + default=None, + help=_('The version number for the database. The version number ' + 'is needed for the datastore versions with the same name.'), + ) + parser.add_argument( '--description', metavar='<description>', default=None, @@ -249,7 +258,8 @@ class CreateDatabaseConfiguration(command.ShowOne): parsed_args.values, description=parsed_args.description, datastore=parsed_args.datastore, - datastore_version=parsed_args.datastore_version) + datastore_version=parsed_args.datastore_version, + datastore_version_number=parsed_args.datastore_version_number) config_grp = set_attributes_for_print_detail(config_grp) return zip(*sorted(config_grp.items())) diff --git a/troveclient/osc/v1/database_instances.py b/troveclient/osc/v1/database_instances.py index c99b776..918ce20 100644 --- a/troveclient/osc/v1/database_instances.py +++ b/troveclient/osc/v1/database_instances.py @@ -70,6 +70,8 @@ def set_attributes_for_print_detail(instance): if hasattr(instance, 'datastore'): info['datastore'] = instance.datastore['type'] info['datastore_version'] = instance.datastore['version'] + info['datastore_version_number'] = instance.datastore.get( + 'version_number') if hasattr(instance, 'configuration'): info['configuration'] = instance.configuration['id'] if hasattr(instance, 'replica_of'): @@ -304,6 +306,12 @@ class CreateDatabaseInstance(command.ShowOne): help=_("A datastore version name or ID."), ) parser.add_argument( + '--datastore-version-number', + default=None, + help=_('The version number for the database. The version number ' + 'is needed for the datastore versions with the same name.'), + ) + parser.add_argument( '--nic', metavar=('<net-id=<net-uuid>,subnet-id=<subnet-uuid>,' 'ip-address=<ip-address>>'), @@ -461,6 +469,7 @@ class CreateDatabaseInstance(command.ShowOne): availability_zone=(parsed_args.availability_zone), datastore=parsed_args.datastore, datastore_version=(parsed_args.datastore_version), + datastore_version_number=(parsed_args.datastore_version_number), nics=nics, configuration=parsed_args.configuration, replica_of=replica_of, diff --git a/troveclient/osc/v1/datastores.py b/troveclient/osc/v1/datastores.py index a45be92..63a4628 100644 --- a/troveclient/osc/v1/datastores.py +++ b/troveclient/osc/v1/datastores.py @@ -92,7 +92,7 @@ class DeleteDatastore(command.Command): class ListDatastoreVersions(command.Lister): _description = _("Lists available versions for a datastore") - columns = ['ID', 'Name'] + columns = ['ID', 'Name', "Version"] def get_parser(self, prog_name): parser = super(ListDatastoreVersions, self).get_parser(prog_name) @@ -207,6 +207,11 @@ class CreateDatastoreVersion(command.Command): action='store_true', help=_('If set the datastore version as default.'), ) + parser.add_argument( + '--version-number', + help=_("The version number for the database. If not specified, " + "use the version name as the default value."), + ) return parser def take_action(self, parsed_args): @@ -224,7 +229,8 @@ class CreateDatastoreVersion(command.Command): parsed_args.image_id, image_tags=image_tags, 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_number=parsed_args.version_number ) except Exception as e: msg = (_("Failed to create datastore version %(version)s: %(e)s") @@ -256,6 +262,10 @@ class UpdateDatastoreVersion(command.Command): default=None, help=_('List of image tags separated by comma, e.g. trove,mysql'), ) + parser.add_argument( + '--version-name', + help=_('New datastore version name.'), + ) enable_group = parser.add_mutually_exclusive_group() enable_group.add_argument('--enable', dest='enable', @@ -292,7 +302,8 @@ class UpdateDatastoreVersion(command.Command): datastore_manager=parsed_args.datastore_manager, image=parsed_args.image, image_tags=image_tags, - active=parsed_args.enable, default=parsed_args.default + active=parsed_args.enable, default=parsed_args.default, + name=parsed_args.version_name ) except Exception as e: msg = (_("Failed to update datastore version %(version)s: %(e)s") diff --git a/troveclient/tests/fakes.py b/troveclient/tests/fakes.py index c692cc9..7328edf 100644 --- a/troveclient/tests/fakes.py +++ b/troveclient/tests/fakes.py @@ -173,7 +173,10 @@ class FakeHTTPClient(base_client.HTTPClient): "volume": {"size": 2}, "flavor": {"id": "02"}, "region": "regionOne", - "datastore": {"version": "5.6", "type": "mysql"}, + "datastore": { + "version": "5.6", "type": "mysql", + "version_number": "5.7.29" + }, "tenant_id": "fake_tenant_id", "replica_of": {"id": "fake_master_id"}, "access": {"is_public": False, "allowed_cidrs": []} @@ -188,7 +191,10 @@ class FakeHTTPClient(base_client.HTTPClient): "volume": {"size": 2}, "flavor": {"id": "2"}, "region": "regionOne", - "datastore": {"version": "5.6", "type": "mysql"}, + "datastore": { + "version": "5.6", "type": "mysql", + "version_number": "5.7.29" + }, "tenant_id": "fake_tenant_id", "access": {"is_public": False, "allowed_cidrs": []} }, @@ -231,7 +237,8 @@ class FakeHTTPClient(base_client.HTTPClient): }, "datastore": { "version": "5.6", - "type": "mysql" + "type": "mysql", + "version_number": "5.7.29" }}}) def post_instances(self, body, **kw): @@ -503,6 +510,7 @@ class FakeHTTPClient(base_client.HTTPClient): "name": "test_config", "created": "2015-05-16T10:24:28", "datastore_version_name": "5.6", + "datastore_version_number": "5.7.29", "id": "c-123", "values": {"max_connections": 5}, "datastore_version_id": "d-123", "description": ''}]}) diff --git a/troveclient/tests/osc/v1/test_database_configurations.py b/troveclient/tests/osc/v1/test_database_configurations.py index dbd2dc6..f97302c 100644 --- a/troveclient/tests/osc/v1/test_database_configurations.py +++ b/troveclient/tests/osc/v1/test_database_configurations.py @@ -41,7 +41,7 @@ class TestConfigurationList(TestConfigurations): } columns = database_configurations.ListDatabaseConfigurations.columns - values = ('c-123', 'test_config', '', 'mysql', '5.6') + values = ('c-123', 'test_config', '', 'mysql', '5.6', "5.7.29") def setUp(self): super(TestConfigurationList, self).setUp() @@ -60,7 +60,7 @@ class TestConfigurationList(TestConfigurations): class TestConfigurationShow(TestConfigurations): - values = ('2015-05-16T10:24:28', 'mysql', '5.6', '', 'c-123', + values = ('2015-05-16T10:24:28', 'mysql', '5.6', '5.7.29', '', 'c-123', 'test_config', '2015-05-16T10:24:29', '{"max_connections": 5}') def setUp(self): @@ -73,6 +73,7 @@ class TestConfigurationShow(TestConfigurations): 'created', 'datastore_name', 'datastore_version_name', + 'datastore_version_number', 'description', 'id', 'name', @@ -205,7 +206,7 @@ class TestDatabaseConfigurationDelete(TestConfigurations): class TestConfigurationCreate(TestConfigurations): - values = ('2015-05-16T10:24:28', 'mysql', '5.6', '', 'c-123', + values = ('2015-05-16T10:24:28', 'mysql', '5.6', '5.7.29', '', 'c-123', 'test_config', '2015-05-16T10:24:29', '{"max_connections": 5}') def setUp(self): @@ -218,6 +219,7 @@ class TestConfigurationCreate(TestConfigurations): 'created', 'datastore_name', 'datastore_version_name', + 'datastore_version_number', 'description', 'id', 'name', @@ -229,7 +231,7 @@ class TestConfigurationCreate(TestConfigurations): args = ['c-123', '{"max_connections": 5}', '--description', 'test_config', '--datastore', 'mysql', - '--datastore_version', '5.6'] + '--datastore-version', '5.6'] parsed_args = self.check_parser(self.cmd, args, []) columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) @@ -244,13 +246,14 @@ class TestConfigurationCreate(TestConfigurations): '{"param1": 1, "param2": 2}', description=None, datastore=None, - datastore_version=None) + datastore_version=None, + datastore_version_number=None) def test_configuration_create_with_optional_args(self): args = ['cgroup2', '{"param3": 3, "param4": 4}', '--description', 'cgroup 2', '--datastore', 'mysql', - '--datastore_version', '5.6'] + '--datastore-version', '5.6'] parsed_args = self.check_parser(self.cmd, args, []) self.cmd.take_action(parsed_args) self.configuration_client.create.assert_called_with( @@ -258,7 +261,8 @@ class TestConfigurationCreate(TestConfigurations): '{"param3": 3, "param4": 4}', description='cgroup 2', datastore='mysql', - datastore_version='5.6') + datastore_version='5.6', + datastore_version_number=None) class TestConfigurationAttach(TestConfigurations): diff --git a/troveclient/tests/osc/v1/test_database_instances.py b/troveclient/tests/osc/v1/test_database_instances.py index af2134e..62c9a25 100644 --- a/troveclient/tests/osc/v1/test_database_instances.py +++ b/troveclient/tests/osc/v1/test_database_instances.py @@ -107,8 +107,8 @@ class TestInstanceList(TestInstances): class TestInstanceShow(TestInstances): values = ([{'address': '10.0.0.13', 'type': 'private'}], [], 'mysql', - '5.6', '02', '1234', 'test-member-1', False, 'regionOne', - 'fake_master_id', 'ACTIVE', 'fake_tenant_id', 2) + '5.6', '5.7.29', '02', '1234', 'test-member-1', False, + 'regionOne', 'fake_master_id', 'ACTIVE', 'fake_tenant_id', 2) def setUp(self): super(TestInstanceShow, self).setUp() @@ -120,6 +120,7 @@ class TestInstanceShow(TestInstances): 'allowed_cidrs', 'datastore', 'datastore_version', + 'datastore_version_number', 'flavor', 'id', 'name', @@ -197,13 +198,14 @@ class TestDatabaseInstanceDelete(TestInstances): class TestDatabaseInstanceCreate(TestInstances): - values = ('2017-12-22T20:02:32', 'mysql', '5.6', '310', + values = ('2017-12-22T20:02:32', 'mysql', '5.6', '5.7.29', '310', '2468', 'test', 'test-net', 'net-id', 'BUILD', '2017-12-22T20:02:32', 1) columns = ( 'created', 'datastore', 'datastore_version', + 'datastore_version_number', 'flavor', 'id', 'name', @@ -266,7 +268,8 @@ class TestDatabaseInstanceCreate(TestInstances): }, "datastore": { "type": "mysql", - "version": "5.7.29" + "version": "5.7.29", + "version_number": "5.7.29" }, "region": "RegionOne", "access": { @@ -310,6 +313,7 @@ class TestDatabaseInstanceCreate(TestInstances): 'created', 'datastore', 'datastore_version', + 'datastore_version_number', 'flavor', 'id', 'name', @@ -325,6 +329,7 @@ class TestDatabaseInstanceCreate(TestInstances): "2020-08-12T09:41:47", "mysql", "5.7.29", + "5.7.29", "a48ea749-7ee3-4003-8aae-eb4e79773e2d", "a1fea1cf-18ad-48ab-bdfd-fce99a4b834e", "test-mysql", @@ -363,6 +368,7 @@ class TestDatabaseInstanceCreate(TestInstances): availability_zone=None, datastore='mysql', datastore_version='5.7.29', + datastore_version_number=None, nics=[ {'network_id': 'net1', 'subnet_id': 'subnet_id', 'ip_address': '192.168.1.11'} diff --git a/troveclient/tests/osc/v1/test_datastores.py b/troveclient/tests/osc/v1/test_datastores.py index 5614963..e310749 100644 --- a/troveclient/tests/osc/v1/test_datastores.py +++ b/troveclient/tests/osc/v1/test_datastores.py @@ -88,7 +88,7 @@ class TestDeleteDatastore(TestDatastores): class TestDatastoreVersionList(TestDatastores): columns = datastores.ListDatastoreVersions.columns - values = ('v-56', '5.6') + values = ('v-56', '5.6', '') def setUp(self): super(TestDatastoreVersionList, self).setUp() @@ -173,7 +173,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']) + default='true', image_tags=['trove', 'mysql'], + version_number=None) class TestUpdateDatastoreVersion(TestDatastores): @@ -191,4 +192,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']) + active='true', default='false', image_tags=['trove', 'mysql'], + name=None) diff --git a/troveclient/v1/configurations.py b/troveclient/v1/configurations.py index b34594d..9605cdc 100644 --- a/troveclient/v1/configurations.py +++ b/troveclient/v1/configurations.py @@ -56,7 +56,7 @@ class Configurations(base.ManagerWithFind): limit, marker) def create(self, name, values, description=None, datastore=None, - datastore_version=None): + datastore_version=None, datastore_version_number=None): """Create a new configuration.""" body = { "configuration": { @@ -69,6 +69,8 @@ class Configurations(base.ManagerWithFind): datastore_obj["type"] = datastore if datastore_version: datastore_obj["version"] = datastore_version + if datastore_version_number: + datastore_obj["version_number"] = datastore_version_number if datastore_obj: body["configuration"]["datastore"] = datastore_obj if description: diff --git a/troveclient/v1/instances.py b/troveclient/v1/instances.py index 1a46c10..359deb1 100644 --- a/troveclient/v1/instances.py +++ b/troveclient/v1/instances.py @@ -94,7 +94,7 @@ class Instances(base.ManagerWithFind): datastore=None, datastore_version=None, nics=None, configuration=None, replica_of=None, replica_count=None, modules=None, locality=None, region_name=None, access=None, - **kwargs): + datastore_version_number=None, **kwargs): """Create (boot) a new instance.""" body = {"instance": { @@ -117,6 +117,8 @@ class Instances(base.ManagerWithFind): datastore_obj["type"] = datastore if datastore_version: datastore_obj["version"] = datastore_version + if datastore_version_number: + datastore_obj["version_number"] = datastore_version_number if datastore_obj: body["instance"]["datastore"] = datastore_obj if nics: diff --git a/troveclient/v1/management.py b/troveclient/v1/management.py index 478d086..fc7f030 100644 --- a/troveclient/v1/management.py +++ b/troveclient/v1/management.py @@ -268,7 +268,8 @@ class MgmtDatastoreVersions(base.ManagerWithFind): "version") def create(self, name, datastore_name, datastore_manager, image, - packages=None, active='true', default='false', image_tags=[]): + packages=None, active='true', default='false', image_tags=[], + version=None): """Create a new datastore version.""" packages = packages or [] body = { @@ -284,11 +285,14 @@ class MgmtDatastoreVersions(base.ManagerWithFind): } if image: body['version']['image'] = image + 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): + packages=None, active=None, default=None, image_tags=None, + name=None): """Update a datastore-version.""" packages = packages or [] body = {} @@ -304,6 +308,8 @@ class MgmtDatastoreVersions(base.ManagerWithFind): body['default'] = json.loads(default) if image_tags is not None: body['image_tags'] = image_tags + if name: + body['name'] = name url = ("/mgmt/datastore-versions/%s" % datastore_version_id) resp, body = self.api.client.patch(url, body=body) |