diff options
-rw-r--r-- | lower-constraints.txt | 1 | ||||
-rw-r--r-- | releasenotes/notes/victoria-create-datastore-version.yaml | 3 | ||||
-rw-r--r-- | setup.cfg | 1 | ||||
-rw-r--r-- | troveclient/osc/v1/database_instances.py | 21 | ||||
-rw-r--r-- | troveclient/osc/v1/datastores.py | 51 | ||||
-rw-r--r-- | troveclient/tests/fakes.py | 8 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_database_instances.py | 17 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_datastores.py | 18 | ||||
-rw-r--r-- | troveclient/tests/test_backups.py | 5 |
9 files changed, 102 insertions, 23 deletions
diff --git a/lower-constraints.txt b/lower-constraints.txt index 28180d6..3631459 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -28,7 +28,6 @@ keystoneauth1==3.4.0 linecache2==1.0.0 MarkupSafe==1.0 mccabe==0.2.1 -mock==2.0.0 monotonic==0.6 mox3==0.20.0 msgpack-python==0.4.0 diff --git a/releasenotes/notes/victoria-create-datastore-version.yaml b/releasenotes/notes/victoria-create-datastore-version.yaml new file mode 100644 index 0000000..f4b0c66 --- /dev/null +++ b/releasenotes/notes/victoria-create-datastore-version.yaml @@ -0,0 +1,3 @@ +--- +features: + - Support to create datastore version in CLI. @@ -99,6 +99,7 @@ openstack.database.v1 = datastore_list = troveclient.osc.v1.datastores:ListDatastores datastore_show = troveclient.osc.v1.datastores:ShowDatastore datastore_delete = troveclient.osc.v1.datastores:DeleteDatastore + datastore_version_create = troveclient.osc.v1.datastores:CreateDatastoreVersion datastore_version_list = troveclient.osc.v1.datastores:ListDatastoreVersions datastore_version_show = troveclient.osc.v1.datastores:ShowDatastoreVersion datastore_version_delete = troveclient.osc.v1.datastores:DeleteDatastoreVersion diff --git a/troveclient/osc/v1/database_instances.py b/troveclient/osc/v1/database_instances.py index f363cb1..ffda02b 100644 --- a/troveclient/osc/v1/database_instances.py +++ b/troveclient/osc/v1/database_instances.py @@ -27,26 +27,23 @@ from troveclient import utils as trove_utils def set_attributes_for_print(instances): for instance in instances: + # To avoid invoking GET request to trove. + instance_info = instance.to_dict() + setattr(instance, 'flavor_id', instance.flavor['id']) - if hasattr(instance, 'volume'): + if 'volume' in instance_info: setattr(instance, 'size', instance.volume['size']) else: setattr(instance, 'size', '-') - if hasattr(instance, 'ip'): - addresses = ', '.join(instance.ip) - setattr(instance, 'addresses', addresses) - - # If 'replica_of' not in instance, the client will invoke a GET - # instance request to API. - if hasattr(instance, 'replica_of'): + setattr(instance, 'role', '') + if 'replica_of' in instance_info: setattr(instance, 'role', 'replica') + if 'replicas' in instance_info: + setattr(instance, 'role', 'primary') - if hasattr(instance, 'replicas'): - setattr(instance, 'role', 'master') - - if hasattr(instance, 'datastore'): + if 'datastore' in instance_info: if instance.datastore.get('version'): setattr(instance, 'datastore_version', instance.datastore['version']) diff --git a/troveclient/osc/v1/datastores.py b/troveclient/osc/v1/datastores.py index 3d53927..bf12158 100644 --- a/troveclient/osc/v1/datastores.py +++ b/troveclient/osc/v1/datastores.py @@ -169,3 +169,54 @@ class DeleteDatastoreVersion(command.Command): msg = (_("Failed to delete datastore version %(version)s: %(e)s") % {'version': parsed_args.datastore_version, 'e': e}) raise exceptions.CommandError(msg) + + +class CreateDatastoreVersion(command.Command): + _description = _("Creates a datastore version.") + + def get_parser(self, prog_name): + parser = super(CreateDatastoreVersion, self).get_parser(prog_name) + parser.add_argument( + 'version_name', + help=_('Datastore version name.'), + ) + parser.add_argument( + 'datastore_name', + help=_("Datastore name. The datastore is created automatically " + "if does not exist."), + ) + parser.add_argument( + 'datastore_manager', + help=_('Datastore manager, e.g. mysql'), + ) + parser.add_argument( + 'image_id', + help=_('ID of the datastore image in Glance.'), + ) + parser.add_argument( + '--active', + action='store_true', + help=_('Enable the datastore version or not.'), + ) + parser.add_argument( + '--default', + action='store_true', + help=_('If set the datastore version as default.'), + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.database.mgmt_ds_versions + try: + client.create( + parsed_args.version_name, + parsed_args.datastore_name, + parsed_args.datastore_manager, + parsed_args.image_id, + active='true' if parsed_args.active else 'false', + default='true' if parsed_args.default else 'false' + ) + except Exception as e: + msg = (_("Failed to create datastore version %(version)s: %(e)s") + % {'version': parsed_args.version_name, 'e': e}) + raise exceptions.CommandError(msg) diff --git a/troveclient/tests/fakes.py b/troveclient/tests/fakes.py index 979bc6b..98f44db 100644 --- a/troveclient/tests/fakes.py +++ b/troveclient/tests/fakes.py @@ -167,7 +167,9 @@ class FakeHTTPClient(base_client.HTTPClient): "id": "1234", "name": "test-member-1", "status": "ACTIVE", - "ip": ["10.0.0.13"], + "addresses": [ + {"type": "private", "address": "10.0.0.13"} + ], "volume": {"size": 2}, "flavor": {"id": "02"}, "region": "regionOne", @@ -179,7 +181,9 @@ class FakeHTTPClient(base_client.HTTPClient): "id": "5678", "name": "test-member-2", "status": "ACTIVE", - "ip": ["10.0.0.14"], + "addresses": [ + {"type": "private", "address": "10.0.0.14"} + ], "volume": {"size": 2}, "flavor": {"id": "2"}, "region": "regionOne", diff --git a/troveclient/tests/osc/v1/test_database_instances.py b/troveclient/tests/osc/v1/test_database_instances.py index c08a089..bb3950d 100644 --- a/troveclient/tests/osc/v1/test_database_instances.py +++ b/troveclient/tests/osc/v1/test_database_instances.py @@ -55,9 +55,11 @@ class TestInstanceList(TestInstances): ) values = [ - ('1234', 'test-member-1', 'mysql', '5.6', 'ACTIVE', '10.0.0.13', + ('1234', 'test-member-1', 'mysql', '5.6', 'ACTIVE', + [{"type": "private", "address": "10.0.0.13"}], '02', 2, 'regionOne', 'replica'), - ('5678', 'test-member-2', 'mysql', '5.6', 'ACTIVE', '10.0.0.14', + ('5678', 'test-member-2', 'mysql', '5.6', 'ACTIVE', + [{"type": "private", "address": "10.0.0.14"}], '2', 2, 'regionOne', '') ] self.assertEqual(values, data) @@ -77,15 +79,18 @@ class TestInstanceList(TestInstances): expected_instances = [ ('1234', 'test-member-1', 'fake_tenant_id', 'mysql', '5.6', - 'ACTIVE', '10.0.0.13', '02', 2, 'replica'), + 'ACTIVE', [{"type": "private", "address": "10.0.0.13"}], '02', 2, + 'replica'), ('5678', 'test-member-2', 'fake_tenant_id', 'mysql', '5.6', - 'ACTIVE', '10.0.0.14', '2', 2, '') + 'ACTIVE', [{"type": "private", "address": "10.0.0.14"}], '2', 2, + '') ] self.assertEqual(expected_instances, instances) class TestInstanceShow(TestInstances): - values = ('mysql', '5.6', '02', '1234', '10.0.0.13', 'test-member-1', + values = ([{'address': '10.0.0.13', 'type': 'private'}], 'mysql', '5.6', + '02', '1234', 'test-member-1', 'regionOne', 'fake_master_id', 'ACTIVE', 'fake_tenant_id', 2) def setUp(self): @@ -94,11 +99,11 @@ class TestInstanceShow(TestInstances): self.data = self.fake_instances.get_instances_1234() self.instance_client.get.return_value = self.data self.columns = ( + 'addresses', 'datastore', 'datastore_version', 'flavor', 'id', - 'ip', 'name', 'region', 'replica_of', diff --git a/troveclient/tests/osc/v1/test_datastores.py b/troveclient/tests/osc/v1/test_datastores.py index aa75d2c..09f43fd 100644 --- a/troveclient/tests/osc/v1/test_datastores.py +++ b/troveclient/tests/osc/v1/test_datastores.py @@ -156,3 +156,21 @@ class TestDeleteDatastoreVersion(TestDatastores): self.cmd.take_action(parsed_args) self.dsversion_mgmt_client.delete.assert_called_once_with(dsversion_id) + + +class TestCreateDatastoreVersion(TestDatastores): + def setUp(self): + super(TestCreateDatastoreVersion, self).setUp() + self.cmd = datastores.CreateDatastoreVersion(self.app, None) + + def test_create_datastore_version(self): + image_id = uuidutils.generate_uuid() + args = ['new_name', 'ds_name', 'ds_manager', image_id, '--active', + '--default'] + parsed_args = self.check_parser(self.cmd, args, []) + + self.cmd.take_action(parsed_args) + + self.dsversion_mgmt_client.create.assert_called_once_with( + 'new_name', 'ds_name', 'ds_manager', image_id, active='true', + default='true') diff --git a/troveclient/tests/test_backups.py b/troveclient/tests/test_backups.py index ba0ed84..521617d 100644 --- a/troveclient/tests/test_backups.py +++ b/troveclient/tests/test_backups.py @@ -13,11 +13,12 @@ # License for the specific language governing permissions and limitations # under the License. -from mock import patch -import testtools from unittest import mock +from unittest.mock import patch import uuid +import testtools + from troveclient.v1 import backups """ |