diff --git a/CHANGELOG.md b/CHANGELOG.md index e199cf0..16db683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ openstack-block-storage Cookbook CHANGELOG ============================== This file is used to list changes made in each version of the openstack-block-storage cookbook. +## 9.3.0 +### Blue print +* Add multiple backend configuration support + ## 9.2.3 * Fix for storwize_svc_vol_rsize default diff --git a/README.md b/README.md index c145d2b..21f5344 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,9 @@ Cinder attributes * `openstack['block-storage']['ibmnas']['mount_point_base']` - Storage system autoexpand parameter for volumes * `openstack['block-storage']['ibmnas']['nfs_sparsed_volumes']` - Storage system volume creation method +### Multiple backends attributes ### +* `openstack['block-storage']['volume']['multi_backend']` - Hash map to indicate multiple backends sections, e.g. { 'lvm1' => { 'volume_driver' => 'cinder.volume.drivers.lvm.LVMISCSIDriver', 'volume_backend_name' => 'lvm1' }, 'lvm2' => { 'volume_driver' => 'cinder.volume.drivers.lvm.LVMISCSIDriver', 'volume_backend_name' => 'lvm2' } } + The following attributes are defined in attributes/default.rb of the common cookbook, but are documented here due to their relevance: * `openstack['endpoints']['block-storage-api-bind']['host']` - The IP address to bind the api service to diff --git a/attributes/default.rb b/attributes/default.rb index ab07ab0..0db56f4 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -222,6 +222,20 @@ default['openstack']['block-storage']['rbd_secret_uuid'] = nil default['openstack']['block-storage']['rbd_secret_name'] = '00000000-0000-0000-0000-000000000000' default['openstack']['block-storage']['rbd_key_name'] = 'openstack_image_cephx_key' +# Multiple backend support +# Allow multiple backends configured in cinder.conf +# For example: { +# 'lvm1' => { +# 'volume_driver': 'cinder.volume.drivers.lvm.LVMISCSIDriver', +# 'volume_backend_name': 'lvm-backend-1' +# } +# 'lvm2' => { +# 'volume_driver': 'cinder.volume.drivers.lvm.LVMISCSIDriver', +# 'volume_backend_name': 'lvm-backend-2' +# } +# } +default['openstack']['block-storage']['volume']['multi_backend'] = nil + # Misc option support # Allow additional strings to be added to cinder.conf # For example: ['# Comment', 'key=value'] diff --git a/metadata.rb b/metadata.rb index ad739ce..fd71827 100644 --- a/metadata.rb +++ b/metadata.rb @@ -5,7 +5,7 @@ maintainer_email 'cookbooks@lists.tfoundry.com' license 'Apache 2.0' description 'The OpenStack Advanced Volume Management service Cinder.' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) -version '9.2.3' +version '9.3.0' recipe 'openstack-block-storage::api', 'Installs the cinder-api, sets up the cinder database, and cinder service/user/endpoints in keystone' recipe 'openstack-block-storage::client', 'Install packages required for cinder client' diff --git a/recipes/cinder-common.rb b/recipes/cinder-common.rb index f7781f5..cf72295 100644 --- a/recipes/cinder-common.rb +++ b/recipes/cinder-common.rb @@ -64,6 +64,22 @@ directory '/etc/cinder' do action :create end +multi_backend_sections = {} +multi_backend = node['openstack']['block-storage']['volume']['multi_backend'] +if multi_backend.nil? + enabled_drivers = [node['openstack']['block-storage']['volume']['driver']] +else + enabled_drivers = [] + multi_backend.each do |drv, options| + optlines = [] + options.each do |optkey, optvalue| + optlines.push "#{optkey} = #{optvalue}" + enabled_drivers.push optvalue if optkey == 'volume_driver' + end + multi_backend_sections[drv] = optlines + end +end + template '/etc/cinder/cinder.conf' do source 'cinder.conf.erb' group node['openstack']['block-storage']['group'] @@ -80,7 +96,9 @@ template '/etc/cinder/cinder.conf' do solidfire_pass: solidfire_pass, volume_api_bind_address: cinder_api_bind.host, volume_api_bind_port: cinder_api_bind.port, - vmware_host_pass: vmware_host_pass + vmware_host_pass: vmware_host_pass, + enabled_drivers: enabled_drivers, + multi_backend_sections: multi_backend_sections ) end diff --git a/spec/cinder_common_spec.rb b/spec/cinder_common_spec.rb index ead5996..2b0f4a5 100644 --- a/spec/cinder_common_spec.rb +++ b/spec/cinder_common_spec.rb @@ -574,6 +574,145 @@ describe 'openstack-block-storage::cinder-common' do /^MISC=OPTION$/) end end + + context 'multiple backend settings' do + before do + node.set['openstack']['block-storage']['volume']['multi_backend'] = { + 'lvm' => { + 'volume_driver' => 'cinder.volume.drivers.lvm.LVMISCSIDriver', + 'volume_backend_name' => 'lvmdrv' + }, + 'rbd' => { + 'volume_driver' => 'cinder.volume.drivers.rbd.RBDDriver', + 'volume_backend_name' => 'rbddrv' + }, + 'netapp_iscsi' => { + 'volume_driver' => 'cinder.volume.drivers.netapp.NetAppISCSIDriver', + 'multi_netapp_iscsi' => 'multi-netapp' + }, + 'netapp_nfs' => { + 'volume_driver' => 'cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver', + 'volume_backend_name' => 'netappnfsdrv', + 'multi_netapp_nfs' => 'multi-netapp' + }, + 'ibmnas' => { + 'volume_driver' => 'cinder.volume.drivers.ibm.ibmnas.IBMNAS_NFSDriver', + 'multi_ibmnas' => 'multi-ibmnas' + }, + 'ibmsvc' => { + 'volume_driver' => 'cinder.volume.drivers.ibm.storwize_svc.StorwizeSVCDriver', + 'multi_ibmsvc' => 'multi-ibmsvc' + }, + 'solidfire' => { + 'volume_driver' => 'cinder.volume.drivers.solidfire.SolidFire', + 'multi_solidfire' => 'multi-solidfire' + }, + 'emciscsi' => { + 'volume_driver' => 'cinder.volume.drivers.emc.emc_smis_iscsi.EMCSMISISCSIDriver', + 'multi_emciscsi' => 'multi-emciscsi' + }, + 'vmware' => { + 'volume_driver' => 'cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver', + 'multi_vmware' => 'multi-vmware' + }, + 'gpfs' => { + 'volume_driver' => 'cinder.volume.drivers.gpfs.GPFSDriver', + 'multi_gpfs' => 'multi-gpfs' + } + } + node.set['openstack']['block-storage']['volume']['volume_group'] = 'multi-lvm-group' + node.set['openstack']['block-storage']['rbd_pool'] = 'multi-rbd-pool' + node.set['openstack']['block-storage']['netapp']['dfm_login'] = 'multi-netapp-login' + node.set['openstack']['block-storage']['netapp']['netapp_server_hostname'] = ['netapp-host-1', 'netapp-host-2'] + node.set['openstack']['block-storage']['netapp']['netapp_server_port'] = 'multi-netapp-port' + node.set['openstack']['block-storage']['ibmnas']['shares_config'] = 'multi-ibmnas-share' + node.set['openstack']['block-storage']['storwize']['storwize_svc_volpool_name'] = 'multi-svc-volpool' + node.set['openstack']['block-storage']['solidfire']['sf_emulate'] = 'multi-sf-true' + node.set['openstack']['block-storage']['emc']['cinder_emc_config_file'] = 'multi-emc-conf' + node.set['openstack']['block-storage']['vmware']['vmware_host_ip'] = 'multi-vmware-ip' + node.set['openstack']['block-storage']['gpfs']['gpfs_mount_point_base'] = 'multi-gpfs-mnt' + end + + it 'enable multiple backends' do + expect(chef_run).to render_file(file.name).with_content(/^enabled_backends = lvm,rbd,netapp_iscsi,netapp_nfs,ibmnas,ibmsvc,solidfire,emciscsi,vmware,gpfs$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[lvm\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.lvm\.LVMISCSIDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[rbd\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.rbd\.RBDDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[netapp_iscsi\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.netapp\.NetAppISCSIDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^netapp_server_hostname=netapp-host-1$/) + expect(chef_run).to render_file(file.name).with_content(/^netapp_server_hostname=netapp-host-2$/) + expect(chef_run).to render_file(file.name).with_content(/^\[netapp_nfs\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.netapp\.nfs\.NetAppDirect7modeNfsDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[ibmnas\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.ibm\.ibmnas\.IBMNAS_NFSDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[ibmsvc\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.ibm\.storwize_svc\.StorwizeSVCDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[solidfire\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.solidfire\.SolidFire$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[emciscsi\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.emc\.emc_smis_iscsi\.EMCSMISISCSIDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[vmware\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.vmware\.vmdk\.VMwareVcVmdkDriver$/) + + expect(chef_run).to render_file(file.name).with_content(/^\[gpfs\]$/) + expect(chef_run).to render_file(file.name).with_content(/^volume_driver = cinder\.volume\.drivers\.gpfs\.GPFSDriver$/) + end + + it 'set lvm option' do + expect(chef_run).to render_file(file.name).with_content(/^volume_group=multi-lvm-group$/) + end + + it 'set rbd option' do + expect(chef_run).to render_file(file.name).with_content(/^rbd_pool=multi-rbd-pool$/) + end + + it 'set netapp_iscsi option' do + expect(chef_run).to render_file(file.name).with_content(/^netapp_login=multi-netapp-login$/) + end + + it 'set netapp_nfs option' do + expect(chef_run).to render_file(file.name).with_content(/^netapp_server_port=multi-netapp-port$/) + end + + it 'set ibmnas option' do + expect(chef_run).to render_file(file.name).with_content(/^nfs_shares_config=multi-ibmnas-share$/) + end + + it 'set ibmsvc option' do + expect(chef_run).to render_file(file.name).with_content(/^storwize_svc_volpool_name=multi-svc-volpool$/) + end + + it 'set solidfire option' do + expect(chef_run).to render_file(file.name).with_content(/^sf_emulate_512=multi-sf-true$/) + end + + it 'set emciscsi option' do + expect(chef_run).to render_file(file.name).with_content(/^cinder_emc_config_file=multi-emc-conf$/) + end + + it 'set vmware option' do + expect(chef_run).to render_file(file.name).with_content(/^vmware_host_ip = multi-vmware-ip$/) + end + + it 'set gpfs option' do + expect(chef_run).to render_file(file.name).with_content(/^gpfs_mount_point_base = multi-gpfs-mnt$/) + end + end + + it 'no multiple backends configured' do + expect(chef_run).to_not render_file(file.name).with_content(/^enabled_backends = [\w\W]+$/) + end end end diff --git a/templates/default/cinder.conf.erb b/templates/default/cinder.conf.erb index c3e0e67..3c4ff8d 100644 --- a/templates/default/cinder.conf.erb +++ b/templates/default/cinder.conf.erb @@ -532,7 +532,7 @@ max_gigabytes=<%= node["openstack"]["block-storage"]["max_gigabytes"] %> ######## defined in cinder.volume.driver ######## -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.lvm.LVMISCSIDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.lvm.LVMISCSIDriver") %> volume_group=<%= node["openstack"]["block-storage"]["volume"]["volume_group"] %> #### (StrOpt) Name for the VG that will contain exported volumes volume_clear=<%= node["openstack"]["block-storage"]["volume"]["volume_clear"] %> @@ -557,7 +557,7 @@ iscsi_ip_address=<%= node["openstack"]["block-storage"]["volume"]["iscsi_ip_addr iscsi_port=<%= node["openstack"]["block-storage"]["volume"]["iscsi_port"] %> #### (IntOpt) The port that the iSCSI daemon is listening on -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.rbd.RBDDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.rbd.RBDDriver") %> rbd_pool=<%= node["openstack"]["block-storage"]["rbd_pool"] %> #### (StrOpt) the RADOS pool in which rbd volumes are stored @@ -595,7 +595,7 @@ volume_driver=<%= node["openstack"]["block-storage"]["volume"]["driver"] %> ######## defined in cinder.volume.netapp ######## -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.netapp.NetAppISCSIDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.netapp.NetAppISCSIDriver") %> netapp_wsdl_url=<%= node["openstack"]["block-storage"]["netapp"]["protocol"] %>://<%= node["openstack"]["block-storage"]["netapp"]["dfm_hostname"] %>:<%= node["openstack"]["block-storage"]["netapp"]["dfm_web_port"] %>/dfm.wsdl #### (StrOpt) URL of the WSDL file for the DFM server @@ -624,7 +624,7 @@ netapp_storage_service=<%= node["openstack"]["block-storage"]["netapp"]["storage <% end %> ######## defined in cinder.volume.netapp_nfs ######## -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver") %> nfs_mount_point_base=<%= node["openstack"]["block-storage"]["nfs"]["mount_point_base"] %> <% node["openstack"]["block-storage"]["netapp"]["netapp_server_hostname"].each do |h| %> @@ -677,7 +677,7 @@ nfs_sparsed_volumes=<%= node["openstack"]["block-storage"]["nfs"]["nfs_sparsed_v ######## defined in cinder.volume.nfs ######## -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.ibm.ibmnas.IBMNAS_NFSDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.ibm.ibmnas.IBMNAS_NFSDriver") %> nfs_shares_config=<%= node["openstack"]["block-storage"]["ibmnas"]["shares_config"] %> #### (StrOpt) File with the list of available nfs shares @@ -709,7 +709,7 @@ nfs_sparsed_volumes=<%= node["openstack"]["block-storage"]["ibmnas"]["nfs_sparse ######## defined in cinder.volume.san ######## -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.ibm.storwize_svc.StorwizeSVCDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.ibm.storwize_svc.StorwizeSVCDriver") %> san_ip=<%= node["openstack"]["block-storage"]["storwize"]["san_ip"] %> #### (StrOpt) IP address of SAN controller @@ -750,7 +750,7 @@ san_private_key=<%= node["openstack"]["block-storage"]["storwize"]["san_private_ #### (StrOpt) The ZFS path under which to create zvols for volumes. <% end %> -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.solidfire.SolidFire" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.solidfire.SolidFire") %> ######## defined in cinder.volume.solidfire ######## sf_emulate_512=<%= node["openstack"]["block-storage"]["solidfire"]["sf_emulate"] %> #### (BoolOpt) Set 512 byte emulation on volume creation; @@ -770,7 +770,7 @@ iscsi_ip_prefix=<%= node["openstack"]["block-storage"]["solidfire"]["iscsi_ip_pr <% end %> #### (BoolOpt) Allow tenants to specify QOS on create -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.ibm.storwize_svc.StorwizeSVCDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.ibm.storwize_svc.StorwizeSVCDriver") %> ######## defined in cinder.volume.storwize_svc ######## storwize_svc_volpool_name=<%= node["openstack"]["block-storage"]["storwize"]["storwize_svc_volpool_name"] %> @@ -822,14 +822,14 @@ 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" %> +<% if @enabled_drivers.include?("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 %> -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.ibm.ibmnas.IBMNAS_NFSDriver" %> +<% if @enabled_drivers.include?("cinder.volume.drivers.ibm.ibmnas.IBMNAS_NFSDriver") %> ######## defined in cinder.volume.ibm.ibmnas ######## nas_ip=<%= node["openstack"]["block-storage"]["ibmnas"]["nas_ip"] %> @@ -892,7 +892,7 @@ nas_ssh_port=<%= node["openstack"]["block-storage"]["ibmnas"]["nas_ssh_port"] %> # zadara_vpsa_allow_nonexistent_delete=true #### (BoolOpt) Don't halt on deletion of non-existing volumes -<% if node['openstack']['block-storage']['volume']['driver'] == 'cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver' %> +<% if @enabled_drivers.include?('cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver') %> # # Options defined in cinder.volume.drivers.vmware.vmdk # @@ -939,7 +939,7 @@ vmware_image_transfer_timeout_secs = <%= node['openstack']['block-storage']['vmw vmware_max_objects_retrieval = <%= node['openstack']['block-storage']['vmware']['vmware_max_objects_retrieval'] %> <% end %> -<% if node["openstack"]["block-storage"]["volume"]["driver"] == "cinder.volume.drivers.gpfs.GPFSDriver" %> +<% if @enabled_drivers.include?('cinder.volume.drivers.gpfs.GPFSDriver') %> ######## defined in cinder.openstack.volume.drivers.ibm.gpfs ######## # Specifies the path of the GPFS directory where Block Storage @@ -982,9 +982,25 @@ gpfs_sparse_volumes = <%= node['openstack']['block-storage']['gpfs']['gpfs_spars gpfs_storage_pool = <%= node['openstack']['block-storage']['gpfs']['gpfs_storage_pool'] %> <% end %> +<% unless @multi_backend_sections.empty? %> +enabled_backends = <%= @multi_backend_sections.keys.join(',') %> +<% end %> + # Misc options <% if node["openstack"]["block-storage"]["misc_cinder"] %> <% node["openstack"]["block-storage"]["misc_cinder"].each do |m| %> <%= m %> <% end %> <% end %> + +# Multi-backend support, add new sections here +# Make sure these sections are at the bottom of conf file +<% unless @multi_backend_sections.empty? %> +<% @multi_backend_sections.each do |sec, opts| %> +[<%= sec %>] +<% opts.each do |optline| %> +<%= optline %> +<% end %> + +<% end %> +<% end %>