Add support for configuring common component

This patch updates cloudkitty class and related spec test to
add support for installing and configuring Cloudkitty common
component.

Change-Id: Ia561fd6b0d44514dd5dd1b97ed71db7921a6ca75
This commit is contained in:
Xingchao Yu
2016-11-28 19:02:17 +08:00
parent e4b0613bfd
commit bc38be1f6a
2 changed files with 561 additions and 4 deletions

View File

@@ -1,14 +1,359 @@
# == Class: cloudkitty
#
# Full description of class cloudkitty here.
# Cloudkitty base package & configuration
#
# === Parameters
#
# [*sample_parameter*]
# Explanation of what this parameter affects and what it defaults to.
# [*ensure_package*]
# (Optional) Ensure state for package.
# Defaults to 'present'
#
class cloudkitty {
# [*rpc_backend*]
# (Optional) Use these options to configure the message system.
# Defaults to $::os_service_default.
#
# [*rpc_response_timeout*]
# (Optional) Configure the timeout (in seconds) for rpc responses
# Defaults to $::os_service_default.
#
# [*rabbit_ha_queues*]
# (optional) Use HA queues in RabbitMQ (x-ha-policy: all).
# Defaults to $::os_service_default.
#
# [*rabbit_heartbeat_timeout_threshold*]
# (optional) Number of seconds after which the RabbitMQ broker is considered
# down if the heartbeat keepalive fails. Any value >0 enables heartbeats.
# Heartbeating helps to ensure the TCP connection to RabbitMQ isn't silently
# closed, resulting in missed or lost messages from the queue.
# (Requires kombu >= 3.0.7 and amqp >= 1.4.0)
# Defaults to $::os_service_default
#
# [*rabbit_heartbeat_rate*]
# (optional) How often during the rabbit_heartbeat_timeout_threshold period to
# check the heartbeat on RabbitMQ connection. (i.e. rabbit_heartbeat_rate=2
# when rabbit_heartbeat_timeout_threshold=60, the heartbeat will be checked
# every 30 seconds.
# Defaults to $::os_service_default.
#
# [*rabbit_use_ssl*]
# (Optional) Connect over SSL for RabbitMQ.
# Defaults to $::os_service_default.
#
# [*kombu_ssl_ca_certs*]
# (Optional) SSL certification authority file (valid only if SSL enabled).
# Defaults to $::os_service_default.
#
# [*kombu_ssl_certfile*]
# (Optional) SSL cert file (valid only if SSL enabled).
# Defaults to $::os_service_default.
#
# [*kombu_ssl_keyfile*]
# (Optional) SSL key file (valid only if SSL enabled).
# Defaults to $::os_service_default.
#
# [*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 $::os_service_default.
#
# [*kombu_reconnect_delay*]
# (Optional) How long to wait before reconnecting in response
# to an AMQP consumer cancel notification. (floating point value)
# Defaults to $::os_service_default
#
# [*kombu_failover_strategy*]
# (Optional) Determines how the next RabbitMQ node is chosen in case the one
# we are currently connected to becomes unavailable. Takes effect only if
# more than one RabbitMQ node is provided in config. (string value)
# Defaults to $::os_service_default
#
# [*kombu_compression*]
# (optional) Possible values are: gzip, bz2. If not set compression will not
# be used. This option may notbe available in future versions. EXPERIMENTAL.
# (string value)
# Defaults to $::os_service_default
#
# [*amqp_durable_queues*]
# (Optional) Use durable queues in amqp.
# Defaults to $::os_service_default.
#
# [*amqp_server_request_prefix*]
# (Optional) Address prefix used when sending to a specific server
# Defaults to $::os_service_default.
#
# [*amqp_broadcast_prefix*]
# (Optional) address prefix used when broadcasting to all servers
# Defaults to $::os_service_default.
#
# [*amqp_group_request_prefix*]
# (Optional) address prefix when sending to any server in group
# Defaults to $::os_service_default.
#
# [*amqp_container_name*]
# (Optional) Name for the AMQP container
# Defaults to $::os_service_default.
#
# [*amqp_idle_timeout*]
# (Optional) Timeout for inactive connections
# Defaults to $::os_service_default.
#
# [*amqp_trace*]
# (Optional) Debug: dump AMQP frames to stdout
# Defaults to $::os_service_default.
#
# [*amqp_ssl_ca_file*]
# (Optional) CA certificate PEM file to verify server certificate
# Defaults to $::os_service_default.
#
# [*amqp_ssl_cert_file*]
# (Optional) Identifying certificate PEM file to present to clients
# Defaults to $::os_service_default.
#
# [*amqp_ssl_key_file*]
# (Optional) Private key PEM file used to sign cert_file certificate
# Defaults to $::os_service_default.
#
# [*amqp_ssl_key_password*]
# (Optional) Password for decrypting ssl_key_file (if encrypted)
# Defaults to $::os_service_default.
#
# [*amqp_allow_insecure_clients*]
# (Optional) Accept clients using either SSL or plain TCP
# Defaults to $::os_service_default.
#
# [*amqp_sasl_mechanisms*]
# (Optional) Space separated list of acceptable SASL mechanisms
# Defaults to $::os_service_default.
#
# [*amqp_sasl_config_dir*]
# (Optional) Path to directory that contains the SASL configuration
# Defaults to $::os_service_default.
#
# [*amqp_sasl_config_name*]
# (Optional) Name of configuration file (without .conf suffix)
# Defaults to $::os_service_default.
#
# [*amqp_username*]
# (Optional) User name for message broker authentication
# Defaults to $::os_service_default.
#
# [*amqp_password*]
# (Optional) Password for message broker authentication
# Defaults to $::os_service_default.
#
# [*default_transport_url*]
# (optional) A URL representing the messaging driver to use for notifications
# and its full configuration. Transport URLs take the form:
# transport://user:pass@host1:port[,hostN:portN]/virtual_host
# Defaults to $::os_service_default
#
# [*notification_transport_url*]
# (optional) A URL representing the messaging driver to use for notifications
# and its full configuration. Transport URLs take the form:
# transport://user:pass@host1:port[,hostN:portN]/virtual_host
# Defaults to $::os_service_default
#
# [*notification_driver*]
# (Optional) Driver or drivers to handle sending notifications.
# Value can be a string or a list.
# Defaults to $::os_service_default
#
# [*notification_topics*]
# (optional) AMQP topic used for OpenStack notifications
# Defaults to ::os_service_default
#
# [*flavor*]
# (optional) Specifies the Authentication method.
# Set to 'standalone' to get cloudkitty to work with a remote OpenStack
# Tested versions include 0.9 and 2.2
# Defaults to $::os_service_default.
#
# [*region_name*]
# (Optional) Region name for services. This is the
# default region name that cloudkitty talks to service endpoints on.
# Defaults to $::os_service_default.
#
# [*enable_proxy_headers_parsing*]
# (Optional) Enable paste middleware to handle SSL requests through
# HTTPProxyToWSGI middleware.
# Defaults to $::os_service_default.
#
# [*purge_config*]
# (optional) Whether to set only the specified config options
# in the cloudkitty config.
# Defaults to false.
#
# [*auth_strategy*]
# (Optional) Type of authentication to use
# Defaults to 'keystone'.
#
# [*api_paste_config*]
# (Optional) Configuration file for WSGI definition of API.
# Defaults to $::os_service_default.
#
# [*host*]
# (Optional) Name of this node. This can be an opaque identifier.
# Defaults to $::os_service_default.
#
# [*state_backend*]
# (Optional) Backend for the state manager.
# Defaults to $::os_service_default.
#
# [*state_basepath*]
# (Optional) Storage directory for the file state backend.
# Defaults to $::os_service_default.
#
# [*output_backend*]
# (Optional) Backend for the output manager.
# Defaults to $::os_service_default.
#
# [*output_basepath*]
# (Optional) Storage directory for the file output backend.
# Defaults to $::os_service_default.
#
# [*pipeline*]
# (Optional) Output pipeline
# Defaults to $::os_service_default.
#
# [*storage_backend*]
# (Optional) Name of the storage backend driver.
# Defaults to $::os_service_default.
#
# [*tenant_fetcher_backend*]
# (Optional) Driver used to fetch tenant list.
# Defaults to $::os_service_default.
#
class cloudkitty(
$ensure_package = 'present',
$rpc_backend = $::os_service_default,
$rabbit_use_ssl = $::os_service_default,
$rabbit_heartbeat_timeout_threshold = $::os_service_default,
$rabbit_heartbeat_rate = $::os_service_default,
$rabbit_ha_queues = $::os_service_default,
$kombu_ssl_ca_certs = $::os_service_default,
$kombu_ssl_certfile = $::os_service_default,
$kombu_ssl_keyfile = $::os_service_default,
$kombu_ssl_version = $::os_service_default,
$kombu_reconnect_delay = $::os_service_default,
$kombu_failover_strategy = $::os_service_default,
$kombu_compression = $::os_service_default,
$amqp_durable_queues = $::os_service_default,
$amqp_server_request_prefix = $::os_service_default,
$amqp_broadcast_prefix = $::os_service_default,
$amqp_group_request_prefix = $::os_service_default,
$amqp_container_name = $::os_service_default,
$amqp_idle_timeout = $::os_service_default,
$amqp_trace = $::os_service_default,
$amqp_ssl_ca_file = $::os_service_default,
$amqp_ssl_cert_file = $::os_service_default,
$amqp_ssl_key_file = $::os_service_default,
$amqp_ssl_key_password = $::os_service_default,
$amqp_allow_insecure_clients = $::os_service_default,
$amqp_sasl_mechanisms = $::os_service_default,
$amqp_sasl_config_dir = $::os_service_default,
$amqp_sasl_config_name = $::os_service_default,
$amqp_username = $::os_service_default,
$amqp_password = $::os_service_default,
$notification_driver = $::os_service_default,
$notification_topics = $::os_service_default,
$default_transport_url = $::os_service_default,
$notification_transport_url = $::os_service_default,
$purge_config = false,
$auth_strategy = 'keystone',
$api_paste_config = $::os_service_default,
$host = $::os_service_default,
$state_backend = $::os_service_default,
$state_basepath = $::os_service_default,
$output_backend = $::os_service_default,
$output_basepath = $::os_service_default,
$pipeline = $::os_service_default,
$storage_backend = $::os_service_default,
$tenant_fetcher_backend = $::os_service_default,
) {
include ::cloudkitty::params
include ::cloudkitty::logging
include ::cloudkitty::db
include ::cloudkitty::deps
include ::cloudkitty::storage
package { 'cloudkitty-common':
ensure => $ensure_package,
name => $::cloudkitty::params::common_package_name,
tag => ['openstack','cloudkitty-package'],
}
resources { 'cloudkitty_config':
purge => $purge_config,
}
if $rpc_backend == 'rabbit' or is_service_default($rpc_backend) {
oslo::messaging::rabbit { 'cloudkitty_config':
rabbit_ha_queues => $rabbit_ha_queues,
rabbit_use_ssl => $rabbit_use_ssl,
amqp_durable_queues => $amqp_durable_queues,
heartbeat_timeout_threshold => $rabbit_heartbeat_timeout_threshold,
heartbeat_rate => $rabbit_heartbeat_rate,
kombu_ssl_version => $kombu_ssl_version,
kombu_ssl_keyfile => $kombu_ssl_keyfile,
kombu_ssl_certfile => $kombu_ssl_certfile,
kombu_ssl_ca_certs => $kombu_ssl_ca_certs,
kombu_reconnect_delay => $kombu_reconnect_delay,
kombu_failover_strategy => $kombu_failover_strategy,
kombu_compression => $kombu_compression,
}
}
elsif $rpc_backend == 'amqp' {
oslo::messaging::amqp { 'cloudkitty_config':
server_request_prefix => $amqp_server_request_prefix,
broadcast_prefix => $amqp_broadcast_prefix,
group_request_prefix => $amqp_group_request_prefix,
container_name => $amqp_container_name,
idle_timeout => $amqp_idle_timeout,
trace => $amqp_trace,
ssl_ca_file => $amqp_ssl_ca_file,
ssl_cert_file => $amqp_ssl_cert_file,
ssl_key_file => $amqp_ssl_key_file,
ssl_key_password => $amqp_ssl_key_password,
allow_insecure_clients => $amqp_allow_insecure_clients,
sasl_mechanisms => $amqp_sasl_mechanisms,
sasl_config_dir => $amqp_sasl_config_dir,
sasl_config_name => $amqp_sasl_config_name,
username => $amqp_username,
password => $amqp_password,
}
}
oslo::messaging::default { 'cloudkitty_config':
transport_url => $default_transport_url,
}
oslo::messaging::notifications { 'cloudkitty_config':
transport_url => $notification_transport_url,
driver => $notification_driver,
topics => $notification_topics,
}
cloudkitty_config {
'DEFAULT/api_paste_config': value => $api_paste_config;
'DEFAULT/auth_strategy': value => $auth_strategy;
'DEFAULT/host': value => $host;
}
cloudkitty_config {
'state/backend': value => $state_backend;
'state/basepath': value => $state_basepath;
}
cloudkitty_config {
'output/backend': value => $output_backend;
'output/basepath': value => $output_basepath;
'output/pipeline': value => $pipeline;
}
cloudkitty_config {
'storage/backend': value => $storage_backend;
'tenant_fetcher/backend': value => $tenant_fetcher_backend;
}
}

View File

@@ -0,0 +1,212 @@
require 'spec_helper'
describe 'cloudkitty' do
shared_examples 'cloudkitty' do
context 'with default parameters' do
it 'contains related class' do
is_expected.to contain_class('cloudkitty::params')
is_expected.to contain_class('cloudkitty::logging')
is_expected.to contain_class('cloudkitty::deps')
is_expected.to contain_class('cloudkitty::db')
is_expected.to contain_class('cloudkitty::storage')
end
it 'installs packages' do
is_expected.to contain_package('cloudkitty-common').with(
:name => platform_params[:cloudkitty_common_package],
:ensure => 'present',
:tag => ['openstack', 'cloudkitty-package']
)
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('DEFAULT/transport_url').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/heartbeat_timeout_threshold').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/heartbeat_rate').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_compression').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_notifications/transport_url').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_notifications/driver').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('storage/backend').with_value('<SERVICE DEFAULT>')
end
it 'passes purge to resource' do
is_expected.to contain_resources('cloudkitty_config').with({
:purge => false
})
end
end
context 'with overridden parameters' do
let :params do
{
:rpc_backend => 'rabbit',
:rabbit_ha_queues => 'undef',
:rabbit_heartbeat_timeout_threshold => '60',
:rabbit_heartbeat_rate => '10',
:kombu_compression => 'gzip',
:ensure_package => '2012.1.1-15.el6',
:notification_topics => 'openstack',
:default_transport_url => 'rabbit://rabbit_user:password@localhost:5673',
:storage_backend => 'gnocchi',
}
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('DEFAULT/rpc_backend').with_value('rabbit')
is_expected.to contain_cloudkitty_config('DEFAULT/transport_url').with_value('rabbit://rabbit_user:password@localhost:5673')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/heartbeat_timeout_threshold').with_value('60')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/heartbeat_rate').with_value('10')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_compression').with_value('gzip')
end
it 'configures various things' do
is_expected.to contain_cloudkitty_config('oslo_messaging_notifications/topics').with_value('openstack')
is_expected.to contain_cloudkitty_config('storage/backend').with_value('gnocchi')
end
end
context 'with kombu_reconnect_delay set to 5.0' do
let :params do
{ :kombu_reconnect_delay => '5.0' }
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_reconnect_delay').with_value('5.0')
end
end
context 'with rabbit_ha_queues set to true' do
let :params do
{ :rabbit_ha_queues => 'true' }
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value(true)
end
end
context 'with amqp_durable_queues parameter' do
let :params do
{ :amqp_durable_queues => 'true' }
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/rabbit_use_ssl').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/amqp_durable_queues').with_value(true)
end
end
context 'with rabbit ssl enabled with kombu' do
let :params do
{ :rabbit_use_ssl => true,
:kombu_ssl_ca_certs => '/etc/ca.cert',
:kombu_ssl_certfile => '/etc/certfile',
:kombu_ssl_keyfile => '/etc/key',
:kombu_ssl_version => 'TLSv1', }
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/rabbit_use_ssl').with_value(true)
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_ca_certs').with_value('/etc/ca.cert')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_certfile').with_value('/etc/certfile')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_keyfile').with_value('/etc/key')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_version').with_value('TLSv1')
end
end
context 'with rabbit ssl enabled without kombu' do
let :params do
{ :rabbit_use_ssl => true, }
end
it 'configures rabbit' do
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/rabbit_use_ssl').with_value(true)
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_ca_certs').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_certfile').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_keyfile').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_rabbit/kombu_ssl_version').with_value('<SERVICE DEFAULT>')
end
end
context 'with amqp rpc_backend' do
let :params do
{ :rpc_backend => 'amqp' }
end
context 'with default parameters' do
it 'configures amqp' do
is_expected.to contain_cloudkitty_config('DEFAULT/rpc_backend').with_value('amqp')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/server_request_prefix').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/broadcast_prefix').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/group_request_prefix').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/container_name').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/idle_timeout').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/trace').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_ca_file').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_cert_file').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_key_file').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_key_password').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/allow_insecure_clients').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/sasl_mechanisms').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/sasl_config_dir').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/sasl_config_name').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/username').with_value('<SERVICE DEFAULT>')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/password').with_value('<SERVICE DEFAULT>')
end
end
end
context 'with overriden amqp parameters' do
let :params do
{ :rpc_backend => 'amqp',
:amqp_idle_timeout => '60',
:amqp_trace => true,
:amqp_ssl_ca_file => '/etc/ca.cert',
:amqp_ssl_cert_file => '/etc/certfile',
:amqp_ssl_key_file => '/etc/key',
:amqp_username => 'amqp_user',
:amqp_password => 'password',
}
end
it 'configures amqp' do
is_expected.to contain_cloudkitty_config('DEFAULT/rpc_backend').with_value('amqp')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/idle_timeout').with_value('60')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/trace').with_value('true')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_ca_file').with_value('/etc/ca.cert')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_cert_file').with_value('/etc/certfile')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/ssl_key_file').with_value('/etc/key')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/username').with_value('amqp_user')
is_expected.to contain_cloudkitty_config('oslo_messaging_amqp/password').with_value('password')
end
end
end
on_supported_os({
:supported_os => OSDefaults.get_supported_os
}).each do |os,facts|
context "on #{os}" do
let (:facts) do
facts.merge!(OSDefaults.get_facts())
end
let(:platform_params) do
case facts[:osfamily]
when 'Debian'
{ :cloudkitty_common_package => 'cloudkitty-common' }
when 'RedHat'
{ :cloudkitty_common_package => 'openstack-cloudkitty-common' }
end
end
it_behaves_like 'cloudkitty'
end
end
end