Add quota commands to OSC
This change adds database support for the python-openstackclient project for the quota-show and quota-update commands. The trove command quota-show is now: openstack database quota show The trove command quota-update is now: openstack database quota update Change-Id: I989b360fd358004e1a2378bdc3a573450baff2f3 Partially-Implements: blueprint trove-support-in-python-openstackclient Signed-off-by: Zhao Chao <zhaochao1984@gmail.com>
This commit is contained in:
@@ -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``.
|
@@ -61,6 +61,8 @@ openstack.database.v1 =
|
|||||||
database_instance_resize_flavor = troveclient.osc.v1.database_instances:ResizeDatabaseInstanceFlavor
|
database_instance_resize_flavor = troveclient.osc.v1.database_instances:ResizeDatabaseInstanceFlavor
|
||||||
database_instance_show = troveclient.osc.v1.database_instances:ShowDatabaseInstance
|
database_instance_show = troveclient.osc.v1.database_instances:ShowDatabaseInstance
|
||||||
database_limit_list = troveclient.osc.v1.database_limits:ListDatabaseLimits
|
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_disable = troveclient.osc.v1.database_root:DisableDatabaseRoot
|
||||||
database_root_enable = troveclient.osc.v1.database_root:EnableDatabaseRoot
|
database_root_enable = troveclient.osc.v1.database_root:EnableDatabaseRoot
|
||||||
database_root_show = troveclient.osc.v1.database_root:ShowDatabaseRoot
|
database_root_show = troveclient.osc.v1.database_root:ShowDatabaseRoot
|
||||||
|
74
troveclient/osc/v1/database_quota.py
Normal file
74
troveclient/osc/v1/database_quota.py
Normal file
@@ -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,
|
"to_port": 3306,
|
||||||
"security_group_id": "2",
|
"security_group_id": "2",
|
||||||
"cidr": "15.0.0.0/24", "id": 3}]})
|
"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 flavors
|
||||||
from troveclient.v1 import instances
|
from troveclient.v1 import instances
|
||||||
from troveclient.v1 import limits
|
from troveclient.v1 import limits
|
||||||
|
from troveclient.v1 import quota
|
||||||
from troveclient.v1 import users
|
from troveclient.v1 import users
|
||||||
|
|
||||||
|
|
||||||
@@ -157,3 +158,13 @@ class FakeRoot(object):
|
|||||||
|
|
||||||
def delete_instance_1234_root(self):
|
def delete_instance_1234_root(self):
|
||||||
return fakes.FakeHTTPClient().delete_instances_1234_root()[2]
|
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]
|
||||||
|
59
troveclient/tests/osc/v1/test_database_quota.py
Normal file
59
troveclient/tests/osc/v1/test_database_quota.py
Normal file
@@ -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)
|
Reference in New Issue
Block a user