diff --git a/manifests/backend/dellemc_sc.pp b/manifests/backend/dellemc_sc.pp new file mode 100644 index 00000000..1afa95bd --- /dev/null +++ b/manifests/backend/dellemc_sc.pp @@ -0,0 +1,163 @@ +# == define: cinder::backend::dellemc_sc +# +# Configure the Dell Storage Center Driver for cinder. +# +# === Parameters +# +# [*san_ip*] +# (required) IP address of Enterprise Manager. +# +# [*san_login*] +# (required) Enterprise Manager user name. +# +# [*san_password*] +# (required) Enterprise Manager user password. +# +# [*dell_sc_ssn*] +# (required) The Storage Center serial number to use. +# +# [*target_ip_address*] +# (optional) The IP address that the iSCSI daemon is listening on. +# Defaults to undef. Only applicable for iSCSI driver. +# +# [*volume_backend_name*] +# (optional) The storage backend name. +# Defaults to the name of the backend +# +# [*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. +# +# [*dell_sc_api_port*] +# (optional) The Enterprise Manager API port. +# Defaults to $::os_service_default +# +# [*dell_sc_server_folder*] +# (optional) Name of the server folder to use on the Storage Center. +# Defaults to 'srv' +# +# [*dell_sc_verify_cert*] +# (optional) Enable HTTPS SC ceritifcate verification +# Defaults to $::os_service_default +# +# [*dell_sc_volume_folder*] +# (optional) Name of the volume folder to use on the Storage Center. +# Defaults to 'vol' +# +# [*target_port*] +# (optional) The ISCSI IP Port of the Storage Center. +# Defaults to $::os_service_default +# +# [*excluded_domain_ips*] +# (optional)Comma separated list of domain IPs to be excluded from +# iSCSI returns of Storage Center. +# Defaults to $::os_service_default +# +# [*secondary_san_ip*] +# (optional) IP address of secondary DSM controller. +# Defaults to $::os_service_default +# +# [*secondary_san_login*] +# (optional) Secondary DSM user name. +# Defaults to $::os_service_default +# +# [*secondary_san_password*] +# (optional) Secondary DSM user password. +# Defaults to $::os_service_default +# +# [*secondary_sc_api_port*] +# (optional) Secondary Dell API port. +# Defaults to $::os_service_default +# +# [*extra_options*] +# (optional) Hash of extra options to pass to the backend stanza. +# Defaults to: {} +# Example: +# { 'dellemc_sc_backend/param1' => { 'value' => value1 } } +# +# [*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. +# +# [*use_multipath_for_image_xfer*] +# (Optional) Enables multipath configuration. +# Defaults to true. +# +# [*sc_storage_protocol*] +# (optional) The Storage protocol, iSCSI or FC. +# This will determine +# which Volume Driver will be configured; SCISCSIDriver or SCFCDriver. +# Defaults to 'iSCSI' +# +define cinder::backend::dellemc_sc ( + $san_ip, + $san_login, + $san_password, + $dell_sc_ssn, + $target_ip_address = undef, + $volume_backend_name = $name, + $backend_availability_zone = $::os_service_default, + $dell_sc_api_port = $::os_service_default, + $dell_sc_server_folder = 'srv', + $dell_sc_verify_cert = $::os_service_default, + $dell_sc_volume_folder = 'vol', + $target_port = $::os_service_default, + $excluded_domain_ips = $::os_service_default, + $secondary_san_ip = $::os_service_default, + $secondary_san_login = $::os_service_default, + $secondary_san_password = $::os_service_default, + $secondary_sc_api_port = $::os_service_default, + $manage_volume_type = false, + $use_multipath_for_image_xfer = true, + $sc_storage_protocol = 'iSCSI', + $extra_options = {}, +) { + + include cinder::deps + + if $sc_storage_protocol == 'iSCSI' { + $volume_driver = 'cinder.volume.drivers.dell_emc.sc.storagecenter_iscsi.SCISCSIDriver' + } + elsif $sc_storage_protocol == 'FC' { + $volume_driver = 'cinder.volume.drivers.dell_emc.sc.storagecenter_fc.SCFCDriver' + } + else { + fail('The cinder::backend::dellemc_sc sc_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}/target_ip_address": value => $target_ip_address; + "${name}/dell_sc_ssn": value => $dell_sc_ssn; + "${name}/dell_sc_api_port": value => $dell_sc_api_port; + "${name}/dell_sc_server_folder": value => $dell_sc_server_folder; + "${name}/dell_sc_verify_cert": value => $dell_sc_verify_cert; + "${name}/dell_sc_volume_folder": value => $dell_sc_volume_folder; + "${name}/target_port": value => $target_port; + "${name}/excluded_domain_ips": value => $excluded_domain_ips; + "${name}/secondary_san_ip": value => $secondary_san_ip; + "${name}/secondary_san_login": value => $secondary_san_login; + "${name}/secondary_san_password": value => $secondary_san_password, secret => true; + "${name}/secondary_sc_api_port": value => $secondary_sc_api_port; + "${name}/use_multipath_for_image_xfer": value => $use_multipath_for_image_xfer; + } + + if $manage_volume_type { + cinder_type { $volume_backend_name: + ensure => present, + properties => ["volume_backend_name=${volume_backend_name}"], + } + } + + create_resources('cinder_config', $extra_options) + +} diff --git a/releasenotes/notes/sc-driver-ab28e372280c44e6.yaml b/releasenotes/notes/sc-driver-ab28e372280c44e6.yaml new file mode 100644 index 00000000..5fc6c754 --- /dev/null +++ b/releasenotes/notes/sc-driver-ab28e372280c44e6.yaml @@ -0,0 +1,4 @@ +--- +features: + - Added Dell EMC SC backend driver config that supports + both iSCSI and FC options. diff --git a/spec/defines/cinder_backend_dellemc_sc.rb b/spec/defines/cinder_backend_dellemc_sc.rb new file mode 100644 index 00000000..5ce5b75d --- /dev/null +++ b/spec/defines/cinder_backend_dellemc_sc.rb @@ -0,0 +1,134 @@ +require 'spec_helper' + +describe 'cinder::backend::dellemc_sc' do + let (:config_group_name) { 'dellemc_sc' } + + let (:title) { config_group_name } + + let :params do + { + :san_ip => '172.23.8.101', + :san_login => 'Admin', + :san_password => '12345', + :target_ip_address => '192.168.0.20', + :dell_sc_ssn => '64720', + } + end + + let :default_params do + { + :backend_availability_zone => '', + :dell_sc_api_port => '', + :dell_sc_server_folder => 'srv', + :dell_sc_verify_cert => '', + :dell_sc_volume_folder => 'vol', + :target_port => '', + :excluded_domain_ips => '', + :secondary_san_ip => '', + :secondary_san_login => '', + :secondary_san_password => '', + :secondary_sc_api_port => '', + :use_multipath_for_image_xfer => 'true', + } + end + + let :custom_params do + { + :backend_availability_zone => 'my_zone', + :dell_sc_api_port => 111, + :dell_sc_server_folder => 'other_srv', + :dell_sc_verify_cert => true, + :dell_sc_volume_folder => 'other_vol', + :target_port => 222, + :secondary_san_ip => '127.0.0.3', + :secondary_san_login => 'Foo', + :secondary_san_password => 'Bar', + :secondary_sc_api_port => 333, + } + end + + shared_examples 'dellemc_sc volume driver' do + let :params_hash do + default_params.merge(params) + end + + it { is_expected.to contain_cinder__backend__dellemc_sc(config_group_name) } + + it { + params_hash.each_pair do |config,value| + is_expected.to contain_cinder_config("#{config_group_name}/#{config}").with_value( value ) + end + } + + it { + is_expected.to contain_cinder_config("#{config_group_name}/volume_driver").with_value('cinder.volume.drivers.dell_emc.sc.storagecenter_iscsi.SCISCSIDriver') + is_expected.to contain_cinder_config("#{config_group_name}/use_multipath_for_image_xfer").with_value('true') + } + end + + context 'with sc_storage_protocol set to FC' do + before do + params.merge!(:sc_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.sc.storagecenter_fc.SCFCDriver' + ) + end + end + + context 'with an invalid sc_storage_protocol' do + before do + params.merge!(:sc_storage_protocol => 'BAD',) + end + + it 'should raise an error' do + is_expected.to compile.and_raise_error( + /The cinder::backend::dellemc_sc sc_storage_protocol specified is not valid. It should be iSCSI or FC/ + ) + end + end + + shared_examples 'cinder::backend::dellemc_sc' do + context 'with default parameters' do + it_behaves_like 'dellemc_sc volume driver' + end + + context 'with custom parameters' do + before do + params.merge(custom_params) + end + + it_behaves_like 'dellemc_sc volume driver' + end + + context 'dellemc_sc backend with additional configuration' do + before do + params.merge!({:extra_options => {'dellemc_sc/param1' => { 'value' => 'value1' }}}) + end + + it { is_expected.to contain_cinder_config('dellemc_sc/param1').with_value('value1') } + end + + context 'dellemc_sc backend with cinder type' do + before do + params.merge!({:manage_volume_type => true}) + end + + it { is_expected.to contain_cinder_type('dellemc_sc').with(:ensure => :present, :properties => ['volume_backend_name=dellemc_sc']) } + 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_sc' + end + end +end