diff --git a/releasenotes/notes/add-configuration-attach-detach-to-osc-c5b52784910f2b09.yaml b/releasenotes/notes/add-configuration-attach-detach-to-osc-c5b52784910f2b09.yaml new file mode 100644 index 00000000..4d9e0c1d --- /dev/null +++ b/releasenotes/notes/add-configuration-attach-detach-to-osc-c5b52784910f2b09.yaml @@ -0,0 +1,9 @@ +--- +features: + - | + The command ``trove configuration-attach`` is now available + to use in the python-openstackclient CLI as ``openstack database + configuration attach`` + The command ``trove configuration-detach`` is now available + to use in the python-openstackclient CLI as ``openstack database + configuration detach`` diff --git a/setup.cfg b/setup.cfg index e6185a32..d1a75667 100644 --- a/setup.cfg +++ b/setup.cfg @@ -39,8 +39,10 @@ openstack.database.v1 = database_cluster_delete = troveclient.osc.v1.database_clusters:DeleteDatabaseCluster database_cluster_list = troveclient.osc.v1.database_clusters:ListDatabaseClusters database_cluster_show = troveclient.osc.v1.database_clusters:ShowDatabaseCluster + database_configuration_attach = troveclient.osc.v1.database_configurations:AttachDatabaseConfiguration database_configuration_create = troveclient.osc.v1.database_configurations:CreateDatabaseConfiguration database_configuration_delete = troveclient.osc.v1.database_configurations:DeleteDatabaseConfiguration + database_configuration_detach = troveclient.osc.v1.database_configurations:DetachDatabaseConfiguration database_configuration_list = troveclient.osc.v1.database_configurations:ListDatabaseConfigurations database_configuration_parameter_list = troveclient.osc.v1.database_configurations:ListDatabaseConfigurationParameters database_configuration_parameter_show = troveclient.osc.v1.database_configurations:ShowDatabaseConfigurationParameter diff --git a/troveclient/osc/v1/database_configurations.py b/troveclient/osc/v1/database_configurations.py index 3a587ebe..e4cea26c 100644 --- a/troveclient/osc/v1/database_configurations.py +++ b/troveclient/osc/v1/database_configurations.py @@ -253,3 +253,56 @@ class CreateDatabaseConfiguration(command.ShowOne): datastore_version=parsed_args.datastore_version) config_grp = set_attributes_for_print_detail(config_grp) return zip(*sorted(six.iteritems(config_grp))) + + +class AttachDatabaseConfiguration(command.Command): + + _description = _("Attaches a configuration group to an instance.") + + def get_parser(self, prog_name): + parser = super(AttachDatabaseConfiguration, self).get_parser(prog_name) + parser.add_argument( + 'instance', + metavar='', + type=str, + help=_('ID or name of the instance'), + ) + parser.add_argument( + 'configuration', + metavar='', + type=str, + help=_('ID or name of the configuration group to attach to the ' + 'instance.'), + ) + return parser + + def take_action(self, parsed_args): + manager = self.app.client_manager.database + db_instances = manager.instances + db_configurations = manager.configurations + instance = osc_utils.find_resource(db_instances, + parsed_args.instance) + configuration = osc_utils.find_resource( + db_configurations, parsed_args.configuration) + db_instances.modify(instance, configuration) + + +class DetachDatabaseConfiguration(command.Command): + + _description = _("Detaches a configuration group from an instance.") + + def get_parser(self, prog_name): + parser = super(DetachDatabaseConfiguration, self).get_parser(prog_name) + parser.add_argument( + 'instance', + metavar='', + type=str, + help=_('ID or name of the instance.'), + ) + return parser + + def take_action(self, parsed_args): + db_instances = self.app.client_manager.database.instances + instance = osc_utils.find_resource(db_instances, + parsed_args.instance) + db_instances.modify(instance) diff --git a/troveclient/tests/osc/v1/test_database_configurations.py b/troveclient/tests/osc/v1/test_database_configurations.py index b603a2cf..f48901b4 100644 --- a/troveclient/tests/osc/v1/test_database_configurations.py +++ b/troveclient/tests/osc/v1/test_database_configurations.py @@ -29,6 +29,7 @@ class TestConfigurations(fakes.TestDatabasev1): self.mock_client = self.app.client_manager.database self.configuration_client = (self.app.client_manager.database. configurations) + self.instance_client = self.app.client_manager.database.instances self.configuration_params_client = (self.app.client_manager. database.configuration_parameters) @@ -258,3 +259,37 @@ class TestConfigurationCreate(TestConfigurations): description='cgroup 2', datastore='mysql', datastore_version='5.6') + + +class TestConfigurationAttach(TestConfigurations): + + def setUp(self): + super(TestConfigurationAttach, self).setUp() + self.cmd = database_configurations.\ + AttachDatabaseConfiguration(self.app, None) + + @mock.patch.object(utils, 'find_resource') + def test_configuration_attach(self, mock_find): + args = ['instance1', 'config1'] + mock_find.side_effect = ['instance1', 'config1'] + parsed_args = self.check_parser(self.cmd, args, []) + result = self.cmd.take_action(parsed_args) + self.instance_client.modify.assert_called_with('instance1', 'config1') + self.assertIsNone(result) + + +class TestConfigurationDetach(TestConfigurations): + + def setUp(self): + super(TestConfigurationDetach, self).setUp() + self.cmd = database_configurations.\ + DetachDatabaseConfiguration(self.app, None) + + @mock.patch.object(utils, 'find_resource') + def test_configuration_detach(self, mock_find): + args = ['instance2'] + mock_find.return_value = args[0] + parsed_args = self.check_parser(self.cmd, args, []) + result = self.cmd.take_action(parsed_args) + self.instance_client.modify.assert_called_with('instance2') + self.assertIsNone(result)