summaryrefslogtreecommitdiff
path: root/openstackclient/volume
diff options
context:
space:
mode:
authorDavid Moreau Simard <dmsimard@iweb.com>2015-06-27 09:31:19 -0400
committerDavid Moreau Simard <dmsimard@iweb.com>2015-06-29 17:24:35 -0400
commit974c9d5793bb00cbcfac799ea18c3b73c0b2455e (patch)
tree6996e8a48d622e715c28dbb9e2beb2ad20002a7c /openstackclient/volume
parent8899bc4162df0c9f235f6c3bf84c601ef06bafb9 (diff)
downloadpython-openstackclient-974c9d5793bb00cbcfac799ea18c3b73c0b2455e.tar.gz
Add support for volume API v2 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: If3c679557ac9abb0dfc75d290b96fb9c8d46c7b7 Partial-Bug: #1467967
Diffstat (limited to 'openstackclient/volume')
-rw-r--r--openstackclient/volume/v2/qos_specs.py303
1 files changed, 303 insertions, 0 deletions
diff --git a/openstackclient/volume/v2/qos_specs.py b/openstackclient/volume/v2/qos_specs.py
new file mode 100644
index 00000000..7f02fa4a
--- /dev/null
+++ b/openstackclient/volume/v2/qos_specs.py
@@ -0,0 +1,303 @@
+# 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 v2 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 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 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 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
+
+
+class ListQos(lister.Lister):
+ """List QoS specifications"""
+
+ log = logging.getLogger(__name__ + '.ListQos')
+
+ 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 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 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 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