From a75f29bf6294c3f866df103b0c140d035b269e51 Mon Sep 17 00:00:00 2001 From: Yanis Guenane Date: Wed, 19 Feb 2014 14:35:22 -0500 Subject: [PATCH 1/4] Enable mongodb replicaset This patch allows HA on mongodb for ceilometer use. --- manifests/database/nosql.pp | 36 +++++++++++++++++++++++++++++++++-- manifests/telemetry/server.pp | 22 +++++++++++---------- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/manifests/database/nosql.pp b/manifests/database/nosql.pp index cc68acb8..f00e2555 100644 --- a/manifests/database/nosql.pp +++ b/manifests/database/nosql.pp @@ -29,10 +29,20 @@ # http://docs.mongodb.org/manual/reference/configuration-options/#nojournal # Defaults to false # +# [*replset_members*] +# (optional) Ceilometer Replica set members +# Default value in params +# +# [*mongo_primary*] +# (optional) MongoDB replicaset primary hostname +# Default value in params +# class cloud::database::nosql( - $bind_ip = $os_params::internal_netif_ip, - $nojournal = false, + $bind_ip = $os_params::internal_netif_ip, + $nojournal = false, + $replset_members = $os_params::mongo_nodes, + $mongo_primary = $os_params::mongo_primary ) { # bind_ip should be an array @@ -49,6 +59,28 @@ class cloud::database::nosql( class { 'mongodb': bind_ip => $bind_ip_real, nojournal => $nojournal, + replset => 'ceilometer', + } + + exec {'check_mongodb' : + command => "/usr/bin/mongo ${bind_ip}:27017", + logoutput => false, + tries => 60, + try_sleep => 5, + require => Service['mongodb'], + } + + if $::hostname == $mongo_primary and !empty($replset_members) { + + mongodb_replset{'ceilometer': + members => $replset_members, + before => Anchor['mongodb setup done'], + } + + } + + anchor {'mongodb setup done' : + require => Exec['check_mongodb'], } } diff --git a/manifests/telemetry/server.pp b/manifests/telemetry/server.pp index 99f3b21f..a9f65015 100644 --- a/manifests/telemetry/server.pp +++ b/manifests/telemetry/server.pp @@ -21,25 +21,27 @@ class cloud::telemetry::server( $ks_keystone_internal_proto = $os_params::ks_keystone_internal_proto, $ks_ceilometer_internal_port = $os_params::ks_ceilometer_internal_port, $ks_ceilometer_password = $os_params::ks_ceilometer_password, - $ceilometer_database_connection = $os_params::ceilometer_database_connection, $api_eth = $os_params::api_eth, + $mongo_nodes = $os_params::mongo_nodes, + $mongo_primary = $os_params::mongo_primary, ){ include 'cloud::telemetry' - $db_conn = regsubst($ceilometer_database_connection, 'mongodb:\/\/(\.*)', '\2') - exec {'check_mongodb' : - command => "/usr/bin/mongo ${db_conn}", - logoutput => false, - tries => 60, - try_sleep => 5, + $s_mongo_nodes = join($mongo_nodes, ',') + $db_conn = "mongodb://${s_mongo_nodes}/ceilometer?replicaSet=ceilometer" + + if $::hostname == $mongo_primary { + $sync_db = true + } else { + $sync_db = false } - Service <| title == 'mongodb' |> -> Exec['check_mongodb'] # Install MongoDB database class { 'ceilometer::db': - database_connection => $ceilometer_database_connection, - require => Exec['check_mongodb'], + database_connection => $db_conn, + sync_db => $sync_db, + require => Anchor['mongodb setup done'], } # Install Ceilometer-collector From 0e3ef7298e86aa67bf3745f47cee66bb624fab0f Mon Sep 17 00:00:00 2001 From: Emilien Macchi Date: Mon, 24 Feb 2014 13:56:46 +0100 Subject: [PATCH 2/4] ceph: enable services by default Close bug #294 Signed-off-by: Emilien Macchi --- manifests/storage/rbd.pp | 1 + 1 file changed, 1 insertion(+) diff --git a/manifests/storage/rbd.pp b/manifests/storage/rbd.pp index 0bc9161c..1b37e27a 100644 --- a/manifests/storage/rbd.pp +++ b/manifests/storage/rbd.pp @@ -25,6 +25,7 @@ class cloud::storage::rbd ( auth_type => 'cephx', cluster_network => $cluster_network, public_network => $public_network, + enable_service => true } Exec { From 4cf8809e4bcca5a0370e67230f32fe594791265b Mon Sep 17 00:00:00 2001 From: Yanis Guenane Date: Wed, 19 Feb 2014 14:35:22 -0500 Subject: [PATCH 3/4] Enable mongodb replicaset This patch allows HA on mongodb for ceilometer use. --- manifests/database/nosql.pp | 36 +++++++++++++++++++++++++++++++++-- manifests/telemetry/server.pp | 22 +++++++++++---------- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/manifests/database/nosql.pp b/manifests/database/nosql.pp index cc68acb8..f00e2555 100644 --- a/manifests/database/nosql.pp +++ b/manifests/database/nosql.pp @@ -29,10 +29,20 @@ # http://docs.mongodb.org/manual/reference/configuration-options/#nojournal # Defaults to false # +# [*replset_members*] +# (optional) Ceilometer Replica set members +# Default value in params +# +# [*mongo_primary*] +# (optional) MongoDB replicaset primary hostname +# Default value in params +# class cloud::database::nosql( - $bind_ip = $os_params::internal_netif_ip, - $nojournal = false, + $bind_ip = $os_params::internal_netif_ip, + $nojournal = false, + $replset_members = $os_params::mongo_nodes, + $mongo_primary = $os_params::mongo_primary ) { # bind_ip should be an array @@ -49,6 +59,28 @@ class cloud::database::nosql( class { 'mongodb': bind_ip => $bind_ip_real, nojournal => $nojournal, + replset => 'ceilometer', + } + + exec {'check_mongodb' : + command => "/usr/bin/mongo ${bind_ip}:27017", + logoutput => false, + tries => 60, + try_sleep => 5, + require => Service['mongodb'], + } + + if $::hostname == $mongo_primary and !empty($replset_members) { + + mongodb_replset{'ceilometer': + members => $replset_members, + before => Anchor['mongodb setup done'], + } + + } + + anchor {'mongodb setup done' : + require => Exec['check_mongodb'], } } diff --git a/manifests/telemetry/server.pp b/manifests/telemetry/server.pp index 99f3b21f..a9f65015 100644 --- a/manifests/telemetry/server.pp +++ b/manifests/telemetry/server.pp @@ -21,25 +21,27 @@ class cloud::telemetry::server( $ks_keystone_internal_proto = $os_params::ks_keystone_internal_proto, $ks_ceilometer_internal_port = $os_params::ks_ceilometer_internal_port, $ks_ceilometer_password = $os_params::ks_ceilometer_password, - $ceilometer_database_connection = $os_params::ceilometer_database_connection, $api_eth = $os_params::api_eth, + $mongo_nodes = $os_params::mongo_nodes, + $mongo_primary = $os_params::mongo_primary, ){ include 'cloud::telemetry' - $db_conn = regsubst($ceilometer_database_connection, 'mongodb:\/\/(\.*)', '\2') - exec {'check_mongodb' : - command => "/usr/bin/mongo ${db_conn}", - logoutput => false, - tries => 60, - try_sleep => 5, + $s_mongo_nodes = join($mongo_nodes, ',') + $db_conn = "mongodb://${s_mongo_nodes}/ceilometer?replicaSet=ceilometer" + + if $::hostname == $mongo_primary { + $sync_db = true + } else { + $sync_db = false } - Service <| title == 'mongodb' |> -> Exec['check_mongodb'] # Install MongoDB database class { 'ceilometer::db': - database_connection => $ceilometer_database_connection, - require => Exec['check_mongodb'], + database_connection => $db_conn, + sync_db => $sync_db, + require => Anchor['mongodb setup done'], } # Install Ceilometer-collector From 95df7cbb58f2ccf2053a67f8c551886f808881a5 Mon Sep 17 00:00:00 2001 From: Emilien Macchi Date: Mon, 24 Feb 2014 16:36:07 +0100 Subject: [PATCH 4/4] mongodb/replicaset: add unit tests Close bug #56 Signed-off-by: Emilien Macchi --- manifests/database/nosql.pp | 20 +++------- spec/classes/cloud_database_nosql_spec.rb | 17 ++++++++- spec/classes/cloud_telemetry_server_spec.rb | 41 +++++++++++++-------- 3 files changed, 47 insertions(+), 31 deletions(-) diff --git a/manifests/database/nosql.pp b/manifests/database/nosql.pp index f00e2555..2db7dc2e 100644 --- a/manifests/database/nosql.pp +++ b/manifests/database/nosql.pp @@ -30,19 +30,15 @@ # Defaults to false # # [*replset_members*] -# (optional) Ceilometer Replica set members -# Default value in params -# -# [*mongo_primary*] -# (optional) MongoDB replicaset primary hostname +# (optional) Ceilometer Replica set members hostnames +# Should be an array. Example: ['node1', 'node2', node3'] # Default value in params # class cloud::database::nosql( $bind_ip = $os_params::internal_netif_ip, $nojournal = false, - $replset_members = $os_params::mongo_nodes, - $mongo_primary = $os_params::mongo_primary + $replset_members = $os_params::mongo_nodes ) { # bind_ip should be an array @@ -70,13 +66,9 @@ class cloud::database::nosql( require => Service['mongodb'], } - if $::hostname == $mongo_primary and !empty($replset_members) { - - mongodb_replset{'ceilometer': - members => $replset_members, - before => Anchor['mongodb setup done'], - } - + mongodb_replset{'ceilometer': + members => $replset_members, + before => Anchor['mongodb setup done'], } anchor {'mongodb setup done' : diff --git a/spec/classes/cloud_database_nosql_spec.rb b/spec/classes/cloud_database_nosql_spec.rb index 0e1827a9..0bbc3e8d 100644 --- a/spec/classes/cloud_database_nosql_spec.rb +++ b/spec/classes/cloud_database_nosql_spec.rb @@ -23,8 +23,9 @@ describe 'cloud::database::nosql' do shared_examples_for 'openstack database nosql' do let :params do - { :bind_ip => '10.0.0.1', - :nojournal => false } + { :bind_ip => '10.0.0.1', + :nojournal => false, + :replset_members => ['node1', 'node2', 'node3'] } end it 'configure mongodb server' do @@ -35,6 +36,18 @@ describe 'cloud::database::nosql' do ) end + it 'configure mongodb replicasets' do + should contain_exec('check_mongodb').with( + :command => "/usr/bin/mongo 10.0.0.1:27017", + :logoutput => false, + :tries => 60, + :try_sleep => 5 + ) + should contain_mongodb_replset('ceilometer').with( + :members => ['node1', 'node2', 'node3'] + ) + should contain_anchor('mongodb setup done') + end end context 'on Debian platforms' do diff --git a/spec/classes/cloud_telemetry_server_spec.rb b/spec/classes/cloud_telemetry_server_spec.rb index 6ee574c2..31a3230b 100644 --- a/spec/classes/cloud_telemetry_server_spec.rb +++ b/spec/classes/cloud_telemetry_server_spec.rb @@ -44,7 +44,8 @@ describe 'cloud::telemetry::server' do :ks_ceilometer_internal_port => '8777', :ks_ceilometer_password => 'secrete', :api_eth => '10.0.0.1', - :ceilometer_database_connection => 'mongodb://10.0.0.2/ceilometer' } + :mongo_nodes => ['node1', 'node2', 'node3'], + :mongo_primary => 'node1' } end it 'configure ceilometer common' do @@ -65,18 +66,6 @@ describe 'cloud::telemetry::server' do ) end - it 'check mongodb is started' do - should contain_exec('check_mongodb').with({ - :command => '/usr/bin/mongo 10.0.0.2/ceilometer', - }) - end - - it 'configure ceilometer db' do - should contain_class('ceilometer::db').with( - :database_connection => 'mongodb://10.0.0.2/ceilometer' - ) - end - it 'configure ceilometer collector' do should contain_class('ceilometer::collector') end @@ -106,11 +95,32 @@ describe 'cloud::telemetry::server' do ) end + context 'configure ceilometer db on primary mongodb node' do + it 'configure ceilometer db' do + should contain_class('ceilometer::db').with( + :sync_db => true, + :database_connection => 'mongodb://node1,node2,node3/ceilometer?replicaSet=ceilometer' + ) + end + end + + context 'configure ceilometer db on secondary mongodb node' do + before :each do + facts.merge!( :hostname => 'node2' ) + end + it 'configure ceilometer db' do + should contain_class('ceilometer::db').with( + :sync_db => false, + :database_connection => 'mongodb://node1,node2,node3/ceilometer?replicaSet=ceilometer' + ) + end + end end context 'on Debian platforms' do let :facts do - { :osfamily => 'Debian' } + { :osfamily => 'Debian', + :hostname => 'node1' } end it_configures 'openstack telemetry server' @@ -118,7 +128,8 @@ describe 'cloud::telemetry::server' do context 'on RedHat platforms' do let :facts do - { :osfamily => 'RedHat' } + { :osfamily => 'RedHat', + :hostname => 'node1' } end it_configures 'openstack telemetry server'