Sync puppet-ceilometer

4.0.0 b231c9681d476a05f437f828b95870ab4cbc4327

Change-Id: Ifa403d8066ede566dddbf49d67308c080b97ea77
Implements: blueprint merge-openstack-puppet-modules
Signed-Off: Sergii Golovatiuk <sgolovatiuk@mirantis.com>
This commit is contained in:
Sergii Golovatiuk 2014-06-27 10:21:27 +00:00 committed by Aleksandr Didenko
parent 8814b0224d
commit 5e9c278652
45 changed files with 2149 additions and 1327 deletions

View File

@ -1,9 +1,11 @@
fixtures:
repositories:
"inifile": "git://github.com/cprice-puppet/puppetlabs-inifile"
"keystone": "git://github.com/stackforge/puppet-keystone.git"
"mysql": "git://github.com/puppetlabs/puppetlabs-mysql.git"
"nova": "git://github.com/stackforge/puppet-nova.git"
"stdlib": "git://github.com/puppetlabs/puppetlabs-stdlib.git"
'inifile': 'git://github.com/puppetlabs/puppetlabs-inifile'
'keystone': 'git://github.com/stackforge/puppet-keystone.git'
'mysql':
repo: 'git://github.com/puppetlabs/puppetlabs-mysql.git'
ref: 'origin/0.x'
'nova': 'git://github.com/stackforge/puppet-nova.git'
'stdlib': 'git://github.com/puppetlabs/puppetlabs-stdlib.git'
symlinks:
"ceilometer": "#{source_dir}"
'ceilometer': "#{source_dir}"

View File

@ -0,0 +1,4 @@
*.swp
spec/fixtures/modules/*
pkg
Gemfile.lock

View File

@ -3,6 +3,7 @@ source 'https://rubygems.org'
group :development, :test do
gem 'puppetlabs_spec_helper', :require => false
gem 'puppet-lint', '~> 0.3.2'
gem 'rake', '10.1.1'
end
if puppetversion = ENV['PUPPET_GEM_VERSION']

View File

@ -1,13 +1,14 @@
name 'enovance-ceilometer'
version '0.0.1'
source 'none'
name 'puppetlabs-ceilometer'
version '4.0.0'
source 'https://github.com/stackforge/puppet-ceilometer'
author 'enovance'
license 'Apache License, Version 2.0'
summary 'Install/configure Openstack Ceilometer'
description 'Install/configure Openstack Ceilometer'
project_page 'https://launchpad.net/ceilometer'
project_page 'https://launchpad.net/puppet-ceilometer'
# Dependencies
dependency 'puppetlabs/inifile', '>=1.0.0 <2.0.0'
dependency 'puppetlabs/keystone', '>=4.0.0 <5.0.0'
dependency 'puppetlabs/mysql', '>=0.9.0 <3.0.0'
dependency 'puppetlabs/stdlib', '>= 3.2.0'
dependency 'cprice404/inifile', '>= 0.9.0'
dependency 'puppetlabs/mysql', '>= 0.5.0 <1.0.0'

View File

@ -1,27 +0,0 @@
puppet-ceilometer
This is the ceilometer module.
License
-------
Apache License 2.0
Copyright 2012 eNovance <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.
Contact
-------
techs@enovance.com

View File

@ -0,0 +1,128 @@
Ceilometer
==========
4.0.0 - 2014.1.0 - Icehouse
#### Table of Contents
1. [Overview - What is the ceilometer module?](#overview)
2. [Module Description - What does the module do?](#module-description)
3. [Setup - The basics of getting started with ceilometer](#setup)
4. [Implementation - An under-the-hood peek at what the module is doing](#implementation)
5. [Limitations - OS compatibility, etc.](#limitations)
6. [Development - Guide for contributing to the module](#development)
7. [Contributors - Those with commits](#contributors)
8. [Release Notes - Notes on the most recent updates to the module](#release-notes)
Overview
--------
The ceilometer module is part of [Stackforge](https://github.com/stackforge), an effort by the
OpenStack infrastructure team to provice continuous integration testing and code review for
OpenStack and OpenStack community projects not part of the core software. The module itself
is used to flexibly configure and manage the metering service for OpenStack.
Module Description
------------------
The ceilometer module is an attempt to make Puppet capable of managing the entirety of ceilometer.
This includes manifests to provision the ceilometer api, agents, and database stores. A
ceilometer_config type is supplied to assist in the manipulation of configuration files.
Setup
-----
**What the ceilometer module affects**
* ceilometer, the metering service for OpenStack
### Installing ceilometer
example% puppet module install puppetlabs/ceilometer
### Beginning with ceilometer
Implementation
--------------
### ceilometer
ceilometer is a combination of Puppet manifests and Ruby code to deliver configuration and
extra functionality through types and providers.
Limitations
-----------
* The ceilometer modules have only been tested on RedHat and Ubuntu family systems.
Development
-----------
Developer documentation for the entire puppet-openstack project
* https://wiki.openstack.org/wiki/Puppet-openstack#Developer_documentation
Contributors
------------
* https://github.com/stackforge/puppet-ceilometer/graphs/contributors
This is the ceilometer module.
Release Notes
-------------
** 4.0.0 **
* Stable Icehouse release.
* Added ability to override notification topics.
* Implemented notification agent service.
* Fixed region name configuration.
* Fixed ensure packages bug.
* Added support for puppetlabs-mysql 2.2 and greater.
* Fixed MySQL grant call.
* Introduced ceilometer::config to handle additional custom options.
** 3.1.1 **
* Removed enforcement of glance_control_exchange.
* Fixed user reference in db.pp.
* Allow db fields configuration without need for dbsync for better replicaset support.
* Fixed alarm package parameters Debian/Ubuntu.
** 3.1.0 **
* Fixed package ceilometer-alarm type error on Debian.
* Remove log_dir from params and make logs configurable in init.
* Removed glance_notifications from notification_topic.
* Don't match commented [DEFAULT] section.
** 3.0.0 **
* Initial release of the puppet-ceilometer module.
License
--------
Apache License 2.0
Copyright 2012 eNovance <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.
Contact
-------
techs@enovance.com

View File

@ -1 +1,6 @@
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
PuppetLint.configuration.fail_on_warnings = true
PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.send('disable_class_parameter_defaults')

View File

@ -22,18 +22,49 @@ node default {
class { 'ceilometer::db':
}
# Configure ceilometer database with mongodb
# class { 'ceilometer::db':
# database_connection => 'mongodb://localhost:27017/ceilometer',
# require => Class['mongodb'],
# }
# Install the ceilometer-api service
# The keystone_password parameter is mandatory
class { 'ceilometer::api':
keystone_password => 'tralalayouyou'
}
# Set common auth parameters used by all agents (compute/central)
class { 'ceilometer::agent::auth':
auth_url => 'http://localhost:35357/v2.0',
auth_password => 'tralalerotralala'
}
# Install compute agent
# default: enable
class { 'ceilometer::agent::compute':
}
# Enable ceilometer agent notification service
class { 'ceilometer::agent_notification':
# Install central agent
class { 'ceilometer::agent::central':
}
# Install alarm notifier
class { 'ceilometer::alarm::notifier':
}
# Install alarm evaluator
class { 'ceilometer::alarm::evaluator':
}
# Purge 1 month old meters
class { 'ceilometer::expirer':
time_to_live => '2592000'
}
# Install notification agent
class { 'ceilometer::agent::notification':
}
}

View File

@ -1,321 +0,0 @@
#!/bin/sh
#
#
# OpenStack Ceilometer Central Agent Service (ceilometer-agent-central)
#
# Description: Manages an OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) process as an HA resource
#
# Authors: Emilien Macchi
# Mainly inspired by the Nova Scheduler resource agent written by Sebastien Han
#
# Support: openstack@lists.launchpad.net
# License: Apache Software License (ASL) 2.0
#
#
# See usage() function below for more details ...
#
# OCF instance parameters:
# OCF_RESKEY_binary
# OCF_RESKEY_config
# OCF_RESKEY_user
# OCF_RESKEY_pid
# OCF_RESKEY_monitor_binary
# OCF_RESKEY_additional_parameters
#######################################################################
# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#######################################################################
# Fill in some defaults if no values are specified
OCF_RESKEY_binary_default="ceilometer-agent-central"
OCF_RESKEY_config_default="/etc/ceilometer/ceilometer.conf"
OCF_RESKEY_user_default="ceilometer"
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
#######################################################################
usage() {
cat <<UEND
usage: $0 (start|stop|validate-all|meta-data|status|monitor)
$0 manages an OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) process as an HA resource
The 'start' operation starts the scheduler service.
The 'stop' operation stops the scheduler service.
The 'validate-all' operation reports whether the parameters are valid
The 'meta-data' operation reports this RA's meta-data information
The 'status' operation reports whether the scheduler service is running
The 'monitor' operation reports whether the scheduler service seems to be working
UEND
}
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="ceilometer-agent-central">
<version>1.0</version>
<longdesc lang="en">
Resource agent for the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central)
May manage a ceilometer-agent-central instance or a clone set that
creates a distributed ceilometer-agent-central cluster.
</longdesc>
<shortdesc lang="en">Manages the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central)</shortdesc>
<parameters>
<parameter name="binary" unique="0" required="0">
<longdesc lang="en">
Location of the OpenStack Ceilometer Central Agent server binary (ceilometer-agent-central)
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Central Agent server binary (ceilometer-agent-central)</shortdesc>
<content type="string" default="${OCF_RESKEY_binary_default}" />
</parameter>
<parameter name="config" unique="0" required="0">
<longdesc lang="en">
Location of the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) configuration file
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Central Agent (ceilometer-agent-central registry) config file</shortdesc>
<content type="string" default="${OCF_RESKEY_config_default}" />
</parameter>
<parameter name="user" unique="0" required="0">
<longdesc lang="en">
User running OpenStack Ceilometer Central Agent Service (ceilometer-agent-central)
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) user</shortdesc>
<content type="string" default="${OCF_RESKEY_user_default}" />
</parameter>
<parameter name="pid" unique="0" required="0">
<longdesc lang="en">
The pid file to use for this OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) instance
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Central Agent Service (ceilometer-agent-central) pid file</shortdesc>
<content type="string" default="${OCF_RESKEY_pid_default}" />
</parameter>
<parameter name="additional_parameters" unique="0" required="0">
<longdesc lang="en">
Additional parameters to pass on to the OpenStack Ceilometer Central Agent Service (ceilometer-agent-central)
</longdesc>
<shortdesc lang="en">Additional parameters for ceilometer-agent-central</shortdesc>
<content type="string" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="20" />
<action name="stop" timeout="20" />
<action name="status" timeout="20" />
<action name="monitor" timeout="30" interval="20" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}
#######################################################################
# Functions invoked by resource manager actions
ceilometer_agent_central_check_port() {
# This function has been taken from the squid RA and improved a bit
# The length of the integer must be 4
# Examples of valid port: "1080", "0080"
# Examples of invalid port: "1080bad", "0", "0000", ""
local int
local cnt
int="$1"
cnt=${#int}
echo $int |egrep -qx '[0-9]+(:[0-9]+)?(,[0-9]+(:[0-9]+)?)*'
if [ $? -ne 0 ] || [ $cnt -ne 4 ]; then
ocf_log err "Invalid port number: $1"
exit $OCF_ERR_CONFIGURED
fi
}
ceilometer_agent_central_validate() {
local rc
check_binary $OCF_RESKEY_binary
check_binary netstat
# A config file on shared storage that is not available
# during probes is OK.
if [ ! -f $OCF_RESKEY_config ]; then
if ! ocf_is_probe; then
ocf_log err "Config $OCF_RESKEY_config doesn't exist"
return $OCF_ERR_INSTALLED
fi
ocf_log_warn "Config $OCF_RESKEY_config not available during a probe"
fi
getent passwd $OCF_RESKEY_user >/dev/null 2>&1
rc=$?
if [ $rc -ne 0 ]; then
ocf_log err "User $OCF_RESKEY_user doesn't exist"
return $OCF_ERR_INSTALLED
fi
true
}
ceilometer_agent_central_status() {
local pid
local rc
if [ ! -f $OCF_RESKEY_pid ]; then
ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) is not running"
return $OCF_NOT_RUNNING
else
pid=`cat $OCF_RESKEY_pid`
fi
ocf_run -warn kill -s 0 $pid
rc=$?
if [ $rc -eq 0 ]; then
return $OCF_SUCCESS
else
ocf_log info "Old PID file found, but OpenStack Ceilometer Central Agent (ceilometer-agent-central) is not running"
return $OCF_NOT_RUNNING
fi
}
ceilometer_agent_central_monitor() {
local rc
local pid
ceilometer_agent_central_status
rc=$?
# If status returned anything but success, return that immediately
if [ $rc -ne $OCF_SUCCESS ]; then
return $rc
fi
ocf_log debug "OpenStack Ceilometer Central Agent (ceilometer-agent-central) monitor succeeded"
return $OCF_SUCCESS
}
ceilometer_agent_central_start() {
local rc
ceilometer_agent_central_status
rc=$?
if [ $rc -eq $OCF_SUCCESS ]; then
ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) already running"
return $OCF_SUCCESS
fi
# run the actual ceilometer-agent-central daemon. Don't use ocf_run as we're sending the tool's output
# straight to /dev/null anyway and using ocf_run would break stdout-redirection here.
su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \
$OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid
# Spin waiting for the server to come up.
while true; do
ceilometer_agent_central_monitor
rc=$?
[ $rc -eq $OCF_SUCCESS ] && break
if [ $rc -ne $OCF_NOT_RUNNING ]; then
ocf_log err "OpenStack Ceilometer Central Agent (ceilometer-agent-central) start failed"
exit $OCF_ERR_GENERIC
fi
sleep 1
done
ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) started"
return $OCF_SUCCESS
}
ceilometer_agent_central_stop() {
local rc
local pid
ceilometer_agent_central_status
rc=$?
if [ $rc -eq $OCF_NOT_RUNNING ]; then
ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) already stopped"
return $OCF_SUCCESS
fi
# Try SIGTERM
pid=`cat $OCF_RESKEY_pid`
ocf_run kill -s TERM $pid
rc=$?
if [ $rc -ne 0 ]; then
ocf_log err "OpenStack Ceilometer Central Agent (ceilometer-agent-central) couldn't be stopped"
exit $OCF_ERR_GENERIC
fi
# stop waiting
shutdown_timeout=15
if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
fi
count=0
while [ $count -lt $shutdown_timeout ]; do
ceilometer_agent_central_status
rc=$?
if [ $rc -eq $OCF_NOT_RUNNING ]; then
break
fi
count=`expr $count + 1`
sleep 1
ocf_log debug "OpenStack Ceilometer Central Agent (ceilometer-agent-central) still hasn't stopped yet. Waiting ..."
done
ceilometer_agent_central_status
rc=$?
if [ $rc -ne $OCF_NOT_RUNNING ]; then
# SIGTERM didn't help either, try SIGKILL
ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) failed to stop after ${shutdown_timeout}s \
using SIGTERM. Trying SIGKILL ..."
ocf_run kill -s KILL $pid
fi
ocf_log info "OpenStack Ceilometer Central Agent (ceilometer-agent-central) stopped"
rm -f $OCF_RESKEY_pid
return $OCF_SUCCESS
}
#######################################################################
case "$1" in
meta-data) meta_data
exit $OCF_SUCCESS;;
usage|help) usage
exit $OCF_SUCCESS;;
esac
# Anything except meta-data and help must pass validation
ceilometer_agent_central_validate || exit $?
# What kind of method was invoked?
case "$1" in
start) ceilometer_agent_central_start;;
stop) ceilometer_agent_central_stop;;
status) ceilometer_agent_central_status;;
monitor) ceilometer_agent_central_monitor;;
validate-all) ;;
*) usage
exit $OCF_ERR_UNIMPLEMENTED;;
esac

View File

@ -1,321 +0,0 @@
#!/bin/sh
#
#
# OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator)
#
# Description: Manages an OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator) process as an HA resource
#
# Authors: Emilien Macchi
# Mainly inspired by the Nova Scheduler resource agent written by Sebastien Han
#
# Support: openstack@lists.launchpad.net
# License: Apache Software License (ASL) 2.0
#
#
# See usage() function below for more details ...
#
# OCF instance parameters:
# OCF_RESKEY_binary
# OCF_RESKEY_config
# OCF_RESKEY_user
# OCF_RESKEY_pid
# OCF_RESKEY_monitor_binary
# OCF_RESKEY_additional_parameters
#######################################################################
# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#######################################################################
# Fill in some defaults if no values are specified
OCF_RESKEY_binary_default="ceilometer-alarm-evaluator"
OCF_RESKEY_config_default="/etc/ceilometer/ceilometer.conf"
OCF_RESKEY_user_default="ceilometer"
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
#######################################################################
usage() {
cat <<UEND
usage: $0 (start|stop|validate-all|meta-data|status|monitor)
$0 manages an OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator) process as an HA resource
The 'start' operation starts the service.
The 'stop' operation stops the service.
The 'validate-all' operation reports whether the parameters are valid
The 'meta-data' operation reports this RA's meta-data information
The 'status' operation reports whether the service is running
The 'monitor' operation reports whether the service seems to be working
UEND
}
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="ceilometer-alarm-evaluator">
<version>1.0</version>
<longdesc lang="en">
Resource agent for the OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator)
May manage a ceilometer-alarm-evaluatorinstance or a clone set that
creates a distributed ceilometer-alarm-evaluator cluster.
</longdesc>
<shortdesc lang="en">Manages the OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator)</shortdesc>
<parameters>
<parameter name="binary" unique="0" required="0">
<longdesc lang="en">
Location of the OpenStack Ceilometer Alarm Evaluator server binary (ceilometer-alarm-evaluator)
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Alarm Evaluator server binary (ceilometer-alarm-evaluator)</shortdesc>
<content type="string" default="${OCF_RESKEY_binary_default}" />
</parameter>
<parameter name="config" unique="0" required="0">
<longdesc lang="en">
Location of the OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator) configuration file
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) config file</shortdesc>
<content type="string" default="${OCF_RESKEY_config_default}" />
</parameter>
<parameter name="user" unique="0" required="0">
<longdesc lang="en">
User running OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator)
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator) user</shortdesc>
<content type="string" default="${OCF_RESKEY_user_default}" />
</parameter>
<parameter name="pid" unique="0" required="0">
<longdesc lang="en">
The pid file to use for this OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator) instance
</longdesc>
<shortdesc lang="en">OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator) pid file</shortdesc>
<content type="string" default="${OCF_RESKEY_pid_default}" />
</parameter>
<parameter name="additional_parameters" unique="0" required="0">
<longdesc lang="en">
Additional parameters to pass on to the OpenStack Ceilometer Alarm Evaluator Service (ceilometer-alarm-evaluator)
</longdesc>
<shortdesc lang="en">Additional parameters for ceilometer-alarm-evaluator</shortdesc>
<content type="string" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="20" />
<action name="stop" timeout="20" />
<action name="status" timeout="20" />
<action name="monitor" timeout="30" interval="20" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}
#######################################################################
# Functions invoked by resource manager actions
ceilometer_alarm_evaluator_check_port() {
# This function has been taken from the squid RA and improved a bit
# The length of the integer must be 4
# Examples of valid port: "1080", "0080"
# Examples of invalid port: "1080bad", "0", "0000", ""
local int
local cnt
int="$1"
cnt=${#int}
echo $int |egrep -qx '[0-9]+(:[0-9]+)?(,[0-9]+(:[0-9]+)?)*'
if [ $? -ne 0 ] || [ $cnt -ne 4 ]; then
ocf_log err "Invalid port number: $1"
exit $OCF_ERR_CONFIGURED
fi
}
ceilometer_alarm_evaluator_validate() {
local rc
check_binary $OCF_RESKEY_binary
check_binary netstat
# A config file on shared storage that is not available
# during probes is OK.
if [ ! -f $OCF_RESKEY_config ]; then
if ! ocf_is_probe; then
ocf_log err "Config $OCF_RESKEY_config doesn't exist"
return $OCF_ERR_INSTALLED
fi
ocf_log_warn "Config $OCF_RESKEY_config not available during a probe"
fi
getent passwd $OCF_RESKEY_user >/dev/null 2>&1
rc=$?
if [ $rc -ne 0 ]; then
ocf_log err "User $OCF_RESKEY_user doesn't exist"
return $OCF_ERR_INSTALLED
fi
true
}
ceilometer_alarm_evaluator_status() {
local pid
local rc
if [ ! -f $OCF_RESKEY_pid ]; then
ocf_log info "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) is not running"
return $OCF_NOT_RUNNING
else
pid=`cat $OCF_RESKEY_pid`
fi
ocf_run -warn kill -s 0 $pid
rc=$?
if [ $rc -eq 0 ]; then
return $OCF_SUCCESS
else
ocf_log info "Old PID file found, but OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) is not running"
return $OCF_NOT_RUNNING
fi
}
ceilometer_alarm_evaluator_monitor() {
local rc
local pid
ceilometer_alarm_evaluator_status
rc=$?
# If status returned anything but success, return that immediately
if [ $rc -ne $OCF_SUCCESS ]; then
return $rc
fi
ocf_log debug "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) monitor succeeded"
return $OCF_SUCCESS
}
ceilometer_alarm_evaluator_start() {
local rc
ceilometer_alarm_evaluator_status
rc=$?
if [ $rc -eq $OCF_SUCCESS ]; then
ocf_log info "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) already running"
return $OCF_SUCCESS
fi
# run the actual ceilometer-alarm-evaluator daemon. Don't use ocf_run as we're sending the tool's output
# straight to /dev/null anyway and using ocf_run would break stdout-redirection here.
su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \
$OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid
# Spin waiting for the server to come up.
while true; do
ceilometer_alarm_evaluator_monitor
rc=$?
[ $rc -eq $OCF_SUCCESS ] && break
if [ $rc -ne $OCF_NOT_RUNNING ]; then
ocf_log err "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) start failed"
exit $OCF_ERR_GENERIC
fi
sleep 1
done
ocf_log info "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) started"
return $OCF_SUCCESS
}
ceilometer_alarm_evaluator_stop() {
local rc
local pid
ceilometer_alarm_evaluator_status
rc=$?
if [ $rc -eq $OCF_NOT_RUNNING ]; then
ocf_log info "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) already stopped"
return $OCF_SUCCESS
fi
# Try SIGTERM
pid=`cat $OCF_RESKEY_pid`
ocf_run kill -s TERM $pid
rc=$?
if [ $rc -ne 0 ]; then
ocf_log err "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) couldn't be stopped"
exit $OCF_ERR_GENERIC
fi
# stop waiting
shutdown_timeout=15
if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
fi
count=0
while [ $count -lt $shutdown_timeout ]; do
ceilometer_alarm_evaluator_status
rc=$?
if [ $rc -eq $OCF_NOT_RUNNING ]; then
break
fi
count=`expr $count + 1`
sleep 1
ocf_log debug "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) still hasn't stopped yet. Waiting ..."
done
ceilometer_alarm_evaluator_status
rc=$?
if [ $rc -ne $OCF_NOT_RUNNING ]; then
# SIGTERM didn't help either, try SIGKILL
ocf_log info "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) failed to stop after ${shutdown_timeout}s \
using SIGTERM. Trying SIGKILL ..."
ocf_run kill -s KILL $pid
fi
ocf_log info "OpenStack Ceilometer Alarm Evaluator (ceilometer-alarm-evaluator) stopped"
rm -f $OCF_RESKEY_pid
return $OCF_SUCCESS
}
#######################################################################
case "$1" in
meta-data) meta_data
exit $OCF_SUCCESS;;
usage|help) usage
exit $OCF_SUCCESS;;
esac
# Anything except meta-data and help must pass validation
ceilometer_alarm_evaluator_validate || exit $?
# What kind of method was invoked?
case "$1" in
start) ceilometer_alarm_evaluator_start;;
stop) ceilometer_alarm_evaluator_stop;;
status) ceilometer_alarm_evaluator_status;;
monitor) ceilometer_alarm_evaluator_monitor;;
validate-all) ;;
*) usage
exit $OCF_ERR_UNIMPLEMENTED;;
esac

View File

@ -15,7 +15,7 @@ Puppet::Type.type(:ceilometer_config).provide(
'='
end
def file_path
def self.file_path
'/etc/ceilometer/ceilometer.conf'
end

View File

@ -0,0 +1,83 @@
Puppet::Type.type(:file_line_after).provide(:ruby) do
def exists?
lines.find do |line|
line.chomp == resource[:line].chomp
end
end
def create
if resource[:match]
handle_create_with_match
elsif resource[:after]
handle_create_with_after
else
append_line
end
end
def destroy
local_lines = lines
File.open(resource[:path],'w') do |fh|
fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join(''))
end
end
private
def lines
# If this type is ever used with very large files, we should
# write this in a different way, using a temp
# file; for now assuming that this type is only used on
# small-ish config files that can fit into memory without
# too much trouble.
@lines ||= File.readlines(resource[:path])
end
def handle_create_with_match()
regex = resource[:match] ? Regexp.new(resource[:match]) : nil
match_count = lines.select { |l| regex.match(l) }.size
if match_count > 1 && resource[:multiple].to_s != 'true'
raise Puppet::Error, "More than one line in file '#{resource[:path]}' matches pattern '#{resource[:match]}'"
end
File.open(resource[:path], 'w') do |fh|
lines.each do |l|
fh.puts(regex.match(l) ? resource[:line] : l)
end
if (match_count == 0)
fh.puts(resource[:line])
end
end
end
def handle_create_with_after
regex = Regexp.new(resource[:after])
count = lines.count {|l| l.match(regex)}
case count
when 1 # find the line to put our line after
File.open(resource[:path], 'w') do |fh|
lines.each do |l|
fh.puts(l)
if regex.match(l) then
fh.puts(resource[:line])
end
end
end
when 0 # append the line to the end of the file
append_line
else
raise Puppet::Error, "#{count} lines match pattern '#{resource[:after]}' in file '#{resource[:path]}'. One or no line must match the pattern."
end
end
##
# append the line to the file.
#
# @api private
def append_line
File.open(resource[:path], 'a') do |fh|
fh.puts resource[:line]
end
end
end

View File

@ -0,0 +1,79 @@
Puppet::Type.newtype(:file_line_after) do
desc <<-EOT
Ensures that a given line is contained within a file. The implementation
matches the full line, including whitespace at the beginning and end. If
the line is not contained in the given file, Puppet will add the line to
ensure the desired state. Multiple resources may be declared to manage
multiple lines in the same file.
Example:
file_line_after { 'sudo_rule':
path => '/etc/sudoers',
line => '%sudo ALL=(ALL) ALL',
}
file_line_after { 'sudo_rule_nopw':
path => '/etc/sudoers',
line => '%sudonopw ALL=(ALL) NOPASSWD: ALL',
}
In this example, Puppet will ensure both of the specified lines are
contained in the file /etc/sudoers.
EOT
ensurable do
defaultvalues
defaultto :present
end
newparam(:name, :namevar => true) do
desc 'An arbitrary name used as the identity of the resource.'
end
newparam(:match) do
desc 'An optional regular expression to run against existing lines in the file;\n' +
'if a match is found, we replace that line rather than adding a new line.'
end
newparam(:multiple) do
desc 'An optional value to determine if match can change multiple lines.'
newvalues(true, false)
end
newparam(:after) do
desc 'An optional value used to specify the line after which we will add any new lines. (Existing lines are added in place)'
end
newparam(:line) do
desc 'The line to be appended to the file located by the path parameter.'
end
newparam(:path) do
desc 'The file Puppet will ensure contains the line specified by the line parameter.'
validate do |value|
unless (Puppet.features.posix? and value =~ /^\//) or (Puppet.features.microsoft_windows? and (value =~ /^.:\// or value =~ /^\/\/[^\/]+\/[^\/]+/))
raise(Puppet::Error, "File paths must be fully qualified, not '#{value}'")
end
end
end
# Autorequire the file resource if it's being managed
autorequire(:file) do
self[:path]
end
validate do
unless self[:line] and self[:path]
raise(Puppet::Error, "Both line and path are required attributes")
end
if (self[:match])
unless Regexp.new(self[:match]).match(self[:line])
raise(Puppet::Error, "When providing a 'match' parameter, the value must be a regex that matches against the value of your 'line' parameter")
end
end
end
end

View File

@ -0,0 +1,62 @@
# The ceilometer::agent::auth class helps configure common
# auth settings for the agents.
#
# == Parameters
# [*auth_url*]
# the keystone public endpoint
# Optional. Defaults to 'http://localhost:5000/v2.0'
#
# [*auth_region*]
# the keystone region of this node
# Optional. Defaults to 'RegionOne'
#
# [*auth_user*]
# the keystone user for ceilometer services
# Optional. Defaults to 'ceilometer'
#
# [*auth_password*]
# the keystone password for ceilometer services
# Required.
#
# [*auth_tenant_name*]
# the keystone tenant name for ceilometer services
# Optional. Defaults to 'services'
#
# [*auth_tenant_id*]
# the keystone tenant id for ceilometer services.
# Optional. Defaults to empty.
#
# [*auth_cacert*]
# Certificate chain for SSL validation. Optional; Defaults to 'None'
#
class ceilometer::agent::auth (
$auth_password,
$auth_url = 'http://localhost:5000/v2.0',
$auth_region = 'RegionOne',
$auth_user = 'ceilometer',
$auth_tenant_name = 'services',
$auth_tenant_id = '',
$auth_cacert = undef,
) {
if ! $auth_cacert {
ceilometer_config { 'service_credentials/os_cacert': ensure => absent }
} else {
ceilometer_config { 'service_credentials/os_cacert': value => $auth_cacert }
}
ceilometer_config {
'service_credentials/os_auth_url' : value => $auth_url;
'service_credentials/os_region_name' : value => $auth_region;
'service_credentials/os_username' : value => $auth_user;
'service_credentials/os_password' : value => $auth_password;
'service_credentials/os_tenant_name' : value => $auth_tenant_name;
}
if ($auth_tenant_id != '') {
ceilometer_config {
'service_credentials/os_tenant_id' : value => $auth_tenant_id;
}
}
}

View File

@ -1,142 +1,36 @@
# Installs/configures the ceilometer central agent
#
# == Parameters
# [*auth_url*]
# Keystone URL. Optional. Defaults to 'http://localhost:5000/v2.0'
#
# [*auth_region*]
# Keystone region. Optional. Defaults to 'RegionOne'
#
# [*auth_user*]
# Keystone user for ceilometer. Optional. Defaults to 'ceilometer'
#
# [*auth_password*]
# Keystone password for ceilometer. Optional. Defaults to 'password'
#
# [*auth_tenant_name*]
# Keystone tenant name for ceilometer. Optional. Defauls to 'services'
#
# [*auth_tenant_id*]
# Keystone tenant id for ceilometer. Optional. Defaults to ''
#
# [*enabled*]
# Should the service be enabled. Optional. Defauls to true
#
# [*ha_mode*]
# Should we deploy service in HA mode. Active/Passive mode under pacemaker.
# Optional. Defauls to false
#
class ceilometer::agent::central (
$auth_host = 'http://localhost:5000/v2.0',
$auth_region = 'RegionOne',
$auth_user = 'ceilometer',
$auth_password = 'password',
$auth_tenant_name = 'services',
$auth_tenant_id = '',
$enabled = true,
$ha_mode = false,
$primary_controller = false
$enabled = true,
) {
include ceilometer::params
Ceilometer_config<||> ~> Service['ceilometer-agent-central']
Package['ceilometer-agent-central'] -> Service['ceilometer-agent-central']
package { 'ceilometer-agent-central':
ensure => installed,
name => $::ceilometer::params::agent_central_package_name,
}
tweaks::ubuntu_service_override { 'ceilometer-agent-central' :}
if $enabled {
$service_ensure = 'running'
} else {
$service_ensure = 'stopped'
}
ceilometer_config {
'DEFAULT/os_auth_url' : value => "http://${auth_host}:5000/v2.0";
'DEFAULT/os_auth_region' : value => $auth_region;
'DEFAULT/os_username' : value => $auth_user;
'DEFAULT/os_password' : value => $auth_password;
'DEFAULT/os_tenant_name' : value => $auth_tenant_name;
Package['ceilometer-common'] -> Service['ceilometer-agent-central']
service { 'ceilometer-agent-central':
ensure => $service_ensure,
name => $::ceilometer::params::agent_central_service_name,
enable => $enabled,
hasstatus => true,
hasrestart => true,
}
if ($auth_tenant_id != '') {
ceilometer_config {
'DEFAULT/os_tenant_id' : value => $auth_tenant_id;
}
}
if $ha_mode {
$res_name = "p_${::ceilometer::params::agent_central_service_name}"
Package['pacemaker'] -> File['ceilometer-agent-central-ocf']
Package['ceilometer-common'] -> File['ceilometer-agent-central-ocf']
Package['ceilometer-agent-central'] -> File['ceilometer-agent-central-ocf']
file {'ceilometer-agent-central-ocf':
path =>'/usr/lib/ocf/resource.d/mirantis/ceilometer-agent-central',
mode => '0755',
owner => root,
group => root,
source => 'puppet:///modules/ceilometer/ocf/ceilometer-agent-central',
}
if $primary_controller {
cs_resource { $res_name:
ensure => present,
primitive_class => 'ocf',
provided_by => 'mirantis',
primitive_type => 'ceilometer-agent-central',
metadata => { 'target-role' => 'stopped', 'resource-stickiness' => '1' },
parameters => { 'user' => 'ceilometer' },
operations => {
'monitor' => {
'interval' => '20',
'timeout' => '30'
},
'start' => {
'timeout' => '360'
},
'stop' => {
'timeout' => '360'
}
},
}
File['ceilometer-agent-central-ocf'] -> Cs_resource[$res_name] -> Service['ceilometer-agent-central']
} else {
File['ceilometer-agent-central-ocf'] -> Service['ceilometer-agent-central']
}
service { 'ceilometer-agent-central':
ensure => $service_ensure,
name => $res_name,
enable => $enabled,
hasstatus => true,
hasrestart => true,
provider => "pacemaker",
}
} else {
Package['ceilometer-common'] -> Service['ceilometer-agent-central']
Package['ceilometer-agent-central'] -> Service['ceilometer-agent-central']
service { 'ceilometer-agent-central':
ensure => $service_ensure,
name => $::ceilometer::params::agent_central_service_name,
enable => $enabled,
hasstatus => true,
hasrestart => true,
}
}
Package<| title == 'ceilometer-agent-central' or title == 'ceilometer-common'|> ~>
Service<| title == 'ceilometer-agent-central'|>
if !defined(Service['ceilometer-agent-central']) {
notify{ "Module ${module_name} cannot notify service ceilometer-agent-central\
on packages update": }
}
}

View File

@ -2,41 +2,11 @@
# Include this class on all nova compute nodes
#
# == Parameters
# [*auth_url*]
# the keystone public endpoint
# Optional. Defaults to 'http://localhost:5000/v2.0'
#
# [*auth_region*]
# the keystone region of this compute node
# Optional. Defaults to 'RegionOne'
#
# [*auth_user*]
# the keystone user for ceilometer services
# Optional. Defaults to 'ceilometer'
#
# [*auth_password*]
# the keystone password for ceilometer services
# Optional. Defaults to 'password'
#
# [*auth_tenant_name*]
# the keystone tenant name for ceilometer services
# Optional. Defaults to 'services'
#
# [*auth_tenant_id*]
# the keystone tenant id for ceilometer services.
# Optional. Defaults to empty.
#
# [*enabled*]
# should the service be started or not
# Optional. Defaults to true
#
class ceilometer::agent::compute (
$auth_host = '127.0.0.1',
$auth_region = 'RegionOne',
$auth_user = 'ceilometer',
$auth_password = 'password',
$auth_tenant_name = 'services',
$auth_tenant_id = '',
$enabled = true,
) inherits ceilometer {
@ -50,15 +20,16 @@ class ceilometer::agent::compute (
name => $::ceilometer::params::agent_compute_package_name,
}
tweaks::ubuntu_service_override { 'ceilometer-agent-compute' :}
if $::ceilometer::params::libvirt_group {
User['ceilometer'] {
groups +> [$::ceilometer::params::libvirt_group]
groups => ['nova', $::ceilometer::params::libvirt_group]
}
} else {
User['ceilometer'] {
groups => ['nova']
}
}
if $enabled {
$service_ensure = 'running'
} else {
@ -73,51 +44,29 @@ class ceilometer::agent::compute (
hasstatus => true,
hasrestart => true,
}
Package<| title == 'ceilometer-agent-compute' or title == 'ceilometer-common'|> ~>
Service<| title == 'ceilometer-agent-compute'|>
if !defined(Service['ceilometer-agent-compute']) {
notify{ "Module ${module_name} cannot notify service ceilometer-agent-compute\
on packages update": }
}
ceilometer_config {
'DEFAULT/os_auth_url' : value => "http://${auth_host}:5000/v2.0";
'DEFAULT/os_auth_region' : value => $auth_region;
'DEFAULT/os_username' : value => $auth_user;
'DEFAULT/os_password' : value => $auth_password;
'DEFAULT/os_tenant_name' : value => $auth_tenant_name;
}
if ($auth_tenant_id != '') {
ceilometer_config {
'DEFAULT/os_tenant_id' : value => $auth_tenant_id;
}
}
#NOTE(adidenko): the line below pulled from ceilometer master and
# 'file_line_after' replaced with 'file_line'
#NOTE(dprince): This is using a custom (inline) file_line provider
# until this lands upstream:
# https://github.com/puppetlabs/puppetlabs-stdlib/pull/174
Nova_config<| |> {
before +> File_line [
before +> File_line_after[
'nova-notification-driver-common',
'nova-notification-driver-ceilometer'
],
}
file_line {
file_line_after {
'nova-notification-driver-common':
line =>
line =>
'notification_driver=nova.openstack.common.notifier.rpc_notifier',
path => '/etc/nova/nova.conf',
after => '^\s*\[DEFAULT\]',
path => '/etc/nova/nova.conf',
after => '^\s*\[DEFAULT\]',
notify => Service['nova-compute'];
'nova-notification-driver-ceilometer':
line => 'notification_driver=ceilometer.compute.nova_notifier',
path => '/etc/nova/nova.conf',
after => '^\s*\[DEFAULT\]',
line => 'notification_driver=ceilometer.compute.nova_notifier',
path => '/etc/nova/nova.conf',
after => '^\s*\[DEFAULT\]',
notify => Service['nova-compute'];
}
}

View File

@ -0,0 +1,74 @@
#
# Copyright (C) 2014 eNovance SAS <licensing@enovance.com>
#
# Author: Emilien Macchi <emilien.macchi@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.
#
# == Class: ceilometer::agent::notification
#
# Configure the ceilometer notification agent.
# This configures the plugin for the API server, but does nothing
# about configuring the agents that must also run and share a config
# file with the OVS plugin if both are on the same machine.
#
# === Parameters
#
# [*enabled*]
# (optional) Should the service be started or not
# Defaults to true
#
# [*ack_on_event_error*]
# (optional) Acknowledge message when event persistence fails.
# Defaults to true
#
# [*store_events*]
# (optional) Save event details.
# Defaults to false
#
class ceilometer::agent::notification (
$enabled = true,
$ack_on_event_error = true,
$store_events = false
) {
include ceilometer::params
Ceilometer_config<||> ~> Service['ceilometer-agent-notification']
Package[$::ceilometer::params::agent_notification_package_name] -> Service['ceilometer-agent-notification']
Package[$::ceilometer::params::agent_notification_package_name] -> Package<| title == 'ceilometer-agent-notification' |>
ensure_packages([$::ceilometer::params::agent_notification_package_name])
if $enabled {
$service_ensure = 'running'
} else {
$service_ensure = 'stopped'
}
Package['ceilometer-common'] -> Service['ceilometer-agent-notification']
service { 'ceilometer-agent-notification':
ensure => $service_ensure,
name => $::ceilometer::params::agent_notification_service_name,
enable => $enabled,
hasstatus => true,
hasrestart => true
}
ceilometer_config {
'notification/ack_on_event_error': value => $ack_on_event_error;
'notification/store_events' : value => $store_events;
}
}

View File

@ -1,58 +0,0 @@
# Installs the ceilometer agent notification service
#
# == Params
# [*enabled*]
# should the service be enabled
#
class ceilometer::agent_notification (
$enabled = true,
$use_neutron = false,
$swift = false,
) {
include ceilometer::params
if $enabled {
$service_ensure = 'running'
} else {
$service_ensure = 'stopped'
}
Ceilometer_config<||> ~> Service['ceilometer-agent-notification']
package { 'ceilometer-agent-notification':
ensure => installed,
name => $::ceilometer::params::agent_notification_package,
}
case $::osfamily {
'Debian': {
tweaks::ubuntu_service_override { 'ceilometer-agent-notification' :}
}
}
Package['ceilometer-agent-notification'] ~> Service['ceilometer-agent-notification']
if $swift {
class { 'swift::notify::ceilometer':
enable_ceilometer => true,
}
}
if $use_neutron {
include neutron::notify::ceilometer
}
service { 'ceilometer-agent-notification':
ensure => $service_ensure,
name => $::ceilometer::params::agent_notification_service,
enable => $enabled,
hasstatus => true,
hasrestart => true,
require => [
Class['ceilometer::db'],
Class['ceilometer::api'],
Exec['ceilometer-dbsync'],
],
}
}

View File

@ -1,120 +1,55 @@
# Installs/configures the ceilometer alarm evaluator service
# Installs the ceilometer alarm evaluator service
#
# == Parameters
# == Params
# [*enabled*]
# Should the service be enabled. Optional. Defauls to true
#
# [*eval_interval*]
# Period of evaluation cycle. This should be >= than configured pipeline
# interval of metrics.
#
# [*ha_mode*]
# Should we deploy service in HA mode. Active/Passive mode under pacemaker.
# Optional. Defauls to false
# should the service be enabled
# [*evaluation_interval*]
# define the time interval for the alarm evaluator
# [*evaluation_service*]
# define which service use for the evaluator
# [*partition_rpc_topic*]
# define which topic the alarm evaluator should access
# [*record_history*]
# Record alarm change events
#
class ceilometer::alarm::evaluator (
$enabled = true,
$eval_interval = 600,
$ha_mode = false,
$primary_controller = false
)
{
$enabled = true,
$evaluation_interval = 60,
$evaluation_service = 'ceilometer.alarm.service.SingletonAlarmService',
$partition_rpc_topic = 'alarm_partition_coordination',
$record_history = true,
) {
include ceilometer::params
validate_re($evaluation_interval,'^(\d+)$')
Ceilometer_config<||> ~> Service['ceilometer-alarm-evaluator']
if ! defined(Notify['ceilometer-alarm']) {
package { $::ceilometer::params::alarm_package:
ensure => installed
}
notify { 'ceilometer-alarm': }
}
tweaks::ubuntu_service_override { 'ceilometer-alarm-evaluator' :
package_name => 'ceilometer-alarm',
}
Package[$::ceilometer::params::alarm_package_name] -> Service['ceilometer-alarm-evaluator']
Package[$::ceilometer::params::alarm_package_name] -> Package<| title == 'ceilometer-alarm' |>
ensure_packages($::ceilometer::params::alarm_package_name)
if $enabled {
$service_ensure = 'running'
}
else {
} else {
$service_ensure = 'stopped'
}
Package['ceilometer-common'] -> Service['ceilometer-alarm-evaluator']
service { 'ceilometer-alarm-evaluator':
ensure => $service_ensure,
name => $::ceilometer::params::alarm_evaluator_service_name,
enable => $enabled,
hasstatus => true,
hasrestart => true
}
ceilometer_config {
'alarm/evaluation_interval': value => $eval_interval;
}
if $ha_mode {
$res_name = "p_${::ceilometer::params::alarm_evaluator_service}"
Package['ceilometer-common'] -> File['ceilometer-alarm-evaluator-ocf']
Package[$::ceilometer::params::alarm_package] -> File['ceilometer-alarm-evaluator-ocf']
Package['pacemaker'] -> File['ceilometer-alarm-evaluator-ocf']
file {'ceilometer-alarm-evaluator-ocf':
path =>'/usr/lib/ocf/resource.d/mirantis/ceilometer-alarm-evaluator',
mode => '0755',
owner => root,
group => root,
source => 'puppet:///modules/ceilometer/ocf/ceilometer-alarm-evaluator',
'alarm/evaluation_interval' : value => $evaluation_interval;
'alarm/evaluation_service' : value => $evaluation_service;
'alarm/partition_rpc_topic' : value => $partition_rpc_topic;
'alarm/record_history' : value => $record_history;
}
if $primary_controller {
cs_resource { $res_name:
ensure => present,
primitive_class => 'ocf',
provided_by => 'mirantis',
primitive_type => 'ceilometer-alarm-evaluator',
metadata => { 'target-role' => 'stopped' },
parameters => { 'user' => 'ceilometer' },
operations => {
'monitor' => {
'interval' => '20',
'timeout' => '30'
}
,
'start' => {
'timeout' => '360'
}
,
'stop' => {
'timeout' => '360'
}
},
}
File['ceilometer-alarm-evaluator-ocf'] -> Cs_resource[$res_name] -> Service['ceilometer-alarm-evaluator']
} else {
File['ceilometer-alarm-evaluator-ocf'] -> Service['ceilometer-alarm-evaluator']
}
service { 'ceilometer-alarm-evaluator':
ensure => $service_ensure,
name => $res_name,
enable => $enabled,
hasstatus => true,
hasrestart => true,
provider => "pacemaker",
}
} else {
Package['ceilometer-common'] -> Service['ceilometer-alarm-evaluator']
Package[$::ceilometer::params::alarm_package] -> Service['ceilometer-alarm-evaluator']
service { 'ceilometer-alarm-evaluator':
ensure => $service_ensure,
name => $::ceilometer::params::alarm_evaluator_service,
enable => $enabled,
hasstatus => true,
hasrestart => true,
}
}
Package<| title == $::ceilometer::params::alarm_package or
title == 'ceilometer-common'|> ~>
Service<| title == 'ceilometer-alarm-evaluator'|>
if !defined(Service['ceilometer-alarm-evaluator']) {
notify{ "Module ${module_name} cannot notify service ceilometer-alarm-evaluator\
on packages update": }
}
}

View File

@ -1,49 +1,67 @@
# Installs/configures the ceilometer alarm notifier service
# Installs the ceilometer alarm notifier service
#
# == Parameters
# == Params
# [*enabled*]
# Should the service be enabled. Optional. Defauls to true
# should the service be enabled
# [*notifier_rpc_topic*]
# define on which topic the notifier will have
# access
# [*rest_notifier_certificate_key*]
# define the certificate key for the rest service
# [*rest_notifier_certificate_file*]
# define the certificate file for the rest service
# [*rest_notifier_ssl_verify*]
# should the ssl verify parameter be enabled
#
class ceilometer::alarm::notifier (
$enabled = true,
)
{
$enabled = true,
$notifier_rpc_topic = undef,
$rest_notifier_certificate_key = undef,
$rest_notifier_certificate_file = undef,
$rest_notifier_ssl_verify = true,
) {
include ceilometer::params
validate_bool($rest_notifier_ssl_verify)
Ceilometer_config<||> ~> Service['ceilometer-alarm-notifier']
Package['ceilometer-common'] -> Service['ceilometer-alarm-notifier']
Package[$::ceilometer::params::alarm_package] -> Service['ceilometer-alarm-notifier']
if ! defined(Notify['ceilometer-alarm']) {
package { $::ceilometer::params::alarm_package:
ensure => installed
}
notify { 'ceilometer-alarm': }
}
tweaks::ubuntu_service_override { 'ceilometer-alarm-notifier' :
package_name => 'ceilometer-alarm',
}
Package[$::ceilometer::params::alarm_package_name] -> Service['ceilometer-alarm-notifier']
Package[$::ceilometer::params::alarm_package_name] -> Package<| title == 'ceilometer-alarm' |>
ensure_packages($::ceilometer::params::alarm_package_name)
if $enabled {
$service_ensure = 'running'
}
else {
} else {
$service_ensure = 'stopped'
}
Package['ceilometer-common'] -> Service['ceilometer-alarm-notifier']
service { 'ceilometer-alarm-notifier':
ensure => $service_ensure,
name => $::ceilometer::params::alarm_notifier_service,
name => $::ceilometer::params::alarm_notifier_service_name,
enable => $enabled,
hasstatus => true,
hasrestart => true,
hasrestart => true
}
Package<| title == $::ceilometer::params::alarm_package or
title == 'ceilometer-common'|> ~>
Service<| title == 'ceilometer-alarm-notifier'|>
if !defined(Service['ceilometer-alarm-notifier']) {
notify{ "Module ${module_name} cannot notify service ceilometer-alarm-notifier\
on packages update": }
if $notifier_rpc_topic != undef {
ceilometer_config {
'alarm/notifier_rpc_topic' : value => $notifier_rpc_topic;
}
}
if $rest_notifier_certificate_key != undef {
ceilometer_config {
'alarm/rest_notifier_certificate_key' :value => $rest_notifier_certificate_key;
'alarm/rest_notifier_ssl_verify' :value => $rest_notifier_ssl_verify;
}
}
if $rest_notifier_certificate_file != undef {
ceilometer_config {
'alarm/rest_notifier_certificate_file' :value => $rest_notifier_certificate_file;
}
}
}

View File

@ -27,12 +27,15 @@
# [*keystone_password*] password to authenticate with
# Mandatory.
#
# [*bind_host*] service binds on this ip.
# Optional. Default '0.0.0.0'.
# [*host*]
# (optional) The ceilometer api bind address
# Defaults to 0.0.0.0
#
# [*bind_port*] service binds on this port.
# Optional. Default '8777'
# [*port*]
# (optional) The ceilometer api port
# Defaults to 8777
#
class ceilometer::api (
$enabled = true,
$keystone_host = '127.0.0.1',
@ -42,8 +45,9 @@ class ceilometer::api (
$keystone_user = 'ceilometer',
$keystone_tenant = 'services',
$keystone_password = false,
$bind_host = '0.0.0.0',
$bind_port = '8777',
$keystone_auth_uri = false,
$host = '0.0.0.0',
$port = '8777'
) {
include ceilometer::params
@ -59,8 +63,6 @@ class ceilometer::api (
name => $::ceilometer::params::api_package_name,
}
tweaks::ubuntu_service_override { 'ceilometer-api' :}
if $enabled {
$service_ensure = 'running'
} else {
@ -77,12 +79,6 @@ class ceilometer::api (
require => Class['ceilometer::db'],
subscribe => Exec['ceilometer-dbsync']
}
Package<| title == 'ceilometer-api' or title == 'ceilometer-common'|> ~>
Service<| title == 'ceilometer-api'|>
if !defined(Service['ceilometer-api']) {
notify{ "Module ${module_name} cannot notify service ceilometer-api\
on packages update": }
}
ceilometer_config {
'keystone_authtoken/auth_host' : value => $keystone_host;
@ -91,24 +87,8 @@ class ceilometer::api (
'keystone_authtoken/admin_tenant_name' : value => $keystone_tenant;
'keystone_authtoken/admin_user' : value => $keystone_user;
'keystone_authtoken/admin_password' : value => $keystone_password;
}
ceilometer_config {
'api/host': value => $bind_host;
'api/port': value => $bind_port;
}
# endpoint encryption
if $keystone_protocol == '___https___' {
ceilometer_config {
'ssl/cert_file': value => $::ceilometer::params::ssl_cert_file;
'ssl/key_file': value => $::ceilometer::params::ssl_key_file;
# 'ssl/ca_file': value => $::ceilometer::params::ssl_ca_file;
}
User['ceilometer'] {
groups +> ['ssl-cert']
}
'api/host' : value => $host;
'api/port' : value => $port;
}
if $keystone_auth_admin_prefix {
@ -122,4 +102,14 @@ class ceilometer::api (
}
}
if $keystone_auth_uri {
ceilometer_config {
'keystone_authtoken/auth_uri': value => $keystone_auth_uri;
}
} else {
ceilometer_config {
'keystone_authtoken/auth_uri': value => "${keystone_protocol}://${keystone_host}:5000/";
}
}
}

View File

@ -12,13 +12,8 @@ class ceilometer::collector (
Ceilometer_config<||> ~> Service['ceilometer-collector']
Package['ceilometer-collector'] -> Service['ceilometer-collector']
package { 'ceilometer-collector':
ensure => installed,
name => $::ceilometer::params::collector_package_name,
}
tweaks::ubuntu_service_override { 'ceilometer-collector' :}
Package[$::ceilometer::params::collector_package_name] -> Service['ceilometer-collector']
ensure_packages([$::ceilometer::params::collector_package_name])
if $enabled {
$service_ensure = 'running'
@ -36,11 +31,4 @@ class ceilometer::collector (
require => Class['ceilometer::db'],
subscribe => Exec['ceilometer-dbsync']
}
Package<| title == 'ceilometer-collector' or title == 'ceilometer-common'|> ~>
Service<| title == 'ceilometer-collector'|>
if !defined(Service['ceilometer-collector']) {
notify{ "Module ${module_name} cannot notify service ceilometer-collector\
on packages update": }
}
}

View File

@ -0,0 +1,31 @@
# == Class: ceilometer::config
#
# This class is used to manage arbitrary ceilometer configurations.
#
# === Parameters
#
# [*ceilometer_config*]
# (optional) Allow configuration of ceilometer.conf.
#
# The value is an hash of ceilometer_config resource. Example:
# { 'DEFAULT/foo' => { value => 'fooValue'},
# 'DEFAULT/bar' => { value => 'barValue'}
# }
#
# In yaml format, Example:
# ceilometer_config:
# DEFAULT/foo:
# value: fooValue
# DEFAULT/bar:
# value: barValue
#
# NOTE: The configuration MUST NOT be already handled by this module
# or Puppet catalog compilation will fail with duplicate resources.
#
class ceilometer::config (
$ceilometer_config = {},
) {
validate_hash($ceilometer_config)
create_resources('ceilometer_config', $ceilometer_config)
}

View File

@ -6,8 +6,18 @@
# [*database_connection*]
# the connection string. format: [driver]://[user]:[password]@[host]/[database]
#
# [*sync_db*]
# enable dbsync.
#
# [*mysql_module*]
# (optional) Mysql puppet module version to use. Tested versions
# are 0.9 and 2.2
# Defaults to '0.9
#
class ceilometer::db (
$database_connection = 'mysql://ceilometer:ceilometer@localhost/ceilometer'
$database_connection = 'mysql://ceilometer:ceilometer@localhost/ceilometer',
$sync_db = true,
$mysql_module = '0.9',
) {
include ceilometer::params
@ -15,27 +25,38 @@ class ceilometer::db (
Package<| title == 'ceilometer-common' |> -> Class['ceilometer::db']
validate_re($database_connection,
'(sqlite|mysql|posgres|mongodb):\/\/(\S+:\S+@\S+\/\S+)?')
'(sqlite|mysql|postgresql|mongodb):\/\/(\S+:\S+@\S+\/\S+)?')
case $database_connection {
/^mysql:\/\//: {
$backend_package = false
include mysql::python
if ($mysql_module >= 2.2) {
include mysql::bindings::python
} else {
include mysql::python
}
}
/^postgres:\/\//: {
$backend_package = 'python-psycopg2'
$backend_package = $::ceilometer::params::psycopg_package_name
}
/^mongodb:\/\//: {
$backend_package = 'python-pymongo'
$backend_package = $::ceilometer::params::pymongo_package_name
}
/^sqlite:\/\//: {
$backend_package = 'python-pysqlite2'
$backend_package = $::ceilometer::params::sqlite_package_name
}
default: {
fail('Unsupported backend configured')
}
}
if $sync_db {
$command = $::ceilometer::params::dbsync_command
} else {
$command = '/bin/true'
}
if $backend_package and !defined(Package[$backend_package]) {
package {'ceilometer-backend-package':
ensure => present,
@ -45,15 +66,14 @@ class ceilometer::db (
ceilometer_config {
'database/connection': value => $database_connection;
'database/max_retries': value => "-1";
}
Ceilometer_config['database/connection'] ~> Exec['ceilometer-dbsync']
exec { 'ceilometer-dbsync':
command => $::ceilometer::params::dbsync_command,
command => $command,
path => '/usr/bin',
user => $::ceilometer::params::username,
user => $::ceilometer::params::user,
refreshonly => true,
logoutput => on_failure,
subscribe => Ceilometer_config['database/connection']

View File

@ -23,6 +23,14 @@
# [*charset*]
# the database charset. Optional. Defaults to 'latin1'
#
# [*collate*]
# the database collation. Optional. Defaults to 'latin1_swedish_ci'
#
# [*mysql_module*]
# (optional) Mysql module version to use. Tested versions
# are 0.9 and 2.2
# Defaults to '0.9'
#
class ceilometer::db::mysql(
$password = false,
$dbname = 'ceilometer',
@ -30,6 +38,8 @@ class ceilometer::db::mysql(
$host = 'localhost',
$allowed_hosts = undef,
$charset = 'latin1',
$collate = 'latin1_swedish_ci',
$mysql_module = '0.9',
) {
validate_string($password)
@ -38,20 +48,38 @@ class ceilometer::db::mysql(
Class['ceilometer::db::mysql'] -> Exec<| title == 'ceilometer-dbsync' |>
Mysql::Db[$dbname] ~> Exec<| title == 'ceilometer-dbsync' |>
mysql::db { $dbname:
user => $user,
password => $password,
host => $host,
charset => $charset,
#require => Class['mysql::config'],
require => Class['mysql::server'],
if $mysql_module >= 2.2 {
mysql::db { $dbname:
user => $user,
password => $password,
host => $host,
charset => $charset,
collate => $collate,
require => Class['mysql::server'],
}
} else {
mysql::db { $dbname:
user => $user,
password => $password,
host => $host,
charset => $charset,
require => Class['mysql::config'],
}
}
if $allowed_hosts {
ceilometer::db::mysql::host_access { $allowed_hosts:
user => $user,
password => $password,
database => $dbname,
# Check allowed_hosts to avoid duplicate resource declarations
if is_array($allowed_hosts) and delete($allowed_hosts,$host) != [] {
$real_allowed_hosts = delete($allowed_hosts,$host)
} elsif is_string($allowed_hosts) and ($allowed_hosts != $host) {
$real_allowed_hosts = $allowed_hosts
}
if $real_allowed_hosts {
ceilometer::db::mysql::host_access { $real_allowed_hosts:
user => $user,
password => $password,
database => $dbname,
mysql_module => $mysql_module,
}
}
}

View File

@ -13,18 +13,35 @@
# [*database*]
# the database name
#
define ceilometer::db::mysql::host_access ($user, $password, $database) {
define ceilometer::db::mysql::host_access ($user, $password, $database, $mysql_module='0.9') {
# New types for mysql module v2.0+
if ($mysql_module >= 2.2) {
mysql_user { "${user}@${name}":
password_hash => mysql_password($password),
provider => 'mysql',
require => Mysql_database[$database],
}
database_user { "${user}@${name}":
password_hash => mysql_password($password),
provider => 'mysql',
require => Database[$database],
}
mysql_grant { "${user}@${name}/${database}":
privileges => 'all',
provider => 'mysql',
table => "${database}.*",
user => "${user}@${name}",
require => Mysql_user["${user}@${name}"]
}
database_grant { "${user}@${name}/${database}":
# TODO figure out which privileges to grant.
privileges => 'all',
provider => 'mysql',
require => Database_user["${user}@${name}"]
} else {
database_user { "${user}@${name}":
password_hash => mysql_password($password),
provider => 'mysql',
require => Database[$database],
}
database_grant { "${user}@${name}/${database}":
# TODO figure out which privileges to grant.
privileges => 'all',
provider => 'mysql',
require => Database_user["${user}@${name}"]
}
}
}

View File

@ -0,0 +1,74 @@
#
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
#
# Author: Emilien Macchi <emilien.macchi@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.
#
# == Class: ceilometer::expirer
#
# Setups Ceilometer Expirer service to enable TTL feature.
#
# === Parameters
#
# [*time_to_live*]
# (optional) Number of seconds that samples are kept in the database.
# Should be a valid integer
# Defaults to '-1' to disable TTL and keep forever the datas.
#
# [*minute*]
# (optional) Defaults to '1'.
#
# [*hour*]
# (optional) Defaults to '0'.
#
# [*monthday*]
# (optional) Defaults to '*'.
#
# [*month*]
# (optional) Defaults to '*'.
#
# [*weekday*]
# (optional) Defaults to '*'.
#
class ceilometer::expirer (
$time_to_live = '-1',
$minute = 1,
$hour = 0,
$monthday = '*',
$month = '*',
$weekday = '*',
) {
include ceilometer::params
Package<| title == 'ceilometer-common' |> -> Class['ceilometer::expirer']
ceilometer_config {
'database/time_to_live': value => $time_to_live;
}
cron { 'ceilometer-expirer':
command => $ceilometer::params::expirer_command,
environment => 'PATH=/bin:/usr/bin:/usr/sbin',
user => 'ceilometer',
minute => $minute,
hour => $hour,
monthday => $monthday,
month => $month,
weekday => $weekday
}
}

View File

@ -7,45 +7,104 @@
# secret key for signing messages. Mandatory.
# [*package_ensure*]
# ensure state for package. Optional. Defaults to 'present'
# [*verbose*]
# should the daemons log verbose messages. Optional. Defaults to false
# [*debug*]
# should the daemons log debug messages. Optional. Defaults to false
# should the daemons log debug messages. Optional. Defaults to 'False'
# [*log_dir*]
# (optional) directory to which ceilometer logs are sent.
# If set to boolean false, it will not log to any directory.
# Defaults to '/var/log/ceilometer'
# (optional) directory to which ceilometer logs are sent.
# If set to boolean false, it will not log to any directory.
# Defaults to '/var/log/ceilometer'
# [*verbose*]
# should the daemons log verbose messages. Optional. Defaults to 'False'
# [*use_syslog*]
# (optional) Use syslog for logging
# Defaults to false
# [*syslog_log_facility*]
# (optional) Syslog facility to receive log lines.
# Defaults to 'LOG_LOCAL0'
# [*amqp_hosts*]
# AMQP servers connection string. Optional. Defaults to '127.0.0.1'
# [*amqp_user*]
# user to connect to the AMQP server. Optional. Defaults to 'guest'
# [*amqp_password*]
# password to connect to the amqp_hosts. Optional. Defaults to 'rabbit_pw'.
# [*rabbit_ha_queues*]
# create mirrored queues. Optional. Defaults to false
# (optional) Use syslog for logging
# Defaults to false
# [*log_facility*]
# (optional) Syslog facility to receive log lines.
# Defaults to 'LOG_USER'
# [*rpc_backend*]
# (optional) what rpc/queuing service to use
# Defaults to impl_kombu (rabbitmq)
# [*rabbit_host*]
# ip or hostname of the rabbit server. Optional. Defaults to '127.0.0.1'
# [*rabbit_port*]
# port of the rabbit server. Optional. Defaults to 5672.
# [*rabbit_hosts*]
# array of host:port (used with HA queues). Optional. Defaults to undef.
# If defined, will remove rabbit_host & rabbit_port parameters from config
# [*rabbit_userid*]
# user to connect to the rabbit server. Optional. Defaults to 'guest'
# [*rabbit_password*]
# password to connect to the rabbit_server. Optional. Defaults to empty.
# [*rabbit_virtual_host*]
# virtualhost to use. Optional. Defaults to '/'
# [*rabbit_use_ssl*]
# (optional) Connect over SSL for RabbitMQ
# Defaults to false
# [*kombu_ssl_ca_certs*]
# (optional) SSL certification authority file (valid only if SSL enabled).
# Defaults to undef
# [*kombu_ssl_certfile*]
# (optional) SSL cert file (valid only if SSL enabled).
# Defaults to undef
# [*kombu_ssl_keyfile*]
# (optional) SSL key file (valid only if SSL enabled).
# Defaults to undef
# [*kombu_ssl_version*]
# (optional) SSL version to use (valid only if SSL enabled).
# Valid values are TLSv1, SSLv23 and SSLv3. SSLv2 may be
# available on some distributions.
# Defaults to 'SSLv3'
#
# [*qpid_hostname*]
# [*qpid_port*]
# [*qpid_username*]
# [*qpid_password*]
# [*qpid_heartbeat*]
# [*qpid_protocol*]
# [*qpid_tcp_nodelay*]
# [*qpid_reconnect*]
# [*qpid_reconnect_timeout*]
# [*qpid_reconnect_limit*]
# [*qpid_reconnect_interval*]
# [*qpid_reconnect_interval_min*]
# [*qpid_reconnect_interval_max*]
# (optional) various QPID options
#
class ceilometer(
$metering_secret = false,
$notification_topics = ['notifications'],
$package_ensure = 'present',
$verbose = false,
$debug = false,
$log_dir = '/var/log/ceilometer',
$verbose = false,
$use_syslog = false,
$syslog_log_facility = 'LOG_LOCAL0',
$queue_provider = 'rabbitmq',
$amqp_hosts = '127.0.0.1',
$amqp_user = 'guest',
$amqp_password = 'rabbit_pw',
$rabbit_ha_queues = false,
$log_facility = 'LOG_USER',
$rpc_backend = 'ceilometer.openstack.common.rpc.impl_kombu',
$rabbit_host = '127.0.0.1',
$rabbit_port = 5672,
$rabbit_hosts = undef,
$rabbit_userid = 'guest',
$rabbit_password = '',
$rabbit_virtual_host = '/',
$rabbit_use_ssl = false,
$kombu_ssl_ca_certs = undef,
$kombu_ssl_certfile = undef,
$kombu_ssl_keyfile = undef,
$kombu_ssl_version = 'SSLv3',
$qpid_hostname = 'localhost',
$qpid_port = 5672,
$qpid_username = 'guest',
$qpid_password = 'guest',
$qpid_heartbeat = 60,
$qpid_protocol = 'tcp',
$qpid_tcp_nodelay = true,
$qpid_reconnect = true,
$qpid_reconnect_timeout = 0,
$qpid_reconnect_limit = 0,
$qpid_reconnect_interval_min = 0,
$qpid_reconnect_interval_max = 0,
$qpid_reconnect_interval = 0
) {
validate_string($metering_secret)
@ -64,7 +123,6 @@ class ceilometer(
user { 'ceilometer':
name => 'ceilometer',
gid => 'ceilometer',
groups => ['nova'],
system => true,
require => Package['ceilometer-common'],
}
@ -89,42 +147,102 @@ class ceilometer(
Package['ceilometer-common'] -> Ceilometer_config<||>
# Configure RPC
case $queue_provider {
'rabbitmq': {
ceilometer_config {
'DEFAULT/rabbit_hosts': value => $amqp_hosts;
'DEFAULT/rabbit_userid': value => $amqp_user;
'DEFAULT/rabbit_password': value => $amqp_password;
'DEFAULT/rabbit_virtual_host': value => $rabbit_virtual_host;
'DEFAULT/rabbit_ha_queues': value => $rabbit_ha_queues;
'DEFAULT/kombu_reconnect_delay': value => '5.0';
'DEFAULT/rpc_backend':
value => 'ceilometer.openstack.common.rpc.impl_kombu';
if $rpc_backend == 'ceilometer.openstack.common.rpc.impl_kombu' {
if $rabbit_hosts {
ceilometer_config { 'DEFAULT/rabbit_host': ensure => absent }
ceilometer_config { 'DEFAULT/rabbit_port': ensure => absent }
ceilometer_config { 'DEFAULT/rabbit_hosts':
value => join($rabbit_hosts, ',')
}
} else {
ceilometer_config { 'DEFAULT/rabbit_host': value => $rabbit_host }
ceilometer_config { 'DEFAULT/rabbit_port': value => $rabbit_port }
ceilometer_config { 'DEFAULT/rabbit_hosts':
value => "${rabbit_host}:${rabbit_port}"
}
}
'qpid': {
ceilometer_config {
'DEFAULT/qpid_hosts': value => $amqp_hosts;
'DEFAULT/qpid_username': value => $amqp_user;
'DEFAULT/qpid_password': value => $amqp_password;
'DEFAULT/rpc_backend':
value => 'ceilometer.openstack.common.rpc.impl_qpid';
if size($rabbit_hosts) > 1 {
ceilometer_config { 'DEFAULT/rabbit_ha_queues': value => true }
} else {
ceilometer_config { 'DEFAULT/rabbit_ha_queues': value => false }
}
ceilometer_config {
'DEFAULT/rabbit_userid' : value => $rabbit_userid;
'DEFAULT/rabbit_password' : value => $rabbit_password;
'DEFAULT/rabbit_virtual_host' : value => $rabbit_virtual_host;
'DEFAULT/rabbit_use_ssl' : value => $rabbit_use_ssl;
}
if $rabbit_use_ssl {
if $kombu_ssl_ca_certs {
ceilometer_config { 'DEFAULT/kombu_ssl_ca_certs': value => $kombu_ssl_ca_certs }
} else {
ceilometer_config { 'DEFAULT/kombu_ssl_ca_certs': ensure => absent}
}
if $kombu_ssl_certfile {
ceilometer_config { 'DEFAULT/kombu_ssl_certfile': value => $kombu_ssl_certfile }
} else {
ceilometer_config { 'DEFAULT/kombu_ssl_certfile': ensure => absent}
}
if $kombu_ssl_keyfile {
ceilometer_config { 'DEFAULT/kombu_ssl_keyfile': value => $kombu_ssl_keyfile }
} else {
ceilometer_config { 'DEFAULT/kombu_ssl_keyfile': ensure => absent}
}
if $kombu_ssl_version {
ceilometer_config { 'DEFAULT/kombu_ssl_version': value => $kombu_ssl_version }
} else {
ceilometer_config { 'DEFAULT/kombu_ssl_version': ensure => absent}
}
} else {
ceilometer_config {
'DEFAULT/kombu_ssl_ca_certs': ensure => absent;
'DEFAULT/kombu_ssl_certfile': ensure => absent;
'DEFAULT/kombu_ssl_keyfile': ensure => absent;
'DEFAULT/kombu_ssl_version': ensure => absent;
}
}
}
}
if $rpc_backend == 'ceilometer.openstack.common.rpc.impl_qpid' {
ceilometer_config {
'DEFAULT/qpid_hostname' : value => $qpid_hostname;
'DEFAULT/qpid_port' : value => $qpid_port;
'DEFAULT/qpid_username' : value => $qpid_username;
'DEFAULT/qpid_password' : value => $qpid_password;
'DEFAULT/qpid_heartbeat' : value => $qpid_heartbeat;
'DEFAULT/qpid_protocol' : value => $qpid_protocol;
'DEFAULT/qpid_tcp_nodelay' : value => $qpid_tcp_nodelay;
'DEFAULT/qpid_reconnect' : value => $qpid_reconnect;
'DEFAULT/qpid_reconnect_timeout' : value => $qpid_reconnect_timeout;
'DEFAULT/qpid_reconnect_limit' : value => $qpid_reconnect_limit;
'DEFAULT/qpid_reconnect_interval_min': value => $qpid_reconnect_interval_min;
'DEFAULT/qpid_reconnect_interval_max': value => $qpid_reconnect_interval_max;
'DEFAULT/qpid_reconnect_interval' : value => $qpid_reconnect_interval;
}
}
# Once we got here, we can act as an honey badger on the rpc used.
ceilometer_config {
'publisher_rpc/metering_secret' : value => $metering_secret;
'DEFAULT/rpc_backend' : value => $rpc_backend;
'publisher/metering_secret' : value => $metering_secret;
'DEFAULT/debug' : value => $debug;
'DEFAULT/verbose' : value => $verbose;
'DEFAULT/notification_topics' : value => join($notification_topics, ',');
}
# Log configuration
# Log configuration
if $log_dir {
ceilometer_config {
'DEFAULT/log_dir' : value => $log_dir;
'DEFAULT/log_dir' : value => $log_dir;
}
} else {
ceilometer_config {
@ -135,13 +253,13 @@ class ceilometer(
# Syslog configuration
if $use_syslog {
ceilometer_config {
'DEFAULT/use_syslog': value => true;
'DEFAULT/use_syslog_rfc_format': value => true;
'DEFAULT/syslog_log_facility': value => $syslog_log_facility;
'DEFAULT/use_syslog': value => true;
'DEFAULT/syslog_log_facility': value => $log_facility;
}
} else {
ceilometer_config {
'DEFAULT/use_syslog': value => false;
'DEFAULT/use_syslog': value => false;
}
}
}

View File

@ -29,7 +29,7 @@
# Internal address for endpoint. Optional. Defaults to '127.0.0.1'.
#
# [*port*]
# Port for endpoint. Optional. Defaults to '8777'.
# Default port for enpoints. Optional. Defaults to '8777'.
#
# [*region*]
# Region for endpoint. Optional. Defaults to 'RegionOne'.
@ -37,9 +37,36 @@
# [*tenant*]
# Tenant for Ceilometer user. Optional. Defaults to 'services'.
#
# [*protocol*]
# [*public_protocol*]
# Protocol for public endpoint. Optional. Defaults to 'http'.
#
# [*admin_protocol*]
# Protocol for admin endpoint. Optional. Defaults to 'http'.
#
# [*internal_protocol*]
# Protocol for public endpoint. Optional. Defaults to 'http'.
#
# [*public_url*]
# The endpoint's public url.
# Optional. Defaults to $public_protocol://$public_address:$port
# This url should *not* contain any API version and should have
# no trailing '/'
# Setting this variable overrides other $public_* parameters.
#
# [*admin_url*]
# The endpoint's admin url.
# Optional. Defaults to $admin_protocol://$admin_address:$port
# This url should *not* contain any API version and should have
# no trailing '/'
# Setting this variable overrides other $admin_* parameters.
#
# [*internal_url*]
# The endpoint's internal url.
# Optional. Defaults to $internal_protocol://$internal_address:$port
# This url should *not* contain any API version and should have
# no trailing '/'
# Setting this variable overrides other $internal_* parameters.
#
class ceilometer::keystone::auth (
$password = false,
$email = 'ceilometer@localhost',
@ -51,17 +78,37 @@ class ceilometer::keystone::auth (
$port = '8777',
$region = 'RegionOne',
$tenant = 'services',
$api_protocol = 'http',
# $public_protocol = $api_protocol,
# $admin_protocol = $api_protocol,
# $internal_protocol = $api_protocol,
$configure_endpoint = true
$public_protocol = 'http',
$admin_protocol = 'http',
$internal_protocol = 'http',
$configure_endpoint = true,
$public_url = undef,
$admin_url = undef,
$internal_url = undef,
) {
validate_string($password)
if $public_url {
$public_url_real = $public_url
} else {
$public_url_real = "${public_protocol}://${public_address}:${port}"
}
if $admin_url {
$admin_url_real = $admin_url
} else {
$admin_url_real = "${admin_protocol}://${admin_address}:${port}"
}
if $internal_url {
$internal_url_real = $internal_url
} else {
$internal_url_real = "${internal_protocol}://${internal_address}:${port}"
}
Keystone_user_role["${auth_name}@${tenant}"] ~>
Service <| title == 'ceilometer-api' |>
Service <| name == 'ceilometer-api' |>
keystone_user { $auth_name:
ensure => present,
@ -85,16 +132,11 @@ class ceilometer::keystone::auth (
description => 'Openstack Metering Service',
}
if $configure_endpoint {
$public_protocol = $api_protocol
$admin_protocol = $api_protocol
$internal_protocol = $api_protocol
keystone_endpoint { "${auth_name}":
region => $region,
keystone_endpoint { "${region}/${auth_name}":
ensure => present,
public_url => "${public_protocol}://${public_address}:${port}",
admin_url => "${admin_protocol}://${admin_address}:${port}",
internal_url => "${internal_protocol}://${internal_address}:${port}",
public_url => $public_url_real,
admin_url => $admin_url_real,
internal_url => $internal_url_real,
}
}
}

View File

@ -2,52 +2,64 @@
#
class ceilometer::params {
$dbsync_command =
'ceilometer-dbsync --config-file=/etc/ceilometer/ceilometer.conf'
# ssl keys/certs
$ssl_cert_file = '/etc/keystone/ssl/certs/signing_cert.pem'
$ssl_key_file = '/etc/keystone/ssl/private/signing_key.pem'
$ssl_ca_file = '/etc/keystone/ssl/certs/ca.pem'
$dbsync_command = 'ceilometer-dbsync --config-file=/etc/ceilometer/ceilometer.conf'
$expirer_command = 'ceilometer-expirer'
$user = 'ceilometer'
case $::osfamily {
'RedHat': {
# package names
$agent_central_package_name = 'openstack-ceilometer-central'
$agent_compute_package_name = 'openstack-ceilometer-compute'
$api_package_name = 'openstack-ceilometer-api'
$collector_package_name = 'openstack-ceilometer-collector'
$common_package_name = 'openstack-ceilometer-common'
$client_package_name = 'python-ceilometerclient'
$alarm_package = 'openstack-ceilometer-alarm'
$agent_notification_package = 'openstack-ceilometer-notification'
$agent_central_package_name = 'openstack-ceilometer-central'
$agent_compute_package_name = 'openstack-ceilometer-compute'
$api_package_name = 'openstack-ceilometer-api'
$collector_package_name = 'openstack-ceilometer-collector'
$agent_notification_package_name = 'openstack-ceilometer-collector'
# notification agent is included in collector package:
$alarm_package_name = ['openstack-ceilometer-alarm']
$common_package_name = 'openstack-ceilometer-common'
$client_package_name = 'python-ceilometerclient'
# service names
$agent_central_service_name = 'openstack-ceilometer-central'
$agent_compute_service_name = 'openstack-ceilometer-compute'
$api_service_name = 'openstack-ceilometer-api'
$collector_service_name = 'openstack-ceilometer-collector'
$alarm_evaluator_service = 'openstack-ceilometer-alarm-evaluator'
$alarm_notifier_service = 'openstack-ceilometer-alarm-notifier'
$agent_notification_service = 'openstack-ceilometer-notification'
$agent_central_service_name = 'openstack-ceilometer-central'
$agent_compute_service_name = 'openstack-ceilometer-compute'
$api_service_name = 'openstack-ceilometer-api'
$collector_service_name = 'openstack-ceilometer-collector'
$agent_notification_service_name = 'openstack-ceilometer-agent-notification'
$alarm_notifier_service_name = 'openstack-ceilometer-alarm-notifier'
$alarm_evaluator_service_name = 'openstack-ceilometer-alarm-evaluator'
$pymongo_package_name = 'python-pymongo'
$psycopg_package_name = 'python-psycopg2'
# db packages
if $::operatingsystem == 'Fedora' and $::operatingsystemrelease >= 18 {
# fallback to stdlib version, not provided on fedora
$sqlite_package_name = undef
} else {
$sqlite_package_name = 'python-sqlite2'
}
}
'Debian': {
# package names
$agent_central_package_name = 'ceilometer-agent-central'
$agent_compute_package_name = 'ceilometer-agent-compute'
$api_package_name = 'ceilometer-api'
$collector_package_name = 'ceilometer-collector'
$common_package_name = 'ceilometer-common'
$client_package_name = 'python-ceilometerclient'
$alarm_package = ['ceilometer-alarm-notifier', 'ceilometer-alarm-evaluator']
$agent_notification_package = 'ceilometer-agent-notification'
$agent_central_package_name = 'ceilometer-agent-central'
$agent_compute_package_name = 'ceilometer-agent-compute'
$api_package_name = 'ceilometer-api'
$collector_package_name = 'ceilometer-collector'
$agent_notification_package_name = 'ceilometer-agent-notification'
$common_package_name = 'ceilometer-common'
$client_package_name = 'python-ceilometerclient'
$alarm_package_name = ['ceilometer-alarm-notifier','ceilometer-alarm-evaluator']
# service names
$agent_central_service_name = 'ceilometer-agent-central'
$agent_compute_service_name = 'ceilometer-agent-compute'
$api_service_name = 'ceilometer-api'
$collector_service_name = 'ceilometer-collector'
$alarm_evaluator_service = 'ceilometer-alarm-evaluator'
$alarm_notifier_service = 'ceilometer-alarm-notifier'
$agent_notification_service = 'ceilometer-agent-notification'
$agent_central_service_name = 'ceilometer-agent-central'
$agent_compute_service_name = 'ceilometer-agent-compute'
$collector_service_name = 'ceilometer-collector'
$api_service_name = 'ceilometer-api'
$agent_notification_service_name = 'ceilometer-agent-notification'
$alarm_notifier_service_name = 'ceilometer-alarm-notifier'
$alarm_evaluator_service_name = 'ceilometer-alarm-evaluator'
# db packages
$pymongo_package_name = 'python-pymongo'
$psycopg_package_name = 'python-psycopg2'
$sqlite_package_name = 'python-pysqlite2'
# Operating system specific
case $::operatingsystem {
'Ubuntu': {

View File

@ -0,0 +1,39 @@
require 'spec_helper'
describe 'ceilometer::agent::auth' do
let :pre_condition do
"class { 'ceilometer': metering_secret => 's3cr3t' }"
end
let :params do
{ :auth_url => 'http://localhost:5000/v2.0',
:auth_region => 'RegionOne',
:auth_user => 'ceilometer',
:auth_password => 'password',
:auth_tenant_name => 'services',
:enabled => true,
}
end
shared_examples_for 'ceilometer-agent-auth' do
it 'configures authentication' do
should contain_ceilometer_config('service_credentials/os_auth_url').with_value('http://localhost:5000/v2.0')
should contain_ceilometer_config('service_credentials/os_region_name').with_value('RegionOne')
should contain_ceilometer_config('service_credentials/os_username').with_value('ceilometer')
should contain_ceilometer_config('service_credentials/os_password').with_value('password')
should contain_ceilometer_config('service_credentials/os_tenant_name').with_value('services')
should contain_ceilometer_config('service_credentials/os_cacert').with(:ensure => 'absent')
end
context 'when overriding parameters' do
before do
params.merge!(:auth_cacert => '/tmp/dummy.pem')
end
it { should contain_ceilometer_config('service_credentials/os_cacert').with_value(params[:auth_cacert]) }
end
end
end

View File

@ -0,0 +1,68 @@
require 'spec_helper'
describe 'ceilometer::agent::central' do
let :pre_condition do
"class { 'ceilometer': metering_secret => 's3cr3t' }"
end
let :params do
{ :enabled => true }
end
shared_examples_for 'ceilometer-agent-central' do
it { should contain_class('ceilometer::params') }
it 'installs ceilometer-agent-central package' do
should contain_package('ceilometer-agent-central').with(
:ensure => 'installed',
:name => platform_params[:agent_package_name],
:before => 'Service[ceilometer-agent-central]'
)
end
it 'ensures ceilometer-common is installed before the service' do
should contain_package('ceilometer-common').with(
:before => /Service\[ceilometer-agent-central\]/
)
end
it 'configures ceilometer-agent-central service' do
should contain_service('ceilometer-agent-central').with(
:ensure => 'running',
:name => platform_params[:agent_service_name],
:enable => true,
:hasstatus => true,
:hasrestart => true
)
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :platform_params do
{ :agent_package_name => 'ceilometer-agent-central',
:agent_service_name => 'ceilometer-agent-central' }
end
it_configures 'ceilometer-agent-central'
end
context 'on RedHat platforms' do
let :facts do
{ :osfamily => 'RedHat' }
end
let :platform_params do
{ :agent_package_name => 'openstack-ceilometer-central',
:agent_service_name => 'openstack-ceilometer-central' }
end
it_configures 'ceilometer-agent-central'
end
end

View File

@ -9,18 +9,12 @@ describe 'ceilometer::agent::compute' do
end
let :params do
{ :auth_url => 'http://localhost:5000/v2.0',
:auth_region => 'RegionOne',
:auth_user => 'ceilometer',
:auth_password => 'password',
:auth_tenant_name => 'services',
:enabled => true,
}
{ :enabled => true }
end
shared_examples_for 'ceilometer-agent-compute' do
it { should include_class('ceilometer::params') }
it { should contain_class('ceilometer::params') }
it 'installs ceilometer-agent-compute package' do
should contain_package('ceilometer-agent-compute').with(
@ -30,9 +24,11 @@ describe 'ceilometer::agent::compute' do
)
end
it 'adds ceilometer user to libvirt group if required' do
it 'adds ceilometer user to nova group and, if required, to libvirt group' do
if platform_params[:libvirt_group]
should contain_user('ceilometer').with_groups(/#{platform_params[:libvirt_group]}/)
should contain_user('ceilometer').with_groups(['nova', "#{platform_params[:libvirt_group]}"])
else
should contain_user('ceilometer').with_groups('nova')
end
end
@ -52,33 +48,20 @@ describe 'ceilometer::agent::compute' do
)
end
it 'configures authentication' do
should contain_ceilometer_config('DEFAULT/os_auth_url').with_value('http://localhost:5000/v2.0')
should contain_ceilometer_config('DEFAULT/os_auth_region').with_value('RegionOne')
should contain_ceilometer_config('DEFAULT/os_username').with_value('ceilometer')
should contain_ceilometer_config('DEFAULT/os_password').with_value('password')
should contain_ceilometer_config('DEFAULT/os_tenant_name').with_value('services')
end
it 'configures instance usage audit in nova' do
should contain_nova_config('DEFAULT/instance_usage_audit').with_value('True')
should contain_nova_config('DEFAULT/instance_usage_audit_period').with_value('hour')
end
it 'configures nova notification driver' do
should contain_file_line('nova-notification-driver-common').with(
should contain_file_line_after('nova-notification-driver-common').with(
:line => 'notification_driver=nova.openstack.common.notifier.rpc_notifier',
:path => '/etc/nova/nova.conf',
:notify => 'Service[nova-compute]'
)
should contain_file_line('nova-notification-driver-ceilometer').with(
should contain_file_line_after('nova-notification-driver-ceilometer').with(
:line => 'notification_driver=ceilometer.compute.nova_notifier',
:path => '/etc/nova/nova.conf',
:notify => 'Service[nova-compute]'
)
end
end
end
context 'on Debian platforms' do
let :facts do

View File

@ -0,0 +1,85 @@
#
# Copyright (C) 2014 eNovance SAS <licensing@enovance.com>
#
# Author: Emilien Macchi <emilien.macchi@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.
#
# Unit tests for ceilometer::agent::notification
#
require 'spec_helper'
describe 'ceilometer::agent::notification' do
let :pre_condition do
"class { 'ceilometer': metering_secret => 's3cr3t' }"
end
let :params do
{ :ack_on_event_error => true,
:store_events => false }
end
shared_examples_for 'ceilometer-agent-notification' do
it { should contain_class('ceilometer::params') }
it 'installs ceilometer agent notification package' do
should contain_package(platform_params[:agent_notification_package_name])
end
it 'configures ceilometer agent notification service' do
should contain_service('ceilometer-agent-notification').with(
:ensure => 'running',
:name => platform_params[:agent_notification_service_name],
:enable => true,
:hasstatus => true,
:hasrestart => true
)
end
it 'configures notifications parameters in ceilometer.conf' do
should contain_ceilometer_config('notification/ack_on_event_error').with_value( params[:ack_on_event_error] )
should contain_ceilometer_config('notification/store_events').with_value( params[:store_events] )
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :platform_params do
{ :agent_notification_package_name => 'ceilometer-agent-notification',
:agent_notification_service_name => 'ceilometer-agent-notification' }
end
it_configures 'ceilometer-agent-notification'
end
context 'on RedHat platforms' do
let :facts do
{ :osfamily => 'RedHat' }
end
let :platform_params do
{ :agent_notification_package_name => 'openstack-ceilometer-collector',
:agent_notification_service_name => 'openstack-ceilometer-agent-notification' }
end
it_configures 'ceilometer-agent-notification'
end
end

View File

@ -0,0 +1,102 @@
require 'spec_helper'
describe 'ceilometer::alarm::evaluator' do
let :pre_condition do
"class { 'ceilometer': metering_secret => 's3cr3t' }"
end
let :params do
{ :evaluation_interval => 60,
:evaluation_service => 'ceilometer.alarm.service.SingletonAlarmService',
:partition_rpc_topic => 'alarm_partition_coordination',
:record_history => true,
:enabled => true,
}
end
shared_examples_for 'ceilometer-alarm-evaluator' do
it { should contain_class('ceilometer::params') }
it 'installs ceilometer-alarm package' do
should contain_package(platform_params[:alarm_evaluator_package_name]).with_before('Service[ceilometer-alarm-evaluator]')
should contain_package(platform_params[:alarm_evaluator_package_name]).with(
:ensure => 'present',
:name => platform_params[:alarm_evaluator_package_name]
)
end
it 'ensures ceilometer-common is installed before the service' do
should contain_package('ceilometer-common').with(
:before => /Service\[ceilometer-alarm-evaluator\]/
)
end
it 'configures ceilometer-alarm-evaluator service' do
should contain_service('ceilometer-alarm-evaluator').with(
:ensure => 'running',
:name => platform_params[:alarm_evaluator_service_name],
:enable => true,
:hasstatus => true,
:hasrestart => true
)
end
it 'configures alarm evaluator' do
should contain_ceilometer_config('alarm/evaluation_interval').with_value( params[:evaluation_interval] )
should contain_ceilometer_config('alarm/evaluation_service').with_value( params[:evaluation_service] )
should contain_ceilometer_config('alarm/partition_rpc_topic').with_value( params[:partition_rpc_topic] )
should contain_ceilometer_config('alarm/record_history').with_value( params[:record_history] )
end
context 'when overriding parameters' do
before do
params.merge!(:evaluation_interval => 80,
:partition_rpc_topic => 'alarm_partition_coordination',
:record_history => false,
:evaluation_service => 'ceilometer.alarm.service.SingletonTestAlarmService')
end
it { should contain_ceilometer_config('alarm/evaluation_interval').with_value(params[:evaluation_interval]) }
it { should contain_ceilometer_config('alarm/evaluation_service').with_value(params[:evaluation_service]) }
it { should contain_ceilometer_config('alarm/record_history').with_value(params[:record_history]) }
it { should contain_ceilometer_config('alarm/partition_rpc_topic').with_value(params[:partition_rpc_topic]) }
end
context 'when override the evaluation interval with a non numeric value' do
before do
params.merge!(:evaluation_interval => 'NaN')
end
it { expect { should contain_ceilometer_config('alarm/evaluation_interval') }.to\
raise_error(Puppet::Error, /validate_re\(\): .* does not match/) }
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :platform_params do
{ :alarm_evaluator_package_name => 'ceilometer-alarm-evaluator',
:alarm_evaluator_service_name => 'ceilometer-alarm-evaluator' }
end
it_configures 'ceilometer-alarm-evaluator'
end
context 'on RedHat platforms' do
let :facts do
{ :osfamily => 'RedHat' }
end
let :platform_params do
{ :alarm_evaluator_package_name => 'openstack-ceilometer-alarm',
:alarm_evaluator_service_name => 'openstack-ceilometer-alarm-evaluator' }
end
it_configures 'ceilometer-alarm-evaluator'
end
end

View File

@ -0,0 +1,95 @@
require 'spec_helper'
describe 'ceilometer::alarm::notifier' do
let :pre_condition do
"class { 'ceilometer': metering_secret => 's3cr3t' }"
end
let :params do
{
#:notifier_rpc_topic => 'UNSET',
#:rest_notifier_certificate_key => 'UNSET',
#:rest_notifier_certificate_file => 'UNSET',
#:rest_notifier_ssl_verify => true,
:enabled => true,
}
end
shared_examples_for 'ceilometer-alarm-notifier' do
it { should contain_class('ceilometer::params') }
it 'installs ceilometer-alarm package' do
should contain_package(platform_params[:alarm_notifier_package_name]).with_before('Service[ceilometer-alarm-notifier]')
should contain_package(platform_params[:alarm_notifier_package_name]).with(
:ensure => 'present',
:name => platform_params[:alarm_notifier_package_name]
)
end
it 'ensures ceilometer-common is installed before the service' do
should contain_package('ceilometer-common').with(
:before => /Service\[ceilometer-alarm-notifier\]/
)
end
it 'configures ceilometer-alarm-notifier service' do
should contain_service('ceilometer-alarm-notifier').with(
:ensure => 'running',
:name => platform_params[:alarm_notifier_service_name],
:enable => true,
:hasstatus => true,
:hasrestart => true
)
end
it 'configures alarm notifier' do
should_not contain_ceilometer_config('alarm/notifier_rpc_topic')
should_not contain_ceilometer_config('alarm/rest_notifier_certificate_key')
should_not contain_ceilometer_config('alarm/rest_notifier_certificate_file')
should_not contain_ceilometer_config('alarm/rest_notifier_ssl_verify')
end
context 'when overriding parameters' do
before do
params.merge!(:notifier_rpc_topic => 'alarm_notifier',
:rest_notifier_certificate_key => '0xdeadbeef',
:rest_notifier_certificate_file => '/var/file',
:rest_notifier_ssl_verify => true)
end
it { should contain_ceilometer_config('alarm/notifier_rpc_topic').with_value(params[:notifier_rpc_topic]) }
it { should contain_ceilometer_config('alarm/rest_notifier_certificate_key').with_value(params[:rest_notifier_certificate_key]) }
it { should contain_ceilometer_config('alarm/rest_notifier_certificate_file').with_value(params[:rest_notifier_certificate_file]) }
it { should contain_ceilometer_config('alarm/rest_notifier_ssl_verify').with_value(params[:rest_notifier_ssl_verify]) }
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :platform_params do
{ :alarm_notifier_package_name => 'ceilometer-alarm-notifier',
:alarm_notifier_service_name => 'ceilometer-alarm-notifier' }
end
it_configures 'ceilometer-alarm-notifier'
end
context 'on RedHat platforms' do
let :facts do
{ :osfamily => 'RedHat' }
end
let :platform_params do
{ :alarm_notifier_package_name => 'openstack-ceilometer-alarm',
:alarm_notifier_service_name => 'openstack-ceilometer-alarm-notifier' }
end
it_configures 'ceilometer-alarm-notifier'
end
end

View File

@ -13,7 +13,9 @@ describe 'ceilometer::api' do
:keystone_protocol => 'http',
:keystone_user => 'ceilometer',
:keystone_password => 'ceilometer-passw0rd',
:keystone_tenant => 'services'
:keystone_tenant => 'services',
:host => '0.0.0.0',
:port => '8777'
}
end
@ -24,7 +26,7 @@ describe 'ceilometer::api' do
it { expect { should raise_error(Puppet::Error) } }
end
it { should include_class('ceilometer::params') }
it { should contain_class('ceilometer::params') }
it 'installs ceilometer-api package' do
should contain_package('ceilometer-api').with(
@ -53,6 +55,9 @@ describe 'ceilometer::api' do
should contain_ceilometer_config('keystone_authtoken/admin_user').with_value( params[:keystone_user] )
should contain_ceilometer_config('keystone_authtoken/admin_password').with_value( params[:keystone_password] )
should contain_ceilometer_config('keystone_authtoken/auth_admin_prefix').with_ensure('absent')
should contain_ceilometer_config('keystone_authtoken/auth_uri').with_value( params[:keystone_protocol] + "://" + params[:keystone_host] + ":5000/" )
should contain_ceilometer_config('api/host').with_value( params[:host] )
should contain_ceilometer_config('api/port').with_value( params[:port] )
end
context 'when specifying keystone_auth_admin_prefix' do
@ -104,4 +109,19 @@ describe 'ceilometer::api' do
it_configures 'ceilometer-api'
end
describe 'with custom auth_uri' do
let :facts do
{ :osfamily => 'RedHat' }
end
before do
params.merge!({
:keystone_auth_uri => 'https://foo.bar:1234/',
})
end
it 'should configure custom auth_uri correctly' do
should contain_ceilometer_config('keystone_authtoken/auth_uri').with_value( 'https://foo.bar:1234/' )
end
end
end

View File

@ -4,7 +4,7 @@ describe 'ceilometer::client' do
shared_examples_for 'ceilometer client' do
it { should include_class('ceilometer::params') }
it { should contain_class('ceilometer::params') }
it 'installs ceilometer client package' do
should contain_package('python-ceilometerclient').with(

View File

@ -8,13 +8,10 @@ describe 'ceilometer::collector' do
shared_examples_for 'ceilometer-collector' do
it { should include_class('ceilometer::params') }
it { should contain_class('ceilometer::params') }
it 'installs ceilometer-collector package' do
should contain_package('ceilometer-collector').with(
:ensure => 'installed',
:name => platform_params[:collector_package_name]
)
should contain_package(platform_params[:collector_package_name])
end
it 'configures ceilometer-collector service' do

View File

@ -0,0 +1,29 @@
require 'spec_helper'
describe 'ceilometer::config' do
let :params do
{ :ceilometer_config => {
'api/host' => { 'value' => '0.0.0.0'},
'api/port' => { 'value' => '8777'},
},
}
end
it 'with [api] options ceilometer_config ' do
should contain_ceilometer_config('api/host').with_value('0.0.0.0')
should contain_ceilometer_config('api/port').with_value('8777')
end
describe 'with [rpc_notifier2] options ceilometer_config' do
before do
params.merge!({
:ceilometer_config => { 'rpc_notifier2/topics' => { 'value' => 'notifications'},},
})
end
it 'should configure rpc_notifier2 topics correctly' do
should contain_ceilometer_config('rpc_notifier2/topics').with_value('notifications')
end
end
end

View File

@ -7,11 +7,13 @@ describe 'ceilometer::db::mysql' do
end
let :params do
{ :password => 's3cr3t',
:dbname => 'ceilometer',
:user => 'ceilometer',
:host => 'localhost',
:charset => 'latin1'
{ :password => 's3cr3t',
:dbname => 'ceilometer',
:user => 'ceilometer',
:host => 'localhost',
:charset => 'latin1',
:collate => 'latin1_swedish_ci',
:mysql_module => '0.9',
}
end
@ -48,4 +50,63 @@ describe 'ceilometer::db::mysql' do
it_configures 'ceilometer mysql database'
end
describe "overriding allowed_hosts param to array" do
let :facts do
{ :osfamily => "Debian" }
end
let :params do
{
:password => 'ceilometerpass',
:allowed_hosts => ['localhost','%']
}
end
it {should_not contain_ceilometer__db__mysql__host_access("localhost").with(
:user => 'ceilometer',
:password => 'ceilometerpass',
:database => 'ceilometer'
)}
it {should contain_ceilometer__db__mysql__host_access("%").with(
:user => 'ceilometer',
:password => 'ceilometerpass',
:database => 'ceilometer'
)}
end
describe "overriding allowed_hosts param to string" do
let :facts do
{ :osfamily => 'RedHat' }
end
let :params do
{
:password => 'ceilometerpass2',
:allowed_hosts => '192.168.1.1'
}
end
it {should contain_ceilometer__db__mysql__host_access("192.168.1.1").with(
:user => 'ceilometer',
:password => 'ceilometerpass2',
:database => 'ceilometer'
)}
end
describe "overriding allowed_hosts param equals to host param " do
let :facts do
{ :osfamily => 'RedHat' }
end
let :params do
{
:password => 'ceilometerpass2',
:allowed_hosts => 'localhost'
}
end
it {should_not contain_ceilometer__db__mysql__host_access("localhost").with(
:user => 'ceilometer',
:password => 'ceilometerpass2',
:database => 'ceilometer'
)}
end
end

View File

@ -0,0 +1,168 @@
require 'spec_helper'
describe 'ceilometer::db' do
# debian has "python-pymongo"
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :params do
{ :database_connection => 'mongodb://localhost:1234/ceilometer',
:sync_db => true }
end
it { should contain_class('ceilometer::params') }
it 'installs python-mongodb package' do
should contain_package('ceilometer-backend-package').with(
:ensure => 'present',
:name => 'python-pymongo')
should contain_ceilometer_config('database/connection').with_value('mongodb://localhost:1234/ceilometer')
end
it 'runs ceilometer-dbsync' do
should contain_exec('ceilometer-dbsync').with(
:command => 'ceilometer-dbsync --config-file=/etc/ceilometer/ceilometer.conf',
:path => '/usr/bin',
:refreshonly => 'true',
:user => 'ceilometer',
:logoutput => 'on_failure'
)
end
end
# Fedora > 18 has python-pymongo too
context 'on Redhat platforms' do
let :facts do
{ :osfamily => 'Redhat',
:operatingsystem => 'Fedora',
:operatingsystemrelease => 18
}
end
let :params do
{ :database_connection => 'mongodb://localhost:1234/ceilometer',
:sync_db => false }
end
it { should contain_class('ceilometer::params') }
it 'installs pymongo package' do
should contain_package('ceilometer-backend-package').with(
:ensure => 'present',
:name => 'python-pymongo')
should contain_ceilometer_config('database/connection').with_value('mongodb://localhost:1234/ceilometer')
end
it 'runs ceilometer-dbsync' do
should contain_exec('ceilometer-dbsync').with(
:command => '/bin/true',
:path => '/usr/bin',
:refreshonly => 'true',
:user => 'ceilometer',
:logoutput => 'on_failure'
)
end
end
# RHEL has python-pymongo too
context 'on Redhat platforms' do
let :facts do
{ :osfamily => 'Redhat',
:operatingsystem => 'CentOS',
:operatingsystemrelease => 6.4
}
end
let :params do
{ :database_connection => 'mongodb://localhost:1234/ceilometer',
:sync_db => true }
end
it { should contain_class('ceilometer::params') }
it 'installs pymongo package' do
should contain_package('ceilometer-backend-package').with(
:ensure => 'present',
:name => 'python-pymongo')
end
it 'runs ceilometer-dbsync' do
should contain_exec('ceilometer-dbsync').with(
:command => 'ceilometer-dbsync --config-file=/etc/ceilometer/ceilometer.conf',
:path => '/usr/bin',
:refreshonly => 'true',
:user => 'ceilometer',
:logoutput => 'on_failure'
)
end
end
# RHEL has python-sqlite2
context 'on Redhat platforms' do
let :facts do
{ :osfamily => 'Redhat',
:operatingsystem => 'CentOS',
:operatingsystemrelease => 6.4
}
end
let :params do
{ :database_connection => 'sqlite:///var/lib/ceilometer.db',
:sync_db => false }
end
it { should contain_class('ceilometer::params') }
it 'installs pymongo package' do
should contain_package('ceilometer-backend-package').with(
:ensure => 'present',
:name => 'python-sqlite2')
should contain_ceilometer_config('database/connection').with_value('sqlite:///var/lib/ceilometer.db')
end
it 'runs ceilometer-dbsync' do
should contain_exec('ceilometer-dbsync').with(
:command => '/bin/true',
:path => '/usr/bin',
:refreshonly => 'true',
:user => 'ceilometer',
:logoutput => 'on_failure'
)
end
end
# debian has "python-pysqlite2"
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :params do
{ :database_connection => 'sqlite:///var/lib/ceilometer.db',
:sync_db => true }
end
it { should contain_class('ceilometer::params') }
it 'installs python-mongodb package' do
should contain_package('ceilometer-backend-package').with(
:ensure => 'present',
:name => 'python-pysqlite2')
end
it 'runs ceilometer-dbsync' do
should contain_exec('ceilometer-dbsync').with(
:command => 'ceilometer-dbsync --config-file=/etc/ceilometer/ceilometer.conf',
:path => '/usr/bin',
:refreshonly => 'true',
:user => 'ceilometer',
:logoutput => 'on_failure'
)
end
end
end

View File

@ -0,0 +1,87 @@
#
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
#
# Author: Emilien Macchi <emilien.macchi@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.
#
# Unit tests for ceilometer::expirer
#
require 'spec_helper'
describe 'ceilometer::expirer' do
let :pre_condition do
"class { 'ceilometer': metering_secret => 's3cr3t' }"
end
let :params do
{ :time_to_live => '-1' }
end
shared_examples_for 'ceilometer-expirer' do
it { should contain_class('ceilometer::params') }
it 'installs ceilometer common package' do
should contain_package('ceilometer-common').with(
:ensure => 'present',
:name => platform_params[:common_package_name]
)
end
it 'configures a cron' do
should contain_cron('ceilometer-expirer').with(
:command => 'ceilometer-expirer',
:environment => 'PATH=/bin:/usr/bin:/usr/sbin',
:user => 'ceilometer',
:minute => 1,
:hour => 0,
:monthday => '*',
:month => '*',
:weekday => '*'
)
end
it 'configures database section in ceilometer.conf' do
should contain_ceilometer_config('database/time_to_live').with_value( params[:time_to_live] )
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }
end
let :platform_params do
{ :common_package_name => 'ceilometer-common' }
end
it_configures 'ceilometer-expirer'
end
context 'on RedHat platforms' do
let :facts do
{ :osfamily => 'RedHat' }
end
let :platform_params do
{ :common_package_name => 'openstack-ceilometer-common' }
end
it_configures 'ceilometer-expirer'
end
end

View File

@ -6,41 +6,68 @@ describe 'ceilometer' do
{
:metering_secret => 'metering-s3cr3t',
:package_ensure => 'present',
:verbose => false,
:debug => false,
:debug => 'False',
:log_dir => '/var/log/ceilometer',
:verbose => 'False',
}
end
let :rabbit_params do
{
:rabbit_host => '127.0.0.1',
:rabbit_port => 5672,
:rabbit_userid => 'guest',
:rabbit_password => '',
:rabbit_virtualhost => '/',
:rabbit_virtual_host => '/',
}
end
let :qpid_params do
{
:rpc_backend => "ceilometer.openstack.common.rpc.impl_qpid",
:qpid_hostname => 'localhost',
:qpid_port => 5672,
:qpid_username => 'guest',
:qpid_password => 'guest',
}
end
shared_examples_for 'ceilometer' do
context 'with rabbit_host parameter' do
before { params.merge!( rabbit_params ) }
it_configures 'a ceilometer base installation'
it_configures 'rabbit with SSL support'
it_configures 'rabbit without HA support (with backward compatibility)'
end
context 'with rabbit_hosts parameter' do
context 'with one server' do
before { params.merge!( :rabbit_hosts => ['127.0.0.1:5672'] ) }
before { params.merge!( rabbit_params ).merge!( :rabbit_hosts => ['127.0.0.1:5672'] ) }
it_configures 'a ceilometer base installation'
it_configures 'rabbit with SSL support'
it_configures 'rabbit without HA support (without backward compatibility)'
end
context 'with multiple servers' do
before { params.merge!( :rabbit_hosts => ['rabbit1:5672', 'rabbit2:5672'] ) }
before { params.merge!( rabbit_params ).merge!( :rabbit_hosts => ['rabbit1:5672', 'rabbit2:5672'] ) }
it_configures 'a ceilometer base installation'
it_configures 'rabbit with SSL support'
it_configures 'rabbit with HA support'
end
end
context 'with qpid' do
before {params.merge!( qpid_params ) }
it_configures 'a ceilometer base installation'
it_configures 'qpid support'
end
end
shared_examples_for 'a ceilometer base installation' do
it { should include_class('ceilometer::params') }
it { should contain_class('ceilometer::params') }
it 'configures ceilometer group' do
should contain_group('ceilometer').with(
@ -53,7 +80,6 @@ describe 'ceilometer' do
should contain_user('ceilometer').with(
:name => 'ceilometer',
:gid => 'ceilometer',
:groups => ['nova'],
:system => true,
:require => 'Package[ceilometer-common]'
)
@ -86,7 +112,7 @@ describe 'ceilometer' do
end
it 'configures required metering_secret' do
should contain_ceilometer_config('DEFAULT/metering_secret').with_value('metering-s3cr3t')
should contain_ceilometer_config('publisher/metering_secret').with_value('metering-s3cr3t')
end
context 'without the required metering_secret' do
@ -94,27 +120,63 @@ describe 'ceilometer' do
it { expect { should raise_error(Puppet::Error) } }
end
it 'configures rabbit' do
should contain_ceilometer_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] )
should contain_ceilometer_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] )
should contain_ceilometer_config('DEFAULT/rabbit_virtualhost').with_value( params[:rabbit_virtualhost] )
end
it 'configures debug and verbose' do
it 'configures debug and verbosity' do
should contain_ceilometer_config('DEFAULT/debug').with_value( params[:debug] )
should contain_ceilometer_config('DEFAULT/verbose').with_value( params[:verbose] )
end
it 'fixes a bad value in ceilometer (glance_control_exchange)' do
should contain_ceilometer_config('DEFAULT/glance_control_exchange').with_value('glance')
it 'configures logging directory by default' do
should contain_ceilometer_config('DEFAULT/log_dir').with_value( params[:log_dir] )
end
it 'adds glance-notifications topic' do
should contain_ceilometer_config('DEFAULT/notification_topics').with_value('notifications,glance_notifications')
context 'with logging directory disabled' do
before { params.merge!( :log_dir => false) }
it { should contain_ceilometer_config('DEFAULT/log_dir').with_ensure('absent') }
end
it 'configures notification_topics' do
should contain_ceilometer_config('DEFAULT/notification_topics').with_value('notifications')
end
it 'configures syslog to be disabled by default' do
should contain_ceilometer_config('DEFAULT/use_syslog').with_value('false')
end
context 'with syslog enabled' do
before { params.merge!( :use_syslog => 'true' ) }
it { should contain_ceilometer_config('DEFAULT/use_syslog').with_value('true') }
it { should contain_ceilometer_config('DEFAULT/syslog_log_facility').with_value('LOG_USER') }
end
context 'with syslog enabled and custom settings' do
before { params.merge!(
:use_syslog => 'true',
:log_facility => 'LOG_LOCAL0'
) }
it { should contain_ceilometer_config('DEFAULT/use_syslog').with_value('true') }
it { should contain_ceilometer_config('DEFAULT/syslog_log_facility').with_value('LOG_LOCAL0') }
end
context 'with overriden notification_topics parameter' do
before { params.merge!( :notification_topics => ['notifications', 'custom']) }
it 'configures notification_topics' do
should contain_ceilometer_config('DEFAULT/notification_topics').with_value('notifications,custom')
end
end
end
shared_examples_for 'rabbit without HA support (with backward compatibility)' do
it 'configures rabbit' do
should contain_ceilometer_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] )
should contain_ceilometer_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] )
should contain_ceilometer_config('DEFAULT/rabbit_virtual_host').with_value( params[:rabbit_virtual_host] )
end
it { should contain_ceilometer_config('DEFAULT/rabbit_host').with_value( params[:rabbit_host] ) }
it { should contain_ceilometer_config('DEFAULT/rabbit_port').with_value( params[:rabbit_port] ) }
it { should contain_ceilometer_config('DEFAULT/rabbit_hosts').with_value( "#{params[:rabbit_host]}:#{params[:rabbit_port]}" ) }
@ -122,6 +184,13 @@ describe 'ceilometer' do
end
shared_examples_for 'rabbit without HA support (without backward compatibility)' do
it 'configures rabbit' do
should contain_ceilometer_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] )
should contain_ceilometer_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] )
should contain_ceilometer_config('DEFAULT/rabbit_virtual_host').with_value( params[:rabbit_virtual_host] )
end
it { should contain_ceilometer_config('DEFAULT/rabbit_host').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/rabbit_port').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/rabbit_hosts').with_value( params[:rabbit_hosts].join(',') ) }
@ -129,12 +198,85 @@ describe 'ceilometer' do
end
shared_examples_for 'rabbit with HA support' do
it 'configures rabbit' do
should contain_ceilometer_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] )
should contain_ceilometer_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] )
should contain_ceilometer_config('DEFAULT/rabbit_virtual_host').with_value( params[:rabbit_virtual_host] )
end
it { should contain_ceilometer_config('DEFAULT/rabbit_host').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/rabbit_port').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/rabbit_hosts').with_value( params[:rabbit_hosts].join(',') ) }
it { should contain_ceilometer_config('DEFAULT/rabbit_ha_queues').with_value('true') }
end
shared_examples_for 'rabbit with SSL support' do
context "with default parameters" do
it { should contain_ceilometer_config('DEFAULT/rabbit_use_ssl').with_value('false') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_ca_certs').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_certfile').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_keyfile').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_version').with_ensure('absent') }
end
context "with SSL enabled" do
before { params.merge!( :rabbit_use_ssl => 'true' ) }
it { should contain_ceilometer_config('DEFAULT/rabbit_use_ssl').with_value('true') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_ca_certs').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_certfile').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_keyfile').with_ensure('absent') }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_version').with_value('SSLv3') }
context "with ca_certs" do
before { params.merge!( :kombu_ssl_ca_certs => '/path/to/ca.crt' ) }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_ca_certs').with_value('/path/to/ca.crt') }
end
context "with certfile" do
before { params.merge!( :kombu_ssl_certfile => '/path/to/cert.crt' ) }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_certfile').with_value('/path/to/cert.crt') }
end
context "with keyfile" do
before { params.merge!( :kombu_ssl_keyfile => '/path/to/cert.key' ) }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_keyfile').with_value('/path/to/cert.key') }
end
context "with version" do
before { params.merge!( :kombu_ssl_version => 'TLSv1' ) }
it { should contain_ceilometer_config('DEFAULT/kombu_ssl_version').with_value('TLSv1') }
end
end
end
shared_examples_for 'qpid support' do
context("with default parameters") do
it { should contain_ceilometer_config('DEFAULT/qpid_reconnect').with_value(true) }
it { should contain_ceilometer_config('DEFAULT/qpid_reconnect_timeout').with_value('0') }
it { should contain_ceilometer_config('DEFAULT/qpid_reconnect_limit').with_value('0') }
it { should contain_ceilometer_config('DEFAULT/qpid_reconnect_interval_min').with_value('0') }
it { should contain_ceilometer_config('DEFAULT/qpid_reconnect_interval_max').with_value('0') }
it { should contain_ceilometer_config('DEFAULT/qpid_reconnect_interval').with_value('0') }
it { should contain_ceilometer_config('DEFAULT/qpid_heartbeat').with_value('60') }
it { should contain_ceilometer_config('DEFAULT/qpid_protocol').with_value('tcp') }
it { should contain_ceilometer_config('DEFAULT/qpid_tcp_nodelay').with_value(true) }
end
context("with mandatory parameters set") do
it { should contain_ceilometer_config('DEFAULT/rpc_backend').with_value('ceilometer.openstack.common.rpc.impl_qpid') }
it { should contain_ceilometer_config('DEFAULT/qpid_hostname').with_value( params[:qpid_hostname] ) }
it { should contain_ceilometer_config('DEFAULT/qpid_port').with_value( params[:qpid_port] ) }
it { should contain_ceilometer_config('DEFAULT/qpid_username').with_value( params[:qpid_username]) }
it { should contain_ceilometer_config('DEFAULT/qpid_password').with_value(params[:qpid_password]) }
end
context("failing if the rpc_backend is not present") do
before { params.delete( :rpc_backend) }
it { expect { should raise_error(Puppet::Error) } }
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian' }

View File

@ -2,9 +2,8 @@ require 'spec_helper'
describe 'ceilometer::keystone::auth' do
let :params do
let :default_params do
{
:password => 'ceilometer-passw0rd',
:email => 'ceilometer@localhost',
:auth_name => 'ceilometer',
:configure_endpoint => true,
@ -15,49 +14,137 @@ describe 'ceilometer::keystone::auth' do
:port => '8777',
:region => 'RegionOne',
:tenant => 'services',
:public_protocol => 'http'
:public_protocol => 'http',
:admin_protocol => 'http',
:internal_protocol => 'http'
}
end
shared_examples_for 'ceilometer keystone auth' do
context 'without the required password parameter' do
before { params.delete(:password) }
it { expect { should raise_error(Puppet::Error) } }
end
it 'configures ceilometer user' do
should contain_keystone_user( params[:auth_name] ).with(
:ensure => 'present',
:password => params[:password],
:email => params[:email],
:tenant => params[:tenant]
)
let :params do
{ :password => 'ceil0met3r-passZord' }
end
it 'configures ceilometer user roles' do
should contain_keystone_user_role("#{params[:auth_name]}@#{params[:tenant]}").with(
:ensure => 'present',
:roles => ['admin','ResellerAdmin']
)
context 'with the required parameters' do
it 'configures ceilometer user' do
should contain_keystone_user( default_params[:auth_name] ).with(
:ensure => 'present',
:password => params[:password],
:email => default_params[:email],
:tenant => default_params[:tenant]
)
end
it 'configures ceilometer user roles' do
should contain_keystone_user_role("#{default_params[:auth_name]}@#{default_params[:tenant]}").with(
:ensure => 'present',
:roles => ['admin','ResellerAdmin']
)
end
it 'configures ceilometer service' do
should contain_keystone_service( default_params[:auth_name] ).with(
:ensure => 'present',
:type => default_params[:service_type],
:description => 'Openstack Metering Service'
)
end
it 'configure ceilometer endpoints' do
should contain_keystone_endpoint("#{default_params[:region]}/#{default_params[:auth_name]}").with(
:ensure => 'present',
:public_url => "#{default_params[:public_protocol]}://#{default_params[:public_address]}:#{default_params[:port]}",
:admin_url => "#{default_params[:admin_protocol]}://#{default_params[:admin_address]}:#{default_params[:port]}",
:internal_url => "#{default_params[:internal_protocol]}://#{default_params[:internal_address]}:#{default_params[:port]}"
)
end
end
it 'configures ceilometer service' do
should contain_keystone_service( params[:auth_name] ).with(
:ensure => 'present',
:type => params[:service_type],
:description => 'Openstack Metering Service'
)
context 'with overriden parameters' do
before do
params.merge!({
:email => 'mighty-ceilometer@remotehost',
:auth_name => 'mighty-ceilometer',
:service_type => 'cloud-measuring',
:public_address => '10.0.0.1',
:admin_address => '10.0.0.2',
:internal_address => '10.0.0.3',
:port => '65001',
:region => 'RegionFortyTwo',
:tenant => 'mighty-services',
:public_protocol => 'https',
:admin_protocol => 'ftp',
:internal_protocol => 'gopher'
})
end
it 'configures ceilometer user' do
should contain_keystone_user( params[:auth_name] ).with(
:ensure => 'present',
:password => params[:password],
:email => params[:email],
:tenant => params[:tenant]
)
end
it 'configures ceilometer user roles' do
should contain_keystone_user_role("#{params[:auth_name]}@#{params[:tenant]}").with(
:ensure => 'present',
:roles => ['admin','ResellerAdmin']
)
end
it 'configures ceilometer service' do
should contain_keystone_service( params[:auth_name] ).with(
:ensure => 'present',
:type => params[:service_type],
:description => 'Openstack Metering Service'
)
end
it 'configure ceilometer endpoints' do
should contain_keystone_endpoint("#{params[:region]}/#{params[:auth_name]}").with(
:ensure => 'present',
:public_url => "#{params[:public_protocol]}://#{params[:public_address]}:#{params[:port]}",
:admin_url => "#{params[:admin_protocol]}://#{params[:admin_address]}:#{params[:port]}",
:internal_url => "#{params[:internal_protocol]}://#{params[:internal_address]}:#{params[:port]}"
)
end
context 'with overriden full uri' do
before do
params.merge!({
:public_url => 'https://public.host:443/ceilometer_pub',
:admin_url => 'https://admin.host/ceilometer_adm',
:internal_url => 'http://internal.host:80/ceilometer_int',
})
end
it 'configure ceilometer endpoints' do
should contain_keystone_endpoint("#{params[:region]}/#{params[:auth_name]}").with(
:ensure => 'present',
:public_url => params[:public_url],
:admin_url => params[:admin_url],
:internal_url => params[:internal_url]
)
end
end
context 'with configure_endpoint = false' do
before do
params.delete!(:configure_endpoint)
it 'does not configure ceilometer endpoints' do
should_not contain_keystone_endpoint("#{params[:region]}/#{params[:auth_name]}")
end
end
end
end
it 'configure ceilometer endpoints' do
should contain_keystone_endpoint("#{params[:region]}/#{params[:auth_name]}").with(
:ensure => 'present',
:public_url => "#{params[:public_protocol]}://#{params[:public_address]}:#{params[:port]}",
:admin_url => "http://#{params[:admin_address]}:#{params[:port]}",
:internal_url => "http://#{params[:internal_address]}:#{params[:port]}"
)
end
end