Merge "Add quota commands to OSC"
This commit is contained in:
commit
da0bbae4e1
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
features:
|
||||
- |
|
||||
The command ``trove quota-show`` is now available to use in the
|
||||
python-openstackclient CLI as ``openstack database quota show``.
|
||||
- |
|
||||
The command ``trove quota-update`` is now available to use in the
|
||||
python-openstackclient CLI as ``openstack database quota update``.
|
|
@ -64,6 +64,8 @@ openstack.database.v1 =
|
|||
database_instance_show = troveclient.osc.v1.database_instances:ShowDatabaseInstance
|
||||
database_instance_upgrade = troveclient.osc.v1.database_instances:UpgradeDatabaseInstance
|
||||
database_limit_list = troveclient.osc.v1.database_limits:ListDatabaseLimits
|
||||
database_quota_show = troveclient.osc.v1.database_quota:ShowDatabaseQuota
|
||||
database_quota_update = troveclient.osc.v1.database_quota:UpdateDatabaseQuota
|
||||
database_root_disable = troveclient.osc.v1.database_root:DisableDatabaseRoot
|
||||
database_root_enable = troveclient.osc.v1.database_root:EnableDatabaseRoot
|
||||
database_root_show = troveclient.osc.v1.database_root:ShowDatabaseRoot
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
# 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.
|
||||
|
||||
"""Database v1 Quota action implementations"""
|
||||
|
||||
from osc_lib.command import command
|
||||
from osc_lib import utils as osc_utils
|
||||
import six
|
||||
|
||||
from troveclient.i18n import _
|
||||
|
||||
|
||||
class ShowDatabaseQuota(command.Lister):
|
||||
|
||||
_description = _("Show quotas for a tenant.")
|
||||
columns = ['Resource', 'In Use', 'Reserved', 'Limit']
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowDatabaseQuota, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'tenant_id',
|
||||
metavar='<tenant_id>',
|
||||
help=_('Id of tenant for which to show quotas.'),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
db_quota = self.app.client_manager.database.quota
|
||||
quota = [osc_utils.get_item_properties(q, self.columns)
|
||||
for q in db_quota.show(parsed_args.tenant_id)]
|
||||
return self.columns, quota
|
||||
|
||||
|
||||
class UpdateDatabaseQuota(command.ShowOne):
|
||||
|
||||
_description = _("Update quotas for a tenant.")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateDatabaseQuota, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'tenant_id',
|
||||
metavar='<tenant_id>',
|
||||
help=_('Id of tenant for which to update quotas.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'resource',
|
||||
metavar='<resource>',
|
||||
help=_('Id of resource to change.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'limit',
|
||||
metavar='<limit>',
|
||||
type=int,
|
||||
help=_('New limit to set for the named resource.'),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
db_quota = self.app.client_manager.database.quota
|
||||
update_params = {
|
||||
parsed_args.resource: parsed_args.limit
|
||||
}
|
||||
updated_quota = db_quota.update(parsed_args.tenant_id,
|
||||
update_params)
|
||||
return zip(*sorted(six.iteritems(updated_quota)))
|
|
@ -759,3 +759,27 @@ class FakeHTTPClient(base_client.HTTPClient):
|
|||
"to_port": 3306,
|
||||
"security_group_id": "2",
|
||||
"cidr": "15.0.0.0/24", "id": 3}]})
|
||||
|
||||
def get_quotas(self, **kw):
|
||||
return (200, {}, {"quotas": [
|
||||
{
|
||||
"reserved": 1,
|
||||
"resource": "instances",
|
||||
"limit": 10,
|
||||
"in_use": 2
|
||||
},
|
||||
{
|
||||
"reserved": 3,
|
||||
"resource": "backups",
|
||||
"limit": 50,
|
||||
"in_use": 4
|
||||
},
|
||||
{
|
||||
"reserved": 5,
|
||||
"resource": "volumes",
|
||||
"limit": 40,
|
||||
"in_use": 6
|
||||
}]})
|
||||
|
||||
def update_instances_quota(self, **kw):
|
||||
return (200, {}, {"quotas": {"instances": 51}})
|
||||
|
|
|
@ -23,6 +23,7 @@ from troveclient.v1 import datastores
|
|||
from troveclient.v1 import flavors
|
||||
from troveclient.v1 import instances
|
||||
from troveclient.v1 import limits
|
||||
from troveclient.v1 import quota
|
||||
from troveclient.v1 import users
|
||||
|
||||
|
||||
|
@ -157,3 +158,13 @@ class FakeRoot(object):
|
|||
|
||||
def delete_instance_1234_root(self):
|
||||
return fakes.FakeHTTPClient().delete_instances_1234_root()[2]
|
||||
|
||||
|
||||
class FakeQuota(object):
|
||||
fake_quotas = fakes.FakeHTTPClient().get_quotas()[2]['quotas']
|
||||
fake_instances_quota = (fakes.FakeHTTPClient()
|
||||
.update_instances_quota()[2]['quotas'])
|
||||
|
||||
def get_quotas(self):
|
||||
return [quota.Quotas.resource_class(None, q)
|
||||
for q in self.fake_quotas]
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
# 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.
|
||||
|
||||
from troveclient.osc.v1 import database_quota
|
||||
from troveclient.tests.osc.v1 import fakes
|
||||
|
||||
|
||||
class TestQuota(fakes.TestDatabasev1):
|
||||
fake_quota = fakes.FakeQuota()
|
||||
|
||||
def setUp(self):
|
||||
super(TestQuota, self).setUp()
|
||||
self.mock_client = self.app.client_manager.database
|
||||
self.quota_client = self.app.client_manager.database.quota
|
||||
|
||||
|
||||
class TestQuotaShow(TestQuota):
|
||||
columns = database_quota.ShowDatabaseQuota.columns
|
||||
values = [('instances', 2, 1, 10),
|
||||
('backups', 4, 3, 50),
|
||||
('volumes', 6, 5, 40)]
|
||||
|
||||
def setUp(self):
|
||||
super(TestQuotaShow, self).setUp()
|
||||
self.cmd = database_quota.ShowDatabaseQuota(self.app, None)
|
||||
self.data = self.fake_quota.get_quotas()
|
||||
self.quota_client.show.return_value = self.data
|
||||
|
||||
def test_show_quotas(self):
|
||||
args = ['tenant_id']
|
||||
parsed_args = self.check_parser(self.cmd, args, [])
|
||||
columns, data = self.cmd.take_action(parsed_args)
|
||||
self.assertEqual(self.columns, columns)
|
||||
self.assertEqual(self.values, data)
|
||||
|
||||
|
||||
class TestQuotaUpdate(TestQuota):
|
||||
|
||||
def setUp(self):
|
||||
super(TestQuotaUpdate, self).setUp()
|
||||
self.cmd = database_quota.UpdateDatabaseQuota(self.app, None)
|
||||
self.data = self.fake_quota.fake_instances_quota
|
||||
self.quota_client.update.return_value = self.data
|
||||
|
||||
def test_update_quota(self):
|
||||
args = ['tenant_id', 'instances', '51']
|
||||
parsed_args = self.check_parser(self.cmd, args, [])
|
||||
columns, data = self.cmd.take_action(parsed_args)
|
||||
self.assertEqual(('instances',), columns)
|
||||
self.assertEqual((51,), data)
|
Loading…
Reference in New Issue