volume/storage: Allow multiple storage of the same type
(cherry picked from commit f7815aaf4c7cda38c7c5d3c810d4fe44dff9a3d6)
This commit is contained in:
committed by
Emilien Macchi
parent
34873ff763
commit
4b80f42930
@@ -17,19 +17,6 @@
|
||||
#
|
||||
# === Parameters
|
||||
#
|
||||
# [*volume_multi_backend*]
|
||||
# (optionnal) To maintain backward compatibility with previous versions of this module,
|
||||
# this parameter aims to enable or not the multi-backend feature.
|
||||
# Defaults to false
|
||||
#
|
||||
# [*rbd_backend*]
|
||||
# (optionnal) Use RBD backend or not.
|
||||
# Defaults to true
|
||||
#
|
||||
# [*rbd_backend_name*]
|
||||
# (optionnal) Backend name presented to end-user.
|
||||
# Defaults to 'rbd'
|
||||
#
|
||||
# [*cinder_rbd_pool*]
|
||||
# (optional) Specifies the pool name for the block device driver.
|
||||
#
|
||||
@@ -47,11 +34,6 @@
|
||||
# (optional) Enalbe flatten volumes created from snapshots.
|
||||
# Defaults to false
|
||||
#
|
||||
# [*cinder_volume_tmp_dir*]
|
||||
# (optional) Location to store temporary image files if the volume
|
||||
# driver does not write them directly to the volume
|
||||
# Defaults to false
|
||||
#
|
||||
# [*cinder_rbd_max_clone_depth*]
|
||||
# (optional) Maximum number of nested clones that can be taken of a
|
||||
# volume before enforcing a flatten prior to next clone.
|
||||
@@ -74,51 +56,23 @@
|
||||
# (optional) Password used by Cinder to connect to Keystone API
|
||||
# Defaults to 'secrete'
|
||||
#
|
||||
# [*netapp_backend*]
|
||||
# (optionnal) Use NetApp backend or not.
|
||||
# Defaults to false
|
||||
#
|
||||
# [*netapp_backend_name*]
|
||||
# (optionnal) Backend name presented to end-user.
|
||||
# Defaults to 'rbd'
|
||||
#
|
||||
# [*netapp_login*]
|
||||
# (optionnal) Administrative user account name used to access the storage
|
||||
# system.
|
||||
# Defaults to 'netapp'
|
||||
#
|
||||
# [*netapp_password*]
|
||||
# (optionnal) Password for the administrative user account specified in the
|
||||
# netapp_login parameter.
|
||||
# Defaults to 'secrete'
|
||||
#
|
||||
# [*netapp_server_hostname*]
|
||||
# (optionnal) The hostname (or IP address) for the storage system.
|
||||
# Defaults to '127.0.0.1'
|
||||
# [*cinder_backends*]
|
||||
# (optionnal) Hash of the Cinder backends to enable
|
||||
# Defaults to undef
|
||||
#
|
||||
|
||||
|
||||
class cloud::volume::storage(
|
||||
# Maintain backward compatibility
|
||||
$volume_multi_backend = false,
|
||||
$cinder_rbd_pool = $os_params::cinder_rbd_pool,
|
||||
$cinder_rbd_user = $os_params::cinder_rbd_user,
|
||||
$cinder_rbd_secret_uuid = $os_params::ceph_fsid,
|
||||
# RBD is our reference backend by default.
|
||||
$rbd_backend = true,
|
||||
$rbd_backend_name = 'rbd',
|
||||
$cinder_backends = undef,
|
||||
$ks_keystone_internal_proto = 'http',
|
||||
$ks_keystone_internal_port = '5000',
|
||||
$ks_keystone_internal_host = '127.0.0.1',
|
||||
$ks_cinder_password = 'secrete',
|
||||
# NetApp stays an option by default.
|
||||
$netapp_backend = false,
|
||||
$netapp_backend_name = 'netapp',
|
||||
$netapp_server_hostname = '127.0.0.1',
|
||||
$netapp_login = 'netapp',
|
||||
$netapp_password = 'secrete',
|
||||
# Deprecated parameters
|
||||
$glance_api_version = '2',
|
||||
$cinder_rbd_pool = $os_params::cinder_rbd_pool,
|
||||
$cinder_rbd_user = $os_params::cinder_rbd_user,
|
||||
$cinder_rbd_secret_uuid = $os_params::ceph_fsid,
|
||||
$cinder_rbd_conf = '/etc/ceph/ceph.conf',
|
||||
$cinder_rbd_flatten_volume_from_snapshot = false,
|
||||
$cinder_rbd_max_clone_depth = '5'
|
||||
@@ -128,87 +82,52 @@ class cloud::volume::storage(
|
||||
|
||||
include 'cinder::volume'
|
||||
|
||||
if $volume_multi_backend {
|
||||
if $cinder_backends {
|
||||
$rbd_backends = has_key($cinder_backends, 'rbd') ? {
|
||||
false => merge({}, {}),
|
||||
default => $cinder_backends['rbd']
|
||||
}
|
||||
|
||||
if has_key($cinder_backends, 'netapp') {
|
||||
$netapp_backends = $cinder_backends['netapp']
|
||||
create_resources('cloud::volume::storage::netapp',
|
||||
$netapp_backends)
|
||||
}
|
||||
else {
|
||||
$netapp_backends = { }
|
||||
}
|
||||
|
||||
class { 'cinder::backends':
|
||||
enabled_backends => keys(merge($rbd_backends,
|
||||
$netapp_backends))
|
||||
}
|
||||
|
||||
# Manage Volume types.
|
||||
# It allows to the end-user to choose from which backend he would like to provision a volume.
|
||||
# Cinder::Type requires keystone credentials
|
||||
Cinder::Type {
|
||||
|
||||
Cinder::Type <| |> {
|
||||
os_tenant_name => 'services',
|
||||
os_username => 'cinder',
|
||||
os_password => $ks_cinder_password,
|
||||
os_auth_url => "${ks_keystone_internal_proto}://${ks_keystone_internal_host}:${ks_keystone_internal_port}/v2.0"
|
||||
}
|
||||
|
||||
if $rbd_backend {
|
||||
# Configure RBD as a backend
|
||||
cinder::backend::rbd {"${rbd_backend_name}":
|
||||
rbd_pool => $cinder_rbd_pool,
|
||||
rbd_user => $cinder_rbd_user,
|
||||
rbd_secret_uuid => $cinder_rbd_secret_uuid
|
||||
}
|
||||
|
||||
# Configure a specific Volume Type
|
||||
cinder::type {'rbd':
|
||||
set_key => 'volume_backend_name',
|
||||
set_value => $rbd_backend_name
|
||||
}
|
||||
|
||||
# Configure Ceph keyring
|
||||
Ceph::Key <<| title == $cinder_rbd_user |>>
|
||||
file { "/etc/ceph/ceph.client.${cinder_rbd_user}.keyring":
|
||||
owner => 'cinder',
|
||||
group => 'cinder',
|
||||
mode => '0400',
|
||||
require => Ceph::Key[$cinder_rbd_user]
|
||||
}
|
||||
Concat::Fragment <<| title == 'ceph-client-os' |>>
|
||||
}
|
||||
|
||||
if $netapp_backend {
|
||||
# Configure NetApp as a backend
|
||||
cinder::backend::netapp {"${netapp_backend_name}":
|
||||
netapp_server_hostname => $netapp_server_hostname,
|
||||
netapp_login => $netapp_login,
|
||||
netapp_password => $netapp_password
|
||||
}
|
||||
|
||||
# Configure a specific Volume Type
|
||||
cinder::type {'netapp':
|
||||
set_key => 'volume_backend_name',
|
||||
set_value => $netapp_backend_name
|
||||
}
|
||||
}
|
||||
|
||||
# TODO(EmilienM) need to be optimized:
|
||||
if $netapp_backend and $rbd_backend {
|
||||
$enabled_backends = ['netapp', 'rbd']
|
||||
} elsif $netapp_backend and ! $rbd_backend {
|
||||
$enabled_backends = ['netapp']
|
||||
} elsif ! $netapp_backend and $rbd_backend {
|
||||
$enabled_backends = ['rbd']
|
||||
} else {
|
||||
fail('no cinder backend has been enabled on storage nodes.')
|
||||
}
|
||||
class {'cinder::backends': enabled_backends => $enabled_backends }
|
||||
} else {
|
||||
# Backward compatibility
|
||||
class { 'cinder::volume::rbd':
|
||||
rbd_pool => $cinder_rbd_pool,
|
||||
glance_api_version => $glance_api_version,
|
||||
rbd_user => $cinder_rbd_user,
|
||||
rbd_secret_uuid => $cinder_rbd_secret_uuid,
|
||||
rbd_ceph_conf => $cinder_rbd_conf,
|
||||
rbd_flatten_volume_from_snapshot => $cinder_rbd_flatten_volume_from_snapshot,
|
||||
rbd_max_clone_depth => $cinder_rbd_max_clone_depth
|
||||
}
|
||||
Ceph::Key <<| title == $cinder_rbd_user |>>
|
||||
file { "/etc/ceph/ceph.client.${cinder_rbd_user}.keyring":
|
||||
owner => 'cinder',
|
||||
group => 'cinder',
|
||||
mode => '0400',
|
||||
require => Ceph::Key[$cinder_rbd_user]
|
||||
}
|
||||
Concat::Fragment <<| title == 'ceph-client-os' |>>
|
||||
}
|
||||
else {
|
||||
$rbd_backends = { 'DEFAULT' => { } }
|
||||
}
|
||||
|
||||
if ! empty($rbd_backends) {
|
||||
create_resources("cloud::volume::storage::rbd",
|
||||
$rbd_backends,
|
||||
{
|
||||
rbd_pool => $cinder_rbd_pool,
|
||||
rbd_user => $cinder_rbd_user,
|
||||
rbd_secret_uuid => $cinder_rbd_secret_uuid,
|
||||
rbd_ceph_conf => $cinder_rbd_conf,
|
||||
rbd_flatten_volume_from_snapshot => $cinder_rbd_flatten_volume_from_snapshot,
|
||||
rbd_max_clone_depth => $cinder_rbd_max_clone_depth,
|
||||
glance_api_version => $glance_api_version,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
37
manifests/volume/storage/netapp.pp
Normal file
37
manifests/volume/storage/netapp.pp
Normal file
@@ -0,0 +1,37 @@
|
||||
#
|
||||
# Copyright (C) 2014 eNovance SAS <licensing@enovance.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Volume Ceph storage
|
||||
#
|
||||
|
||||
define cloud::volume::storage::netapp (
|
||||
$volume_backend_name = $name,
|
||||
$netapp_backend = false,
|
||||
$netapp_server_hostname = '127.0.0.1',
|
||||
$netapp_login = 'netapp',
|
||||
$netapp_password = 'secrete',
|
||||
) {
|
||||
|
||||
cinder::backend::netapp { $name:
|
||||
netapp_server_hostname => $netapp_server_hostname,
|
||||
netapp_login => $netapp_login,
|
||||
netapp_password => $netapp_password,
|
||||
}
|
||||
|
||||
@cinder::type { $volume_backend_name:
|
||||
set_key => 'volume_backend_name',
|
||||
set_value => $volume_backend_name
|
||||
}
|
||||
}
|
||||
54
manifests/volume/storage/rbd.pp
Normal file
54
manifests/volume/storage/rbd.pp
Normal file
@@ -0,0 +1,54 @@
|
||||
#
|
||||
# Copyright (C) 2014 eNovance SAS <licensing@enovance.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Volume Ceph storage
|
||||
#
|
||||
|
||||
define cloud::volume::storage::rbd (
|
||||
$volume_backend_name = $name,
|
||||
$rbd_pool,
|
||||
$glance_api_version,
|
||||
$rbd_user,
|
||||
$rbd_secret_uuid,
|
||||
$rbd_ceph_conf,
|
||||
$rbd_flatten_volume_from_snapshot,
|
||||
$rbd_max_clone_depth,
|
||||
) {
|
||||
|
||||
cinder::backend::rbd { $volume_backend_name:
|
||||
rbd_pool => $rbd_pool,
|
||||
glance_api_version => $glance_api_version,
|
||||
rbd_user => $rbd_user,
|
||||
rbd_secret_uuid => $rbd_secret_uuid,
|
||||
rbd_ceph_conf => $rbd_ceph_conf,
|
||||
rbd_flatten_volume_from_snapshot => $rbd_flatten_volume_from_snapshot,
|
||||
rbd_max_clone_depth => $rbd_max_clone_depth,
|
||||
}
|
||||
|
||||
# Configure Ceph keyring
|
||||
Ceph::Key <<| title == $rbd_user |>>
|
||||
file { "/etc/ceph/ceph.client.${rbd_user}.keyring":
|
||||
owner => 'cinder',
|
||||
group => 'cinder',
|
||||
mode => '0400',
|
||||
require => Ceph::Key[$rbd_user]
|
||||
}
|
||||
Concat::Fragment <<| title == 'ceph-client-os' |>>
|
||||
|
||||
@cinder::type { $volume_backend_name:
|
||||
set_key => 'volume_backend_name',
|
||||
set_value => $volume_backend_name
|
||||
}
|
||||
}
|
||||
@@ -26,11 +26,11 @@ describe 'cloud::volume::storage' do
|
||||
"class { 'cloud::volume':
|
||||
cinder_db_host => '10.0.0.1',
|
||||
cinder_db_user => 'cinder',
|
||||
cinder_db_password => 'secrete',
|
||||
cinder_db_password => 'secret',
|
||||
rabbit_hosts => ['10.0.0.1'],
|
||||
rabbit_password => 'secrete',
|
||||
rabbit_password => 'secret',
|
||||
ks_keystone_internal_host => '10.0.0.1',
|
||||
ks_cinder_password => 'secrete',
|
||||
ks_cinder_password => 'secret',
|
||||
verbose => true,
|
||||
debug => true,
|
||||
log_facility => 'LOG_LOCAL0',
|
||||
@@ -38,17 +38,30 @@ describe 'cloud::volume::storage' do
|
||||
end
|
||||
|
||||
let :params do
|
||||
{ :volume_multi_backend => true,
|
||||
:cinder_rbd_pool => 'ceph_cinder',
|
||||
{ :cinder_rbd_pool => 'ceph_cinder',
|
||||
:cinder_rbd_user => 'cinder',
|
||||
:cinder_rbd_secret_uuid => 'secrete',
|
||||
:rbd_backend => true,
|
||||
:rbd_backend_name => 'lowcost',
|
||||
:cinder_rbd_secret_uuid => 'secret',
|
||||
:cinder_rbd_max_clone_depth => '10',
|
||||
:cinder_backends => {
|
||||
'rbd' => {
|
||||
'lowcost' => {
|
||||
'rbd_pool' => 'ceph_cinder',
|
||||
'rbd_user' => 'cinder',
|
||||
'rbd_secret_uuid' => 'secret',
|
||||
}
|
||||
},
|
||||
'netapp' => {
|
||||
'premium' => {
|
||||
'netapp_server_hostname' => 'netapp-server.host',
|
||||
'netapp_login' => 'joe',
|
||||
'netapp_password' => 'secret'
|
||||
}
|
||||
}
|
||||
},
|
||||
:ks_keystone_internal_proto => 'http',
|
||||
:ks_keystone_internal_port => '5000',
|
||||
:ks_keystone_internal_host => 'keystone.host',
|
||||
:ks_cinder_password => 'secrete',
|
||||
:netapp_backend => false }
|
||||
:ks_cinder_password => 'secret' }
|
||||
end
|
||||
|
||||
it 'configure cinder common' do
|
||||
@@ -57,7 +70,7 @@ describe 'cloud::volume::storage' do
|
||||
:debug => true,
|
||||
:rabbit_userid => 'cinder',
|
||||
:rabbit_hosts => ['10.0.0.1'],
|
||||
:rabbit_password => 'secrete',
|
||||
:rabbit_password => 'secret',
|
||||
:rabbit_virtual_host => '/',
|
||||
:log_facility => 'LOG_LOCAL0',
|
||||
:use_syslog => true,
|
||||
@@ -71,7 +84,7 @@ describe 'cloud::volume::storage' do
|
||||
it 'checks if Cinder DB is populated' do
|
||||
should contain_exec('cinder_db_sync').with(
|
||||
:command => '/usr/bin/cinder-manage db sync',
|
||||
:unless => '/usr/bin/mysql cinder -h 10.0.0.1 -u cinder -psecrete -e "show tables" | /bin/grep Tables'
|
||||
:unless => '/usr/bin/mysql cinder -h 10.0.0.1 -u cinder -psecret -e "show tables" | /bin/grep Tables'
|
||||
)
|
||||
end
|
||||
|
||||
@@ -80,66 +93,39 @@ describe 'cloud::volume::storage' do
|
||||
end
|
||||
|
||||
context 'with RBD backend' do
|
||||
before :each do
|
||||
params.merge!( :rbd_backend => true )
|
||||
end
|
||||
|
||||
it 'configures rbd volume driver' do
|
||||
should contain_cinder_config('lowcost/volume_backend_name').with_value('lowcost')
|
||||
should contain_cinder_config('lowcost/rbd_pool').with_value('ceph_cinder')
|
||||
should contain_cinder_config('lowcost/rbd_user').with_value('cinder')
|
||||
should contain_cinder_config('lowcost/rbd_secret_uuid').with_value('secrete')
|
||||
should contain_cinder__type('rbd').with(
|
||||
:set_key => 'volume_backend_name',
|
||||
:set_value => 'lowcost'
|
||||
should contain_cinder_config('lowcost/rbd_secret_uuid').with_value('secret')
|
||||
should contain_cinder__type('lowcost').with(
|
||||
:set_key => 'volume_backend_name',
|
||||
:set_value => 'lowcost',
|
||||
:os_tenant_name => 'services',
|
||||
:os_username => 'cinder',
|
||||
:os_password => 'secret',
|
||||
:os_auth_url => 'http://keystone.host:5000/v2.0'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with NetApp backend' do
|
||||
before :each do
|
||||
params.merge!(
|
||||
:netapp_backend => true,
|
||||
:netapp_backend_name => 'premium',
|
||||
:netapp_server_hostname => 'netapp-server.host',
|
||||
:netapp_login => 'joe',
|
||||
:netapp_password => 'secrete'
|
||||
)
|
||||
end
|
||||
it 'configures netapp volume driver' do
|
||||
should contain_cinder_config('premium/volume_backend_name').with_value('premium')
|
||||
should contain_cinder_config('premium/netapp_login').with_value('joe')
|
||||
should contain_cinder_config('premium/netapp_password').with_value('secrete')
|
||||
should contain_cinder_config('premium/netapp_password').with_value('secret')
|
||||
should contain_cinder_config('premium/netapp_server_hostname').with_value('netapp-server.host')
|
||||
should contain_cinder__type('netapp').with(
|
||||
should contain_cinder__type('premium').with(
|
||||
:set_key => 'volume_backend_name',
|
||||
:set_value => 'premium'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context 'without any backend' do
|
||||
before :each do
|
||||
params.merge!(
|
||||
:netapp_backend => false,
|
||||
:rbd_backend => false
|
||||
)
|
||||
end
|
||||
it 'should fail to configure cinder-volume'do
|
||||
expect { subject }.to raise_error(/no cinder backend has been enabled on storage nodes./)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with all backends enabled' do
|
||||
before :each do
|
||||
params.merge!(
|
||||
:netapp_backend => true,
|
||||
:rbd_backend => true
|
||||
)
|
||||
end
|
||||
it 'configure all cinder backends' do
|
||||
should contain_class('cinder::backends').with(
|
||||
:enabled_backends => ['netapp', 'rbd']
|
||||
:enabled_backends => ['lowcost', 'premium']
|
||||
)
|
||||
end
|
||||
end
|
||||
@@ -147,18 +133,18 @@ describe 'cloud::volume::storage' do
|
||||
context 'with backward compatiblity (without multi-backend)' do
|
||||
before :each do
|
||||
params.merge!(
|
||||
:volume_multi_backend => false,
|
||||
:cinder_backends => false,
|
||||
)
|
||||
end
|
||||
it 'configure rbd volume driver without multi-backend' do
|
||||
should contain_class('cinder::volume::rbd').with(
|
||||
:rbd_pool => 'ceph_cinder',
|
||||
:rbd_user => 'cinder',
|
||||
:rbd_secret_uuid => 'secrete',
|
||||
:rbd_ceph_conf => '/etc/ceph/ceph.conf',
|
||||
:rbd_flatten_volume_from_snapshot => false,
|
||||
:rbd_max_clone_depth => '5',
|
||||
:glance_api_version => '2'
|
||||
should contain_cinder__backend__rbd('DEFAULT').with(
|
||||
:rbd_pool => 'ceph_cinder',
|
||||
:rbd_user => 'cinder',
|
||||
:rbd_secret_uuid => 'secret',
|
||||
:rbd_ceph_conf => '/etc/ceph/ceph.conf',
|
||||
:rbd_flatten_volume_from_snapshot => false,
|
||||
:rbd_max_clone_depth => '10',
|
||||
:glance_api_version => '2'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user