diff options
| author | David Moreau Simard <dmsimard@iweb.com> | 2015-06-23 23:16:31 -0400 |
|---|---|---|
| committer | David Moreau Simard <dmsimard@iweb.com> | 2015-06-26 23:19:08 -0400 |
| commit | 7bb038c4a77c396d1831a4e48dfe1f3a3202c279 (patch) | |
| tree | 6896ac0471f52edff26f275d013fa184ce3455f7 /openstackclient/volume | |
| parent | af7f64eae5c89ca5faf380ec03d1d9f31707b2a9 (diff) | |
| download | python-openstackclient-7bb038c4a77c396d1831a4e48dfe1f3a3202c279.tar.gz | |
Add support for volume API v1 QoS commands
This commit adds the following commands:
volume qos associate
volume qos create
volume qos delete
volume qos disassociate
volume qos list
volume qos set
volume qos show
volume qos unset
Change-Id: I72ea1b9a4d0bd0e35eda03071ea438b75439fce9
Partial-Bug: #1467967
Diffstat (limited to 'openstackclient/volume')
| -rw-r--r-- | openstackclient/volume/v1/qos_specs.py | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/openstackclient/volume/v1/qos_specs.py b/openstackclient/volume/v1/qos_specs.py new file mode 100644 index 00000000..634b6297 --- /dev/null +++ b/openstackclient/volume/v1/qos_specs.py @@ -0,0 +1,307 @@ +# Copyright 2015 iWeb Technologies Inc. +# +# 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. +# + +"""Volume v1 QoS action implementations""" + +import logging +import six + +from cliff import command +from cliff import lister +from cliff import show + +from openstackclient.common import parseractions +from openstackclient.common import utils + + +class CreateQos(show.ShowOne): + """Create new QoS specification""" + + log = logging.getLogger(__name__ + '.CreateQos') + + def get_parser(self, prog_name): + parser = super(CreateQos, self).get_parser(prog_name) + parser.add_argument( + 'name', + metavar='<name>', + help='New QoS specification name', + ) + consumer_choices = ['front-end', 'back-end', 'both'] + parser.add_argument( + '--consumer', + metavar='<consumer>', + choices=consumer_choices, + default='both', + help='Consumer of the QoS. Valid consumers: %s ' + "(defaults to 'both')" % utils.format_list(consumer_choices) + ) + parser.add_argument( + '--property', + metavar='<key=value>', + action=parseractions.KeyValueAction, + help='Set a QoS specification property ' + '(repeat option to set multiple properties)', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + specs = {} + specs.update({'consumer': parsed_args.consumer}) + + if parsed_args.property: + specs.update(parsed_args.property) + + qos_specs = volume_client.qos_specs.create(parsed_args.name, specs) + + return zip(*sorted(six.iteritems(qos_specs._info))) + + +class DeleteQos(command.Command): + """Delete QoS specification""" + + log = logging.getLogger(__name__ + '.DeleteQos') + + def get_parser(self, prog_name): + parser = super(DeleteQos, self).get_parser(prog_name) + parser.add_argument( + 'qos_specs', + metavar='<qos-specs>', + help='QoS specification to delete (name or ID)', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs = utils.find_resource(volume_client.qos_specs, + parsed_args.qos_specs) + + volume_client.qos_specs.delete(qos_specs.id) + + return + + +class ListQos(lister.Lister): + """List QoS specifications""" + + log = logging.getLogger(__name__ + '.ListQos') + + def get_parser(self, prog_name): + parser = super(ListQos, self).get_parser(prog_name) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs_list = volume_client.qos_specs.list() + + for qos in qos_specs_list: + qos_associations = volume_client.qos_specs.get_associations(qos) + if qos_associations: + associations = [association.name + for association in qos_associations] + qos._info.update({'associations': associations}) + + columns = ('ID', 'Name', 'Consumer', 'Associations', 'Specs') + return (columns, + (utils.get_dict_properties( + s._info, columns, + formatters={ + 'Specs': utils.format_dict, + 'Associations': utils.format_list + }, + ) for s in qos_specs_list)) + + +class ShowQos(show.ShowOne): + """Display QoS specification details""" + + log = logging.getLogger(__name__ + '.ShowQos') + + def get_parser(self, prog_name): + parser = super(ShowQos, self).get_parser(prog_name) + parser.add_argument( + 'qos_specs', + metavar='<qos-specs>', + help='QoS specification to display (name or ID)', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs = utils.find_resource(volume_client.qos_specs, + parsed_args.qos_specs) + + qos_associations = volume_client.qos_specs.get_associations(qos_specs) + if qos_associations: + associations = [association.name + for association in qos_associations] + qos_specs._info.update({ + 'associations': utils.format_list(associations) + }) + qos_specs._info.update({'specs': utils.format_dict(qos_specs.specs)}) + + return zip(*sorted(six.iteritems(qos_specs._info))) + + +class SetQos(command.Command): + """Set QoS specification properties""" + + log = logging.getLogger(__name__ + '.SetQos') + + def get_parser(self, prog_name): + parser = super(SetQos, self).get_parser(prog_name) + parser.add_argument( + 'qos_specs', + metavar='<qos-specs>', + help='QoS specification to modify (name or ID)', + ) + parser.add_argument( + '--property', + metavar='<key=value>', + action=parseractions.KeyValueAction, + help='Property to add or modify for this QoS specification ' + '(repeat option to set multiple properties)', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs = utils.find_resource(volume_client.qos_specs, + parsed_args.qos_specs) + + if parsed_args.property: + volume_client.qos_specs.set_keys(qos_specs.id, + parsed_args.property) + else: + self.app.log.error("No changes requested\n") + + return + + +class UnsetQos(command.Command): + """Unset QoS specification properties""" + + log = logging.getLogger(__name__ + '.SetQos') + + def get_parser(self, prog_name): + parser = super(UnsetQos, self).get_parser(prog_name) + parser.add_argument( + 'qos_specs', + metavar='<qos-specs>', + help='QoS specification to modify (name or ID)', + ) + parser.add_argument( + '--property', + metavar='<key>', + action='append', + default=[], + help='Property to remove from the QoS specification. ' + '(repeat option to unset multiple properties)', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs = utils.find_resource(volume_client.qos_specs, + parsed_args.qos_specs) + + if parsed_args.property: + volume_client.qos_specs.unset_keys(qos_specs.id, + parsed_args.property) + else: + self.app.log.error("No changes requested\n") + + return + + +class AssociateQos(command.Command): + """Associate a QoS specification to a volume type""" + + log = logging.getLogger(__name__ + '.AssociateQos') + + def get_parser(self, prog_name): + parser = super(AssociateQos, self).get_parser(prog_name) + parser.add_argument( + 'qos_specs', + metavar='<qos-specs>', + help='QoS specification to modify (name or ID)', + ) + parser.add_argument( + 'volume_type', + metavar='<volume-type>', + help='Volume type to associate the QoS (name or ID)', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs = utils.find_resource(volume_client.qos_specs, + parsed_args.qos_specs) + volume_type = utils.find_resource(volume_client.volume_types, + parsed_args.volume_type) + + volume_client.qos_specs.associate(qos_specs.id, volume_type.id) + + return + + +class DisassociateQos(command.Command): + """Disassociate a QoS specification from a volume type""" + + log = logging.getLogger(__name__ + '.DisassociateQos') + + def get_parser(self, prog_name): + parser = super(DisassociateQos, self).get_parser(prog_name) + parser.add_argument( + 'qos_specs', + metavar='<qos-specs>', + help='QoS specification to modify (name or ID)', + ) + volume_type_group = parser.add_mutually_exclusive_group() + volume_type_group.add_argument( + '--volume-type', + metavar='<volume-type>', + help='Volume type to disassociate the QoS from (name or ID)', + ) + volume_type_group.add_argument( + '--all', + action='store_true', + default=False, + help='Disassociate the QoS from every volume type', + ) + + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)', parsed_args) + volume_client = self.app.client_manager.volume + qos_specs = utils.find_resource(volume_client.qos_specs, + parsed_args.qos_specs) + + if parsed_args.volume_type: + volume_type = utils.find_resource(volume_client.volume_types, + parsed_args.volume_type) + volume_client.qos_specs.disassociate(qos_specs.id, volume_type.id) + elif parsed_args.all: + volume_client.qos_specs.disassociate_all(qos_specs.id) + + return |
