diff --git a/releasenotes/notes/add-configuration-parameter-list-to-osc-3d1a383999dd2d64.yaml b/releasenotes/notes/add-configuration-parameter-list-to-osc-3d1a383999dd2d64.yaml new file mode 100644 index 00000000..4b18bbc3 --- /dev/null +++ b/releasenotes/notes/add-configuration-parameter-list-to-osc-3d1a383999dd2d64.yaml @@ -0,0 +1,5 @@ +--- +features: + - The command ``trove configuration-parameter-list`` is now available to + use in the python-openstackclient CLI as ``openstack database + configuration parameter list`` diff --git a/setup.cfg b/setup.cfg index 032800a8..04a02c8d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,6 +35,7 @@ openstack.database.v1 = database_cluster_list = troveclient.osc.v1.database_clusters:ListDatabaseClusters database_cluster_show = troveclient.osc.v1.database_clusters:ShowDatabaseCluster database_configuration_list = troveclient.osc.v1.database_configurations:ListDatabaseConfigurations + database_configuration_parameter_list = troveclient.osc.v1.database_configurations:ListDatabaseConfigurationParameters database_configuration_show = troveclient.osc.v1.database_configurations:ShowDatabaseConfiguration database_flavor_list = troveclient.osc.v1.database_flavors:ListDatabaseFlavors database_flavor_show = troveclient.osc.v1.database_flavors:ShowDatabaseFlavor diff --git a/troveclient/osc/v1/database_configurations.py b/troveclient/osc/v1/database_configurations.py index 59deea60..eb0d5d48 100644 --- a/troveclient/osc/v1/database_configurations.py +++ b/troveclient/osc/v1/database_configurations.py @@ -17,7 +17,9 @@ from osc_lib.command import command from osc_lib import utils as osc_utils import six +from troveclient import exceptions from troveclient.i18n import _ +from troveclient import utils def set_attributes_for_print_detail(configuration): @@ -80,3 +82,51 @@ class ShowDatabaseConfiguration(command.ShowOne): db_configurations, parsed_args.configuration_group) configuration = set_attributes_for_print_detail(configuration) return zip(*sorted(six.iteritems(configuration))) + + +class ListDatabaseConfigurationParameters(command.Lister): + + _description = _("Lists available parameters for a configuration group.") + columns = ['Name', 'Type', 'Min Size', 'Max Size', 'Restart Required'] + + def get_parser(self, prog_name): + parser = super(ListDatabaseConfigurationParameters, self).\ + get_parser(prog_name) + parser.add_argument( + 'datastore_version', + metavar='', + help=_('Datastore version name or ID assigned' + 'to the configuration group.') + ) + parser.add_argument( + '--datastore', + metavar='', + default=None, + help=_('ID or name of the datastore to list configuration' + 'parameters for. Optional if the ID of the' + 'datastore_version is provided.') + ) + return parser + + 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) + else: + raise exceptions.NoUniqueMatch(_('The datastore name or id is' + ' required to retrieve the' + ' parameters for the' + ' configuration group' + ' by name.')) + for param in params: + setattr(param, 'min_size', getattr(param, 'min', '-')) + setattr(param, 'max_size', getattr(param, 'max', '-')) + params = [osc_utils.get_item_properties(p, self.columns) + for p in params] + return self.columns, params diff --git a/troveclient/tests/osc/v1/fakes.py b/troveclient/tests/osc/v1/fakes.py index 934ad1c7..f650c94f 100644 --- a/troveclient/tests/osc/v1/fakes.py +++ b/troveclient/tests/osc/v1/fakes.py @@ -17,6 +17,7 @@ from troveclient.tests import fakes from troveclient.tests.osc import utils from troveclient.v1 import backups from troveclient.v1 import clusters +from troveclient.v1 import configurations from troveclient.v1 import databases from troveclient.v1 import datastores from troveclient.v1 import flavors @@ -57,7 +58,17 @@ class FakeConfigurations(object): [2]['configurations']) def get_configurations_c_123(self): - return flavors.Flavor(None, self.fake_config[0]) + return configurations.Configuration(None, self.fake_config[0]) + + +class FakeConfigurationParameters(object): + fake_config_param = (fakes.FakeHTTPClient(). + get_datastores_d_123_versions_v_156_parameters() + [2]['configuration-parameters']) + + def get_params_connect_timeout(self): + return configurations.\ + ConfigurationParameter(None, self.fake_config_param[1]) class FakeLimits(object): diff --git a/troveclient/tests/osc/v1/test_database_configurations.py b/troveclient/tests/osc/v1/test_database_configurations.py index 81769711..2f76c1c3 100644 --- a/troveclient/tests/osc/v1/test_database_configurations.py +++ b/troveclient/tests/osc/v1/test_database_configurations.py @@ -11,18 +11,22 @@ # under the License. from troveclient import common +from troveclient import exceptions from troveclient.osc.v1 import database_configurations from troveclient.tests.osc.v1 import fakes class TestConfigurations(fakes.TestDatabasev1): fake_configurations = fakes.FakeConfigurations() + fake_configuration_params = fakes.FakeConfigurationParameters() def setUp(self): super(TestConfigurations, self).setUp() self.mock_client = self.app.client_manager.database self.configuration_client = (self.app.client_manager.database. configurations) + self.configuration_params_client = (self.app.client_manager. + database.configuration_parameters) class TestConfigurationList(TestConfigurations): @@ -77,3 +81,43 @@ class TestConfigurationShow(TestConfigurations): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) self.assertEqual(self.values, data) + + +class TestConfigurationParameterList(TestConfigurations): + + columns = database_configurations.\ + ListDatabaseConfigurationParameters.columns + values = ('connect_timeout', 'integer', 2, 31536000, 'false') + + def setUp(self): + super(TestConfigurationParameterList, self).setUp() + self.cmd = database_configurations.\ + ListDatabaseConfigurationParameters(self.app, None) + data = [self.fake_configuration_params.get_params_connect_timeout()] + self.configuration_params_client.parameters.return_value =\ + common.Paginated(data) + self.configuration_params_client.parameters_by_version.return_value =\ + common.Paginated(data) + + def test_configuration_parameters_list_defaults(self): + args = ['d-123', '--datastore', 'mysql'] + verifylist = [ + ('datastore_version', 'd-123'), + ('datastore', 'mysql'), + ] + parsed_args = self.check_parser(self.cmd, args, verifylist) + columns, data = self.cmd.take_action(parsed_args) + self.assertEqual(self.columns, columns) + self.assertEqual([tuple(self.values)], data) + + def test_configuration_parameters_list_with_version_id_exception(self): + args = [ + 'd-123', + ] + verifylist = [ + ('datastore_version', 'd-123'), + ] + parsed_args = self.check_parser(self.cmd, args, verifylist) + self.assertRaises(exceptions.NoUniqueMatch, + self.cmd.take_action, + parsed_args)