From 7bb038c4a77c396d1831a4e48dfe1f3a3202c279 Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Tue, 23 Jun 2015 23:16:31 -0400 Subject: 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 --- openstackclient/volume/v1/qos_specs.py | 307 +++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 openstackclient/volume/v1/qos_specs.py (limited to 'openstackclient/volume') 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='', + help='New QoS specification name', + ) + consumer_choices = ['front-end', 'back-end', 'both'] + parser.add_argument( + '--consumer', + metavar='', + 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='', + 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='', + 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='', + 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='', + help='QoS specification to modify (name or ID)', + ) + parser.add_argument( + '--property', + metavar='', + 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='', + help='QoS specification to modify (name or ID)', + ) + parser.add_argument( + '--property', + metavar='', + 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='', + help='QoS specification to modify (name or ID)', + ) + parser.add_argument( + 'volume_type', + metavar='', + 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='', + help='QoS specification to modify (name or ID)', + ) + volume_type_group = parser.add_mutually_exclusive_group() + volume_type_group.add_argument( + '--volume-type', + metavar='', + 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 -- cgit v1.2.1