diff --git a/karborclient/osc/v1/quotas.py b/karborclient/osc/v1/quotas.py new file mode 100644 index 0000000..b142e80 --- /dev/null +++ b/karborclient/osc/v1/quotas.py @@ -0,0 +1,108 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Data protection V1 quotas action implementations""" + +from osc_lib.command import command + + +def quota_set_pretty_show(quotas): + """Convert quotas object to dict and display.""" + + new_quotas = [] + for quota_k, quota_v in sorted(quotas.to_dict().items()): + if isinstance(quota_v, dict): + quota_v = '\n'.join( + ['%s = %s' % (k, v) for k, v in sorted(quota_v.items())]) + new_quotas.append((quota_k, quota_v)) + + return new_quotas + + +class ShowQuotas(command.ShowOne): + _description = "Shows Quotas" + + def get_parser(self, prog_name): + parser = super(ShowQuotas, self).get_parser(prog_name) + parser.add_argument( + '--tenant', + metavar='', + default=None, + help='ID of tenant to list the quotas for.') + parser.add_argument( + '--detail', + action='store_true', + help='Optional flag to indicate whether to show quota in detail. ' + 'Default false.') + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.data_protection + project_id = parsed_args.tenant or client.http_client.get_project_id() + kwargs = { + "project_id": project_id, + "detail": parsed_args.detail, + } + result = client.quotas.get(**kwargs) + quotas = quota_set_pretty_show(result) + return zip(*sorted(quotas)) + + +class ShowDefaultQuotas(command.ShowOne): + _description = "Shows default Quotas" + + def get_parser(self, prog_name): + parser = super(ShowDefaultQuotas, self).get_parser(prog_name) + parser.add_argument( + '--tenant', + metavar='', + default=None, + help='ID of tenant to list the quotas for.') + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.data_protection + project_id = parsed_args.tenant or client.http_client.get_project_id() + + result = client.quotas.defaults(project_id) + quotas = quota_set_pretty_show(result) + + return zip(*sorted(quotas)) + + +class UpdateQuotas(command.ShowOne): + _description = "Updates Quotas" + + def get_parser(self, prog_name): + parser = super(UpdateQuotas, self).get_parser(prog_name) + parser.add_argument( + 'tenant', + metavar='', + help='ID of tenant to set the quotas for.') + parser.add_argument( + '--plans', + metavar='', + type=int, + default=None, + help='New value for the "plans" quota.') + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.data_protection + project_id = parsed_args.tenant + data = { + "plans": parsed_args.plans, + } + result = client.quotas.update(project_id, data) + quotas = quota_set_pretty_show(result) + + return zip(*sorted(quotas)) diff --git a/karborclient/tests/unit/osc/v1/test_quotas.py b/karborclient/tests/unit/osc/v1/test_quotas.py new file mode 100644 index 0000000..717ed2a --- /dev/null +++ b/karborclient/tests/unit/osc/v1/test_quotas.py @@ -0,0 +1,76 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy + +from karborclient.osc.v1 import quotas as osc_quotas +from karborclient.tests.unit.osc.v1 import fakes +from karborclient.v1 import quotas + + +QUOTA_INFO = { + "id": "73f74f90a1754bd7ad658afb3272323f", + "plans": "40" +} + + +class TestQuotas(fakes.TestDataProtection): + def setUp(self): + super(TestQuotas, self).setUp() + self.quotas_mock = self.app.client_manager.data_protection.quotas + self.quotas_mock.reset_mock() + + +class TestUpdateQuotas(TestQuotas): + def setUp(self): + super(TestUpdateQuotas, self).setUp() + self.quotas_mock.update.return_value = quotas.Quota( + None, copy.deepcopy(QUOTA_INFO)) + self.cmd = osc_quotas.UpdateQuotas(self.app, None) + + def test_quotas_update(self): + arglist = ['--plans', + '40', '73f74f90a1754bd7ad658afb3272323f'] + verifylist = [('plans', 40), + ('tenant', + '73f74f90a1754bd7ad658afb3272323f')] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.quotas_mock.update.assert_called_once_with( + '73f74f90a1754bd7ad658afb3272323f', + {'plans': 40}) + + +class TestShowQuotas(TestQuotas): + def setUp(self): + super(TestShowQuotas, self).setUp() + self._quota_info = copy.deepcopy(QUOTA_INFO) + self.quotas_mock.get.return_value = quotas.Quota( + None, copy.deepcopy(QUOTA_INFO)) + + self.cmd = osc_quotas.ShowQuotas(self.app, None) + + def test_quota_show(self): + arglist = [] + verifylist = [] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(('id', 'plans'), columns) + self.assertEqual(('73f74f90a1754bd7ad658afb3272323f', '40'), + data) diff --git a/setup.cfg b/setup.cfg index 0007102..c016899 100644 --- a/setup.cfg +++ b/setup.cfg @@ -69,6 +69,9 @@ openstack.data_protection.v1 = data_protection_service_list = karborclient.osc.v1.services:ListServices data_protection_service_enable = karborclient.osc.v1.services:EnableService data_protection_service_disable = karborclient.osc.v1.services:DisableService + data_protection_quotas_show = karborclient.osc.v1.quotas:ShowQuotas + data_protection_quotas_default = karborclient.osc.v1.quotas:ShowDefaultQuotas + data_protection_quotas_update = karborclient.osc.v1.quotas:UpdateQuotas [compile_catalog] directory = karborclient/locale