Add multiple backends support for cinder conf

This implementation allows users to configure multiple backends for
cinder volume. By providing a hash map for different volume driver
sections, cinder.conf can be configured to support multiple backends.

Change-Id: Idec6691168c6a67f1a11f7174a8a97ffb950d7b8
Implements: blueprint cinder-multi-backend-conf
This commit is contained in:
Yi Ming Yin 2014-06-07 21:12:43 +08:00
parent a424890fb3
commit a7bd7eb0ed
7 changed files with 208 additions and 14 deletions

View File

@ -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

View File

@ -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

View File

@ -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']

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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 %>