summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lower-constraints.txt1
-rw-r--r--releasenotes/notes/victoria-create-datastore-version.yaml3
-rw-r--r--setup.cfg1
-rw-r--r--troveclient/osc/v1/database_instances.py21
-rw-r--r--troveclient/osc/v1/datastores.py51
-rw-r--r--troveclient/tests/fakes.py8
-rw-r--r--troveclient/tests/osc/v1/test_database_instances.py17
-rw-r--r--troveclient/tests/osc/v1/test_datastores.py18
-rw-r--r--troveclient/tests/test_backups.py5
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.
diff --git a/setup.cfg b/setup.cfg
index 9054a38..5a4aed9 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -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
"""