Add OSC commands for quota API

Change-Id: I3b7afc0df984b015fb7a8b5488d447c470bd2a12
Implements: blueprint support-quotas-in-karbor
This commit is contained in:
chenying
2017-11-24 17:47:17 +08:00
parent 3a22b3fcdd
commit 8cf80d3041
3 changed files with 187 additions and 0 deletions

View File

@@ -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='<tenant>',
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='<tenant>',
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='<tenant>',
help='ID of tenant to set the quotas for.')
parser.add_argument(
'--plans',
metavar='<plans>',
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))

View File

@@ -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)

View File

@@ -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