From 1f69d19eb78dbacbe4bd6fb377b8504eca4cb613 Mon Sep 17 00:00:00 2001 From: sreesiv Date: Fri, 2 Dec 2016 21:22:26 +0530 Subject: [PATCH] Release Candidate #1 with 5 backends --- cinder_nimble-1.0-1.0.0-1.noarch.rpm | Bin 20252 -> 20592 bytes .../puppet/manifests/default_type.pp | 56 ++++----- .../puppet/manifests/disable_default_type.pp | 36 +++++- .../puppet/manifests/hiera_override.pp | 58 ++++------ .../manifests/backend/disable_default_type.pp | 39 ++----- .../manifests/backend/nimble.pp | 106 +++++------------- .../manifests/backend/set_default_type.pp | 33 +++--- .../backend/set_extraspecs_perfpol.pp | 5 +- 8 files changed, 138 insertions(+), 195 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 2ec0468bd605c0f9a257597ea23e07fdd551acad..cd193fe1425bf1260725c76a7f8970cbd257566e 100644 GIT binary patch delta 14036 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 F{|{61`~m;~ diff --git a/deployment_scripts/puppet/manifests/default_type.pp b/deployment_scripts/puppet/manifests/default_type.pp index 3812cbc..4000751 100644 --- a/deployment_scripts/puppet/manifests/default_type.pp +++ b/deployment_scripts/puppet/manifests/default_type.pp @@ -3,35 +3,35 @@ notice('MODULAR: nimble-default-volume-type') $config_file = '/etc/cinder/cinder.conf' $cinder_nimble = hiera_hash('cinder_nimble', {}) -if ($cinder_nimble['nimble_grouping']) == true { - $nimble_default_type_set = $cinder_nimble['nimble_group_default_backend'] - $nimble_default_type = $cinder_nimble['nimble_group_backend_type'] -} -else { - $nimble_default_type_set = $cinder_nimble['nimble1_default_backend'] or - $cinder_nimble['nimble2_default_backend'] or - $cinder_nimble['nimble3_default_backend'] or - $cinder_nimble['nimble4_default_backend'] or - $cinder_nimble['nimble5_default_backend'] - if ($cinder_nimble['nimble1_default_backend']) == true { - $nimble_default_type = $cinder_nimble['nimble1_backend_type'] - } - elsif ($cinder_nimble['nimble2_default_backend']) == true { - $nimble_default_type = $cinder_nimble['nimble2_backend_type'] - } - elsif ($cinder_nimble['nimble3_default_backend']) == true { - $nimble_default_type = $cinder_nimble['nimble3_backend_type'] - } - elsif ($cinder_nimble['nimble4_default_backend']) == true { - $nimble_default_type = $cinder_nimble['nimble4_backend_type'] - } - elsif ($cinder_nimble['nimble5_default_backend']) == true { - $nimble_default_type = $cinder_nimble['nimble5_backend_type'] +define plugin_cinder_nimble::check_if_default_backend_is_enabled ( +) { + if ($cinder_nimble["nimble${name}_default_backend"]) == true { + class { 'plugin_cinder_nimble::backend::set_default_type' : + config_file => $config_file, + nimble_backend_type => $cinder_nimble["nimble${name}_backend_type"], + } } } -class { 'plugin_cinder_nimble::backend::set_default_type' : - config_file => $config_file, - nimble_default_type_set => $nimble_default_type_set, - nimble_backend_type => $nimble_default_type, +if ($cinder_nimble['nimble_grouping']) == true { + if ($cinder_nimble["nimble_group_default_backend"]) == true { + class { 'plugin_cinder_nimble::backend::set_default_type' : + config_file => $config_file, + nimble_backend_type => $cinder_nimble['nimble_group_backend_type'], + } + } +} +else { + # Should work from Puppet >= 4.0.0 onwards which has Future parser + /* + range("1", "$cinder_nimble['no_backends']").each |Integer $index, String $value| { + if ($cinder_nimble["nimble${value}_default_backend"]) == true { + $nimble_default_type = $cinder_nimble["nimble${value}_backend_type"] + $nimble_default_type_set = true + } + } + */ + + $range_array = range("1", $cinder_nimble['no_backends']) + plugin_cinder_nimble::check_if_default_backend_is_enabled { $range_array: } } diff --git a/deployment_scripts/puppet/manifests/disable_default_type.pp b/deployment_scripts/puppet/manifests/disable_default_type.pp index 5d1ab2e..6a1e30e 100644 --- a/deployment_scripts/puppet/manifests/disable_default_type.pp +++ b/deployment_scripts/puppet/manifests/disable_default_type.pp @@ -1,7 +1,37 @@ notice('MODULAR: nimble-disable-default-volume-type') -$config_file = '/etc/cinder/cinder.conf' +include plugin_cinder_nimble::params +include cinder::params -class { 'plugin_cinder_nimble::backend::disable_default_type' : - config_file => $config_file, +$config_file = '/etc/cinder/cinder.conf' +$cinder_nimble = hiera_hash('cinder_nimble', {}) + +define plugin_cinder_nimble::check_if_default_type_is_enabled ( +) { + if ($cinder_nimble["nimble${name}_default_backend"]) == true { + class { 'plugin_cinder_nimble::backend::disable_default_type' : + config_file => $config_file, + } + } +} + +if ($cinder_nimble['nimble_grouping']) == true { + if ($cinder_nimble['nimble_group_default_backend']) == true { + class { 'plugin_cinder_nimble::backend::disable_default_type' : + config_file => $config_file, + } + } +} +else { + # Should work from Puppet >= 4.0.0 onwards which has Future parser + /* + range("1", "$cinder_nimble['no_backends']").each |Integer $index, String $value| { + if ($cinder_nimble["nimble${value}_default_backend"]) == true { + $nimble_default_type_set = true + } + } + */ + + $range_array = range("1", $cinder_nimble['no_backends']) + plugin_cinder_nimble::check_if_default_type_is_enabled { $range_array: } } diff --git a/deployment_scripts/puppet/manifests/hiera_override.pp b/deployment_scripts/puppet/manifests/hiera_override.pp index e7af9bf..b9a4be8 100644 --- a/deployment_scripts/puppet/manifests/hiera_override.pp +++ b/deployment_scripts/puppet/manifests/hiera_override.pp @@ -3,76 +3,56 @@ notice('MODULAR: nimble-hiera-override') $cinder_nimble = hiera_hash('cinder_nimble', {}) -$nimble_group_backend_type = $cinder_nimble['nimble_group_backend_type'] -$nimble_group_backend_name = $cinder_nimble['nimble_group_backend_name'] -$no_backends = $cinder_nimble['no_backends'] -$nimble1_backend_type = $cinder_nimble['nimble1_backend_type'] -$nimble1_backend_name = $cinder_nimble['nimble1_backend_name'] -$nimble2_backend_type = $cinder_nimble['nimble2_backend_type'] -$nimble2_backend_name = $cinder_nimble['nimble2_backend_name'] +$no_backends = $cinder_nimble['no_backends'] $hiera_dir = '/etc/hiera/plugins' $plugin_yaml = 'cinder_nimble.yaml' $plugin_name = 'cinder_nimble' -# extraspecs -$nimble_group_encryption = $cinder_nimble['nimble_group_encryption'] -$nimble_group_perfpol = $cinder_nimble['nimble_group_perfpol'] -$nimble_group_multi_init = $cinder_nimble['nimble_group_multi_init'] -$nimble1_encryption = $cinder_nimble['nimble1_encryption'] -$nimble1_perfpol = $cinder_nimble['nimble1_perfpol'] -$nimble1_multi_init = $cinder_nimble['nimble1_multi_init'] -$nimble2_encryption = $cinder_nimble['nimble2_encryption'] -$nimble2_perfpol = $cinder_nimble['nimble2_perfpol'] -$nimble2_multi_init = $cinder_nimble['nimble2_multi_init'] - file { $hiera_dir: ensure => directory, } +$range_array = range("1", $no_backends) + # Create content based on grouping flag. # This is separated to keep the inline content and conditions tidy. if ($cinder_nimble['nimble_grouping']) == true { $content = inline_template(' storage: volume_backend_names: - <%= nimble_group_backend_type %>: <%= nimble_group_backend_name %> + <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_backend_name"] %> nimble_encryption: - <%= nimble_group_backend_type %>: <%= nimble_group_encryption -%> -<% if nimble_group_perfpol != "" %> + <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_encryption"] -%> +<% if @cinder_nimble["nimble_group_perfpol"] != "" %> nimble_perfpol: - <%= nimble_group_backend_type %>: <%= nimble_group_perfpol -%> + <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_perfpol"] -%> <% end %> nimble_multi_init: - <%= nimble_group_backend_type %>: <%= nimble_group_multi_init %> + <%= @cinder_nimble["nimble_group_backend_type"] %>: <%= @cinder_nimble["nimble_group_multi_init"] %> ') } else { $content = inline_template(' storage: volume_backend_names: - <%= nimble1_backend_type %>: <%= nimble1_backend_name -%> -<% if no_backends != "1" %> - <%= nimble2_backend_type %>: <%= nimble2_backend_name -%> +<% @range_array.each do |i| -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_backend_name"] %> <% end %> nimble_encryption: - <%= nimble1_backend_type %>: <%= nimble1_encryption -%> -<% if no_backends != "1" %> - <%= nimble2_backend_type %>: <%= nimble2_encryption -%> -<% end -%> -<% if nimble1_perfpol != "" or nimble2_perfpol != "" %> - nimble_perfpol: -<% if nimble1_perfpol != "" -%> - <%= nimble1_backend_type %>: <%= nimble1_perfpol -%> +<% @range_array.each do |i| -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_encryption"] %> <% end %> -<% if no_backends != "1" and nimble2_perfpol != "" -%> - <%= nimble2_backend_type %>: <%= nimble2_perfpol -%> + nimble_perfpol: + __dummy__: __dummy__ +<% @range_array.each do |i| -%> +<% if @cinder_nimble["nimble#{i}_perfpol"] != "" -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_perfpol"] -%> <% end %> <% end %> nimble_multi_init: - <%= nimble1_backend_type %>: <%= nimble1_multi_init -%> -<% if no_backends != "1" %> - <%= nimble2_backend_type %>: <%= nimble2_multi_init -%> +<% @range_array.each do |i| -%> + <%= @cinder_nimble["nimble#{i}_backend_type"] %>: <%= @cinder_nimble["nimble#{i}_multi_init"] %> <% end %> ') } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/disable_default_type.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/disable_default_type.pp index 80bca0d..1ce0966 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/disable_default_type.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/disable_default_type.pp @@ -5,35 +5,20 @@ class plugin_cinder_nimble::backend::disable_default_type ( include plugin_cinder_nimble::params include cinder::params - $cinder_nimble = hiera_hash('cinder_nimble', {}) - - if ($cinder_nimble['nimble_grouping']) == true { - $nimble_default_type_set = $cinder_nimble['nimble_group_default_backend'] - } - else { - $nimble_default_type_set = $cinder_nimble['nimble1_default_backend'] or - $cinder_nimble['nimble2_default_backend'] or - $cinder_nimble['nimble3_default_backend'] or - $cinder_nimble['nimble4_default_backend'] or - $cinder_nimble['nimble5_default_backend'] + ini_setting {"disable_default_type_${nimble_backend_type}": + ensure => absent, + section => 'DEFAULT', + path => $config_file, + setting => 'default_volume_type', } - if ($nimble_default_type_set) == true { - ini_setting {"disable_default_type_${nimble_backend_type}": - ensure => absent, - section => 'DEFAULT', - path => $config_file, - setting => 'default_volume_type', - } + Cinder_config<||> ~> Service['cinder-api'] - Cinder_config<||> ~> Service['cinder-api'] - - service { 'cinder-api': - ensure => stopped, - name => $::cinder::params::api_service, - enable => true, - hasstatus => true, - hasrestart => true, - } + service { 'cinder-api': + ensure => stopped, + name => $::cinder::params::api_service, + enable => true, + hasstatus => true, + hasrestart => true, } } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/nimble.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/nimble.pp index 84679f5..60f3469 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/nimble.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/nimble.pp @@ -2,91 +2,41 @@ class plugin_cinder_nimble::backend::nimble ( $cinder_nimble = $plugin_cinder_nimble::params::cinder_nimble ) { - include plugin_cinder_nimble::params include cinder::params - # Get the group backend name as configured by the user - $nimble_group_backend_name = $cinder_nimble['nimble_group_backend_name'] + define plugin_cinder_nimble::add_backend ( + $array, # pass the original $name + ) { + #notice(inline_template('NAME: <%= name.inspect %>')) - # Sets correct driver depending on backend protocol - if ($cinder_nimble['nimble1_backend_protocol']) == 'iSCSI' { - if ! defined(Package['open-iscsi']) { - # We need following packages to create a root volume during an instance spawning - package { 'open-iscsi': } + # build a unique name... + $length = inline_template('<%= array.length %>') + $ulength = inline_template('<%= array.uniq.length %>') + if ( "${length}" != '0' ) and ( "${length}" != "${ulength}" ) { + fail('Array must not have duplicates.') + } + # if array had duplicates, this wouldn't be a unique index + $index = inline_template('<%= array.index(name) %>') + + plugin_cinder_nimble::backend::set_nimble_backend { "$index" : + backend_id => $name, + index => "$index", } - $nimble1_cinder_driver = 'cinder.volume.drivers.nimble.NimbleISCSIDriver' - } - elsif ($cinder_nimble['nimble1_backend_protocol']) == 'FC' { - $nimble1_cinder_driver = 'cinder.volume.drivers.nimble.NimbleFCDriver' } - # To be ensure that $ symbol is correctly escaped in cinder password - $nimble1_password = regsubst($cinder_nimble['nimble1_password'],'\$','$$','G') - - # Check whether grouping is enabled and adjust volume_backend_name accordingly - if ($cinder_nimble['nimble_grouping']) == true { - $nimble1_backend_name = "${nimble_group_backend_name}_1" - $nimble1_volume_backend_name = "${nimble_group_backend_name}" + # Should work from Puppet >= 4.0.0 onwards which has Future parser + /* + range("1", "$cinder_nimble['no_backends']").each |$id| { + # Set backend details + class { 'plugin_cinder_nimble::backend::set_nimble_backend' : + $backend_id => $id, + } } - else { - $nimble1_backend_name = "${cinder_nimble['nimble1_backend_name']}" - $nimble1_volume_backend_name = "${cinder_nimble['nimble1_backend_name']}" + */ + + $range_array = range("1", $cinder_nimble['no_backends']) + plugin_cinder_nimble::add_backend { $range_array: + array => $range_array, } - - Cinder_config <||> -> Plugin_cinder_nimble::Backend::Enable_backend[$nimble1_backend_name] ~> Service <||> - Cinder_config <||> ~> Service <||> - - cinder_config { - "$nimble1_backend_name/volume_backend_name": value => $nimble1_volume_backend_name; - "$nimble1_backend_name/volume_driver": value => $nimble1_cinder_driver; - "$nimble1_backend_name/san_ip": value => $cinder_nimble['nimble1_san_ip']; - "$nimble1_backend_name/san_login": value => $cinder_nimble['nimble1_login']; - "$nimble1_backend_name/san_password": value => $nimble1_password; - } - - # Adds the backend in parameter - plugin_cinder_nimble::backend::enable_backend { $nimble1_backend_name: } - - if ($cinder_nimble['no_backends']) >= '2' { - # Sets correct driver depending on backend protocol - if ($cinder_nimble['nimble2_backend_protocol']) == 'iSCSI' { - if ! defined(Package['open-iscsi']) { - # We need following packages to create a root volume during an instance spawning - package { 'open-iscsi': } - } - $nimble2_cinder_driver = 'cinder.volume.drivers.nimble.NimbleISCSIDriver' - } - elsif ($cinder_nimble['nimble2_backend_protocol']) == 'FC' { - $nimble2_cinder_driver = 'cinder.volume.drivers.nimble.NimbleFCDriver' - } - - # To be ensure that $ symbol is correctly escaped in cinder password - $nimble2_password = regsubst($cinder_nimble['nimble2_password'],'\$','$$','G') - - # Check whether grouping is enabled and adjust volume_backend_name accordingly - if ($cinder_nimble['nimble_grouping']) == true { - $nimble2_backend_name = "${nimble_group_backend_name}_2" - $nimble2_volume_backend_name = "${nimble_group_backend_name}" - } - else { - $nimble2_backend_name = "${cinder_nimble['nimble2_backend_name']}" - $nimble2_volume_backend_name = "${cinder_nimble['nimble2_backend_name']}" - } - - Cinder_config <||> -> Plugin_cinder_nimble::Backend::Enable_backend[$nimble2_backend_name] ~> Service <||> - Cinder_config <||> ~> Service <||> - - cinder_config { - "$nimble2_backend_name/volume_backend_name": value => $nimble2_volume_backend_name; - "$nimble2_backend_name/volume_driver": value => $nimble2_cinder_driver; - "$nimble2_backend_name/san_ip": value => $cinder_nimble['nimble2_san_ip']; - "$nimble2_backend_name/san_login": value => $cinder_nimble['nimble2_login']; - "$nimble2_backend_name/san_password": value => $nimble2_password; - } - - # Adds the backend in parameter - plugin_cinder_nimble::backend::enable_backend { $nimble2_backend_name: } - } - service { $cinder::params::volume_service: } } diff --git a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_default_type.pp b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_default_type.pp index 0fc6d2d..01d25bf 100644 --- a/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_default_type.pp +++ b/deployment_scripts/puppet/modules/plugin_cinder_nimble/manifests/backend/set_default_type.pp @@ -1,30 +1,27 @@ class plugin_cinder_nimble::backend::set_default_type ( $config_file, - $nimble_default_type_set, $nimble_backend_type ) { include plugin_cinder_nimble::params include cinder::params - if ($nimble_default_type_set) == true { - ini_subsetting {"set_default_type_${nimble_backend_type}": - ensure => present, - section => 'DEFAULT', - key_val_separator => '=', - path => $config_file, - setting => 'default_volume_type', - subsetting => $nimble_backend_type, - } + ini_subsetting {"set_default_type_${nimble_backend_type}": + ensure => present, + section => 'DEFAULT', + key_val_separator => '=', + path => $config_file, + setting => 'default_volume_type', + subsetting => $nimble_backend_type, + } - Cinder_config<||> ~> Service['cinder-api'] + Cinder_config<||> ~> Service['cinder-api'] - service { 'cinder-api': - ensure => running, - name => $::cinder::params::api_service, - enable => true, - hasstatus => true, - hasrestart => true, - } + service { 'cinder-api': + ensure => running, + name => $::cinder::params::api_service, + enable => true, + hasstatus => true, + hasrestart => true, } } 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 f0ca982..88320aa 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 @@ -3,10 +3,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_backend_names = keys($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 => $nimble_perfpol, + volume_backend_names => $available_backends, key => 'nimble:perfpol-name' } }