diff options
-rw-r--r-- | .zuul.yaml | 15 | ||||
-rw-r--r-- | README.rst | 2 | ||||
-rw-r--r-- | troveclient/apiclient/base.py | 2 | ||||
-rw-r--r-- | troveclient/compat/base.py | 2 | ||||
-rw-r--r-- | troveclient/compat/client.py | 4 | ||||
-rw-r--r-- | troveclient/osc/v1/database_clusters.py | 34 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_database_clusters.py | 12 | ||||
-rw-r--r-- | troveclient/v1/shell.py | 10 |
8 files changed, 64 insertions, 17 deletions
@@ -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 @@ -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, |