From 9ac1cd15bdeddc28a70a384db100d77e3fe189a0 Mon Sep 17 00:00:00 2001 From: Graham Hayes Date: Tue, 28 Jun 2016 19:15:57 +0100 Subject: [PATCH] Add quota set / list / reset commands Added: openstack dns quota - list - set - reset All sub commands can be scoped to a project using --project-id If the --project-id does not match the current project id it will set X-Auth-All-Projects:True This cannot be a standard quota command as osc does not allow us to access that command Change-Id: I8e22535be042608022ef1d1cb3866e7aa5324e84 Depends-On: I7a0b828824ad6f274d922748f5f9a68157cd939a Related-Bug: #1587927 --- designateclient/v2/cli/quotas.py | 133 ++++++++++++++++++ designateclient/v2/client.py | 2 + designateclient/v2/quotas.py | 27 ++++ .../quota-commands-7ff037bddae95771.yaml | 8 ++ setup.cfg | 4 + 5 files changed, 174 insertions(+) create mode 100644 designateclient/v2/cli/quotas.py create mode 100644 designateclient/v2/quotas.py create mode 100644 releasenotes/notes/quota-commands-7ff037bddae95771.yaml diff --git a/designateclient/v2/cli/quotas.py b/designateclient/v2/cli/quotas.py new file mode 100644 index 0000000..a9e1e32 --- /dev/null +++ b/designateclient/v2/cli/quotas.py @@ -0,0 +1,133 @@ +# Copyright 2014 Hewlett-Packard Development Company, L.P. +# +# Author: Endre Karlson +# +# 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 itertools +import logging + +from cliff import command +from cliff import show +import six + +from designateclient.v2.cli import common + +LOG = logging.getLogger(__name__) + + +DNS_QUOTAS = { + "api_export_size": "api-export-size", + "recordset_records": "recordset-records", + "zone_records": "zone-records", + "zone_recordsets": "zone-recordsets", + "zones": "zones" +} + + +class ListQuotasCommand(show.ShowOne): + """List quotas""" + + # columns = ['resource', 'hard_limit'] + + def get_parser(self, prog_name): + parser = super(ListQuotasCommand, self).get_parser(prog_name) + + common.add_all_common_options(parser) + + parser.add_argument( + '--project-id', + help="Project ID Default: current project") + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + proj_id = parsed_args.project_id or client.session.get_project_id() + + if parsed_args.project_id != client.session.get_project_id(): + common.set_all_projects(client, True) + + data = client.quotas.list(proj_id) + return six.moves.zip(*sorted(six.iteritems(data))) + + +class SetQuotasCommand(show.ShowOne): + """Set blacklist properties""" + + def _build_options_list(self): + return itertools.chain(DNS_QUOTAS.items()) + + def get_parser(self, prog_name): + parser = super(SetQuotasCommand, self).get_parser(prog_name) + + common.add_all_common_options(parser) + + parser.add_argument('--project-id', help="Project ID") + for k, v in self._build_options_list(): + parser.add_argument( + '--%s' % v, + metavar='<%s>' % v, + dest=k, + type=int, + help='New value for the %s quota' % v, + ) + + return parser + + def take_action(self, parsed_args): + + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + quotas = {} + for k, v in DNS_QUOTAS.items(): + value = getattr(parsed_args, k, None) + if value is not None: + quotas[k] = value + + proj_id = parsed_args.project_id or client.session.get_project_id() + + if parsed_args.project_id != client.session.get_project_id(): + common.set_all_projects(client, True) + + updated = client.quotas.update(proj_id, quotas) + + return six.moves.zip(*sorted(six.iteritems(updated))) + + +class ResetQuotasCommand(command.Command): + """Delete blacklist""" + + def get_parser(self, prog_name): + parser = super(ResetQuotasCommand, self).get_parser(prog_name) + + common.add_all_common_options(parser) + + parser.add_argument('--project-id', help="Project ID") + + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.dns + common.set_all_common_headers(client, parsed_args) + + proj_id = parsed_args.project_id or client.session.get_project_id() + + if parsed_args.project_id != client.session.get_project_id(): + common.set_all_projects(client, True) + + client.quotas.reset(proj_id) + + LOG.info('Quota for project %s was reset', parsed_args.project_id) diff --git a/designateclient/v2/client.py b/designateclient/v2/client.py index e7eba3b..4e9abbc 100644 --- a/designateclient/v2/client.py +++ b/designateclient/v2/client.py @@ -20,6 +20,7 @@ from designateclient.v2.blacklists import BlacklistController from designateclient.v2.limits import LimitController from designateclient.v2.nameservers import NameServerController from designateclient.v2.pools import PoolController +from designateclient.v2.quotas import QuotasController from designateclient.v2.recordsets import RecordSetController from designateclient.v2.reverse import FloatingIPController from designateclient.v2.service_statuses import ServiceStatusesController @@ -133,3 +134,4 @@ class Client(object): self.zone_exports = ZoneExportsController(self) self.zone_imports = ZoneImportsController(self) self.pools = PoolController(self) + self.quotas = QuotasController(self) diff --git a/designateclient/v2/quotas.py b/designateclient/v2/quotas.py new file mode 100644 index 0000000..6377a41 --- /dev/null +++ b/designateclient/v2/quotas.py @@ -0,0 +1,27 @@ +# Copyright 2015 Hewlett-Packard Development Company, L.P. +# +# Author: Endre Karlson +# +# 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 designateclient.v2.base import V2Controller + + +class QuotasController(V2Controller): + def list(self, project_id): + return self._get('/quotas/%s' % project_id) + + def update(self, project_id, values): + return self._patch('/quotas/%s' % project_id, data=values) + + def reset(self, project_id): + return self._delete('/quotas/%s' % project_id) diff --git a/releasenotes/notes/quota-commands-7ff037bddae95771.yaml b/releasenotes/notes/quota-commands-7ff037bddae95771.yaml new file mode 100644 index 0000000..d640000 --- /dev/null +++ b/releasenotes/notes/quota-commands-7ff037bddae95771.yaml @@ -0,0 +1,8 @@ +--- +features: + - added openstack dns quota command + + list + set + reset sub commands + + All sub commands can be scoped to a project using --project-id + If the --project-id does not match the current project id + it will set X-Auth-All-Projects:True diff --git a/setup.cfg b/setup.cfg index a81689a..64f097b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -143,6 +143,10 @@ openstack.dns.v2 = dns_service_list = designateclient.v2.cli.service_statuses:ListServiceStatusesCommand dns_service_show = designateclient.v2.cli.service_statuses:ShowServiceStatusCommand + dns_quota_list = designateclient.v2.cli.quotas:ListQuotasCommand + dns_quota_set = designateclient.v2.cli.quotas:SetQuotasCommand + dns_quota_reset = designateclient.v2.cli.quotas:ResetQuotasCommand + [build_sphinx] all_files = 1 build-dir = doc/build