diff --git a/manifests/backend/dellemc_powermax.pp b/manifests/backend/dellemc_powermax.pp new file mode 100644 index 00000000..06de1862 --- /dev/null +++ b/manifests/backend/dellemc_powermax.pp @@ -0,0 +1,110 @@ +# +# == Define: cinder::backend::dellemc_powermax +# +# Setup Cinder to use the Dell EMC PowerMax Driver +# Compatible for multiple backends +# +# == Parameters +# +# [*san_ip*] +# (required) IP address of PowerMax Unisphere. +# +# [*san_login*] +# (required) PowerMax Unisphere user name. +# +# [*san_password*] +# (required) PowerMax Unisphere user password. +# +# [*powermax_array*] +# (required) Serial number of the PowerMax Array. +# +# [*powermax_srp*] +# (required) Storage resource pool on array to use for provisioning. +# +# [*powermax_port_groups*] +# (required) List of port groups. +# +# [*powermax_storage_protocol*] +# (optional) The Storage protocol, iSCSI or FC. +# This will determine +# which Volume Driver will be configured; PowerMaxISCSIDriver or PowerMaxFCDriver. +# Defaults to 'iSCSI' + +# [*volume_backend_name*] +# (optional) Allows for the volume_backend_name to be separate of $name. +# Defaults to: $name +# +# [*backend_availability_zone*] +# (Optional) Availability zone for this volume backend. +# If not set, the storage_availability_zone option value +# is used as the default for all backends. +# Defaults to $::os_service_default. +# +# [*volume_driver*] +# (optional) The Dell EMC PowerMax Driver +# +# [*manage_volume_type*] +# (Optional) Whether or not manage Cinder Volume type. +# If set to true, a Cinder Volume type will be created +# with volume_backend_name=$volume_backend_name key/value. +# Defaults to false. +# +# [*extra_options*] +# (optional) Hash of extra options to pass to the backend stanza +# Defaults to: {} +# Example : +# { 'dellemc_powermax_backend/param1' => { 'value' => value1 } }# +# +define cinder::backend::dellemc_powermax ( + $san_ip, + $san_login, + $san_password, + $powermax_array, + $powermax_srp, + $powermax_port_groups, + $powermax_storage_protocol = 'iSCSI', + $volume_backend_name = $name, + $backend_availability_zone = $::os_service_default, + $extra_options = {}, + $manage_volume_type = false, +) { + + include cinder::deps + + if $powermax_storage_protocol == 'iSCSI' { + $volume_driver = 'cinder.volume.drivers.dell_emc.powermax.iscsi.PowerMaxISCSIDriver' + } + elsif $powermax_storage_protocol == 'FC' { + $volume_driver = 'cinder.volume.drivers.dell_emc.powermax.fc.PowerMaxFCDriver' + } + else { + fail('The cinder::backend::dellemc_powermax powermax_storage_protocol specified is not valid. It should be iSCSI or FC') + } + + cinder_config { + "${name}/volume_backend_name": value => $volume_backend_name; + "${name}/backend_availability_zone": value => $backend_availability_zone; + "${name}/volume_driver": value => $volume_driver; + "${name}/san_ip": value => $san_ip; + "${name}/san_login": value => $san_login; + "${name}/san_password": value => $san_password, secret => true; + "${name}/powermax_array": value => $powermax_array; + "${name}/powermax_srp": value => $powermax_srp; + "${name}/powermax_port_groups": value => $powermax_port_groups; + } + + if $manage_volume_type { + cinder_type { $volume_backend_name: + ensure => present, + properties => ["volume_backend_name=${volume_backend_name}"], + } + } + + ensure_packages( 'pywbem', { + ensure => present, + name => $::cinder::params::pywbem_package_name, + tag => 'cinder-support-package'}) + + create_resources('cinder_config', $extra_options) + +} diff --git a/releasenotes/notes/powermax-driver-d428e372280c44e6.yaml b/releasenotes/notes/powermax-driver-d428e372280c44e6.yaml new file mode 100644 index 00000000..967097b6 --- /dev/null +++ b/releasenotes/notes/powermax-driver-d428e372280c44e6.yaml @@ -0,0 +1,4 @@ +--- +features: + - Add new PowerMax backend driver options to support + both iSCSI and FC options.` diff --git a/spec/defines/cinder_backend_dellemc_powermax_spec.rb b/spec/defines/cinder_backend_dellemc_powermax_spec.rb new file mode 100644 index 00000000..4ed4ddcb --- /dev/null +++ b/spec/defines/cinder_backend_dellemc_powermax_spec.rb @@ -0,0 +1,101 @@ +require 'spec_helper' + +describe 'cinder::backend::dellemc_powermax' do + let (:config_group_name) { 'dellemc_powermax' } + + let (:title) { config_group_name } + + let :params do + { + :san_ip => '127.0.0.2', + :san_login => 'Admin', + :san_password => '12345', + :powermax_array => '000123456789', + :powermax_srp => 'SRP_1', + :powermax_port_groups => '[OS-ISCSI-PG]', + } + end + + shared_examples 'cinder::backend::dellemc_powermax' do + context 'with default parameters' do + it 'should configure an iSCSI dellemc_powermax backend' do + is_expected.to contain_cinder__backend__dellemc_powermax(config_group_name) + is_expected.to contain_cinder_config("#{title}/volume_driver").with_value( + 'cinder.volume.drivers.dell_emc.powermax.iscsi.PowerMaxISCSIDriver' + ) + is_expected.to contain_cinder_config("#{title}/san_ip").with_value('127.0.0.2') + is_expected.to contain_cinder_config("#{title}/san_login").with_value('Admin') + is_expected.to contain_cinder_config("#{title}/san_password").with_value('12345') + is_expected.to contain_cinder_config("#{title}/powermax_array").with_value('000123456789') + is_expected.to contain_cinder_config("#{title}/powermax_srp").with_value('SRP_1') + is_expected.to contain_cinder_config("#{title}/powermax_port_groups").with_value('[OS-ISCSI-PG]') + is_expected.to contain_cinder_config("#{title}/backend_availability_zone").with_value('') + end + end + + context 'with powermax_storage_protocol set to FC' do + before do + params.merge!(:powermax_storage_protocol => 'FC',) + end + + it 'should configure the FC driver' do + is_expected.to contain_cinder_config("#{title}/volume_driver").with_value( + 'cinder.volume.drivers.dell_emc.powermax.fc.PowerMaxFCDriver' + ) + end + end + + context 'with an invalid powermax_storage_protocol' do + before do + params.merge!(:powermax_storage_protocol => 'BAD',) + end + + it 'should raise an error' do + is_expected.to compile.and_raise_error( + /The cinder::backend::dellemc_powermax powermax_storage_protocol specified is not valid. It should be iSCSI or FC/ + ) + end + end + + context 'with custom backend_availability_zone' do + before do + params.merge!(:backend_availability_zone => 'my_zone') + end + + it 'should configure the backend_availability_zone' do + is_expected.to contain_cinder_config("#{title}/backend_availability_zone").with_value('my_zone') + end + end + + context 'dellemc_powermax backend with additional configuration' do + before do + params.merge!( :extra_options => {'dellemc_powermax/param1' => { 'value' => 'value1' }} ) + end + + it { is_expected.to contain_cinder_config('dellemc_powermax/param1').with_value('value1') } + end + + context 'dellemc_powermax backend with cinder type' do + before do + params.merge!( :manage_volume_type => true ) + end + + it { is_expected.to contain_cinder_type('dellemc_powermax').with( + :ensure => 'present', + :properties => ['volume_backend_name=dellemc_powermax'] + )} + end + end + + on_supported_os({ + :supported_os => OSDefaults.get_supported_os + }).each do |os,facts| + context "on #{os}" do + let (:facts) do + facts.merge!(OSDefaults.get_facts()) + end + + it_behaves_like 'cinder::backend::dellemc_powermax' + end + end +end