From dc055ee999826ace8048ce8b272fdcb34fdc2f79 Mon Sep 17 00:00:00 2001 From: Michael Gugino Date: Thu, 22 Sep 2016 17:31:19 -0400 Subject: [PATCH] Implement support for cinder qos specs Currently, there is no support for creating qos specs and associations in cinder. This patch enables deployers to create qos specs and associate them to any desired cinder volume-types. Change-Id: I5d493fb3987849f071c6df5241466c993009389b --- defaults/main.yml | 17 ++++++++ doc/source/configure-cinder.rst | 24 ++++++++++++ .../notes/qos-support-1c601862ab2f9825.yaml | 5 +++ tasks/cinder_backends.yml | 6 +++ tasks/cinder_qos.yml | 39 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 releasenotes/notes/qos-support-1c601862ab2f9825.yaml create mode 100644 tasks/cinder_qos.yml diff --git a/defaults/main.yml b/defaults/main.yml index 41734c2d..70f3b9ff 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -265,8 +265,25 @@ cinder_services: # by the py_pkgs lookup. cinder_role_project_group: cinder_all +# Define the following dictionary variable to enable qos settings on volumes. +# cinder_qos_specs +# - name: high-iops +# options: +# consumer: front-end +# read_iops_sec: 2000 +# write_iops_sec: 2000 +# cinder_volume_types: +# - volumes-1 +# - volumes-2 +# - name: low-iops +# options: +# consumer: front-end +# write_iops_sec: 100 + ## Tunable overrides cinder_policy_overrides: {} cinder_rootwrap_conf_overrides: {} cinder_api_paste_ini_overrides: {} cinder_cinder_conf_overrides: {} + +_UUID_regex: "[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}" diff --git a/doc/source/configure-cinder.rst b/doc/source/configure-cinder.rst index dbd2abc5..72793138 100644 --- a/doc/source/configure-cinder.rst +++ b/doc/source/configure-cinder.rst @@ -461,3 +461,27 @@ each storage node that will use it. The ``cinder-volume.yml`` playbook will automatically install the ``nfs-common`` file across the hosts, transitioning from an LVM to a NetApp back end. + +Configuring cinder qos specs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Deployers may optionally define the variable ``cinder_qos_specs`` +to create qos specs. This variable is a list of dictionaries that +contain the options for each qos spec. cinder volume-types may be +assigned to a qos spec by defining the key ``cinder_volume_types`` in +the desired qos spec dictionary. + +.. code-block:: console + + - name: high-iops + options: + consumer: front-end + read_iops_sec: 2000 + write_iops_sec: 2000 + cinder_volume_types: + - volumes-1 + - volumes-2 + - name: low-iops + options: + consumer: front-end + write_iops_sec: 100 diff --git a/releasenotes/notes/qos-support-1c601862ab2f9825.yaml b/releasenotes/notes/qos-support-1c601862ab2f9825.yaml new file mode 100644 index 00000000..8c14016e --- /dev/null +++ b/releasenotes/notes/qos-support-1c601862ab2f9825.yaml @@ -0,0 +1,5 @@ +--- +features: + - Deployers can now define the varible ``cinder_qos_specs`` + to create qos specs and assign those specs to desired + cinder volume types. diff --git a/tasks/cinder_backends.yml b/tasks/cinder_backends.yml index cacf5daa..e75b0370 100644 --- a/tasks/cinder_backends.yml +++ b/tasks/cinder_backends.yml @@ -42,3 +42,9 @@ {% endfor %} with_dict: "{{ cinder_backends|default({}) }}" when: item.value.extra_volume_types is defined + +- include: cinder_qos.yml + static: no + when: cinder_qos_specs is defined + tags: + - cinder-qos diff --git a/tasks/cinder_qos.yml b/tasks/cinder_qos.yml new file mode 100644 index 00000000..d0157622 --- /dev/null +++ b/tasks/cinder_qos.yml @@ -0,0 +1,39 @@ +--- +# Copyright 2016, Walmart Stores, 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. + +- name: Add in cinder qos types + shell: | + . {{ ansible_env.HOME }}/openrc + {{ cinder_bin }}/cinder qos-list | grep {{ item.name }} || \ + {{ cinder_bin }}/cinder qos-create {{ item.name }}\ + {% for k,v in item.options.iteritems() %} {{ k }}={{ v }}{% endfor %} + with_items: cinder_qos_specs + tags: + - cinder-qos + +- name: Associate qos types to volume types + shell: | + . {{ ansible_env.HOME }}/openrc + {% for vtype in item.cinder_volume_types %} + {{ cinder_bin }}/cinder qos-associate \ + $({{ cinder_bin }}/cinder qos-list | grep {{ item.name }} | grep -oE "{{ _UUID_regex }}") \ + $({{ cinder_bin }}/cinder type-list | grep {{ vtype }} | grep -oE "{{ _UUID_regex }}") + {% endfor %} + with_items: cinder_qos_specs + when: + - item.cinder_volume_types is defined + tags: + - cinder-qos + - cinder-qos-associate