summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingxian Kong <anlin.kong@gmail.com>2020-11-20 20:44:56 +1300
committerLingxian Kong <anlin.kong@gmail.com>2020-11-21 23:44:42 +0000
commita57568397e58cd40269a48b777bd41cc1a1416e8 (patch)
tree2924a251a076f797e05bf9dbef4e4d116ef23342
parentf28390ee5ddf83c0dfbf886b7e99c192fa7f4ecc (diff)
downloadpython-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.yaml4
-rw-r--r--troveclient/osc/v1/database_configurations.py72
-rw-r--r--troveclient/osc/v1/database_instances.py9
-rw-r--r--troveclient/osc/v1/datastores.py17
-rw-r--r--troveclient/tests/fakes.py14
-rw-r--r--troveclient/tests/osc/v1/test_database_configurations.py18
-rw-r--r--troveclient/tests/osc/v1/test_database_instances.py14
-rw-r--r--troveclient/tests/osc/v1/test_datastores.py8
-rw-r--r--troveclient/v1/configurations.py4
-rw-r--r--troveclient/v1/instances.py4
-rw-r--r--troveclient/v1/management.py10
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)