From c8e8c39221e5ad62f3e5fded04542024b9f9a00d Mon Sep 17 00:00:00 2001 From: sreesiv Date: Mon, 12 Dec 2016 20:06:44 +0530 Subject: [PATCH] Release Candidate #4 -- Additional requirements as per mail on 09-Dec-16 adding cinder service name, non-mandatory volume_type, addition of use_multipath_for_image_xfer, nimble_subnet_label, and nimble_pool_name. --- cinder_nimble-1.0-1.0.0-1.noarch.rpm | Bin 21376 -> 22220 bytes .../puppet/manifests/default_type.pp | 6 +- .../puppet/manifests/disable_default_type.pp | 6 +- .../puppet/manifests/hiera_override.pp | 33 +- .../manifests/backend/enable_backend.pp | 2 +- .../backend/set_extraspecs_encryption.pp | 5 +- .../backend/set_extraspecs_multi_init.pp | 5 +- .../backend/set_extraspecs_perfpol.pp | 14 +- .../manifests/backend/set_nimble_backend.pp | 38 +- .../backend/set_nimble_cinder_type.pp | 2 - deployment_tasks.yaml | 4 +- environment_config.yaml | 586 ++++++++++++++---- metadata.yaml | 4 +- 13 files changed, 539 insertions(+), 166 deletions(-) diff --git a/cinder_nimble-1.0-1.0.0-1.noarch.rpm b/cinder_nimble-1.0-1.0.0-1.noarch.rpm index 6c679be74d22add4679aeab31dfe2a1b87d5da30..65b7fff131ede9da371e0c0e5538b9853ad196a1 100644 GIT binary patch delta 14889 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

*QZwFmolSqzF%K~E*C1&eMz$@vUMG$ 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 JMnGj@`9C?X5LN&H diff --git a/deployment_scripts/puppet/manifests/default_type.pp b/deployment_scripts/puppet/manifests/default_type.pp index 4000751..00a14dd 100644 --- a/deployment_scripts/puppet/manifests/default_type.pp +++ b/deployment_scripts/puppet/manifests/default_type.pp @@ -5,7 +5,8 @@ $cinder_nimble = hiera_hash('cinder_nimble', {}) define plugin_cinder_nimble::check_if_default_backend_is_enabled ( ) { - if ($cinder_nimble["nimble${name}_default_backend"]) == true { + if (($cinder_nimble["nimble${name}_default_backend"]) == true) and + (($cinder_nimble["nimble${name}_backend_type"]) != '') { class { 'plugin_cinder_nimble::backend::set_default_type' : config_file => $config_file, nimble_backend_type => $cinder_nimble["nimble${name}_backend_type"], @@ -14,7 +15,8 @@ define plugin_cinder_nimble::check_if_default_backend_is_enabled ( } if ($cinder_nimble['nimble_grouping']) == true { - if ($cinder_nimble["nimble_group_default_backend"]) == true { + if (($cinder_nimble['nimble_group_default_backend']) == true) and + (($cinder_nimble["nimble_group_backend_type"]) != '') { class { 'plugin_cinder_nimble::backend::set_default_type' : config_file => $config_file, nimble_backend_type => $cinder_nimble['nimble_group_backend_type'], diff --git a/deployment_scripts/puppet/manifests/disable_default_type.pp b/deployment_scripts/puppet/manifests/disable_default_type.pp index 6a1e30e..23e039f 100644 --- a/deployment_scripts/puppet/manifests/disable_default_type.pp +++ b/deployment_scripts/puppet/manifests/disable_default_type.pp @@ -8,7 +8,8 @@ $cinder_nimble = hiera_hash('cinder_nimble', {}) define plugin_cinder_nimble::check_if_default_type_is_enabled ( ) { - if ($cinder_nimble["nimble${name}_default_backend"]) == true { + if (($cinder_nimble["nimble${name}_default_backend"]) == true) and + (($cinder_nimble["nimble${name}_backend_type"]) != '') { class { 'plugin_cinder_nimble::backend::disable_default_type' : config_file => $config_file, } @@ -16,7 +17,8 @@ define plugin_cinder_nimble::check_if_default_type_is_enabled ( } if ($cinder_nimble['nimble_grouping']) == true { - if ($cinder_nimble['nimble_group_default_backend']) == true { + if (($cinder_nimble['nimble_group_default_backend']) == true) and + (($cinder_nimble["nimble_group_backend_type"]) != '') { class { 'plugin_cinder_nimble::backend::disable_default_type' : config_file => $config_file, } diff --git a/deployment_scripts/puppet/manifests/hiera_override.pp b/deployment_scripts/puppet/manifests/hiera_override.pp index b9a4be8..e6e9a3f 100644 --- a/deployment_scripts/puppet/manifests/hiera_override.pp +++ b/deployment_scripts/puppet/manifests/hiera_override.pp @@ -21,38 +21,57 @@ if ($cinder_nimble['nimble_grouping']) == true { $content = inline_template(' storage: volume_backend_names: + __dummy__: false +<% if @cinder_nimble["nimble_group_backend_type"] != "" -%> <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_backend_name"] %> +<% end %> nimble_encryption: - <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_encryption"] -%> -<% if @cinder_nimble["nimble_group_perfpol"] != "" %> + __dummy__: __dummy__ +<% if @cinder_nimble["nimble_group_backend_type"] != "" -%> + <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_encryption"] %> +<% end %> nimble_perfpol: - <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_perfpol"] -%> + __dummy__: __dummy__ +<% if (@cinder_nimble["nimble_group_perfpol"] != "") and (@cinder_nimble["nimble_group_backend_type"] != "") -%> + <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_perfpol"] %> <% end %> nimble_multi_init: + __dummy__: __dummy__ +<% if @cinder_nimble["nimble_group_backend_type"] != "" -%> <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_multi_init"] %> +<% end %> ') } else { $content = inline_template(' storage: volume_backend_names: + __dummy__: false <% @range_array.each do |i| -%> - <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_backend_name"] %> +<% if @cinder_nimble["nimble#{i}_backend_type"] != "" -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_backend_name"] -%> +<% end %> <% end %> nimble_encryption: + __dummy__: __dummy__ <% @range_array.each do |i| -%> - <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_encryption"] %> +<% if @cinder_nimble["nimble#{i}_backend_type"] != "" -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_encryption"] -%> +<% end %> <% end %> nimble_perfpol: __dummy__: __dummy__ <% @range_array.each do |i| -%> -<% if @cinder_nimble["nimble#{i}_perfpol"] != "" -%> +<% if (@cinder_nimble["nimble#{i}_perfpol"] != "") and (@cinder_nimble["nimble#{i}_backend_type"] != "") -%> <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_perfpol"] -%> <% end %> <% end %> nimble_multi_init: + __dummy__: __dummy__ <% @range_array.each do |i| -%> - <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_multi_init"] %> +<% if @cinder_nimble["nimble#{i}_backend_type"] != "" -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_multi_init"] -%> +<% end %> <% end %> ') } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/enable_backend.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/enable_backend.pp index cac3958..bb0e87f 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/enable_backend.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/enable_backend.pp @@ -12,6 +12,6 @@ define plugin_cinder_nimble::backend::enable_backend ( setting => 'enabled_backends', subsetting => $name, subsetting_separator => ',', - use_exact_match => true, + use_exact_match => true, } } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_encryption.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_encryption.pp index 631c06a..9424f9a 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_encryption.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_encryption.pp @@ -2,10 +2,11 @@ class plugin_cinder_nimble::backend::set_extraspecs_encryption ( ) { $storage_hash = hiera_hash('storage', {}) $nimble_encryption = $storage_hash['nimble_encryption'] - $available_backend_names = keys($nimble_encryption) + $available_backends = delete_values($nimble_encryption, '__dummy__') + $available_backend_names = keys($available_backends) ::osnailyfacter::openstack::manage_cinder_types { $available_backend_names: ensure => 'present', - volume_backend_names => $nimble_encryption, + volume_backend_names => $available_backends, key => 'nimble:encryption' } } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_multi_init.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_multi_init.pp index fc5569c..de91c10 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_multi_init.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_multi_init.pp @@ -2,10 +2,11 @@ class plugin_cinder_nimble::backend::set_extraspecs_multi_init ( ) { $storage_hash = hiera_hash('storage', {}) $nimble_multi_init = $storage_hash['nimble_multi_init'] - $available_backend_names = keys($nimble_multi_init) + $available_backends = delete_values($nimble_multi_init, '__dummy__') + $available_backend_names = keys($available_backends) ::osnailyfacter::openstack::manage_cinder_types { $available_backend_names: ensure => 'present', - volume_backend_names => $nimble_multi_init, + volume_backend_names => $available_backends, key => 'nimble:multi-initiator' } } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_perfpol.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_perfpol.pp index 88320aa..36ec491 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_perfpol.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_extraspecs_perfpol.pp @@ -2,13 +2,11 @@ class plugin_cinder_nimble::backend::set_extraspecs_perfpol ( ) { $storage_hash = hiera_hash('storage', {}) $nimble_perfpol = $storage_hash['nimble_perfpol'] - if ! empty($nimble_perfpol) { - $available_backends = delete_values($nimble_perfpol, '__dummy__') - $available_backend_names = keys($available_backends) - ::osnailyfacter::openstack::manage_cinder_types { $available_backend_names: - ensure => 'present', - volume_backend_names => $available_backends, - key => 'nimble:perfpol-name' - } + $available_backends = delete_values($nimble_perfpol, '__dummy__') + $available_backend_names = keys($available_backends) + ::osnailyfacter::openstack::manage_cinder_types { $available_backend_names: + ensure => 'present', + volume_backend_names => $available_backends, + key => 'nimble:perfpol-name' } } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_backend.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_backend.pp index 78e93bb..ac9aee1 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_backend.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_backend.pp @@ -1,7 +1,8 @@ define plugin_cinder_nimble::backend::set_nimble_backend ( $backend_id, $index, - $cinder_nimble = $plugin_cinder_nimble::params::cinder_nimble + $cinder_nimble = $plugin_cinder_nimble::params::cinder_nimble, + $config_file = $plugin_cinder_nimble::params::config_file ) { include plugin_cinder_nimble::params @@ -28,13 +29,30 @@ define plugin_cinder_nimble::backend::set_nimble_backend ( # Check whether grouping is enabled and adjust volume_backend_name accordingly if ($cinder_nimble['nimble_grouping']) == true { - $nimble_backend_name = "${nimble_group_backend_name}_${backend_id}" + if ($cinder_nimble["nimble${backend_id}_cinder_service_name"]) != '' { + $nimble_backend_name = $cinder_nimble["nimble${backend_id}_cinder_service_name"] + } + else { + $nimble_backend_name = "${nimble_group_backend_name}_${backend_id}" + } $nimble_volume_backend_name = "${nimble_group_backend_name}" } else { - $nimble_backend_name = "${cinder_nimble["nimble${backend_id}_backend_name"]}" + if ($cinder_nimble["nimble${backend_id}_cinder_service_name"]) != '' { + $nimble_backend_name = $cinder_nimble["nimble${backend_id}_cinder_service_name"] + } + else { + $nimble_backend_name = "${cinder_nimble["nimble${backend_id}_backend_name"]}" + } $nimble_volume_backend_name = "${cinder_nimble["nimble${backend_id}_backend_name"]}" } + # Pool name selection + if ($cinder_nimble["nimble${backend_id}_pool_name"]) != '' { + $nimble_pool_name = $cinder_nimble["nimble${backend_id}_pool_name"] + } + else { + $nimble_pool_name = 'default' + } Cinder_config <||> -> Plugin_cinder_nimble::Backend::Enable_backend[$nimble_backend_name] ~> Service <||> Cinder_config <||> ~> Service <||> @@ -45,6 +63,20 @@ define plugin_cinder_nimble::backend::set_nimble_backend ( "$nimble_backend_name/san_ip": value => $cinder_nimble["nimble${backend_id}_san_ip"]; "$nimble_backend_name/san_login": value => $cinder_nimble["nimble${backend_id}_login"]; "$nimble_backend_name/san_password": value => $nimble_password; + "$nimble_backend_name/nimble_pool_name": value => $nimble_pool_name; + "$nimble_backend_name/use_multipath_for_image_xfer": value => $cinder_nimble["nimble${backend_id}_mp_img_xfer"]; + } + + # nimble_subnet_label enabled only when iSCSI and non-nil! + if (($cinder_nimble["nimble${backend_id}_subnet_label"]) != '') and (($cinder_nimble["nimble${backend_id}_backend_protocol"]) == 'iSCSI'){ + cinder_config { "$nimble_backend_name/nimble_subnet_label": + value => $cinder_nimble["nimble${backend_id}_subnet_label"], + } + } + else { + cinder_config { "$nimble_backend_name/nimble_subnet_label": + ensure => absent, + } } # Adds the backend in parameter diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_cinder_type.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_cinder_type.pp index 5f93928..000fd88 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_cinder_type.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_nimble_cinder_type.pp @@ -2,10 +2,8 @@ class plugin_cinder_nimble::backend::set_nimble_cinder_type ( ) { $storage_hash = hiera_hash('storage', {}) $backends = $storage_hash['volume_backend_names'] - $available_backends = delete_values($backends, false) $available_backend_names = keys($available_backends) - ::osnailyfacter::openstack::manage_cinder_types { $available_backend_names: ensure => 'present', volume_backend_names => $available_backends, diff --git a/deployment_tasks.yaml b/deployment_tasks.yaml index 52e9dac..cbbe9a8 100644 --- a/deployment_tasks.yaml +++ b/deployment_tasks.yaml @@ -86,13 +86,13 @@ # Post Deployment tasks # Set the default volume type to the nimble type in parameter -- id: disable_default_type +- id: disable_default_type role: [primary-controller, controller] required_for: [post_deployment_end] requires: [post_deployment_start] type: puppet parameters: - puppet_manifest: puppet/manifests/disable_default_type.pp + puppet_manifest: puppet/manifests/disable_default_type.pp puppet_modules: "puppet/modules/:/etc/puppet/modules/" timeout: 360 diff --git a/environment_config.yaml b/environment_config.yaml index beb05ec..87fec81 100644 --- a/environment_config.yaml +++ b/environment_config.yaml @@ -6,7 +6,7 @@ attributes: # Number of Backends. Is there a dynamic way to build UI without this? no_backends: type: 'select' - weight: 11 + weight: 11 value: '1' label: 'Nimble backends' description: 'Number of Nimble backends' @@ -26,7 +26,7 @@ attributes: value: false label: 'Group all backends to same volume_backend_name' description: 'Specify if all Nimble Storage backends needs to be grouped to a volume type' - weight: 12 + weight: 12 type: 'checkbox' # Group Backend details nimble_group_backend_name: @@ -47,23 +47,26 @@ attributes: description: 'Volume Type for Nimble Storage backends group in cinder' weight: 14 type: "text" - regex: - source: '^(?!\s*$).+' - error: 'Error: Volume Type Name cannot be blank' restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == false" action: 'hide' + - condition: "settings:cinder_nimble.nimble_group_backend_type.value == ''" + message: "During re-deployment, Volume Type cannot be removed by setting this field blank. Old type will be retained. Delete Volume Type manually if needed." + action: 'none' nimble_group_default_backend: type: 'checkbox' - value: false + value: false weight: 15 label: 'Set as Default Type?' - description: 'Set the Nimble backend group as the default type' + description: 'Set the Nimble backend group as the default type' restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == false" action: 'hide' + - condition: "settings:cinder_nimble.nimble_group_backend_type.value == ''" + message: "Since Group Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble_group_encryption: - value: false + value: false label: 'Encryption enabled?' description: 'Specify if Nimble Storage backends needs to be encypted' weight: 16 @@ -71,8 +74,11 @@ attributes: restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == false" action: 'hide' + - condition: "settings:cinder_nimble.nimble_group_backend_type.value == ''" + message: "Since Group Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble_group_multi_init: - value: false + value: false label: 'Multi-Initiator enabled?' description: 'Specify if Nimble Storage multi-initiator needs to be enabled' weight: 17 @@ -80,6 +86,9 @@ attributes: restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == false" action: 'hide' + - condition: "settings:cinder_nimble.nimble_group_backend_type.value == ''" + message: "Since Group Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble_group_perfpol: value: "" type: "text" @@ -90,26 +99,39 @@ attributes: - condition: "settings:cinder_nimble.nimble_grouping.value == false" action: 'hide' - condition: "settings:cinder_nimble.nimble_group_perfpol.value == ''" - message: "Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + message: "During re-deployment, Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + action: 'none' + - condition: "settings:cinder_nimble.nimble_group_backend_type.value == ''" + message: "Since Group Volume Type Name field is blank, this setting will be ignored during deployment." action: 'none' # Individual Backend details nimble1_backend_divider: - value: '' + value: '' label: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" description: '' - weight: 19 + weight: 19 type: "hidden" nimble1_backend_label: - value: '' + value: '' label: 'Nimble Backend #1' description: 'Details for Nimble Backend #1' weight: 21 type: "radio" + nimble1_cinder_service_name: + value: '' + label: 'Cinder Service Name' + description: 'Stanza title for backend definition in cinder.conf, which will become the Cinder Service Name. Will be autogenerated if left blank.' + weight: 22 + type: "text" + restrictions: + - condition: "settings:cinder_nimble.nimble1_cinder_service_name.value != ''" + message: "Use with caution! For successful deployment, make sure Cinder Service Name is unique across backends. Please avoid using 'volume_backend_name_##' format or 'volume_backend_name' itself as it may conflict with autogenerated service names." + action: 'none' nimble1_backend_name: value: 'cinder_nimble1' label: 'Backend Name' description: '"volume_backend_name" for Nimble Storage backend in cinder' - weight: 22 + weight: 23 type: "text" regex: source: '^(?!\s*$).+' @@ -121,20 +143,20 @@ attributes: value: 'cinder_nimble1' label: 'Volume Type Name' description: 'Volume Type for Nimble Storage backend in cinder' - weight: 23 + weight: 24 type: "text" - regex: - source: '^(?!\s*$).+' - error: 'Error: Volume Type Name cannot be blank' restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble1_backend_type.value == ''" + message: "During re-deployment, Volume Type cannot be removed by setting this field blank. Old type will be retained. Delete Volume Type manually if needed." + action: 'none' nimble1_default_backend: type: 'checkbox' - value: false - weight: 24 + value: false + weight: 25 label: 'Set as Default Type?' - description: 'Set the Nimble backend #1 as the default type' + description: 'Set the Nimble backend #1 as the default type' restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' @@ -150,6 +172,9 @@ attributes: - condition: "settings:cinder_nimble.nimble5_default_backend.value == true" action: 'disable' message: "Backend #5 is selected as default type." + - condition: "settings:cinder_nimble.nimble1_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble1_backend_protocol: value: 'iSCSI' values: @@ -161,13 +186,13 @@ attributes: description: "Enables Fibre Channel protocol for block storage volumes" label: 'Storage Protocol to be used with Nimble Array Backend' description: '' - weight: 25 + weight: 26 type: "radio" nimble1_san_ip: value: "" label: 'Nimble Storage Management IP' description: 'The hostname (or IP address) for Nimble Storage Management IP' - weight: 26 + weight: 27 type: "text" regex: source: '^(?!\s*$).+' @@ -175,7 +200,7 @@ attributes: nimble1_login: value: "" type: "text" - weight: 27 + weight: 28 label: "User ID for Nimble Storage" description: "Nimble Storage username/ID (with admin privilages)" regex: @@ -184,65 +209,108 @@ attributes: nimble1_password: value: "" type: "password" - weight: 28 + weight: 29 label: "Password for Nimble Storage" description: "Nimble Storage password for username/ID above" regex: source: '^(?!\s*$).+' error: "Error: Password cannot be blank" - nimble1_encryption: - value: false - label: 'Encryption enabled?' - description: 'Specify if Nimble Storage backend needs to be encypted' - weight: 29 - type: 'checkbox' - restrictions: - - condition: "settings:cinder_nimble.nimble_grouping.value == true" - action: 'hide' - nimble1_multi_init: - value: false - label: 'Multi-Initiator enabled?' - description: 'Specify if Nimble Storage multi-initiator needs to be enabled' + nimble1_subnet_label: + value: "" + type: "text" weight: 30 - type: 'checkbox' + label: "Subnet Label" + description: "Nimble Storage data network Subnet Label if more than one data network" restrictions: - - condition: "settings:cinder_nimble.nimble_grouping.value == true" - action: 'hide' - nimble1_perfpol: + - condition: "settings:cinder_nimble.nimble1_backend_protocol.value != 'iSCSI'" + message: "Subnet Label is valid for iSCSI protocol only, this setting will be ignored during deployment." + action: 'none' + nimble1_pool_name: value: "" type: "text" weight: 31 + label: "Pool Name" + description: "Nimble Storage Pool Name (blank will use Nimble default storage pool)" + nimble1_mp_img_xfer: + value: false + label: 'Use multipath for Image transfer?' + description: 'Attach/Detach volumes in cinder using multipath for volume to image, and image to volume transfers' + weight: 32 + type: 'checkbox' + nimble1_encryption: + value: false + label: 'Encryption enabled?' + description: 'Specify if Nimble Storage backend needs to be encypted' + weight: 33 + type: 'checkbox' + restrictions: + - condition: "settings:cinder_nimble.nimble_grouping.value == true" + action: 'hide' + - condition: "settings:cinder_nimble.nimble1_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' + nimble1_multi_init: + value: false + label: 'Multi-Initiator enabled?' + description: 'Specify if Nimble Storage multi-initiator needs to be enabled' + weight: 34 + type: 'checkbox' + restrictions: + - condition: "settings:cinder_nimble.nimble_grouping.value == true" + action: 'hide' + - condition: "settings:cinder_nimble.nimble1_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' + nimble1_perfpol: + value: "" + type: "text" + weight: 35 label: "Performance policy name" description: "Performance policy name for Nimble Storage backend" restrictions: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' - condition: "settings:cinder_nimble.nimble1_perfpol.value == ''" - message: "Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + message: "During re-deployment, Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + action: 'none' + - condition: "settings:cinder_nimble.nimble1_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." action: 'none' nimble2_backend_divider: - value: '' + value: '' label: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" description: '' - weight: 32 + weight: 36 type: "hidden" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' nimble2_backend_label: - value: '' + value: '' label: 'Nimble Backend #2' description: 'Details for Nimble Backend #2' - weight: 34 + weight: 38 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' + nimble2_cinder_service_name: + value: '' + label: 'Cinder Service Name' + description: 'Stanza title for backend definition in cinder.conf, which will become the Cinder Service Name. Will be autogenerated if left blank.' + weight: 39 + type: "text" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble2_cinder_service_name.value != ''" + message: "Use with caution! For successful deployment, make sure Cinder Service Name is unique across backends. Please avoid using 'volume_backend_name_##' format or 'volume_backend_name' itself as it may conflict with autogenerated service names." + action: 'none' nimble2_backend_name: value: 'cinder_nimble2' label: 'Backend Name' description: '"volume_backend_name" for Nimble Storage backend in cinder' - weight: 35 + weight: 40 type: "text" regex: source: '^(?!\s*$).+' @@ -256,22 +324,22 @@ attributes: value: 'cinder_nimble2' label: 'Volume Type Name' description: 'Volume Type for Nimble Storage backend in cinder' - weight: 36 + weight: 41 type: "text" - regex: - source: '^(?!\s*$).+' - error: 'Error: Volume Type Name cannot be blank' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble2_backend_type.value == ''" + message: "During re-deployment, Volume Type cannot be removed by setting this field blank. Old type will be retained. Delete Volume Type manually if needed." + action: 'none' nimble2_default_backend: type: 'checkbox' - value: false - weight: 37 + value: false + weight: 42 label: 'Set as Default Type?' - description: 'Set the Nimble backend #2 as the default type' + description: 'Set the Nimble backend #2 as the default type' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -289,6 +357,9 @@ attributes: - condition: "settings:cinder_nimble.nimble5_default_backend.value == true" action: 'disable' message: "Backend #5 is selected as default type." + - condition: "settings:cinder_nimble.nimble2_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble2_backend_protocol: value: 'iSCSI' values: @@ -300,7 +371,7 @@ attributes: description: "Enables Fibre Channel protocol for block storage volumes" label: 'Nimble Storage Protocol' description: '' - weight: 38 + weight: 43 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -309,7 +380,7 @@ attributes: value: "" label: 'Nimble Storage Management IP' description: 'The hostname (or IP address) for Nimble Storage Management IP' - weight: 39 + weight: 44 type: "text" regex: source: '^(?!\s*$).+' @@ -320,7 +391,7 @@ attributes: nimble2_login: value: "" type: "text" - weight: 40 + weight: 45 label: "User ID for Nimble Storage" description: "Nimble Storage username/ID (with admin privilages)" regex: @@ -332,7 +403,7 @@ attributes: nimble2_password: value: "" type: "password" - weight: 41 + weight: 46 label: "Password for Nimble Storage" description: "Nimble Storage password for username/ID above" regex: @@ -341,32 +412,68 @@ attributes: restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' + nimble2_subnet_label: + value: "" + type: "text" + weight: 47 + label: "Subnet Label" + description: "Nimble Storage data network Subnet Label if more than one data network" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble2_backend_protocol.value != 'iSCSI'" + message: "Subnet Label is valid for iSCSI protocol only, this setting will be ignored during deployment." + action: 'none' + nimble2_pool_name: + value: "" + type: "text" + weight: 48 + label: "Pool Name" + description: "Nimble Storage Pool Name (blank will use Nimble default storage pool)" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + nimble2_mp_img_xfer: + value: false + label: 'Use multipath for Image transfer?' + description: 'Attach/Detach volumes in cinder using multipath for volume to image, and image to volume transfers' + weight: 49 + type: 'checkbox' + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' nimble2_encryption: - value: false + value: false label: 'Encryption enabled?' description: 'Specify if Nimble Storage backend needs to be encypted' - weight: 42 + weight: 50 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble2_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble2_multi_init: - value: false + value: false label: 'Multi-Initiator enabled?' description: 'Specify if Nimble Storage multi-initiator needs to be enabled' - weight: 43 + weight: 51 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble2_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble2_perfpol: value: "" type: "text" - weight: 44 + weight: 52 label: "Performance policy name" description: "Performance policy name for Nimble Storage backend" restrictions: @@ -375,13 +482,16 @@ attributes: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' - condition: "settings:cinder_nimble.nimble2_perfpol.value == ''" - message: "Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + message: "During re-deployment, Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + action: 'none' + - condition: "settings:cinder_nimble.nimble2_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." action: 'none' nimble3_backend_divider: - value: '' + value: '' label: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" description: '' - weight: 45 + weight: 53 type: "hidden" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -389,21 +499,35 @@ attributes: - condition: "settings:cinder_nimble.no_backends.value == '2'" action: 'hide' nimble3_backend_label: - value: '' + value: '' label: 'Nimble Backend #3' description: 'Details for Nimble Backend #3' - weight: 47 + weight: 55 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' - condition: "settings:cinder_nimble.no_backends.value == '2'" action: 'hide' + nimble3_cinder_service_name: + value: '' + label: 'Cinder Service Name' + description: 'Stanza title for backend definition in cinder.conf, which will become the Cinder Service Name. Will be autogenerated if left blank.' + weight: 56 + type: "text" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble3_cinder_service_name.value != ''" + message: "Use with caution! For successful deployment, make sure Cinder Service Name is unique across backends. Please avoid using 'volume_backend_name_##' format or 'volume_backend_name' itself as it may conflict with autogenerated service names." + action: 'none' nimble3_backend_name: value: 'cinder_nimble3' label: 'Backend Name' description: '"volume_backend_name" for Nimble Storage backend in cinder' - weight: 48 + weight: 57 type: "text" regex: source: '^(?!\s*$).+' @@ -419,11 +543,8 @@ attributes: value: 'cinder_nimble3' label: 'Volume Type Name' description: 'Volume Type for Nimble Storage backend in cinder' - weight: 49 + weight: 58 type: "text" - regex: - source: '^(?!\s*$).+' - error: 'Error: Volume Type Name cannot be blank' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -431,12 +552,15 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble3_backend_type.value == ''" + message: "During re-deployment, Volume Type cannot be removed by setting this field blank. Old type will be retained. Delete Volume Type manually if needed." + action: 'none' nimble3_default_backend: type: 'checkbox' - value: false - weight: 50 + value: false + weight: 59 label: 'Set as Default Type?' - description: 'Set the Nimble backend #3 as the default type' + description: 'Set the Nimble backend #3 as the default type' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -456,6 +580,9 @@ attributes: - condition: "settings:cinder_nimble.nimble5_default_backend.value == true" action: 'disable' message: "Backend #5 is selected as default type." + - condition: "settings:cinder_nimble.nimble3_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble3_backend_protocol: value: 'iSCSI' values: @@ -467,7 +594,7 @@ attributes: description: "Enables Fibre Channel protocol for block storage volumes" label: 'Storage Protocol to be used with Nimble Array Backend' description: '' - weight: 51 + weight: 60 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -478,7 +605,7 @@ attributes: value: "" label: 'Nimble Storage Management IP' description: 'The hostname (or IP address) for Nimble Storage Management IP' - weight: 52 + weight: 61 type: "text" regex: source: '^(?!\s*$).+' @@ -491,7 +618,7 @@ attributes: nimble3_login: value: "" type: "text" - weight: 53 + weight: 62 label: "User ID for Nimble Storage" description: "Nimble Storage username/ID (with admin privilages)" regex: @@ -505,7 +632,7 @@ attributes: nimble3_password: value: "" type: "password" - weight: 54 + weight: 63 label: "Password for Nimble Storage" description: "Nimble Storage password for username/ID above" regex: @@ -516,11 +643,47 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.no_backends.value == '2'" action: 'hide' + nimble3_subnet_label: + value: "" + type: "text" + weight: 64 + label: "Subnet Label" + description: "Nimble Storage data network Subnet Label if more than one data network" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble3_backend_protocol.value != 'iSCSI'" + message: "Subnet Label is valid for iSCSI protocol only, this setting will be ignored during deployment." + action: 'none' + nimble3_pool_name: + value: "" + type: "text" + weight: 65 + label: "Pool Name" + description: "Nimble Storage Pool Name (blank will use Nimble default storage pool)" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + nimble3_mp_img_xfer: + value: false + label: 'Use multipath for Image transfer?' + description: 'Attach/Detach volumes in cinder using multipath for volume to image, and image to volume transfers' + weight: 66 + type: 'checkbox' + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' nimble3_encryption: - value: false + value: false label: 'Encryption enabled?' description: 'Specify if Nimble Storage backend needs to be encypted' - weight: 55 + weight: 67 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -529,11 +692,14 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble3_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble3_multi_init: - value: false + value: false label: 'Multi-Initiator enabled?' description: 'Specify if Nimble Storage multi-initiator needs to be enabled' - weight: 56 + weight: 68 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -542,10 +708,13 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble3_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble3_perfpol: value: "" type: "text" - weight: 57 + weight: 69 label: "Performance policy name" description: "Performance policy name for Nimble Storage backend" restrictions: @@ -556,13 +725,16 @@ attributes: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' - condition: "settings:cinder_nimble.nimble3_perfpol.value == ''" - message: "Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + message: "During re-deployment, Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + action: 'none' + - condition: "settings:cinder_nimble.nimble3_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." action: 'none' nimble4_backend_divider: - value: '' + value: '' label: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" description: '' - weight: 58 + weight: 70 type: "hidden" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -572,10 +744,10 @@ attributes: - condition: "settings:cinder_nimble.no_backends.value == '3'" action: 'hide' nimble4_backend_label: - value: '' + value: '' label: 'Nimble Backend #4' description: 'Details for Nimble Backend #4' - weight: 60 + weight: 72 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -584,11 +756,27 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.no_backends.value == '3'" action: 'hide' + nimble4_cinder_service_name: + value: '' + label: 'Cinder Service Name' + description: 'Stanza title for backend definition in cinder.conf, which will become the Cinder Service Name. Will be autogenerated if left blank.' + weight: 73 + type: "text" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble4_cinder_service_name.value != ''" + message: "Use with caution! For successful deployment, make sure Cinder Service Name is unique across backends. Please avoid using 'volume_backend_name_##' format or 'volume_backend_name' itself as it may conflict with autogenerated service names." + action: 'none' nimble4_backend_name: value: 'cinder_nimble4' label: 'Backend Name' description: '"volume_backend_name" for Nimble Storage backend in cinder' - weight: 61 + weight: 74 type: "text" regex: source: '^(?!\s*$).+' @@ -606,11 +794,8 @@ attributes: value: 'cinder_nimble4' label: 'Volume Type Name' description: 'Volume Type for Nimble Storage backend in cinder' - weight: 62 + weight: 75 type: "text" - regex: - source: '^(?!\s*$).+' - error: 'Error: Volume Type Name cannot be blank' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -620,12 +805,15 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble4_backend_type.value == ''" + message: "During re-deployment, Volume Type cannot be removed by setting this field blank. Old type will be retained. Delete Volume Type manually if needed." + action: 'none' nimble4_default_backend: type: 'checkbox' - value: false - weight: 63 + value: false + weight: 76 label: 'Set as Default Type?' - description: 'Set the Nimble backend #4 as the default type' + description: 'Set the Nimble backend #4 as the default type' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -647,6 +835,9 @@ attributes: - condition: "settings:cinder_nimble.nimble5_default_backend.value == true" action: 'disable' message: "Backend #5 is selected as default type." + - condition: "settings:cinder_nimble.nimble4_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble4_backend_protocol: value: 'iSCSI' values: @@ -658,7 +849,7 @@ attributes: description: "Enables Fibre Channel protocol for block storage volumes" label: 'Storage Protocol to be used with Nimble Array Backend' description: '' - weight: 64 + weight: 77 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -671,7 +862,7 @@ attributes: value: "" label: 'Nimble Storage Management IP' description: 'The hostname (or IP address) for Nimble Storage Management IP' - weight: 65 + weight: 78 type: "text" regex: source: '^(?!\s*$).+' @@ -686,7 +877,7 @@ attributes: nimble4_login: value: "" type: "text" - weight: 66 + weight: 79 label: "User ID for Nimble Storage" description: "Nimble Storage username/ID (with admin privilages)" regex: @@ -702,7 +893,7 @@ attributes: nimble4_password: value: "" type: "password" - weight: 67 + weight: 80 label: "Password for Nimble Storage" description: "Nimble Storage password for username/ID above" regex: @@ -715,11 +906,53 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.no_backends.value == '3'" action: 'hide' + nimble4_subnet_label: + value: "" + type: "text" + weight: 81 + label: "Subnet Label" + description: "Nimble Storage data network Subnet Label if more than one data network" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble4_backend_protocol.value != 'iSCSI'" + message: "Subnet Label is valid for iSCSI protocol only, this setting will be ignored during deployment." + action: 'none' + nimble4_pool_name: + value: "" + type: "text" + weight: 82 + label: "Pool Name" + description: "Nimble Storage Pool Name (blank will use Nimble default storage pool)" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + nimble4_mp_img_xfer: + value: false + label: 'Use multipath for Image transfer?' + description: 'Attach/Detach volumes in cinder using multipath for volume to image, and image to volume transfers' + weight: 83 + type: 'checkbox' + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' nimble4_encryption: - value: false + value: false label: 'Encryption enabled?' description: 'Specify if Nimble Storage backend needs to be encypted' - weight: 68 + weight: 84 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -730,11 +963,14 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble4_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble4_multi_init: - value: false + value: false label: 'Multi-Initiator enabled?' description: 'Specify if Nimble Storage multi-initiator needs to be enabled' - weight: 69 + weight: 85 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -745,10 +981,13 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble4_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble4_perfpol: value: "" type: "text" - weight: 70 + weight: 86 label: "Performance policy name" description: "Performance policy name for Nimble Storage backend" restrictions: @@ -761,13 +1000,16 @@ attributes: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' - condition: "settings:cinder_nimble.nimble4_perfpol.value == ''" - message: "Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + message: "During re-deployment, Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + action: 'none' + - condition: "settings:cinder_nimble.nimble4_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." action: 'none' nimble5_backend_divider: - value: '' + value: '' label: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" description: '' - weight: 71 + weight: 87 type: "hidden" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -779,10 +1021,10 @@ attributes: - condition: "settings:cinder_nimble.no_backends.value == '4'" action: 'hide' nimble5_backend_label: - value: '' + value: '' label: 'Nimble Backend #5' description: 'Details for Nimble Backend #5' - weight: 73 + weight: 89 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -793,11 +1035,29 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.no_backends.value == '4'" action: 'hide' + nimble5_cinder_service_name: + value: '' + label: 'Cinder Service Name' + description: 'Stanza title for backend definition in cinder.conf, which will become the Cinder Service Name. Will be autogenerated if left blank.' + weight: 90 + type: "text" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '4'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble5_cinder_service_name.value != ''" + message: "Use with caution! For successful deployment, make sure Cinder Service Name is unique across backends. Please avoid using 'volume_backend_name_##' format or 'volume_backend_name' itself as it may conflict with autogenerated service names." + action: 'none' nimble5_backend_name: value: 'cinder_nimble5' label: 'Backend Name' description: '"volume_backend_name" for Nimble Storage backend in cinder' - weight: 74 + weight: 91 type: "text" regex: source: '^(?!\s*$).+' @@ -817,11 +1077,8 @@ attributes: value: 'cinder_nimble5' label: 'Volume Type Name' description: 'Volume Type for Nimble Storage backend in cinder' - weight: 75 + weight: 92 type: "text" - regex: - source: '^(?!\s*$).+' - error: 'Error: Volume Type Name cannot be blank' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -833,12 +1090,15 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble5_backend_type.value == ''" + message: "During re-deployment, Volume Type cannot be removed by setting this field blank. Old type will be retained. Delete Volume Type manually if needed." + action: 'none' nimble5_default_backend: type: 'checkbox' - value: false - weight: 76 + value: false + weight: 93 label: 'Set as Default Type?' - description: 'Set the Nimble backend #5 as the default type' + description: 'Set the Nimble backend #5 as the default type' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" action: 'hide' @@ -862,6 +1122,9 @@ attributes: - condition: "settings:cinder_nimble.nimble4_default_backend.value == true" action: 'disable' message: "Backend #4 is selected as default type." + - condition: "settings:cinder_nimble.nimble5_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble5_backend_protocol: value: 'iSCSI' values: @@ -873,7 +1136,7 @@ attributes: description: "Enables Fibre Channel protocol for block storage volumes" label: 'Storage Protocol to be used with Nimble Array Backend' description: '' - weight: 77 + weight: 94 type: "radio" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -888,7 +1151,7 @@ attributes: value: "" label: 'Nimble Storage Management IP' description: 'The hostname (or IP address) for Nimble Storage Management IP' - weight: 78 + weight: 95 type: "text" regex: source: '^(?!\s*$).+' @@ -905,7 +1168,7 @@ attributes: nimble5_login: value: "" type: "text" - weight: 79 + weight: 96 label: "User ID for Nimble Storage" description: "Nimble Storage username/ID (with admin privilages)" regex: @@ -923,7 +1186,7 @@ attributes: nimble5_password: value: "" type: "password" - weight: 80 + weight: 97 label: "Password for Nimble Storage" description: "Nimble Storage password for username/ID above" regex: @@ -938,11 +1201,59 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.no_backends.value == '4'" action: 'hide' + nimble5_subnet_label: + value: "" + type: "text" + weight: 98 + label: "Subnet Label" + description: "Nimble Storage data network Subnet Label if more than one data network" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '4'" + action: 'hide' + - condition: "settings:cinder_nimble.nimble5_backend_protocol.value != 'iSCSI'" + message: "Subnet Label is valid for iSCSI protocol only, this setting will be ignored during deployment." + action: 'none' + nimble5_pool_name: + value: "" + type: "text" + weight: 99 + label: "Pool Name" + description: "Nimble Storage Pool Name (blank will use Nimble default storage pool)" + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '4'" + action: 'hide' + nimble5_mp_img_xfer: + value: false + label: 'Use multipath for Image transfer?' + description: 'Attach/Detach volumes in cinder using multipath for volume to image, and image to volume transfers' + weight: 100 + type: 'checkbox' + restrictions: + - condition: "settings:cinder_nimble.no_backends.value == '1'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '2'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '3'" + action: 'hide' + - condition: "settings:cinder_nimble.no_backends.value == '4'" + action: 'hide' nimble5_encryption: - value: false + value: false label: 'Encryption enabled?' description: 'Specify if Nimble Storage backend needs to be encypted' - weight: 81 + weight: 101 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -955,11 +1266,14 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble5_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble5_multi_init: - value: false + value: false label: 'Multi-Initiator enabled?' description: 'Specify if Nimble Storage multi-initiator needs to be enabled' - weight: 82 + weight: 102 type: 'checkbox' restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" @@ -972,10 +1286,13 @@ attributes: action: 'hide' - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' + - condition: "settings:cinder_nimble.nimble5_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." + action: 'none' nimble5_perfpol: value: "" type: "text" - weight: 83 + weight: 103 label: "Performance policy name" description: "Performance policy name for Nimble Storage backend" restrictions: @@ -990,13 +1307,16 @@ attributes: - condition: "settings:cinder_nimble.nimble_grouping.value == true" action: 'hide' - condition: "settings:cinder_nimble.nimble5_perfpol.value == ''" - message: "Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + message: "During re-deployment, Performance policy cannot be unset by setting this field blank. Old value will be retained. Delete extra spec value manually if needed." + action: 'none' + - condition: "settings:cinder_nimble.nimble5_backend_type.value == ''" + message: "Since Volume Type Name field is blank, this setting will be ignored during deployment." action: 'none' nimble6_backend_divider: - value: '' + value: '' label: "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" description: '' - weight: 84 + weight: 104 type: "hidden" restrictions: - condition: "settings:cinder_nimble.no_backends.value == '1'" diff --git a/metadata.yaml b/metadata.yaml index 76a4684..df3f46b 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -1,5 +1,5 @@ # Plugin name -name: cinder_nimble +name: cinder_nimble # Human-readable name for your plugin title: Cinder plugin for Nimble Storage # Plugin version @@ -22,7 +22,7 @@ homepage: 'https://github.com/openstack/fuel-plugin-cinder-nimble' groups: ['storage::cinder'] # Change `false` to `true` if the plugin can be installed in the environment # after the deployment. -is_hotpluggable: true +is_hotpluggable: true # The plugin is compatible with releases in the list releases: