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:
parent
a424890fb3
commit
a7bd7eb0ed
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 %>
|
||||
|
|
Loading…
Reference in New Issue