aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Schultz <aschultz@redhat.com>2016-09-30 09:49:35 -0600
committerAlex Schultz <aschultz@redhat.com>2016-09-30 21:12:24 +0000
commitdaebf929822aa6849e4e8c6f2e61efe1759e4f80 (patch)
tree01c1690cfd5a252fb8b45175d023c51e640b22ca
parent1c725dd46f37e2b21d5e1dece467e4f5567bd761 (diff)
Add ceilometer profile rspec testing
This change adds rspec testing for the ceilometer profiles. While writing these tests, the tripleo::profile::base::ceilometer::collector class needed to have the hiera lookups moved to class parameters to allow for testing the possible options around the database backend. These tests add coverage for ipv4 and ipv6 configurations for the collector profile as well as excluding mongodb on the backend. Change-Id: I1abae040104e8492a9fe266de74080e1e7701731
-rw-r--r--manifests/profile/base/ceilometer/collector.pp68
-rw-r--r--spec/classes/tripleo_profile_base_ceilometer_api_spec.rb57
-rw-r--r--spec/classes/tripleo_profile_base_ceilometer_collector_spec.rb138
-rw-r--r--spec/classes/tripleo_profile_base_ceilometer_expirer_spec.rb58
-rw-r--r--spec/classes/tripleo_profile_base_ceilometer_spec.rb55
-rw-r--r--spec/fixtures/hieradata/default.yaml1
6 files changed, 354 insertions, 23 deletions
diff --git a/manifests/profile/base/ceilometer/collector.pp b/manifests/profile/base/ceilometer/collector.pp
index e892478..443873f 100644
--- a/manifests/profile/base/ceilometer/collector.pp
+++ b/manifests/profile/base/ceilometer/collector.pp
@@ -27,9 +27,30 @@
# for more details.
# Defaults to hiera('step')
#
+# [*ceilometer_backend*]
+# (Optional) The ceilometer backend to use.
+# Defaults to hiera('ceilometer_backend', 'mongodb')
+#
+# [*mongodb_ipv6*]
+# (Optional) Flag to indicate if mongodb is using ipv6
+# Defaults to hiera('mongodb::server::ipv6', false)
+#
+# [*mongodb_node_ips*]
+# (Optional) Array of mongodb node ip address. Required if backend is set
+# to mongodb.
+# Defaults to hiera('mongodb_node_ips', [])
+#
+# [*mongodb_replset*]
+# (Optional) Replica set for mongodb. Required if backend is mongodb
+# Defaults to hiera(''mongodb::server::replset', '')
+#
class tripleo::profile::base::ceilometer::collector (
- $bootstrap_node = hiera('bootstrap_nodeid', undef),
- $step = hiera('step'),
+ $bootstrap_node = hiera('bootstrap_nodeid', undef),
+ $step = hiera('step'),
+ $ceilometer_backend = hiera('ceilometer_backend', 'mongodb'),
+ $mongodb_ipv6 = hiera('mongodb::server::ipv6', false),
+ $mongodb_node_ips = hiera('mongodb_node_ips', []),
+ $mongodb_replset = hiera('mongodb::server::replset', undef)
) {
if $::hostname == downcase($bootstrap_node) {
$sync_db = true
@@ -37,26 +58,6 @@ class tripleo::profile::base::ceilometer::collector (
$sync_db = false
}
- $ceilometer_backend = downcase(hiera('ceilometer_backend', 'mongodb'))
- # MongoDB
- if $ceilometer_backend == 'mongodb' {
- # NOTE(gfidente): We need to pass the list of IPv6 addresses *with* port and
- # without the brackets as 'members' argument for the 'mongodb_replset'
- # resource.
- if str2bool(hiera('mongodb::server::ipv6', false)) {
- $mongo_node_ips_with_port_prefixed = prefix(hiera('mongodb_node_ips'), '[')
- $mongo_node_ips_with_port = suffix($mongo_node_ips_with_port_prefixed, ']:27017')
- $mongo_node_ips_with_port_nobr = suffix(hiera('mongodb_node_ips'), ':27017')
- } else {
- $mongo_node_ips_with_port = suffix(hiera('mongodb_node_ips'), ':27017')
- $mongo_node_ips_with_port_nobr = suffix(hiera('mongodb_node_ips'), ':27017')
- }
- $mongo_node_string = join($mongo_node_ips_with_port, ',')
-
- $mongodb_replset = hiera('mongodb::server::replset')
- $ceilometer_mongodb_conn_string = "mongodb://${mongo_node_string}/ceilometer?replicaSet=${mongodb_replset}"
- }
-
include ::tripleo::profile::base::ceilometer
if $step >= 3 and $sync_db {
@@ -64,7 +65,28 @@ class tripleo::profile::base::ceilometer::collector (
}
if $step >= 4 or ($step >= 3 and $sync_db) {
- if $ceilometer_backend == 'mongodb' {
+ if downcase($ceilometer_backend) == 'mongodb' {
+ if empty($mongodb_node_ips) {
+ fail('Provided mongodb node ip addresses are empty')
+ }
+ if !$mongodb_replset {
+ fail('mongodb_replset is required when using mongodb')
+ }
+ # NOTE(gfidente): We need to pass the list of IPv6 addresses *with* port
+ # and without the brackets as 'members' argument for the 'mongodb_replset'
+ # resource.
+ if str2bool($mongodb_ipv6) {
+ $mongo_node_ips_with_port_prefixed = prefix($mongodb_node_ips, '[')
+ $mongo_node_ips_with_port = suffix($mongo_node_ips_with_port_prefixed, ']:27017')
+ $mongo_node_ips_with_port_nobr = suffix($mongodb_node_ips, ':27017')
+ } else {
+ $mongo_node_ips_with_port = suffix($mongodb_node_ips, ':27017')
+ $mongo_node_ips_with_port_nobr = suffix($mongodb_node_ips, ':27017')
+ }
+ $mongo_node_string = join($mongo_node_ips_with_port, ',')
+
+ $ceilometer_mongodb_conn_string = "mongodb://${mongo_node_string}/ceilometer?replicaSet=${mongodb_replset}"
+
class { '::ceilometer::db' :
database_connection => $ceilometer_mongodb_conn_string,
}
diff --git a/spec/classes/tripleo_profile_base_ceilometer_api_spec.rb b/spec/classes/tripleo_profile_base_ceilometer_api_spec.rb
new file mode 100644
index 0000000..256b756
--- /dev/null
+++ b/spec/classes/tripleo_profile_base_ceilometer_api_spec.rb
@@ -0,0 +1,57 @@
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# 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.
+#
+
+require 'spec_helper'
+
+describe 'tripleo::profile::base::ceilometer::api' do
+ shared_examples_for 'tripleo::profile::base::ceilometer::api' do
+ let(:pre_condition) do
+ "class { '::tripleo::profile::base::ceilometer': step => #{params[:step]}, rabbit_hosts => ['127.0.0.1'] }"
+ end
+
+ context 'with step less than 4' do
+ let(:params) { { :step => 3 } }
+
+ it 'should do nothing' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer::api')
+ is_expected.to_not contain_class('ceilometer::api')
+ is_expected.to_not contain_class('ceilometer::wsgi::apache')
+ end
+ end
+
+ context 'with step 4' do
+ let(:params) { {
+ :step => 4,
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('ceilometer::api')
+ is_expected.to contain_class('ceilometer::wsgi::apache')
+ end
+ end
+ end
+
+
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) do
+ facts.merge({ :hostname => 'node.example.com' })
+ end
+
+ it_behaves_like 'tripleo::profile::base::ceilometer::api'
+ end
+ end
+end
diff --git a/spec/classes/tripleo_profile_base_ceilometer_collector_spec.rb b/spec/classes/tripleo_profile_base_ceilometer_collector_spec.rb
new file mode 100644
index 0000000..e262491
--- /dev/null
+++ b/spec/classes/tripleo_profile_base_ceilometer_collector_spec.rb
@@ -0,0 +1,138 @@
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# 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.
+#
+
+require 'spec_helper'
+
+describe 'tripleo::profile::base::ceilometer::collector' do
+ shared_examples_for 'tripleo::profile::base::ceilometer::collector' do
+ let(:pre_condition) do
+ "class { '::tripleo::profile::base::ceilometer': step => #{params[:step]}, rabbit_hosts => ['127.0.0.1'] }"
+ end
+
+ context 'with step 3 on bootstrap node with mongodb' do
+ let(:params) { {
+ :step => 3,
+ :bootstrap_node => 'node.example.com',
+ :mongodb_node_ips => ['127.0.0.1',],
+ :mongodb_replset => 'replicaset'
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer::collector')
+ is_expected.to contain_class('ceilometer::db::sync')
+ is_expected.to contain_class('ceilometer::db').with(
+ :database_connection => 'mongodb://127.0.0.1:27017/ceilometer?replicaSet=replicaset'
+ )
+ end
+ end
+
+ context 'with step 3 on bootstrap node with mongodb with ipv6' do
+ let(:params) { {
+ :step => 3,
+ :bootstrap_node => 'node.example.com',
+ :mongodb_ipv6 => true,
+ :mongodb_node_ips => ['::1','fe80::ca5b:76ff:fe4b:be3b'],
+ :mongodb_replset => 'replicaset'
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer::collector')
+ is_expected.to contain_class('ceilometer::db::sync')
+ is_expected.to contain_class('ceilometer::db').with(
+ :database_connection => 'mongodb://[::1]:27017,[fe80::ca5b:76ff:fe4b:be3b]:27017/ceilometer?replicaSet=replicaset'
+ )
+ end
+ end
+
+ context 'with step 3 on bootstrap node without mongodb' do
+ let(:params) { {
+ :step => 3,
+ :bootstrap_node => 'node.example.com',
+ :ceilometer_backend => 'somethingelse',
+ :mongodb_node_ips => ['127.0.0.1',],
+ :mongodb_replset => 'replicaset'
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer::collector')
+ is_expected.to contain_class('ceilometer::db::sync')
+ is_expected.to contain_class('ceilometer::db').without(
+ :database_connection => 'mongodb://127.0.0.1:27017/ceilometer?replicaSet=replicaset'
+ )
+ end
+ end
+
+ context 'with step 3 not on bootstrap node' do
+ let(:params) { {
+ :step => 3,
+ :bootstrap_node => 'soemthingelse.example.com'
+ } }
+
+ it 'should not trigger any configuration' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer::collector')
+ is_expected.to_not contain_class('ceilometer::db')
+ end
+ end
+
+ context 'with step 4 on bootstrap node' do
+ let(:params) { {
+ :step => 4,
+ :bootstrap_node => 'node.example.com',
+ :mongodb_node_ips => ['127.0.0.1',],
+ :mongodb_replset => 'replicaset'
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('ceilometer::db::sync')
+ is_expected.to contain_class('ceilometer::db').with(
+ :database_connection => 'mongodb://127.0.0.1:27017/ceilometer?replicaSet=replicaset'
+ )
+ is_expected.to contain_class('ceilometer::collector')
+ is_expected.to contain_class('ceilometer::dispatcher::gnocchi')
+ end
+ end
+
+ context 'with step 4 not on bootstrap node' do
+ let(:params) { {
+ :step => 4,
+ :bootstrap_node => 'somethingelse.example.com',
+ :mongodb_node_ips => ['127.0.0.1',],
+ :mongodb_replset => 'replicaset'
+ } }
+
+ it 'should trigger complete configuration' do
+ #TODO(aschultz): LP#1629373
+ #is_expected.to_not contain_class('ceilometer::db::sync')
+ is_expected.to contain_class('ceilometer::db').with(
+ :database_connection => 'mongodb://127.0.0.1:27017/ceilometer?replicaSet=replicaset'
+ )
+ is_expected.to contain_class('ceilometer::collector')
+ is_expected.to contain_class('ceilometer::dispatcher::gnocchi')
+ end
+ end
+ end
+
+
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) do
+ facts.merge({ :hostname => 'node.example.com' })
+ end
+
+ it_behaves_like 'tripleo::profile::base::ceilometer::collector'
+ end
+ end
+end
diff --git a/spec/classes/tripleo_profile_base_ceilometer_expirer_spec.rb b/spec/classes/tripleo_profile_base_ceilometer_expirer_spec.rb
new file mode 100644
index 0000000..bbef431
--- /dev/null
+++ b/spec/classes/tripleo_profile_base_ceilometer_expirer_spec.rb
@@ -0,0 +1,58 @@
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# 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.
+#
+
+require 'spec_helper'
+
+describe 'tripleo::profile::base::ceilometer::expirer' do
+ shared_examples_for 'tripleo::profile::base::ceilometer::expirer' do
+ let(:pre_condition) do
+ "class { '::tripleo::profile::base::ceilometer': step => #{params[:step]}, rabbit_hosts => ['127.0.0.1'] }"
+ end
+
+ context 'with step less than 4' do
+ let(:params) { { :step => 3 } }
+
+ it 'should do nothing' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer::expirer')
+ is_expected.to_not contain_class('ceilometer::expirer')
+ end
+ end
+
+ context 'with step 4' do
+ let(:params) { {
+ :step => 4,
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('ceilometer::expirer')
+ is_expected.to contain_cron('ceilometer-expirer').with(
+ :command => 'sleep $(($(od -A n -t d -N 3 /dev/urandom) % 86400)) && ceilometer-expirer'
+ )
+ end
+ end
+ end
+
+
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) do
+ facts.merge({ :hostname => 'node.example.com' })
+ end
+
+ it_behaves_like 'tripleo::profile::base::ceilometer::expirer'
+ end
+ end
+end
diff --git a/spec/classes/tripleo_profile_base_ceilometer_spec.rb b/spec/classes/tripleo_profile_base_ceilometer_spec.rb
new file mode 100644
index 0000000..73fb41b
--- /dev/null
+++ b/spec/classes/tripleo_profile_base_ceilometer_spec.rb
@@ -0,0 +1,55 @@
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# 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.
+#
+
+require 'spec_helper'
+
+describe 'tripleo::profile::base::ceilometer' do
+ shared_examples_for 'tripleo::profile::base::ceilometer' do
+ context 'with step less than 3' do
+ let(:params) { { :step => 1 } }
+ it 'should do nothing' do
+ is_expected.to contain_class('tripleo::profile::base::ceilometer')
+ is_expected.to_not contain_class('ceilometer')
+ is_expected.to_not contain_class('ceilometer::config')
+ end
+ end
+
+ context 'with step 3' do
+ let(:params) { {
+ :step => 3,
+ :rabbit_hosts => ['127.0.0.1', '127.0.0.2']
+ } }
+
+ it 'should trigger complete configuration' do
+ is_expected.to contain_class('ceilometer').with(
+ :rabbit_hosts => params[:rabbit_hosts]
+ )
+ is_expected.to contain_class('ceilometer::config')
+ end
+ end
+ end
+
+
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) do
+ facts.merge({ :hostname => 'node.example.com' })
+ end
+
+ it_behaves_like 'tripleo::profile::base::ceilometer'
+ end
+ end
+end
diff --git a/spec/fixtures/hieradata/default.yaml b/spec/fixtures/hieradata/default.yaml
index 7a57a15..e9409e7 100644
--- a/spec/fixtures/hieradata/default.yaml
+++ b/spec/fixtures/hieradata/default.yaml
@@ -8,3 +8,4 @@ redis_vip: '127.0.0.1'
aodh::auth::auth_password: 'password'
aodh::db::mysql::password: 'password'
aodh::keystone::authtoken::password: 'password'
+ceilometer::keystone::authtoken::password: 'password'