From e7bcd475a975c4905356eacb779c461108998509 Mon Sep 17 00:00:00 2001 From: Andy McCrae Date: Mon, 10 Feb 2014 15:52:48 +0000 Subject: [PATCH] Add EMC VMAX/VNX support as a provider for cinder - Add EMC attributes - Create cinder_emc_config.xml when EMC driver is used. - Installs appropriate packages when EMC driver is used. - Add tests for new cinder_emc_config.xml - Add tests for changed attributes in existing cinder.conf - Add tests for package installs Change-Id: I5a44e3626784814f57e15a43ce459a4d36d31c6b Implements: blueprint emc-cinder-provider --- attributes/default.rb | 17 +++++- recipes/volume.rb | 19 +++++++ spec/cinder_common_spec.rb | 18 +++++- spec/spec_helper.rb | 3 + spec/volume-redhat_spec.rb | 9 +++ spec/volume-suse_spec.rb | 9 +++ spec/volume_spec.rb | 62 +++++++++++++++++++++ templates/default/cinder.conf.erb | 7 +++ templates/default/cinder_emc_config.xml.erb | 10 ++++ 9 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 templates/default/cinder_emc_config.xml.erb diff --git a/attributes/default.rb b/attributes/default.rb index 3d8578a..6692920 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -139,6 +139,18 @@ default['openstack']['block-storage']['solidfire']['san_password'] = node['opens default['openstack']['block-storage']['solidfire']['sf_emulate'] = 'False' default['openstack']['block-storage']['solidfire']['iscsi_ip_prefix'] = nil +# EMC VMAX/VNX tSupport +# The EmcUserName user's password is stored in an encrypted databag and +# accessed with openstack-common cookbook library's "get_password" routeine. You +# are expected to create the user and pass in a wrapper cookbook. +default['openstack']['block-storage']['emc']['iscsi_target_prefix'] = 'iqn.1992-04.com.emc' +default['openstack']['block-storage']['emc']['cinder_emc_config_file'] = '/etc/cinder/cinder_emc_config.xml' +default['openstack']['block-storage']['emc']['StorageType'] = 0 +default['openstack']['block-storage']['emc']['EcomServerIP'] = '127.0.0.1' +default['openstack']['block-storage']['emc']['EcomServerPort'] = '5988' +default['openstack']['block-storage']['emc']['EcomUserName'] = 'admin' +default['openstack']['block-storage']['emc']['MaskingView'] = nil + # logging attribute default['openstack']['block-storage']['syslog']['use'] = false default['openstack']['block-storage']['syslog']['facility'] = 'LOG_LOCAL2' @@ -197,6 +209,7 @@ when 'fedora', 'redhat', 'centos' # :pragma-foodcritic: ~FC024 - won't fix this 'cinder_iscsitarget_service' => 'tgtd', 'cinder_ceph_packages' => ['python-ceph'], 'cinder_nfs_packages' => ['nfs-utils', 'nfs-utils-lib'], + 'cinder_emc_packages' => ['pywbem'], 'package_overrides' => '' } when 'suse' @@ -217,7 +230,8 @@ when 'suse' 'cinder_ceph_packages' => ['python-ceph'], 'cinder_iscsitarget_packages' => ['tgt'], 'cinder_iscsitarget_service' => 'tgtd', - 'cinder_nfs_packages' => ['nfs-utils'] + 'cinder_nfs_packages' => ['nfs-utils'], + 'cinder_emc_packages' => ['python-pywbem'] } when 'ubuntu' # operating system user and group names @@ -238,6 +252,7 @@ when 'ubuntu' 'cinder_iscsitarget_packages' => ['tgt'], 'cinder_iscsitarget_service' => 'tgt', 'cinder_nfs_packages' => ['nfs-common'], + 'cinder_emc_packages' => ['python-pywbem'], 'package_overrides' => "-o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef'" } end diff --git a/recipes/volume.rb b/recipes/volume.rb index 12db440..910dc1c 100644 --- a/recipes/volume.rb +++ b/recipes/volume.rb @@ -150,6 +150,25 @@ when 'cinder.volume.drivers.lvm.LVMISCSIDriver' action [:enable, :start] end end + +when 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + platform_options['cinder_emc_packages'].each do |pkg| + package pkg do + options platform_options['package_overrides'] + action :upgrade + end + end + + ecom_password = get_password('user', node['openstack']['block-storage']['emc']['EcomUserName']) + + template node['openstack']['block-storage']['emc']['cinder_emc_config_file'] do + source 'cinder_emc_config.xml.erb' + variables( + ecom_password: ecom_password + ) + mode 00644 + notifies :restart, 'service[iscsitarget]', :immediately + end end service 'cinder-volume' do diff --git a/spec/cinder_common_spec.rb b/spec/cinder_common_spec.rb index 2cd02d2..a2952ec 100644 --- a/spec/cinder_common_spec.rb +++ b/spec/cinder_common_spec.rb @@ -287,6 +287,23 @@ describe 'openstack-block-storage::cinder-common' do expect(@chef_run).to render_file(@file.name).with_content('iscsi_ip_prefix=203.0.113.*') end end + + describe 'emc settings' do + before do + @chef_run.node.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + @chef_run.node.set['openstack']['block-storage']['emc']['iscsi_target_prefix'] = 'test.prefix' + @chef_run.node.set['openstack']['block-storage']['emc']['cinder_emc_config_file'] = '/etc/test/config.file' + @chef_run.converge 'openstack-block-storage::cinder-common' + end + + it 'has emc iscsi_target_prefix' do + expect(@chef_run).to render_file(@file.name).with_content('iscsi_target_prefix=test.prefix') + end + + it 'has cinder_emc_config_file' do + expect(@chef_run).to render_file(@file.name).with_content('cinder_emc_config_file=/etc/test/config.file') + end + end end describe '/var/lock/cinder' do @@ -303,5 +320,4 @@ describe 'openstack-block-storage::cinder-common' do expect(sprintf('%o', @dir.mode)).to eq '700' end end - end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d73845f..cd3cf1e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -51,6 +51,9 @@ def block_storage_stubs # rubocop:disable MethodLength ::Chef::Recipe.any_instance.stub(:get_password) .with('service', 'openstack_image_cephx_key') .and_return('cephx-key') + ::Chef::Recipe.any_instance.stub(:get_password) + .with('user', 'admin') + .and_return('emc_test_pass') ::Chef::Application.stub(:fatal!) end diff --git a/spec/volume-redhat_spec.rb b/spec/volume-redhat_spec.rb index 8de1229..e9ad611 100644 --- a/spec/volume-redhat_spec.rb +++ b/spec/volume-redhat_spec.rb @@ -64,6 +64,15 @@ describe 'openstack-block-storage::volume' do expect(chef_run).to upgrade_package 'nfs-utils-lib' end + it 'installs emc packages' do + chef_run = ::ChefSpec::Runner.new ::REDHAT_OPTS do |n| + n.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + end + chef_run.converge 'openstack-block-storage::volume' + + expect(chef_run).to upgrade_package 'pywbem' + end + it 'has redhat include' do file = '/etc/tgt/targets.conf' diff --git a/spec/volume-suse_spec.rb b/spec/volume-suse_spec.rb index f8ff67b..fbdd1bc 100644 --- a/spec/volume-suse_spec.rb +++ b/spec/volume-suse_spec.rb @@ -57,6 +57,15 @@ describe 'openstack-block-storage::volume' do expect(chef_run).not_to upgrade_package 'nfs-utils-lib' end + it 'installs emc packages' do + chef_run = ::ChefSpec::Runner.new ::SUSE_OPTS do |n| + n.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + end + chef_run.converge 'openstack-block-storage::volume' + + expect(chef_run).to upgrade_package 'python-pywbem' + end + it 'has suse include' do file = '/etc/tgt/targets.conf' diff --git a/spec/volume_spec.rb b/spec/volume_spec.rb index a5c82c4..a03e8f0 100644 --- a/spec/volume_spec.rb +++ b/spec/volume_spec.rb @@ -45,6 +45,15 @@ describe 'openstack-block-storage::volume' do expect(@chef_run).to upgrade_package 'tgt' end + it 'installs emc packages' do + chef_run = ::ChefSpec::Runner.new ::UBUNTU_OPTS do |n| + n.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + end + chef_run.converge 'openstack-block-storage::volume' + + expect(chef_run).to upgrade_package 'python-pywbem' + end + it 'installs nfs packages' do chef_run = ::ChefSpec::Runner.new ::UBUNTU_OPTS do |n| n.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver' @@ -240,5 +249,58 @@ describe 'openstack-block-storage::volume' do expect(@chef_run).to create_template(@filename) end end + + describe 'cinder_emc_config.xml' do + before do + @chef_run = ::ChefSpec::Runner.new ::UBUNTU_OPTS do |n| + n.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + end + @chef_run.converge 'openstack-block-storage::volume' + @filename = '/etc/cinder/cinder_emc_config.xml' + @file = @chef_run.template(@filename) + end + + it 'creates cinder emc config file' do + expect(@chef_run).to create_template(@filename) + end + + it 'has proper modes' do + expect(sprintf('%o', @file.mode)).to eq('644') + end + + it 'has StorageType' do + expect(@chef_run).to render_file(@file.name).with_content('0') + end + + it 'has EcomServerIp' do + expect(@chef_run).to render_file(@file.name).with_content('127.0.0.1') + end + + it 'has EcomServerPort' do + expect(@chef_run).to render_file(@file.name).with_content('5988') + end + + it 'has EcomUserName' do + expect(@chef_run).to render_file(@file.name).with_content('admin') + end + + it 'has EcomPassword' do + expect(@chef_run).to render_file(@file.name).with_content('emc_test_pass') + end + + it 'does not have MaskingView when not specified' do + expect(@chef_run).not_to render_file(@file.name).with_content('') + end + + it 'has MaskingView when specified' do + @chef_run = ::ChefSpec::Runner.new ::UBUNTU_OPTS do |n| + n.set['openstack']['block-storage']['emc']['MaskingView'] = 'testMaskingView' + n.set['openstack']['block-storage']['volume']['driver'] = 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver' + end + @chef_run.converge 'openstack-block-storage::volume' + + expect(@chef_run).to render_file(@file.name).with_content('testMaskingView') + end + end end end diff --git a/templates/default/cinder.conf.erb b/templates/default/cinder.conf.erb index f88228f..d7e79d4 100644 --- a/templates/default/cinder.conf.erb +++ b/templates/default/cinder.conf.erb @@ -808,6 +808,13 @@ storwize_svc_multihostmap_enabled=<%= node["openstack"]["block-storage"]["storwi <% end %> +<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver" %> + +iscsi_target_prefix=<%= node["openstack"]["block-storage"]["emc"]["iscsi_target_prefix"] %> +cinder_emc_config_file=<%= node["openstack"]["block-storage"]["emc"]["cinder_emc_config_file"] %> + +<% end %> + ######## defined in cinder.volume.xiv ######## # xiv_proxy=xiv_openstack.nova_proxy.XIVNovaProxy diff --git a/templates/default/cinder_emc_config.xml.erb b/templates/default/cinder_emc_config.xml.erb new file mode 100644 index 0000000..9e722f7 --- /dev/null +++ b/templates/default/cinder_emc_config.xml.erb @@ -0,0 +1,10 @@ + +<%= node["openstack"]["block-storage"]["emc"]["StorageType"] %> +<%= node["openstack"]["block-storage"]["emc"]["EcomServerIP"] %> +<%= node["openstack"]["block-storage"]["emc"]["EcomServerPort"] %> +<%= node["openstack"]["block-storage"]["emc"]["EcomUserName"] %> +<%= @ecom_password %> +<% unless node["openstack"]["block-storage"]["emc"]["MaskingView"].nil? %> +<%= node["openstack"]["block-storage"]["emc"]["MaskingView"] %> +<% end %> +