summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zuul.yaml15
-rw-r--r--README.rst2
-rw-r--r--troveclient/apiclient/base.py2
-rw-r--r--troveclient/compat/base.py2
-rw-r--r--troveclient/compat/client.py4
-rw-r--r--troveclient/osc/v1/database_clusters.py34
-rw-r--r--troveclient/tests/osc/v1/test_database_clusters.py12
-rw-r--r--troveclient/v1/shell.py10
8 files changed, 64 insertions, 17 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 756f5aa..c351cb9 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -1,16 +1,23 @@
- project:
templates:
+ - check-requirements
+ - openstack-lower-constraints-jobs
+ - openstack-python-jobs
+ - openstack-python35-jobs
+ - openstack-python36-jobs
- openstackclient-plugin-jobs
+ - publish-openstack-docs-pti
+ - release-notes-jobs-python3
check:
jobs:
- python-troveclient-tempest-neutron-src
- - openstack-tox-lower-constraints
+ - trove-functional-mysql
gate:
queue: trove
jobs:
- python-troveclient-tempest-neutron-src
+ - trove-functional-mysql
- - openstack-tox-lower-constraints
- job:
name: python-troveclient-tempest-neutron-src
parent: devstack-tempest
@@ -26,9 +33,9 @@
- openstack/tempest
- openstack/trove-tempest-plugin
vars:
- tox_envlist: 'full'
+ tox_envlist: full
devstack_localrc:
- TEMPEST_PLUGINS: '/opt/stack/trove-tempest-plugin'
+ TEMPEST_PLUGINS: /opt/stack/trove-tempest-plugin
devstack_plugins:
trove: git://git.openstack.org/openstack/trove
diff --git a/README.rst b/README.rst
index 9aede99..155b638 100644
--- a/README.rst
+++ b/README.rst
@@ -30,6 +30,7 @@ python-troveclient is licensed under the Apache License like the rest of OpenSta
* `Github`_
* `Specs`_
* `How to Contribute`_
+* `Release Notes`_
.. _Online Documentation: https://docs.openstack.org/python-troveclient/latest
.. _Bugs: https://bugs.launchpad.net/python-troveclient
@@ -39,3 +40,4 @@ python-troveclient is licensed under the Apache License like the rest of OpenSta
.. _Github: https://github.com/openstack/python-troveclient
.. _Specs: https://specs.openstack.org/openstack/trove-specs/
.. _How to Contribute: https://docs.openstack.org/infra/manual/developers.html
+.. _Release Notes: https://docs.openstack.org/releasenotes/python-troveclient
diff --git a/troveclient/apiclient/base.py b/troveclient/apiclient/base.py
index 1b7e35f..e2a2f05 100644
--- a/troveclient/apiclient/base.py
+++ b/troveclient/apiclient/base.py
@@ -458,6 +458,8 @@ class Resource(object):
pass
def __getattr__(self, k):
+ if k == "__setstate__":
+ raise AttributeError(k)
if k not in self.__dict__:
# NOTE(bcwaldon): disallow lazy-loading if already loaded once
if not self.is_loaded:
diff --git a/troveclient/compat/base.py b/troveclient/compat/base.py
index 24d681c..3301684 100644
--- a/troveclient/compat/base.py
+++ b/troveclient/compat/base.py
@@ -246,7 +246,7 @@ class Resource(object):
return None
def _add_details(self, info):
- for (k, v) in info.iteritems():
+ for (k, v) in info.items():
try:
setattr(self, k, v)
except AttributeError:
diff --git a/troveclient/compat/client.py b/troveclient/compat/client.py
index b04e008..9dfa284 100644
--- a/troveclient/compat/client.py
+++ b/troveclient/compat/client.py
@@ -200,9 +200,9 @@ class TroveHTTPClient(httplib2.Http):
if 'body' in kwargs:
kwargs['body'] = json.dumps(kwargs['body'])
- def morph_response_body(self, body_string):
+ def morph_response_body(self, raw_body):
try:
- return json.loads(body_string)
+ return json.loads(raw_body.decode())
except ValueError:
raise exceptions.ResponseFormatError()
diff --git a/troveclient/osc/v1/database_clusters.py b/troveclient/osc/v1/database_clusters.py
index bd73802..eaf36ff 100644
--- a/troveclient/osc/v1/database_clusters.py
+++ b/troveclient/osc/v1/database_clusters.py
@@ -18,7 +18,10 @@ from osc_lib import utils
import six
from troveclient.i18n import _
+from troveclient.v1.shell import _parse_extended_properties
from troveclient.v1.shell import _parse_instance_options
+from troveclient.v1.shell import EXT_PROPS_HELP
+from troveclient.v1.shell import EXT_PROPS_METAVAR
from troveclient.v1.shell import INSTANCE_HELP
from troveclient.v1.shell import INSTANCE_METAVAR
@@ -165,16 +168,37 @@ class CreateDatabaseCluster(command.ShowOne):
help=_('Locality policy to use when creating cluster. '
'Choose one of %(choices)s.'),
)
+ parser.add_argument(
+ '--extended-properties',
+ dest='extended_properties',
+ metavar=EXT_PROPS_METAVAR,
+ default=None,
+ help=EXT_PROPS_HELP,
+ )
+ parser.add_argument(
+ '--configuration',
+ metavar='<configuration>',
+ type=str,
+ default=None,
+ help=_('ID of the configuration group to attach to the cluster.'),
+ )
return parser
def take_action(self, parsed_args):
database = self.app.client_manager.database
instances = _parse_instance_options(database, parsed_args.instances)
- cluster = database.clusters.create(parsed_args.name,
- parsed_args.datastore,
- parsed_args.datastore_version,
- instances=instances,
- locality=parsed_args.locality)
+ extended_properties = {}
+ if parsed_args.extended_properties:
+ extended_properties = _parse_extended_properties(
+ parsed_args.extended_properties)
+ cluster = database.clusters.create(
+ parsed_args.name,
+ parsed_args.datastore,
+ parsed_args.datastore_version,
+ instances=instances,
+ locality=parsed_args.locality,
+ extended_properties=extended_properties,
+ configuration=parsed_args.configuration)
cluster = set_attributes_for_print_detail(cluster)
return zip(*sorted(six.iteritems(cluster)))
diff --git a/troveclient/tests/osc/v1/test_database_clusters.py b/troveclient/tests/osc/v1/test_database_clusters.py
index 9eb5f9a..9c11f65 100644
--- a/troveclient/tests/osc/v1/test_database_clusters.py
+++ b/troveclient/tests/osc/v1/test_database_clusters.py
@@ -140,15 +140,21 @@ class TestDatabaseClusterCreate(TestClusters):
'flavor="03",volume=3']
parsed_instances = [{'flavor': '02', 'volume': 2},
{'flavor': '03', 'volume': 3}]
+ extended_properties = "foo_properties=foo_value"
+ parsed_extended_properties = {'foo_properties': 'foo_value'}
mock_parse_instance_opts.return_value = parsed_instances
args = ['test-name', 'vertica', '7.1',
'--instance', instances[0],
- '--instance', instances[1]]
+ '--instance', instances[1],
+ '--extended-properties', extended_properties,
+ '--configuration', 'config01']
verifylist = [
('name', 'test-name'),
('datastore', 'vertica'),
('datastore_version', '7.1'),
('instances', instances),
+ ('extended_properties', extended_properties),
+ ('configuration', 'config01'),
]
parsed_args = self.check_parser(self.cmd, args, verifylist)
columns, data = self.cmd.take_action(parsed_args)
@@ -156,7 +162,9 @@ class TestDatabaseClusterCreate(TestClusters):
parsed_args.name, parsed_args.datastore,
parsed_args.datastore_version,
instances=parsed_instances,
- locality=parsed_args.locality)
+ locality=parsed_args.locality,
+ extended_properties=parsed_extended_properties,
+ configuration=parsed_args.configuration)
self.assertEqual(self.columns, columns)
self.assertEqual(self.values, data)
diff --git a/troveclient/v1/shell.py b/troveclient/v1/shell.py
index aef2529..4f05b87 100644
--- a/troveclient/v1/shell.py
+++ b/troveclient/v1/shell.py
@@ -871,6 +871,11 @@ def _parse_instance_options(cs, instance_options, for_grow=False):
return instances
+def _parse_extended_properties(extended_properties):
+ return dict([(k, v) for (k, v) in [kv.strip().split("=")
+ for kv in extended_properties.split(",")]])
+
+
@utils.arg('name',
metavar='<name>',
type=str,
@@ -905,9 +910,8 @@ def do_cluster_create(cs, args):
instances = _parse_instance_options(cs, args.instances)
extended_properties = {}
if args.extended_properties:
- extended_properties = dict([(k, v) for (k, v) in
- [kv.strip().split("=") for kv in
- args.extended_properties.split(",")]])
+ extended_properties = _parse_extended_properties(
+ args.extended_properties)
cluster = cs.clusters.create(args.name,
args.datastore,
args.datastore_version,