Trove Fuel Plugin update for OpenStack Fuel 8.0 release.

Implements: blueprint fuel-plugin-for-trove-liberty

Change-Id: Iddc7c6c867e10459d6aa9185528aedac29ae73b6
This commit is contained in:
Shaik Apsar 2016-07-11 20:28:09 +00:00
parent c0aace5e4a
commit 1324103e27
99 changed files with 3598 additions and 1489 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
.tox
.build
*.pyc
docs/build
fuel-plugin-dbaas-trove-*.rpm
repositories/ubuntu/*.deb

8
components.yaml Normal file
View File

@ -0,0 +1,8 @@
- name: additional_service:fuel-plugin-dbaas-trove
compatible: []
requires: []
incompatible: []
label: "Install Trove"
description: |
Trove provides scalable and reliable cloud Database as a Service provisioning
functionality for both relational and non-relational database engines.

View File

@ -1,50 +0,0 @@
notice('MODULAR: trove/cluster.pp')
if !(hiera('role') in ['trove']) {
fail('The node role is not in trove roles')
}
$network_scheme = hiera_hash('network_scheme', {})
$network_metadata = hiera_hash('network_metadata', {})
prepare_network_config($network_scheme)
$trove_node = get_nodes_hash_by_roles($network_metadata, ['trove'])
$corosync_nodes = corosync_nodes($trove_node, 'trove/api')
$network_ip = get_network_role_property('trove/api', 'ipaddr')
class { 'cluster':
internal_address => $network_ip,
corosync_nodes => $corosync_nodes,
}
pcmk_nodes { 'pacemaker' :
nodes => $corosync_nodes,
add_pacemaker_nodes => false,
}
Service <| title == 'corosync' |> {
subscribe => File['/etc/corosync/service.d'],
require => File['/etc/corosync/corosync.conf'],
}
Service['corosync'] -> Pcmk_nodes<||>
Pcmk_nodes<||> -> Service<| provider == 'pacemaker' |>
# Sometimes during first start pacemaker can not connect to corosync
# via IPC due to pacemaker and corosync processes are run under different users
if($::operatingsystem == 'Ubuntu') {
$pacemaker_run_uid = 'hacluster'
$pacemaker_run_gid = 'haclient'
file {'/etc/corosync/uidgid.d/pacemaker':
content =>"uidgid {
uid: ${pacemaker_run_uid}
gid: ${pacemaker_run_gid}
}"
}
File['/etc/corosync/corosync.conf'] -> File['/etc/corosync/uidgid.d/pacemaker'] -> Service <| title == 'corosync' |>
}

View File

@ -1,53 +0,0 @@
notice('MODULAR: trove/db.pp')
$node_name = hiera('node_name')
$trove_hash = hiera_hash('fuel-plugin-dbaas-trove', {})
$trove_enabled = pick($trove_hash['metadata']['enabled'], false)
$mysql_hash = hiera_hash('mysql_hash', {})
$management_vip = hiera('management_vip', undef)
$database_vip = hiera('database_vip')
$mysql_root_user = pick($mysql_hash['root_user'], 'root')
$mysql_db_create = pick($mysql_hash['db_create'], true)
$mysql_root_password = $mysql_hash['root_password']
$db_user = pick($trove_hash['metadata']['db_user'], 'trove')
$db_name = pick($trove_hash['metadata']['db_name'], 'trove')
$db_password = pick($trove_hash['metadata']['db_password'], $mysql_root_password)
$db_host = pick($trove_hash['metadata']['db_host'], $database_vip, 'localhost')
$db_create = pick($trove_hash['metadata']['db_create'], $mysql_db_create)
$db_root_user = pick($trove_hash['metadata']['root_user'], $mysql_root_user)
$db_root_password = pick($trove_hash['metadata']['root_password'], $mysql_root_password)
$allowed_hosts = [ $node_name, 'localhost', '127.0.0.1', '%' ]
if $trove_enabled and $db_create {
class { 'galera::client':
custom_setup_class => hiera('mysql_custom_setup_class', 'galera'),
}
class { 'trove::db::mysql':
user => $db_user,
password => $db_password,
dbname => $db_name,
allowed_hosts => $allowed_hosts,
}
class { 'osnailyfacter::mysql_access':
db_host => $db_host,
db_user => $db_root_user,
db_password => $db_root_password,
}
Class['galera::client'] ->
Class['osnailyfacter::mysql_access'] ->
Class['trove::db::mysql']
}
class mysql::config {}
include mysql::config
class mysql::server {}
include mysql::server

View File

@ -1,48 +0,0 @@
notice('MODULAR: trove/haproxy.pp')
$network_metadata = hiera_hash('network_metadata')
$trove_hash = hiera_hash('fuel-plugin-dbaas-trove', {})
# enabled by default
$use_trove = pick($trove_hash['metadata']['enabled'], true)
$public_ssl_hash = hiera('public_ssl')
$troves_address_map = get_node_to_ipaddr_map_by_network_role(get_nodes_hash_by_roles($network_metadata, ['trove']), 'trove/api')
if ($use_trove) {
$server_names = hiera_array('trove_names', keys($troves_address_map))
$ipaddresses = hiera_array('trove_ipaddresses', values($troves_address_map))
$public_virtual_ip = hiera('public_vip')
$internal_virtual_ip = hiera('management_vip')
# configure trove ha proxy
Openstack::Ha::Haproxy_service {
internal_virtual_ip => $internal_virtual_ip,
ipaddresses => $ipaddresses,
public_virtual_ip => $public_virtual_ip,
server_names => $server_names,
public_ssl => $public_ssl_hash['services'],
}
openstack::ha::haproxy_service { 'trove-api':
order => '210',
listen_port => 8779,
internal => true,
public => true,
}
openstack::ha::haproxy_service { 'trove-rabbitmq':
order => '211',
listen_port => 55671,
define_backups => true,
internal => true,
public => true,
haproxy_config_options => {
'option' => ['tcpka'],
'timeout client' => '48h',
'timeout server' => '48h',
'balance' => 'roundrobin',
'mode' => 'tcp'
},
balancermember_options => 'check inter 5000 rise 2 fall 3',
}
}

View File

@ -1,44 +0,0 @@
notice('MODULAR: trove/keystone.pp')
$trove_hash = hiera_hash('fuel-plugin-dbaas-trove', {})
$public_ssl_hash = hiera('public_ssl')
$public_vip = hiera('public_vip')
$public_address = $public_ssl_hash['services'] ? {
true => $public_ssl_hash['hostname'],
default => $public_vip,
}
$public_protocol = $public_ssl_hash['services'] ? {
true => 'https',
default => 'http',
}
$admin_protocol = 'http'
$admin_address = hiera('management_vip')
$region = pick($trove_hash['metadata']['region'], hiera('region', 'RegionOne'))
$password = pick($trove_hash['metadata']['user_password'], 'password')
$auth_name = pick($trove_hash['metadata']['auth_name'], 'trove')
$configure_endpoint = pick($trove_hash['metadata']['configure_endpoint'], true)
$configure_user = pick($trove_hash['metadata']['configure_user'], true)
$configure_user_role = pick($trove_hash['metadata']['configure_user_role'], true)
$service_name = pick($trove_hash['metadata']['service_name'], 'trove')
$tenant = pick($trove_hash['metadata']['tenant'], 'services')
$port = '8779'
$public_url = "${public_protocol}://${public_address}:${port}/v1.0/%(tenant_id)s"
$admin_url = "${admin_protocol}://${admin_address}:${port}/v1.0/%(tenant_id)s"
validate_string($public_address)
validate_string($password)
class { 'trove::keystone::auth':
password => $password,
auth_name => $auth_name,
configure_endpoint => $configure_endpoint,
service_name => $service_name,
public_url => $public_url,
internal_url => $admin_url,
admin_url => $admin_url,
region => $region,
tenant => $tenant,
}

View File

@ -1,147 +0,0 @@
notice('MODULAR: trove/rabbitmq.pp')
$network_scheme = hiera_hash('network_scheme', {})
prepare_network_config($network_scheme)
$queue_provider = hiera('queue_provider', 'rabbitmq')
if $queue_provider == 'rabbitmq' {
$trove_hash = hiera_hash('fuel-plugin-dbaas-trove', {})
$erlang_cookie = hiera('erlang_cookie', 'EOKOWXQREETZSHFNTPEY')
$version = hiera('rabbit_version', '3.3.5')
$debug = hiera('debug', false)
$deployment_mode = hiera('deployment_mode', 'ha_compact')
$amqp_port = pick($trove_hash['rabbit_port'], '55671')
$rabbit_hash = hiera_hash('rabbit_hash', {})
$enabled = pick($rabbit_hash['enabled'], true)
$use_pacemaker = pick($rabbit_hash['pacemaker'], true)
case $::osfamily {
'RedHat': {
$command_timeout = "'-s KILL'"
$package_provider = 'yum'
}
'Debian': {
$command_timeout = "'--signal=KILL'"
$package_provider = 'apt'
}
default: {
fail("Unsupported osfamily: ${::osfamily} operatingsystem: ${::operatingsystem},\
module ${module_name} only support osfamily RedHat and Debian")
}
}
if ($debug) {
# FIXME(aschultz): debug wasn't introduced until v3.5.0, when we upgrade
# we should change info to debug. Also don't forget to fix tests!
$rabbit_levels = '[{connection,info}]'
} else {
$rabbit_levels = '[{connection,info}]'
}
$cluster_partition_handling = hiera('rabbit_cluster_partition_handling', 'autoheal')
$mnesia_table_loading_timeout = hiera('mnesia_table_loading_timeout', '10000')
$rabbitmq_bind_ip_address = pick(get_network_role_property('trove/api', 'ipaddr'), 'UNSET')
# NOTE(bogdando) not a hash. Keep an indentation as is
$rabbit_tcp_listen_options = hiera('rabbit_tcp_listen_options',
'[
binary,
{packet, raw},
{reuseaddr, true},
{backlog, 128},
{nodelay, true},
{exit_on_close, false},
{keepalive, true}
]'
)
$config_kernel_variables = hiera('rabbit_config_kernel_variables',
{
'inet_dist_listen_min' => '41055',
'inet_dist_listen_max' => '41055',
'inet_default_connect_options' => '[{nodelay,true}]',
'net_ticktime' => '10',
}
)
$config_variables = hiera('rabbit_config_variables',
{
'log_levels' => $rabbit_levels,
'default_vhost' => "<<\"/\">>",
'default_permissions' => '[<<".*">>, <<".*">>, <<".*">>]',
'tcp_listen_options' => $rabbit_tcp_listen_options,
'cluster_partition_handling' => $cluster_partition_handling,
'mnesia_table_loading_timeout' => $mnesia_table_loading_timeout,
}
)
$thread_pool_calc = min(100,max(12*$physicalprocessorcount,30))
if $deployment_mode == 'ha_compact' {
$rabbit_pid_file = '/var/run/rabbitmq/p_pid'
} else {
$rabbit_pid_file = '/var/run/rabbitmq/pid'
}
$environment_variables = hiera('rabbit_environment_variables',
{
'SERVER_ERL_ARGS' => "\"+K true +A${thread_pool_calc} +P 1048576\"",
'PID_FILE' => $rabbit_pid_file,
}
)
if ($enabled) {
class { '::rabbitmq':
admin_enable => true,
repos_ensure => false,
package_provider => $package_provider,
package_source => undef,
service_ensure => 'running',
service_manage => true,
port => $amqp_port,
delete_guest_user => true,
default_user => 'trove',
default_pass => $trove_hash['metadata']['rabbit_password'],
# NOTE(bogdando) set to true and uncomment the lines below, if puppet should create a cluster
# We don't want it as far as OCF script creates the cluster
config_cluster => false,
#erlang_cookie => $erlang_cookie,
#wipe_db_on_cookie_change => true,
#cluster_nodes => $rabbitmq_cluster_nodes,
#cluster_node_type => 'disc',
#cluster_partition_handling => $cluster_partition_handling,
version => $version,
node_ip_address => $rabbitmq_bind_ip_address,
config_kernel_variables => $config_kernel_variables,
config_variables => $config_variables,
environment_variables => $environment_variables,
}
if ($use_pacemaker) {
# Install rabbit-fence daemon
class { 'cluster::rabbitmq_fence':
enabled => $enabled,
require => Class['::rabbitmq']
}
}
class { 'trove::rabbitmq':
enabled => $enabled,
# Do not install rabbitmq from trove classes
rabbitmq_class => false,
userid => $trove_hash['metadata']['rabbit_user'],
password => $trove_hash['metadata']['rabbit_password'],
require => Class['::rabbitmq'],
}
if ($use_pacemaker) {
class { 'pacemaker_wrappers::rabbitmq':
command_timeout => $command_timeout,
debug => $debug,
erlang_cookie => $erlang_cookie,
admin_user => $trove_hash['metadata']['rabbit_user'],
admin_pass => $trove_hash['metadata']['rabbit_password'],
before => Class['trove::rabbitmq'],
}
}
}
}

View File

@ -1,92 +0,0 @@
notice('MODULAR: trove/trove.pp')
prepare_network_config(hiera('network_scheme', {}))
$trove_hash = hiera_hash('fuel-plugin-dbaas-trove', {})
$nova_hash = hiera_hash('nova_hash', {})
$neutron_config = hiera_hash('neutron_config', {})
$node_role = hiera('node_role')
$public_ip = hiera('public_vip')
$database_ip = hiera('database_vip')
$management_ip = hiera('management_vip')
$region = hiera('region', 'RegionOne')
$service_endpoint = hiera('service_endpoint')
$debug = hiera('debug', false)
$verbose = hiera('verbose', true)
$use_syslog = hiera('use_syslog', true)
$use_stderr = hiera('use_stderr', false)
$rabbit_ha_queues = hiera('rabbit_ha_queues')
$amqp_port = hiera('amqp_port')
$amqp_hosts = hiera('amqp_hosts')
$public_ssl = hiera_hash('public_ssl', {})
#################################################################
if $trove_hash['metadata']['enabled'] {
$public_protocol = pick($public_ssl['services'], false) ? {
true => 'https',
default => 'http',
}
$public_address = pick($public_ssl['services'], false) ? {
true => pick($public_ssl['hostname']),
default => $public_ip,
}
$firewall_rule = '210 trove-api'
$api_bind_port = '8779'
$api_bind_host = get_network_role_property('trove/api', 'ipaddr')
$trove_user = pick($trove_hash['metadata']['user'], 'trove')
$tenant = pick($trove_hash['metadata']['tenant'], 'services')
$internal_url = "http://${api_bind_host}:${api_bind_port}"
$db_user = pick($trove_hash['metadata']['db_user'], 'trove')
$db_name = pick($trove_hash['metadata']['db_name'], 'trove')
$db_password = pick($trove_hash['metadata']['db_password'], 's3cr3t')
$db_host = pick($trove_hash['metadata']['db_host'], $database_ip)
$read_timeout = '60'
$sql_connection = "mysql://${db_user}:${db_password}@${db_host}/${db_name}?read_timeout=${read_timeout}"
class { '::trove::client': }
class { '::trove':
database_connection => $sql_connection,
rabbit_host => $management_ip,
rabbit_password => $trove_hash['metadata']['rabbit_password'],
rabbit_port => '55671',
rabbit_userid => $trove_hash['metadata']['rabbit_user'],
rabbit_use_ssl => false,
nova_proxy_admin_pass => $nova_hash['user_password'],
nova_proxy_admin_user => 'nova',
nova_proxy_admin_tenant_name => pick($nova_hash['tenant_name'], 'services'),
}
class { '::trove::api':
debug => true,
verbose => true,
bind_host => $api_bind_host,
auth_url => "http://${service_endpoint}:5000/v2.0/",
keystone_password => $trove_hash['metadata']['user_password'],
}
class { '::trove::conductor':
debug => true,
verbose => true,
auth_url => "http://${service_endpoint}:5000/v2.0/",
}
class { '::trove::taskmanager':
debug => true,
verbose => true,
auth_url => "http://${service_endpoint}:5000/v2.0/",
}
firewall { $firewall_rule :
dport => $api_bind_port,
proto => 'tcp',
action => 'accept',
}
}

View File

@ -0,0 +1,71 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::db
class dbaas_trove::db {
notice('MODULAR: dbaas_trove/db')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
if ($trove_enabled) {
$mysql_hash = hiera_hash('mysql', {})
$management_vip = hiera('management_vip', undef)
$database_vip = hiera('database_vip', undef)
$mysql_root_user = pick($mysql_hash['root_user'], 'root')
$mysql_db_create = pick($mysql_hash['db_create'], true)
$mysql_root_password = $mysql_hash['root_password']
$db_user = pick($trove['db_user'], 'trove')
$db_name = pick($trove['db_name'], 'trove')
$db_password = $trove['db_password']
$db_host = pick($trove['metadata']['db_host'], $database_vip)
$db_create = pick($trove['metadata']['db_create'], $mysql_db_create)
$db_root_user = pick($trove['metadata']['root_user'], $mysql_root_user)
$db_root_password = pick($trove['metadata']['root_password'], $mysql_root_password)
$allowed_hosts = [ 'localhost', '127.0.0.1', '%' ]
if $db_create {
class { '::galera::client':
custom_setup_class => hiera('mysql_custom_setup_class', 'galera'),
}
class { '::trove::db::mysql':
user => $db_user,
password => $db_password,
dbname => $db_name,
allowed_hosts => $allowed_hosts,
}
class { '::osnailyfacter::mysql_access':
db_host => $db_host,
db_user => $db_root_user,
db_password => $db_root_password,
}
Class['::galera::client'] ->
Class['::osnailyfacter::mysql_access'] ->
Class['::trove::db::mysql']
}
}
}

View File

@ -0,0 +1,107 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::firewall
class dbaas_trove::firewall {
notice('MODULAR: dbaas_trove/firewall.pp')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
if ($trove_enabled) {
$network_scheme = hiera_hash('network_scheme')
$trove_amqp_port = hiera('amqp_port')
$trove_api_port = hiera('trove_api_port')
$corosync_input_port = 5404
$corosync_output_port = 5405
$erlang_epmd_port = 4369
$erlang_inet_dist_port = 41055
$erlang_rabbitmq_backend_port = $trove_amqp_port
$erlang_rabbitmq_port = $trove_amqp_port
$pcsd_port = 2224
$trove_networks = get_routable_networks_for_network_role($network_scheme, 'trove/api')
$corosync_networks = $trove_networks
openstack::firewall::multi_net {'210 trove-api':
port => $trove_api_port,
proto => 'tcp',
action => 'accept',
source_nets => $trove_networks,
}
openstack::firewall::multi_net {'106 rabbitmq':
port => [$erlang_epmd_port, $erlang_rabbitmq_port, $erlang_rabbitmq_backend_port, $erlang_inet_dist_port],
proto => 'tcp',
action => 'accept',
source_nets => $trove_networks,
}
# Workaround for fuel bug with firewall
firewall {'003 remote rabbitmq ':
sport => [$erlang_epmd_port, $erlang_rabbitmq_port, $erlang_rabbitmq_backend_port, $erlang_inet_dist_port, 55672, 61613],
source => hiera('master_ip'),
proto => 'tcp',
action => 'accept',
}
# allow local rabbitmq admin traffic for LP#1383258
firewall {'005 local rabbitmq admin':
sport => [ 15672 ],
iniface => 'lo',
proto => 'tcp',
action => 'accept',
}
# reject all non-local rabbitmq admin traffic for LP#1450443
firewall {'006 reject non-local rabbitmq admin':
sport => [ 15672 ],
proto => 'tcp',
action => 'drop',
}
# allow connections from haproxy namespace
firewall {'030 allow connections from haproxy namespace':
source => '240.0.0.2',
action => 'accept',
}
openstack::firewall::multi_net {'113 corosync-input':
port => $corosync_input_port,
proto => 'udp',
action => 'accept',
source_nets => $corosync_networks,
}
openstack::firewall::multi_net {'114 corosync-output':
port => $corosync_output_port,
proto => 'udp',
action => 'accept',
source_nets => $corosync_networks,
}
openstack::firewall::multi_net {'115 pcsd-server':
port => $pcsd_port,
proto => 'tcp',
action => 'accept',
source_nets => $corosync_networks,
}
}
}

View File

@ -0,0 +1,103 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::hiera_override
class dbaas_trove::hiera_override {
notice('MODULAR: dbaas_trove/hiera_override.pp')
$plugin_name = 'fuel-plugin-dbaas-trove'
$trove = hiera_hash($plugin_name, undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
$hiera_dir = '/etc/hiera/override'
if ($trove_enabled) {
$plugin_yaml = "${plugin_name}.yaml"
$network_metadata = hiera_hash('network_metadata')
if empty($network_metadata) {
fail('Network_metadata not given in the astute.yaml')
}
$trove_roles = [ 'primary-trove', 'trove' ]
$trove_nodes = get_nodes_hash_by_roles($network_metadata, $trove_roles)
$trove_address_map = get_node_to_ipaddr_map_by_network_role(
$trove_nodes,
'trove/api'
)
$trove_nodes_ips = values($trove_address_map)
$trove_nodes_names = keys($trove_address_map)
$corosync_roles = $trove_roles
$corosync_nodes = $trove_nodes
$amqp_port = hiera('amqp_port', '5673')
$trove_amqp_port = hiera($trove['rabbit_port'], '55671')
$rabbit_username = $trove['rabbit_user']
$rabbit_password = $trove['rabbit_password']
$trove_api_port = hiera($trove['trove_api_port'], 8779)
$trove_amqp_hosts = inline_template("<%= @trove_nodes_ips.map {|x| x + ':' + @trove_amqp_port}.join ',' %>")
}
$calculated_content = inline_template('<%
require "yaml"
data = {
"trove_amqp_hosts" => @trove_amqp_hosts,
"amqp_port" => @trove_amqp_port ,
"infra_amqp_port" => @amqp_port,
"trove_api_port" => @trove_api_port,
"rabbit_hash" => {
"user" => @rabbit_username ,
"password" => @rabbit_password ,
} ,
}
#data["trove_nodes"] = @trove_nodes if @trove_nodes
data["corosync_nodes"] = @corosync_nodes if @corosync_nodes
data["corosync_roles"] = @corosync_roles if @corosync_roles
-%>
<%= YAML.dump(data) %>')
file { $hiera_dir :
ensure => 'directory',
path => $hiera_dir,
} ->
file { "${hiera_dir}/${plugin_yaml}" :
ensure => 'present',
content => $calculated_content,
}
package {'ruby-deep-merge':
ensure => 'installed',
}
# hiera file changes between 7.0 and 8.0 so we need to handle the override the
# different yaml formats via these exec hacks. It should be noted that the
# fuel hiera task will wipe out these this update to the hiera.yaml
exec { "${plugin_name}_hiera_override_7.0":
command => "sed -i '/ - override\\/plugins/a\\ - override\\/${plugin_name}' /etc/hiera.yaml",
path => '/bin:/usr/bin',
unless => "grep -q '^ - override/${plugin_name}' /etc/hiera.yaml",
onlyif => 'grep -q "^ - override/plugins" /etc/hiera.yaml'
}
exec { "${plugin_name}_hiera_override_8.0":
command => "sed -i '/ - override\\/plugins/a\\ - override\\/${plugin_name}' /etc/hiera.yaml",
path => '/bin:/usr/bin',
unless => "grep -q '^ - override/${plugin_name}' /etc/hiera.yaml",
onlyif => 'grep -q "^ - override/plugins" /etc/hiera.yaml'
}
}

View File

@ -0,0 +1,74 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::keystone
class dbaas_trove::keystone {
notice('MODULAR: dbaas_trove/keystone')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
if ($trove_enabled) {
$management_vip = hiera('management_vip')
$public_ssl_hash = hiera_hash('public_ssl', {})
$ssl_hash = hiera_hash('use_ssl', {})
$public_vip = hiera('public_vip')
$public_protocol = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'protocol', 'http')
$public_address = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'hostname', [$public_vip])
$internal_protocol = get_ssl_property($ssl_hash, {}, 'trove', 'internal', 'protocol', 'http')
$internal_address = get_ssl_property($ssl_hash, {}, 'trove', 'internal', 'hostname', [$management_vip])
$admin_protocol = get_ssl_property($ssl_hash, {}, 'trove', 'admin', 'protocol', 'http')
$admin_address = get_ssl_property($ssl_hash, {}, 'trove', 'admin', 'hostname', [$management_vip])
$region = pick($trove['region'], hiera('region', 'RegionOne'))
$password = $trove['auth_password']
$auth_name = pick($trove['auth_name'], 'trove')
$configure_endpoint = pick($trove['configure_endpoint'], true)
$service_name = pick($trove['service_name'], 'trove')
$tenant = pick($trove['tenant'], 'services')
validate_string($public_address)
validate_string($password)
$bind_port = '8779'
$public_url = "${public_protocol}://${public_address}:${bind_port}/v1.0/%(tenant_id)s"
$internal_url = "${internal_protocol}://${internal_address}:${bind_port}/v1.0/%(tenant_id)s"
$admin_url = "${admin_protocol}://${admin_address}:${bind_port}/v1.0/%(tenant_id)s"
Class['::osnailyfacter::wait_for_keystone_backends'] -> Class['::trove::keystone::auth']
class {'::osnailyfacter::wait_for_keystone_backends': }
class { '::trove::keystone::auth':
configure_endpoint => $configure_endpoint,
service_name => $service_name,
region => $region,
auth_name => $auth_name,
password => $password,
email => "${auth_name}@localhost",
tenant => $tenant,
public_url => $public_url,
internal_url => $internal_url,
admin_url => $admin_url,
}
}
}

View File

@ -0,0 +1,103 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::openstack_haproxy_trove
class dbaas_trove::openstack_haproxy_trove {
notice('MODULAR: dbaas_trove/openstack_haproxy_trove.pp')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
if ($trove_enabled) {
$network_metadata = hiera_hash('network_metadata', {})
$public_ssl_hash = hiera_hash('public_ssl', {})
$ssl_hash = hiera_hash('use_ssl', {})
$public_ssl = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'usage', false)
$public_ssl_path = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'path', [''])
$internal_ssl = get_ssl_property($ssl_hash, {}, 'trove', 'internal', 'usage', false)
$internal_ssl_path = get_ssl_property($ssl_hash, {}, 'trove', 'internal', 'path', [''])
$external_lb = hiera('external_lb', false)
$trove_nodes = get_nodes_hash_by_roles($network_metadata, ['primary-trove', 'trove'])
$trove_amqp_use_ssl = pick($trove['metadata']['rabbit_use_ssl'], true)
$trove_amqp_port = hiera($trove['rabbit_port'], '55671')
$trove_api_port = hiera($trove['metadata']['trove_api_port'], 8779)
if (!$external_lb) {
$trove_address_map = get_node_to_ipaddr_map_by_network_role($trove_nodes, 'trove/api')
$server_names = hiera_array('trove_names', keys($trove_address_map))
$ipaddresses = hiera_array('trove_ipaddresses', values($trove_address_map))
$public_virtual_ip = hiera('public_vip')
$internal_virtual_ip = hiera('management_vip')
# configure trove ha proxy
Openstack::Ha::Haproxy_service {
internal_virtual_ip => $internal_virtual_ip,
ipaddresses => $ipaddresses,
public_virtual_ip => $public_virtual_ip,
server_names => $server_names,
public => true,
internal_ssl => $internal_ssl,
internal_ssl_path => $internal_ssl_path,
}
openstack::ha::haproxy_service { 'trove-api':
order => '206',
listen_port => $trove_api_port,
public_ssl => $public_ssl,
public_ssl_path => $public_ssl_path,
#require_service => 'trove-api',
haproxy_config_options => {
option => ['httpchk', 'httplog', 'httpclose'],
'timeout server' => '660s',
'http-request' => 'set-header X-Forwarded-Proto https if { ssl_fc }',
},
balancermember_options => 'check inter 10s fastinter 2s downinter 3s rise 3 fall 3',
}
if($public_ssl and $trove_amqp_use_ssl) {
$rabbit_public_ssl = true
} else {
$rabbit_public_ssl = false
}
openstack::ha::haproxy_service { 'trove-rabbitmq':
order => '205',
listen_port => $trove_amqp_port,
public_ssl => $rabbit_public_ssl,
public_ssl_path => $public_ssl_path,
internal => false,
define_backups => true,
haproxy_config_options => {
'option' => ['tcpka'],
'timeout client' => '48h',
'timeout server' => '48h',
'balance' => 'roundrobin',
'mode' => 'tcp',
},
balancermember_options => 'check inter 5000 rise 2 fall 3',
}
}
}
}

View File

@ -0,0 +1,103 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::ssl_add_trust_chain
class dbaas_trove::ssl_add_trust_chain {
notice('MODULAR: dbaas_trove/ssl_add_trust_chain.pp')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
Exec {
path => '/bin:/usr/bin:/sbin:/usr/sbin',
}
File {
ensure => file,
}
define file_link {
$service = $name
if !empty(file("/etc/pki/tls/certs/public_${service}.pem",'/dev/null')) {
file { "/usr/local/share/ca-certificates/${service}_public_haproxy.crt":
source => "/etc/pki/tls/certs/public_${service}.pem",
}
}
if !empty(file("/etc/pki/tls/certs/internal_${service}.pem",'/dev/null')) {
file { "/usr/local/share/ca-certificates/${service}_internal_haproxy.crt":
source => "/etc/pki/tls/certs/internal_${service}.pem",
}
}
if !empty(file("/etc/pki/tls/certs/admin_${service}.pem",'/dev/null')) {
file { "/usr/local/share/ca-certificates/${service}_admin_haproxy.crt":
source => "/etc/pki/tls/certs/admin_${service}.pem",
}
}
}
if !empty($ssl_hash and $trove_enabled) {
$custome_services = [ 'trove' ]
file_link { $custome_services: }
} elsif !empty($custome_services and $trove_enabled) {
case $::osfamily {
'RedHat': {
file { '/etc/pki/ca-trust/source/anchors/public_haproxy.pem':
source => '/etc/pki/tls/certs/public_haproxy.pem',
}
}
'Debian': {
file { '/usr/local/share/ca-certificates/public_haproxy.crt':
source => '/etc/pki/tls/certs/public_haproxy.pem',
}
}
default: {
fail("Unsupported OS: ${::osfamily}/${::operatingsystem}")
}
}
}
case $::osfamily {
'RedHat': {
exec { 'enable_trust':
command => 'update-ca-trust force-enable',
refreshonly => true,
notify => Exec['add_trust']
}
File <||> ~> Exec['enable_trust']
}
'Debian': {
File <||> ~> Exec['add_trust']
}
default: {
fail("Unsupported OS: ${::osfamily}/${::operatingsystem}")
}
}
exec { 'add_trust':
command => 'update-ca-certificates',
refreshonly => true,
}
}

View File

@ -0,0 +1,126 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::ssl_dns_setup
class dbaas_trove::ssl_dns_setup {
notice('MODULAR: dbaas_trove/ssl_dns_setup.pp')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
$public_ssl_hash = hiera_hash('public_ssl')
$ssl_hash = hiera_hash('use_ssl', {})
$public_vip = hiera('public_vip')
$management_vip = hiera('management_vip')
$openstack_service_endpoints = hiera_hash('openstack_service_endpoints', {})
$custom_services = [ 'trove']
define hosts (
$ssl_hash,
){
$service = $name
$public_vip = hiera('public_vip')
$management_vip = hiera('management_vip')
$public_hostname = try_get_value($ssl_hash, "${service}_public_hostname", '')
$internal_hostname = try_get_value($ssl_hash, "${service}_internal_hostname", '')
$admin_hostname = try_get_value($ssl_hash, "${service}_admin_hostname", $internal_hostname)
$service_public_ip = try_get_value($ssl_hash, "${service}_public_ip", '')
if !empty($service_public_ip) {
$public_ip = $service_public_ip
} else {
$public_ip = $public_vip
}
$service_internal_ip = try_get_value($ssl_hash, "${service}_internal_ip", '')
if !empty($service_internal_ip) {
$internal_ip = $service_internal_ip
} else {
$internal_ip = $management_vip
}
$service_admin_ip = try_get_value($ssl_hash, "${service}_admin_ip", '')
if !empty($service_admin_ip) {
$admin_ip = $service_admin_ip
} else {
$admin_ip = $management_vip
}
# We always need to set public hostname resolution
if !empty($public_hostname) and !defined(Host[$public_hostname]) {
host { $public_hostname:
name => $public_hostname,
ensure => present,
ip => $public_ip,
}
}
if ($public_hostname == $internal_hostname) and ($public_hostname == $admin_hostname) {
notify{"All ${service} hostnames is equal, just public one inserted to DNS":}
}
elsif $public_hostanme == $internal_hostname {
if !empty($admin_hostname) and !defined(Host[$admin_hostname]) {
host { $admin_hostname:
name => $admin_hostname,
ensure => present,
ip => $admin_ip,
}
}
}
elsif ($public_hostname == $admin_hostname) or ($internal_hostname == $admin_hostname) {
if !empty($internal_hostname) and !defined(Host[$internal_hostname]) {
host { $internal_hostname:
name => $internal_hostname,
ensure => present,
ip => $internal_ip,
}
}
}
else {
if !empty($admin_hostname) and !defined(Host[$admin_hostname]) {
host { $admin_hostname:
name => $admin_hostname,
ensure => present,
ip => $admin_ip,
}
}
if !empty($internal_hostname) and !defined(Host[$internal_hostname]) {
host { $internal_hostname:
name => $internal_hostname,
ensure => present,
ip => $internal_ip,
}
}
}
}
if($trove_enabled) {
if !empty($ssl_hash) {
hosts { $custom_services:
ssl_hash => $ssl_hash,
}
} elsif !empty($public_ssl_hash) {
host { $public_ssl_hash['hostname']:
ensure => present,
ip => $public_vip,
}
}
}
}

View File

@ -0,0 +1,98 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::ssl_keys_saving
class dbaas_trove::ssl_keys_saving {
notice('MODULAR: dbaas_trove/ssl_keys_saving.pp')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
$public_ssl_hash = hiera_hash('public_ssl')
$ssl_hash = hiera_hash('use_ssl', {})
$pub_certificate_content = try_get_value($public_ssl_hash, 'cert_data/content', '')
$base_path = '/etc/pki/tls/certs'
$pki_path = [ '/etc/pki', '/etc/pki/tls' ]
$astute_base_path = '/var/lib/astute/haproxy'
File {
owner => 'root',
group => 'root',
mode => '0644',
}
file { [ $pki_path, $base_path, $astute_base_path ]:
ensure => directory,
}
#TODO(sbog): convert it to '.each' syntax when moving to Puppet 4
#TODO(anoskov): move it outside class 'osnailyfacter::ssl::ssl_keys_saving'
define cert_file (
$ssl_hash,
$base_path,
$astute_base_path,
){
$service = $name
$public_service = try_get_value($ssl_hash, "${service}_public", false)
$public_usercert = try_get_value($ssl_hash, "${service}_public_usercert", false)
$public_certdata = try_get_value($ssl_hash, "${service}_public_certdata/content", '')
$internal_service = try_get_value($ssl_hash, "${service}_internal", false)
$internal_usercert = try_get_value($ssl_hash, "${service}_internal_usercert", false)
$internal_certdata = try_get_value($ssl_hash, "${service}_internal_certdata/content", '')
$admin_service = try_get_value($ssl_hash, "${service}_admin", false)
$admin_usercert = try_get_value($ssl_hash, "${service}_admin_usercert", false)
$admin_certdata = try_get_value($ssl_hash, "${service}_admin_certdata/content", '')
if $ssl_hash["${service}"] {
if $public_service and $public_usercert and !empty($public_certdata) {
file { ["${base_path}/public_${service}.pem", "${astute_base_path}/public_${service}.pem"]:
ensure => present,
content => $public_certdata,
}
}
if $internal_service and $internal_usercert and !empty($internal_certdata) {
file { ["${base_path}/internal_${service}.pem", "${astute_base_path}/internal_${service}.pem"]:
ensure => present,
content => $internal_certdata,
}
}
if $admin_service and $admin_usercert and !empty($admin_certdata) {
file { ["${base_path}/admin_${service}.pem", "${astute_base_path}/admin_${service}.pem"]:
ensure => present,
content => $admin_certdata,
}
}
}
}
if !empty($ssl_hash and $trove_enabled) {
$custom_services = [ 'trove']
cert_file { $custom_services:
ssl_hash => $ssl_hash,
base_path => $base_path,
astute_base_path => $astute_base_path,
}
} elsif !empty($public_ssl_hash and $trove_enabled) {
file { ["${base_path}/public_haproxy.pem", "${astute_base_path}/public_haproxy.pem"]:
ensure => present,
content => $pub_certificate_content,
}
}
}

View File

@ -0,0 +1,177 @@
#
# Copyright (C) 2016 AT&T Services, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# dbaas_trove::trove
class dbaas_trove::trove {
notice('MODULAR: dbaas_trove/trove')
$trove = hiera_hash('fuel-plugin-dbaas-trove', undef)
$trove_enabled = pick($trove['metadata']['enabled'], false)
prepare_network_config(hiera('network_scheme', {}))
if ($trove_enabled) {
$nova_hash = hiera_hash('nova', {})
$neutron_config = hiera_hash('neutron_config', {})
$public_vip = hiera('public_vip')
$database_vip = hiera('database_vip')
$management_vip = hiera('management_vip')
$region = hiera('region', 'RegionOne')
$service_endpoint = hiera('service_endpoint')
$debug = hiera('debug', false)
$verbose = hiera('verbose', true)
$use_syslog = hiera('use_syslog', true)
$use_stderr = hiera('use_stderr', false)
$trove_amqp_port = hiera('amqp_port')
$trove_amqp_hosts = hiera('trove_amqp_hosts')
$public_ssl_hash = hiera_hash('public_ssl', {})
$ssl_hash = hiera_hash('use_ssl', {})
$external_dns = hiera_hash('external_dns', {})
$external_lb = hiera('external_lb', false)
$api_bind_port = hiera('trove_api_port')
$internal_auth_protocol = get_ssl_property($ssl_hash, {}, 'keystone', 'internal', 'protocol', 'http')
$internal_auth_address = get_ssl_property($ssl_hash, {}, 'keystone', 'internal', 'hostname', [hiera('keystone_endpoint', ''), $service_endpoint, $management_vip])
$auth_url = "${internal_auth_protocol}://${internal_auth_address}:5000/v2.0/"
$admin_auth_protocol = get_ssl_property($ssl_hash, {}, 'keystone', 'admin', 'protocol', 'http')
$admin_auth_address = get_ssl_property($ssl_hash, {}, 'keystone', 'admin', 'hostname', [hiera('keystone_endpoint', ''), $service_endpoint, $management_vip])
$identity_uri = "${admin_auth_protocol}://${admin_auth_address}:35357/"
$neutron_protocol = get_ssl_property($ssl_hash, {}, 'neutron', 'internal', 'protocol', 'http')
$neutron_address = get_ssl_property($ssl_hash, {}, 'neutron', 'internal', 'hostname', [$service_endpoint, $management_vip])
$neutron_url = "${neutron_protocol}://${neutron_address}:9696/"
$cinder_protocol = get_ssl_property($ssl_hash, {}, 'cinder', 'internal', 'protocol', 'http')
$cinder_address = get_ssl_property($ssl_hash, {}, 'cinder', 'internal', 'hostname', [$service_endpoint, $management_vip])
$cinder_url = "${cinder_protocol}://${cinder_address}:8776/v1"
$swift_protocol = get_ssl_property($ssl_hash, {}, 'swift', 'internal', 'protocol', 'http')
$swift_address = get_ssl_property($ssl_hash, {}, 'swift', 'internal', 'hostname', [$service_endpoint, $management_vip])
$swift_url = "${swift_protocol}://${swift_address}:8080/v1/AUTH_"
$nova_protocol = get_ssl_property($ssl_hash, {}, 'nova', 'internal', 'protocol', 'http')
$nova_address = get_ssl_property($ssl_hash, {}, 'nova', 'internal', 'hostname', [$service_endpoint, $management_vip])
$nova_url = "${nova_protocol}://${nova_address}:8774/v2"
$trove_public_ssl = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'usage', false)
$trove_public_protocol = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'protocol', 'http')
$trove_public_address = get_ssl_property($ssl_hash, $public_ssl_hash, 'trove', 'public', 'hostname', [$public_vip])
$api_bind_host = get_network_role_property('trove/api', 'ipaddr')
$tenant = pick($trove['tenant'], 'services')
$db_user = pick($trove['db_user'], 'trove')
$db_name = pick($trove['db_name'], 'trove')
$db_password = $trove['db_password']
$read_timeout = '60'
$sql_connection = "mysql://${db_user}:${db_password}@${database_vip}/${db_name}?read_timeout=${read_timeout}"
$sql_idle_timeout = pick($idle_timeout, '3600')
$rabbit_password = $trove['rabbit_password']
$rabbit_userid = $trove['rabbit_user']
$rabbit_use_ssl = pick($trove['metadata']['rabbit_use_ssl'], true)
$amqp_durable_queues = pick($trove['amqp_durable_queues'], true)
$rabbit_ha_queues = pick($trove['rabbit_ha_queues'], true)
$public_rabbit_hosts = "$public_vip:$trove_amqp_port"
if($trove_public_ssl and $rabbit_use_ssl) {
$guest_rabbit_use_ssl = true
} else {
$guest_rabbit_use_ssl = false
}
$nova_proxy_admin_pass = $nova_hash['user_password']
$nova_proxy_admin_user = $nova_hash['auth_name']
$nova_proxy_admin_tenant_name = pick($nova_hash['tenant_name'], 'services')
class { '::trove::client': }
class { '::trove':
database_connection => $sql_connection,
database_idle_timeout => $sql_idle_timeout,
rabbit_hosts => $trove_amqp_hosts,
rabbit_password => $trove['rabbit_password'],
rabbit_userid => $trove['rabbit_user'],
rabbit_ha_queues => $rabbit_ha_queues,
amqp_durable_queues => $amqp_durable_queues,
os_region_name => $region,
nova_compute_url => $nova_url,
cinder_url => $cinder_url,
swift_url => $swift_url,
neutron_url => $neutron_url,
nova_proxy_admin_pass => $nova_hash['user_password'],
nova_proxy_admin_user => $nova_hash['auth_name'],
nova_proxy_admin_tenant_name => pick($nova_hash['tenant_name'], 'services'),
}
class { '::trove::api':
debug => $debug,
verbose => $verbose,
bind_host => $api_bind_host,
auth_url => $auth_url,
auth_host => $service_endpoint,
keystone_password => $trove['auth_password'],
keystone_user => $trove['auth_name'],
}
class { '::trove::conductor':
debug => $debug,
verbose => $verbose,
auth_url => $auth_url,
}
class { '::trove::taskmanager':
debug => $debug,
verbose => $verbose,
auth_url => $auth_url,
use_guestagent_template => false,
}
class { '::trove::guestagent':
enabled => false,
manage_service => true,
debug => $debug,
verbose => $verbose,
rabbit_hosts => $public_rabbit_hosts,
rabbit_host => $public_vip,
rabbit_port => $trove_amqp_port,
rabbit_use_ssl => $guest_rabbit_use_ssl,
auth_url => false,
swift_url => false,
}
class { '::trove::quota': }
class { '::trove::config':
trove_config => {
'DEFAULT/taskmanager_manager' => { value => 'trove.taskmanager.manager.Manager' },
'DEFAULT/update_status_on_fail' => { value => 'True' },
'DEFAULT/guest_config' => { value => '/etc/trove/trove-guestagent.conf' },
'DEFAULT/injected_config_location' => { value => '/etc/trove' },
'DEFAULT/guest_info' => { value => '/etc/guest_info' },
'DEFAULT/volume_time_out' => { value => '240' },
'DEFAULT/agent_call_high_timeout' => { value => '240' },
'DEFAULT/agent_call_low_timeout' => { value => '20' },
},
trove_guestagent_config => {
'mysql/replication_strategy' => { value => 'MysqlGTIDReplication' },
'mysql/replication_namespace' => { value => 'trove.guestagent.strategies.replication.mysql_gtid' },
},
}
}
}

View File

@ -0,0 +1,9 @@
include ::dbaas_trove::db
# mysql::config
class mysql::config {}
include ::mysql::config
# mysql::server
class mysql::server {}
include ::mysql::server

View File

@ -0,0 +1 @@
include ::dbaas_trove::firewall

View File

@ -0,0 +1 @@
include ::dbaas_trove::hiera_override

View File

@ -0,0 +1 @@
include ::dbaas_trove::keystone

View File

@ -0,0 +1 @@
include ::dbaas_trove::openstack_haproxy_trove

View File

@ -0,0 +1 @@
include ::dbaas_trove::ssl_add_trust_chain

View File

@ -0,0 +1 @@
include ::dbaas_trove::ssl_dns_setup

View File

@ -0,0 +1 @@
include ::dbaas_trove::ssl_keys_saving

View File

@ -0,0 +1 @@
include ::dbaas_trove::trove

View File

@ -1,8 +1,11 @@
*.swp
spec/fixtures/modules/*
spec/fixtures/manifests/site.pp
pkg/
Gemfile.lock
.vendor
.bundle/
vendor/
spec/fixtures/
.vagrant/
.bundle/
coverage/
.idea/
*.swp
*.iml
openstack/

View File

@ -1,3 +1,53 @@
##2016-05-20 - 7.1.0
###Summary
This is a feature and bugfix release in the Liberty series.
####Features
- Support of PyMySQL driver for MySQL backend
####Bugfixes
- Remove nova_* options from trove-guestagent.conf.erb
- Use swift_url variable in the template instead of the hardcoded url
####Maintenance
- Add deprecation warning for Qpid rpc driver
##2015-11-25 - 7.0.0
###Summary
This is a backwards-compatible major release for OpenStack Liberty.
####Features
- add tag to package and service resources
- add trove::config class
- reflect provider change in puppet-openstacklib
- introduce trove::quota class
- introduce use_guestagent_template option
- make taskmanager_queue option configurable
- add api ratelimit options
- add region and resource url related options
- add default_neutron_networks in trove::taskmanager
- complete qpid support
- keystone/auth: make service description configurable
####Bugfixes
- fix rabbit_userid parameter
- fix default value of guestagent_config_file option
####Maintenance
- initial msync run for all Puppet OpenStack modules
- try to use zuul-cloner to prepare fixtures
- remove class_parameter_defaults puppet-lint check
- acceptance: use common bits from puppet-openstack-integration
- acceptance: enable debug & verbosity for OpenStack logs
- fix rspec 3.x syntax
##2015-10-10 - 6.1.0
###Summary

View File

@ -1,29 +1,16 @@
source 'https://rubygems.org'
source ENV['GEM_SOURCE'] || "https://rubygems.org"
group :development, :test do
gem 'puppetlabs_spec_helper', :require => false
gem 'rspec-puppet', '~> 2.1.0', :require => false
gem 'metadata-json-lint'
gem 'puppet-lint-param-docs'
gem 'puppet-lint-absolute_classname-check'
gem 'puppet-lint-absolute_template_path'
gem 'puppet-lint-trailing_newline-check'
# Puppet 4.x related lint checks
gem 'puppet-lint-unquoted_string-check'
gem 'puppet-lint-leading_zero-check'
gem 'puppet-lint-variable_contains_upcase'
gem 'puppet-lint-numericvariable'
gem 'beaker-rspec', :require => false
gem 'beaker-puppet_install_helper', :require => false
gem 'json'
gem 'webmock'
group :development, :test, :system_tests do
gem 'puppet-openstack_spec_helper',
:git => 'https://git.openstack.org/openstack/puppet-openstack_spec_helper',
:branch => 'stable/liberty',
:require => false
end
group :system_tests do
gem 'r10k', :require => 'false'
if facterversion = ENV['FACTER_GEM_VERSION']
gem 'facter', facterversion, :require => false
else
gem 'facter', :require => false
end
if puppetversion = ENV['PUPPET_GEM_VERSION']

View File

@ -1,7 +1,7 @@
puppet-trove
=============
6.1.0 - 2015.1 - Kilo
7.1.0 - 2015.2 - Liberty
#### Table of Contents
@ -35,6 +35,120 @@ Implementation
trove is a combination of Puppet manifest and ruby code to delivery configuration and extra functionality through types and providers.
### Types
#### trove_config
The `trove_config` provider is a children of the ini_setting provider. It allows one to write an entry in the `/etc/trove/trove.conf` file.
```puppet
trove_config { 'DEFAULT/verbose' :
value => true,
}
```
This will write `verbose=true` in the `[DEFAULT]` section.
##### name
Section/setting name to manage from `trove.conf`
##### value
The value of the setting to be defined.
##### secret
Whether to hide the value from Puppet logs. Defaults to `false`.
##### ensure_absent_val
If value is equal to ensure_absent_val then the resource will behave as if `ensure => absent` was specified. Defaults to `<SERVICE DEFAULT>`
#### trove_conductor_config
The `trove_conductor_config` provider is a children of the ini_setting provider. It allows one to write an entry in the `/etc/trove/trove-conductor.conf` file.
```puppet
trove_conductor_config { 'DEFAULT/verbose' :
value => true,
}
```
This will write `verbose=true` in the `[DEFAULT]` section.
##### name
Section/setting name to manage from `trove.conf`
##### value
The value of the setting to be defined.
##### secret
Whether to hide the value from Puppet logs. Defaults to `false`.
##### ensure_absent_val
If value is equal to ensure_absent_val then the resource will behave as if `ensure => absent` was specified. Defaults to `<SERVICE DEFAULT>`
#### trove_guestagent_config
The `trove_guestagent_config` provider is a children of the ini_setting provider. It allows one to write an entry in the `/etc/trove/trove-guestagent.conf` file.
```puppet
trove_guestagent_config { 'DEFAULT/verbose' :
value => true,
}
```
This will write `verbose=true` in the `[DEFAULT]` section.
##### name
Section/setting name to manage from `trove.conf`
##### value
The value of the setting to be defined.
##### secret
Whether to hide the value from Puppet logs. Defaults to `false`.
##### ensure_absent_val
If value is equal to ensure_absent_val then the resource will behave as if `ensure => absent` was specified. Defaults to `<SERVICE DEFAULT>`
#### trove_taskmanager_config
The `trove_taskmanager_config` provider is a children of the ini_setting provider. It allows one to write an entry in the `/etc/trove/trove-taskmanager.conf` file.
```puppet
trove_taskmanager_config { 'DEFAULT/verbose' :
value => true,
}
```
This will write `verbose=true` in the `[DEFAULT]` section.
##### name
Section/setting name to manage from `trove.conf`
##### value
The value of the setting to be defined.
##### secret
Whether to hide the value from Puppet logs. Defaults to `false`.
##### ensure_absent_val
If value is equal to ensure_absent_val then the resource will behave as if `ensure => absent` was specified. Defaults to `<SERVICE DEFAULT>`
Limitations
-----------

View File

@ -1,15 +1,27 @@
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
require 'puppet-syntax/tasks/puppet-syntax'
require 'json'
modname = JSON.parse(open('metadata.json').read)['name'].split('-')[1]
PuppetLint.configuration.fail_on_warnings = true
PuppetLint.configuration.send('disable_80chars')
PuppetLint.configuration.send('disable_class_parameter_defaults')
PuppetSyntax.exclude_paths ||= []
PuppetSyntax.exclude_paths << "spec/fixtures/**/*"
PuppetSyntax.exclude_paths << "pkg/**/*"
PuppetSyntax.exclude_paths << "vendor/**/*"
task(:default).clear
task :default => [:spec, :lint]
Rake::Task[:lint].clear
PuppetLint::RakeTask.new :lint do |config|
config.ignore_paths = ["spec/**/*.pp", "vendor/**/*.pp"]
config.fail_on_warnings = true
config.log_format = '%{path}:%{linenumber}:%{KIND}: %{message}'
config.disable_checks = ["80chars", "class_inherits_from_params_class", "only_variable_string"]
end
desc "Run acceptance tests"
RSpec::Core::RakeTask.new(:acceptance) do |t|
t.pattern = 'spec/acceptance'
end
Rake::Task[:spec_prep].clear
desc 'Create the fixtures directory'
@ -46,7 +58,7 @@ task :spec_prep do
zuul_clone_cmd += ['git://git.openstack.org', "#{repo}"]
sh(*zuul_clone_cmd)
else
sh("git clone https://git.openstack.org/#{repo} -b stable/kilo #{repo}")
sh("git clone https://git.openstack.org/#{repo} -b stable/liberty #{repo}")
end
script = ['env']
script += ["PUPPETFILE_DIR=#{Dir.pwd}/spec/fixtures/modules"]

View File

@ -1,27 +1,10 @@
Puppet::Type.type(:trove_api_paste_ini).provide(
:ini_setting,
:parent => Puppet::Type.type(:ini_setting).provider(:ruby)
:parent => Puppet::Type.type(:openstack_config).provider(:ini_setting)
) do
def section
resource[:name].split('/', 2).first
end
def setting
resource[:name].split('/', 2).last
end
def separator
'='
end
def self.file_path
'/etc/trove/api-paste.ini'
end
# added for backwards compatibility with older versions of inifile
def file_path
self.class.file_path
end
end

View File

@ -1,27 +1,10 @@
Puppet::Type.type(:trove_conductor_config).provide(
:ini_setting,
:parent => Puppet::Type.type(:ini_setting).provider(:ruby)
:parent => Puppet::Type.type(:openstack_config).provider(:ini_setting)
) do
def section
resource[:name].split('/', 2).first
end
def setting
resource[:name].split('/', 2).last
end
def separator
'='
end
def self.file_path
'/etc/trove/trove-conductor.conf'
end
# added for backwards compatibility with older versions of inifile
def file_path
self.class.file_path
end
end

View File

@ -1,27 +1,10 @@
Puppet::Type.type(:trove_config).provide(
:ini_setting,
:parent => Puppet::Type.type(:ini_setting).provider(:ruby)
:parent => Puppet::Type.type(:openstack_config).provider(:ini_setting)
) do
def section
resource[:name].split('/', 2).first
end
def setting
resource[:name].split('/', 2).last
end
def separator
'='
end
def self.file_path
'/etc/trove/trove.conf'
end
# added for backwards compatibility with older versions of inifile
def file_path
self.class.file_path
end
end

View File

@ -1,27 +1,10 @@
Puppet::Type.type(:trove_guestagent_config).provide(
:ini_setting,
:parent => Puppet::Type.type(:ini_setting).provider(:ruby)
:parent => Puppet::Type.type(:openstack_config).provider(:ini_setting)
) do
def section
resource[:name].split('/', 2).first
end
def setting
resource[:name].split('/', 2).last
end
def separator
'='
end
def self.file_path
'/etc/trove/trove-guestagent.conf'
end
# added for backwards compatibility with older versions of inifile
def file_path
self.class.file_path
end
end

View File

@ -1,27 +1,10 @@
Puppet::Type.type(:trove_taskmanager_config).provide(
:ini_setting,
:parent => Puppet::Type.type(:ini_setting).provider(:ruby)
:parent => Puppet::Type.type(:openstack_config).provider(:ini_setting)
) do
def section
resource[:name].split('/', 2).first
end
def setting
resource[:name].split('/', 2).last
end
def separator
'='
end
def self.file_path
'/etc/trove/trove-taskmanager.conf'
end
# added for backwards compatibility with older versions of inifile
def file_path
self.class.file_path
end
end

View File

@ -39,4 +39,13 @@ Puppet::Type.newtype(:trove_api_paste_ini) do
defaultto false
end
newparam(:ensure_absent_val) do
desc 'A value that is specified as the value property will behave as if ensure => absent was specified'
defaultto('<SERVICE DEFAULT>')
end
autorequire(:package) do
'trove-api'
end
end

View File

@ -14,6 +14,7 @@ Puppet::Type.newtype(:trove_conductor_config) do
value.capitalize! if value =~ /^(true|false)$/i
value
end
newvalues(/^[\S ]*$/)
def is_to_s( currentvalue )
if resource.secret?
@ -39,4 +40,13 @@ Puppet::Type.newtype(:trove_conductor_config) do
defaultto false
end
newparam(:ensure_absent_val) do
desc 'A value that is specified as the value property will behave as if ensure => absent was specified'
defaultto('<SERVICE DEFAULT>')
end
autorequire(:package) do
'trove-conductor'
end
end

View File

@ -14,6 +14,7 @@ Puppet::Type.newtype(:trove_config) do
value.capitalize! if value =~ /^(true|false)$/i
value
end
newvalues(/^[\S ]*$/)
def is_to_s( currentvalue )
if resource.secret?
@ -39,4 +40,13 @@ Puppet::Type.newtype(:trove_config) do
defaultto false
end
newparam(:ensure_absent_val) do
desc 'A value that is specified as the value property will behave as if ensure => absent was specified'
defaultto('<SERVICE DEFAULT>')
end
autorequire(:package) do
'trove-api'
end
end

View File

@ -14,6 +14,7 @@ Puppet::Type.newtype(:trove_guestagent_config) do
value.capitalize! if value =~ /^(true|false)$/i
value
end
newvalues(/^[\S ]*$/)
def is_to_s( currentvalue )
if resource.secret?
@ -39,4 +40,13 @@ Puppet::Type.newtype(:trove_guestagent_config) do
defaultto false
end
newparam(:ensure_absent_val) do
desc 'A value that is specified as the value property will behave as if ensure => absent was specified'
defaultto('<SERVICE DEFAULT>')
end
autorequire(:package) do
'trove-guestagent'
end
end

View File

@ -14,6 +14,7 @@ Puppet::Type.newtype(:trove_taskmanager_config) do
value.capitalize! if value =~ /^(true|false)$/i
value
end
newvalues(/^[\S ]*$/)
def is_to_s( currentvalue )
if resource.secret?
@ -39,4 +40,10 @@ Puppet::Type.newtype(:trove_taskmanager_config) do
defaultto false
end
newparam(:ensure_absent_val) do
desc 'A value that is specified as the value property will behave as if ensure => absent was specified'
defaultto('<SERVICE DEFAULT>')
end
end

View File

@ -119,6 +119,26 @@
# (optional) CA certificate file to use to verify connecting clients
# Defaults to false, not set
#
# [*http_get_rate*]
# (optional) Default rate limit of GET request.
# Defaults to 200.
#
# [*http_post_rate*]
# (optional) Default rate limit of POST request.
# Defaults to 200.
#
# [*http_put_rate*]
# (optional) Default rate limit of PUT request.
# Defaults to 200.
#
# [*http_delete_rate*]
# (optional) Default rate limit of DELETE request.
# Defaults to 200.
#
# [*http_mgmt_post_rate*]
# (optional) Default rate limit of mgmt post request.
# Defaults to 200.
#
class trove::api(
$keystone_password,
$verbose = false,
@ -142,42 +162,22 @@ class trove::api(
$cert_file = false,
$key_file = false,
$ca_file = false,
$http_get_rate = 200,
$http_post_rate = 200,
$http_put_rate = 200,
$http_delete_rate = 200,
$http_mgmt_post_rate = 200,
$manage_service = true,
$ensure_package = 'present',
) inherits trove {
require ::keystone::python
include ::trove::db
include ::trove::params
Trove_config<||> ~> Exec['post-trove_config']
Trove_config<||> ~> Service['trove-api']
Package['trove-api'] -> Trove_api_paste_ini<||>
Trove_api_paste_ini<||> ~> Service['trove-api']
# Trove db sync is broken in Ubuntu packaging
# This is a temporary fix until it's fixed in packaging.
# https://bugs.launchpad.net/ubuntu/+source/openstack-trove/+bug/1451134
file { '/etc/trove/trove.conf':
require => File['/etc/trove'],
}
File['/etc/trove/trove.conf'] -> Trove_config<||>
Trove_config<||> -> Package[$::trove::params::api_package_name]
if $::trove::database_connection {
if($::trove::database_connection =~ /mysql:\/\/\S+:\S+@\S+\/\S+/) {
require 'mysql::bindings'
require 'mysql::bindings::python'
} elsif($::trove::database_connection =~ /postgresql:\/\/\S+:\S+@\S+\/\S+/) {
} elsif($::trove::database_connection =~ /sqlite:\/\//) {
} else {
fail("Invalid db connection ${::trove::database_connection}")
}
trove_config {
'database/connection': value => $::trove::database_connection;
'database/idle_timeout': value => $::trove::database_idle_timeoutl;
}
}
# basic service config
trove_config {
@ -191,6 +191,7 @@ class trove::api(
'DEFAULT/nova_proxy_admin_pass': value => $::trove::nova_proxy_admin_pass;
'DEFAULT/nova_proxy_admin_tenant_name': value => $::trove::nova_proxy_admin_tenant_name;
'DEFAULT/control_exchange': value => $::trove::control_exchange;
'DEFAULT/rpc_backend': value => $::trove::rpc_backend;
}
if $auth_url {
@ -271,30 +272,66 @@ class trove::api(
}
}
# rate limits
trove_config {
'DEFAULT/http_get_rate': value => $http_get_rate;
'DEFAULT/http_post_rate': value => $http_post_rate;
'DEFAULT/http_put_rate': value => $http_put_rate;
'DEFAULT/http_delete_rate': value => $http_delete_rate;
'DEFAULT/http_mgmt_post_rate': value => $http_mgmt_post_rate;
}
resources { 'trove_config':
purge => $purge_config,
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' {
# region name
if $::trove::os_region_name {
trove_config { 'DEFAULT/os_region_name': value => $::trove::os_region_name }
}
else {
trove_config {'DEFAULT/os_region_name': ensure => absent }
}
# services type
trove_config {
'DEFAULT/nova_compute_service_type': value => $::trove::nova_compute_service_type;
'DEFAULT/cinder_service_type': value => $::trove::cinder_service_type;
'DEFAULT/neutron_service_type': value => $::trove::neutron_service_type;
'DEFAULT/swift_service_type': value => $::trove::swift_service_type;
'DEFAULT/heat_service_type': value => $::trove::heat_service_type;
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' or $::trove::rpc_backend == 'rabbit' {
if ! $::trove::rabbit_password {
fail('When rpc_backend is rabbitmq, you must set rabbit password')
}
if $::trove::rabbit_hosts {
trove_config { 'oslo_messaging_rabbit/rabbit_hosts': value => join($::trove::rabbit_hosts, ',') }
trove_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
trove_config { 'oslo_messaging_rabbit/rabbit_hosts': value => $::trove::rabbit_hosts }
} else {
trove_config { 'oslo_messaging_rabbit/rabbit_host': value => $::trove::rabbit_host }
trove_config { 'oslo_messaging_rabbit/rabbit_port': value => $::trove::rabbit_port }
trove_config { 'oslo_messaging_rabbit/rabbit_hosts': value => "${::trove::rabbit_host}:${::trove::rabbit_port}" }
trove_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
if $::trove::rabbit_ha_queues == undef {
if size($::trove::rabbit_hosts) > 1 {
trove_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
} else {
trove_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
} else {
trove_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => $::trove::rabbit_ha_queues }
}
trove_config {
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_user;
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_userid;
'oslo_messaging_rabbit/rabbit_password': value => $::trove::rabbit_password, secret => true;
'oslo_messaging_rabbit/rabbit_virtual_host': value => $::trove::rabbit_virtual_host;
'oslo_messaging_rabbit/rabbit_use_ssl': value => $::trove::rabbit_use_ssl;
'oslo_messaging_rabbit/kombu_reconnect_delay': value => $::trove::kombu_reconnect_delay;
# TODO(shaikapsar): remove this line once bug/1486319 merged to stable/liberty.
'oslo_messaging_rabbit/amqp_durable_queues': value => $::trove::amqp_durable_queues;
}
if $::trove::rabbit_use_ssl {
@ -333,29 +370,32 @@ class trove::api(
}
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' {
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' or $::trove::rpc_backend == 'qpid'{
warning('Qpid driver is removed from Oslo.messaging in the Mitaka release')
trove_config {
'DEFAULT/qpid_hostname': value => $::trove::qpid_hostname;
'DEFAULT/qpid_port': value => $::trove::qpid_port;
'DEFAULT/qpid_username': value => $::trove::qpid_username;
'DEFAULT/qpid_password': value => $::trove::qpid_password, secret => true;
'DEFAULT/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'DEFAULT/qpid_protocol': value => $::trove::qpid_protocol;
'DEFAULT/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
'oslo_messaging_qpid/qpid_hostname': value => $::trove::qpid_hostname;
'oslo_messaging_qpid/qpid_port': value => $::trove::qpid_port;
'oslo_messaging_qpid/qpid_username': value => $::trove::qpid_username;
'oslo_messaging_qpid/qpid_password': value => $::trove::qpid_password, secret => true;
'oslo_messaging_qpid/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'oslo_messaging_qpid/qpid_protocol': value => $::trove::qpid_protocol;
'oslo_messaging_qpid/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
}
if is_array($::trove::qpid_sasl_mechanisms) {
trove_config {
'DEFAULT/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
'oslo_messaging_qpid/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
}
}
elsif $::trove::qpid_sasl_mechanisms {
trove_config {
'DEFAULT/qpid_sasl_mechanisms': value => $::trove::qpid_sasl_mechanisms;
'oslo_messaging_qpid/qpid_sasl_mechanisms': value => $::trove::qpid_sasl_mechanisms;
}
}
else {
trove_config {
'DEFAULT/qpid_sasl_mechanisms': ensure => absent;
'oslo_messaging_qpid/qpid_sasl_mechanisms': ensure => absent;
}
}
}

View File

@ -68,14 +68,6 @@ class trove::conductor(
Trove_conductor_config<||> ~> Exec['post-trove_config']
Trove_conductor_config<||> ~> Service['trove-conductor']
# Trove db sync is broken in Ubuntu packaging
# This is a temporary fix until it's fixed in packaging.
# https://bugs.launchpad.net/ubuntu/+source/openstack-trove/+bug/1451134
file { '/etc/trove/trove-conductor.conf':
require => File['/etc/trove'],
}
File['/etc/trove/trove-conductor.conf'] -> Trove_conductor_config<||>
Trove_conductor_config<||> -> Package[$::trove::params::conductor_package_name]
if $::trove::database_connection {
if($::trove::database_connection =~ /mysql:\/\/\S+:\S+@\S+\/\S+/) {
@ -103,28 +95,39 @@ class trove::conductor(
'DEFAULT/nova_proxy_admin_tenant_name': value => $::trove::nova_proxy_admin_tenant_name;
'DEFAULT/nova_proxy_admin_pass': value => $::trove::nova_proxy_admin_pass;
'DEFAULT/control_exchange': value => $::trove::control_exchange;
'DEFAULT/rpc_backend': value => $::trove::rpc_backend;
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' {
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' or $::trove::rpc_backend == 'rabbit' {
if ! $::trove::rabbit_password {
fail('When rpc_backend is rabbitmq, you must set rabbit password')
}
if $::trove::rabbit_hosts {
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_hosts': value => join($::trove::rabbit_hosts, ',') }
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_hosts': value => ::trove::rabbit_hosts }
} else {
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_host': value => $::trove::rabbit_host }
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_port': value => $::trove::rabbit_port }
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_hosts': value => "${::trove::rabbit_host}:${::trove::rabbit_port}" }
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
if $::trove::rabbit_ha_queues == undef {
if size($::trove::rabbit_hosts) > 1 {
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
} else {
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
} else {
trove_conductor_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => $::trove::rabbit_ha_queues }
}
trove_conductor_config {
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_user;
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_userid;
'oslo_messaging_rabbit/rabbit_password': value => $::trove::rabbit_password, secret => true;
'oslo_messaging_rabbit/rabbit_virtual_host': value => $::trove::rabbit_virtual_host;
'oslo_messaging_rabbit/rabbit_use_ssl': value => $::trove::rabbit_use_ssl;
'oslo_messaging_rabbit/kombu_reconnect_delay': value => $::trove::kombu_reconnect_delay;
# TODO(shaikapsar): remove this line once bug/1486319 merged to stable/liberty.
'oslo_messaging_rabbit/amqp_durable_queues': value => $::trove::amqp_durable_queues;
}
if $::trove::rabbit_use_ssl {
@ -163,19 +166,22 @@ class trove::conductor(
}
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' {
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' or $::trove::rpc_backend == 'qpid'{
warning('Qpid driver is removed from Oslo.messaging in the Mitaka release')
trove_conductor_config {
'DEFAULT/qpid_hostname': value => $::trove::qpid_hostname;
'DEFAULT/qpid_port': value => $::trove::qpid_port;
'DEFAULT/qpid_username': value => $::trove::qpid_username;
'DEFAULT/qpid_password': value => $::trove::qpid_password, secret => true;
'DEFAULT/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'DEFAULT/qpid_protocol': value => $::trove::qpid_protocol;
'DEFAULT/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
'oslo_messaging_qpid/qpid_hostname': value => $::trove::qpid_hostname;
'oslo_messaging_qpid/qpid_port': value => $::trove::qpid_port;
'oslo_messaging_qpid/qpid_username': value => $::trove::qpid_username;
'oslo_messaging_qpid/qpid_password': value => $::trove::qpid_password, secret => true;
'oslo_messaging_qpid/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'oslo_messaging_qpid/qpid_protocol': value => $::trove::qpid_protocol;
'oslo_messaging_qpid/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
}
if is_array($::trove::qpid_sasl_mechanisms) {
trove_conductor_config {
'DEFAULT/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
'oslo_messaging_qpid/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
}
}
}

View File

@ -0,0 +1,103 @@
# == Class: trove::db
#
# Configure the Trove database
#
# === Parameters
#
# [*database_connection*]
# Url used to connect to database.
# (Optional) Defaults to 'sqlite:////var/lib/trove/trove.sqlite'.
#
# [*database_idle_timeout*]
# Timeout when db connections should be reaped.
# (Optional) Defaults to 3600.
#
# [*database_max_retries*]
# Maximum number of database connection retries during startup.
# Setting -1 implies an infinite retry count.
# (Optional) Defaults to 10.
#
# [*database_retry_interval*]
# Interval between retries of opening a database connection.
# (Optional) Defaults to 10.
#
# [*database_min_pool_size*]
# Minimum number of SQL connections to keep open in a pool.
# (Optional) Defaults to 1.
#
# [*database_max_pool_size*]
# Maximum number of SQL connections to keep open in a pool.
# (Optional) Defaults to 10.
#
# [*database_max_overflow*]
# If set, use this value for max_overflow with sqlalchemy.
# (Optional) Defaults to 20.
#
class trove::db (
$database_connection = 'sqlite:////var/lib/trove/trove.sqlite',
$database_idle_timeout = 3600,
$database_min_pool_size = 1,
$database_max_pool_size = 10,
$database_max_retries = 10,
$database_retry_interval = 10,
$database_max_overflow = 20,
) {
include ::trove::params
# NOTE(spredzy): In order to keep backward compatibility we rely on the pick function
# to use trove::<myparam> if trove::db::<myparam> isn't specified.
$database_connection_real = pick($::trove::database_connection, $database_connection)
$database_idle_timeout_real = pick($::trove::database_idle_timeout, $database_idle_timeout)
$database_min_pool_size_real = pick($::trove::database_min_pool_size, $database_min_pool_size)
$database_max_pool_size_real = pick($::trove::database_max_pool_size, $database_max_pool_size)
$database_max_retries_real = pick($::trove::database_max_retries, $database_max_retries)
$database_retry_interval_real = pick($::trove::database_retry_interval, $database_retry_interval)
$database_max_overflow_real = pick($::trove::database_max_overflow, $database_max_overflow)
validate_re($database_connection_real,
'^(sqlite|mysql(\+pymysql)?|postgresql):\/\/(\S+:\S+@\S+\/\S+)?')
if $database_connection_real {
case $database_connection_real {
/^mysql(\+pymysql)?:\/\//: {
require 'mysql::bindings'
require 'mysql::bindings::python'
if $database_connection_real =~ /^mysql\+pymysql/ {
$backend_package = $::trove::params::pymysql_package_name
} else {
$backend_package = false
}
}
/^postgresql:\/\//: {
$backend_package = false
require 'postgresql::lib::python'
}
/^sqlite:\/\//: {
$backend_package = $::trove::params::sqlite_package_name
}
default: {
fail('Unsupported backend configured')
}
}
if $backend_package and !defined(Package[$backend_package]) {
package {'trove-backend-package':
ensure => present,
name => $backend_package,
tag => 'openstack',
}
}
trove_config {
'database/connection': value => $database_connection_real, secret => true;
'database/idle_timeout': value => $database_idle_timeout_real;
'database/min_pool_size': value => $database_min_pool_size_real;
'database/max_retries': value => $database_max_retries_real;
'database/retry_interval': value => $database_retry_interval_real;
'database/max_pool_size': value => $database_max_pool_size_real;
'database/max_overflow': value => $database_max_overflow_real;
}
}
}

View File

@ -79,5 +79,5 @@ class trove::db::mysql(
allowed_hosts => $allowed_hosts,
}
::Openstacklib::Db::Mysql['trove'] ~> Exec<| title == 'trove-db-sync' |>
::Openstacklib::Db::Mysql['trove'] ~> Exec<| title == 'trove-manage db_sync' |>
}

View File

@ -23,6 +23,5 @@ class trove::db::sync {
user => 'trove',
refreshonly => true,
subscribe => Trove_config['database/connection'],
require => Package['trove-api'],
}
}

View File

@ -60,7 +60,7 @@ define trove::generic_service(
$trove_title = "trove-${name}"
Exec['post-trove_config'] ~> Service<| title == $trove_title |>
Exec<| title == 'trove-db-sync' |> ~> Service<| title == $trove_title |>
Exec<| title == 'trove-manage db_sync' |> ~> Service<| title == $trove_title |>
if ($package_name) {
if !defined(Package[$package_name]) {
@ -68,6 +68,7 @@ define trove::generic_service(
ensure => $ensure_package,
name => $package_name,
notify => Service[$trove_title],
tag => ['openstack', 'trove-package'],
}
}
}
@ -86,6 +87,7 @@ define trove::generic_service(
name => $service_name,
enable => $enabled,
hasstatus => true,
tag => 'trove-service',
}
}
}

View File

@ -54,6 +54,38 @@
# (optional) Control exchange.
# Defaults to 'trove'.
#
# TODO(shaikapsar): remove this once bug/1585783 merged to stable/liberty.
# [*rabbit_hosts*]
# (optional) List of clustered rabbit servers.
# Defaults to the value set in the trove class.
# The default can generally be left unless the
# guests need to talk to the rabbit cluster via
# different IPs.
#
# TODO(shaikapsar): remove this once bug/1585783 merged to stable/liberty.
# [*rabbit_host*]
# (optional) Location of rabbitmq installation.
# Defaults to the value set in the trove class.
# The default can generally be left unless the
# guests need to talk to the rabbit cluster via
# a different IP.
#
# TODO(shaikapsar): remove this once bug/1585783 merged to stable/liberty.
# [*rabbit_port*]
# (optional) Port for rabbitmq instance.
# Defaults to the value set in the trove class.
# The default can generally be left unless the
# guests need to talk to the rabbit cluster via
# a different port.
#
# TODO(shaikapsar): remove this once bug/1585783 merged to stable/liberty.
# [*rabbit_use_ssl*]
# (optional) Connect over SSL for RabbitMQ
# Defaults to the value set in the trove class.
# The default can generally be left unless the
# guests need to talk to the rabbit cluster via
# a different ssl connection option.
#
class trove::guestagent(
$enabled = true,
$manage_service = true,
@ -66,57 +98,91 @@ class trove::guestagent(
$log_facility = 'LOG_USER',
$auth_url = 'http://localhost:5000/v2.0',
$swift_url = 'http://localhost:8080/v1/AUTH_',
$control_exchange = 'trove'
$control_exchange = 'trove',
# TODO(shaikapsar): remove the below 4lines once bug/1585783 merged to stable/liberty.
$rabbit_hosts = $::trove::rabbit_hosts,
$rabbit_host = $::trove::rabbit_host,
$rabbit_port = $::trove::rabbit_port,
$rabbit_use_ssl = $::trove::rabbit_use_ssl,
) inherits trove {
include ::trove::params
Trove_guestagent_config<||> ~> Exec['post-trove_config']
Trove_guestagent_config<||> ~> Service['trove-guestagent']
# Trove db sync is broken in Ubuntu packaging
# This is a temporary fix until it's fixed in packaging.
# https://bugs.launchpad.net/ubuntu/+source/openstack-trove/+bug/1451134
file { '/etc/trove/trove-guestagent.conf':
require => File['/etc/trove'],
}
File['/etc/trove/trove-guestagent.conf'] -> Trove_guestagent_config<||>
Trove_guestagent_config<||> -> Package[$::trove::params::guestagent_package_name]
# basic service config
trove_guestagent_config {
'DEFAULT/verbose': value => $verbose;
'DEFAULT/debug': value => $debug;
'DEFAULT/trove_auth_url': value => $auth_url;
'DEFAULT/swift_url': value => $swift_url;
'DEFAULT/nova_proxy_admin_user': value => $::trove::nova_proxy_admin_user;
'DEFAULT/nova_proxy_admin_tenant_name': value => $::trove::nova_proxy_admin_tenant_name;
'DEFAULT/nova_proxy_admin_pass': value => $::trove::nova_proxy_admin_pass;
'DEFAULT/control_exchange': value => $control_exchange;
'DEFAULT/rpc_backend': value => $::trove::rpc_backend;
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' {
if ! $::trove::rabbit_password {
# (shaikapsar): Option to fetch auth_url and swift_url from the keystone catalog.
# auth_url
if $auth_url {
trove_guestagent_config { 'DEFAULT/trove_auth_url': value => $auth_url }
}
else {
trove_guestagent_config { 'DEFAULT/trove_auth_url': ensure => absent }
}
# swift_url
if $swift_url {
trove_guestagent_config { 'DEFAULT/swift_url': value => $swift_url }
}
else {
trove_guestagent_config { 'DEFAULT/swift_url': ensure => absent }
}
# region name
if $::trove::os_region_name {
trove_guestagent_config { 'DEFAULT/os_region_name': value => $::trove::os_region_name }
}
else {
trove_guestagent_config {'DEFAULT/os_region_name': ensure => absent }
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' or $::trove::rpc_backend == 'rabbit' {
if ! $::trove::rabbit_password {
fail('When rpc_backend is rabbitmq, you must set rabbit password')
}
if $::trove::rabbit_hosts {
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_hosts': value => join($::trove::rabbit_hosts, ',') }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
# TODO(shaikapsar): remove the below lines once bug/1585783 merged to stable/liberty.
if $rabbit_hosts {
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_hosts': value => $rabbit_hosts }
} else {
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_host': value => $::trove::rabbit_host }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_port': value => $::trove::rabbit_port }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_hosts': value => "${::trove::rabbit_host}:${::trove::rabbit_port}" }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_host': value => $rabbit_host }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_port': value => $rabbit_port }
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_hosts': value => "${rabbit_host}:${rabbit_port}" }
}
if $::trove::rabbit_ha_queues == undef {
# TODO(shaikapsar): remove the below lines once bug/1585783 merged to stable/liberty.
if size($rabbit_hosts) > 1 {
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
} else {
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
} else {
trove_guestagent_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => $::trove::rabbit_ha_queues }
}
trove_guestagent_config {
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_user;
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_userid;
'oslo_messaging_rabbit/rabbit_password': value => $::trove::rabbit_password, secret => true;
'oslo_messaging_rabbit/rabbit_virtual_host': value => $::trove::rabbit_virtual_host;
'oslo_messaging_rabbit/rabbit_use_ssl': value => $::trove::rabbit_use_ssl;
# TODO(shaikapsar): remove the below lines once bug/1585783 merged to stable/liberty.
'oslo_messaging_rabbit/rabbit_use_ssl': value => $rabbit_use_ssl;
'oslo_messaging_rabbit/kombu_reconnect_delay': value => $::trove::kombu_reconnect_delay;
# TODO(shaikapsar): remove the below lines once bug/1486319 merged to stable/liberty.
'oslo_messaging_rabbit/amqp_durable_queues': value => $::trove::amqp_durable_queues;
}
if $::trove::rabbit_use_ssl {
# TODO(shaikapsar): remove the below lines once bug/1585783 merged to stable/liberty.
if $rabbit_use_ssl {
if $::trove::kombu_ssl_ca_certs {
trove_guestagent_config { 'oslo_messaging_rabbit/kombu_ssl_ca_certs': value => $::trove::kombu_ssl_ca_certs; }
@ -152,19 +218,22 @@ class trove::guestagent(
}
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' {
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' or $::trove::rpc_backend == 'qpid'{
warning('Qpid driver is removed from Oslo.messaging in the Mitaka release')
trove_guestagent_config {
'DEFAULT/qpid_hostname': value => $::trove::qpid_hostname;
'DEFAULT/qpid_port': value => $::trove::qpid_port;
'DEFAULT/qpid_username': value => $::trove::qpid_username;
'DEFAULT/qpid_password': value => $::trove::qpid_password, secret => true;
'DEFAULT/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'DEFAULT/qpid_protocol': value => $::trove::qpid_protocol;
'DEFAULT/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
'oslo_messaging_qpid/qpid_hostname': value => $::trove::qpid_hostname;
'oslo_messaging_qpid/qpid_port': value => $::trove::qpid_port;
'oslo_messaging_qpid/qpid_username': value => $::trove::qpid_username;
'oslo_messaging_qpid/qpid_password': value => $::trove::qpid_password, secret => true;
'oslo_messaging_qpid/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'oslo_messaging_qpid/qpid_protocol': value => $::trove::qpid_protocol;
'oslo_messaging_qpid/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
}
if is_array($::trove::qpid_sasl_mechanisms) {
trove_guestagent_config {
'DEFAULT/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
'oslo_messaging_qpid/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
}
}
}

View File

@ -77,6 +77,10 @@
# available on some distributions.
# Defaults to 'TLSv1'
#
# [*rabbit_ha_queues*]
# (optional) Use HA queues in RabbitMQ (x-ha-policy: all).
# Defaults to undef
#
# [*amqp_durable_queues*]
# (optional) Define queues as "durable" to rabbitmq.
# Defaults to false
@ -115,9 +119,9 @@
#
# [*rpc_backend*]
# (optional) The rpc backend implementation to use, can be:
# trove.openstack.common.rpc.impl_kombu (for rabbitmq)
# trove.openstack.common.rpc.impl_qpid (for qpid)
# Defaults to 'trove.openstack.common.rpc.impl_kombu'
# rabbit (for rabbitmq)
# qpid (for qpid)
# Defaults to 'rabbit'
#
# [*mysql_module*]
# (optional) Deprecated. Does nothing.
@ -125,11 +129,32 @@
#
# [*database_connection*]
# (optional) Connection url to connect to trove database.
# Defaults to 'sqlite:////var/lib/trove/trove.sqlite'
# Defaults to undef.
#
# [*database_idle_timeout*]
# (optional) Timeout before idle db connections are reaped.
# Defaults to 3600
# Defaults to undef.
#
# [*database_max_retries*]
# (optional) Maximum number of database connection retries during startup.
# Setting -1 implies an infinite retry count.
# Defaults to undef.
#
# [*database_retry_interval*]
# (optional) Interval between retries of opening a database connection.
# Defaults to undef.
#
# [*database_min_pool_size*]
# (optional) Minimum number of SQL connections to keep open in a pool.
# Defaults to: undef.
#
# [*database_max_pool_size*]
# (optional) Maximum number of SQL connections to keep open in a pool.
# Defaults to: undef.
#
# [*database_max_overflow*]
# (optional) If set, use this value for max_overflow with sqlalchemy.
# Defaults to: undef.
#
# [*nova_compute_url*]
# (optional) URL without the tenant segment.
@ -158,6 +183,37 @@
# (optional) Swift URL ending in AUTH_.
# Defaults to false.
#
# [*neutron_url*]
# (optional) Cinder URL without the tenant segment.
# Defaults to false.
#
# [*os_region_name*]
# (optional) Sets the os_region_name flag. For environments with
# more than one endpoint per service. If you don't set this and
# you have multiple endpoints, you will get Ambiguous Endpoint
# exceptions in the trove API service.
# Defaults to undef.
#
# [*nova_compute_service_type*]
# (optional) Nova service type to use when searching catalog.
# Defaults to 'compute'.
#
# [*cinder_service_type*]
# (optional) Cinder service type to use when searching catalog.
# Defaults to 'volumev2'.
#
# [*swift_service_type*]
# (optional) Swift service type to use when searching catalog.
# Defaults to 'object-store'.
#
# [*heat_service_type*]
# (optional) Heat service type to use when searching catalog.
# Defaults to 'orchestration'.
#
# [*neutron_service_type*]
# (optional) Neutron service type to use when searching catalog.
# Defaults to 'network'.
#
# [*use_neutron*]
# (optional) Use Neutron
# Defaults to true
@ -169,27 +225,48 @@
class trove(
$nova_proxy_admin_pass,
$rabbit_host = 'localhost',
$rabbit_hosts = false,
$rabbit_hosts = undef,
$rabbit_password = 'guest',
$rabbit_port = '5672',
$rabbit_userid = 'guest',
$rabbit_virtual_host = '/',
$rabbit_use_ssl = false,
$rabbit_ha_queues = undef,
$rabbit_notification_topic = 'notifications',
$kombu_ssl_ca_certs = undef,
$kombu_ssl_certfile = undef,
$kombu_ssl_keyfile = undef,
$kombu_ssl_version = 'TLSv1',
$amqp_durable_queues = false,
$database_connection = 'sqlite:////var/lib/trove/trove.sqlite',
$database_idle_timeout = 3600,
$rpc_backend = 'trove.openstack.common.rpc.impl_kombu',
$qpid_hostname = 'localhost',
$qpid_port = '5672',
$qpid_username = 'guest',
$qpid_password = 'guest',
$qpid_sasl_mechanisms = false,
$qpid_heartbeat = 60,
$qpid_protocol = 'tcp',
$qpid_tcp_nodelay = true,
$database_connection = undef,
$database_idle_timeout = undef,
$database_max_retries = undef,
$database_retry_interval = undef,
$database_min_pool_size = undef,
$database_max_pool_size = undef,
$database_max_overflow = undef,
$rpc_backend = 'rabbit',
$nova_compute_url = false,
$nova_proxy_admin_user = 'admin',
$nova_proxy_admin_tenant_name = 'admin',
$control_exchange = 'trove',
$cinder_url = false,
$swift_url = false,
$neutron_url = false,
$os_region_name = undef,
$nova_compute_service_type = 'compute',
$cinder_service_type = 'volumev2',
$swift_service_type = 'object-store',
$heat_service_type = 'orchestration',
$neutron_service_type = 'network',
$use_neutron = true,
$package_ensure = 'present',
# DEPRECATED PARAMETERS
@ -229,31 +306,16 @@ class trove(
trove_config { 'DEFAULT/swift_url': ensure => absent }
}
if $::osfamily == 'RedHat' {
# TO-DO(mmagr): Conditional should be removed as soon as following bug
# is really fixed. On Ubuntu trove-common is not installable without already
# running database and correctly filled trove.conf:
# https://bugs.launchpad.net/ubuntu/+source/openstack-trove/+bug/1365561
package { 'trove':
ensure => $package_ensure,
name => $::trove::params::common_package_name
}
$group_require = Package['trove']
} else {
$group_require = undef
if $neutron_url {
trove_config { 'DEFAULT/neutron_url': value => $neutron_url }
}
else {
trove_config { 'DEFAULT/neutron_url': ensure => absent }
}
group { 'trove':
ensure => 'present',
name => 'trove',
system => true,
require => $group_require
package { 'trove':
ensure => $package_ensure,
name => $::trove::params::common_package_name,
tag => ['openstack', 'trove-package'],
}
file { '/etc/trove/':
ensure => directory,
group => 'trove',
require => Group['trove']
}
}

View File

@ -43,6 +43,10 @@
# (optional) Name of the service.
# Defaults to the value of auth_name.
#
# [*service_description*]
# (optional) Description for keystone service.
# Defaults to 'Trove Database Service'.
#
# [*region*]
# Region for endpoint. Defaults to 'RegionOne'.
#
@ -113,25 +117,26 @@
#
class trove::keystone::auth (
$password,
$auth_name = 'trove',
$email = 'trove@localhost',
$tenant = 'services',
$configure_endpoint = true,
$service_name = undef,
$service_type = 'database',
$region = 'RegionOne',
$public_url = 'http://127.0.0.1:8779/v1.0/%(tenant_id)s',
$admin_url = 'http://127.0.0.1:8779/v1.0/%(tenant_id)s',
$internal_url = 'http://127.0.0.1:8779/v1.0/%(tenant_id)s',
$auth_name = 'trove',
$email = 'trove@localhost',
$tenant = 'services',
$configure_endpoint = true,
$service_name = undef,
$service_type = 'database',
$service_description = 'Trove Database Service',
$region = 'RegionOne',
$public_url = 'http://127.0.0.1:8779/v1.0/%(tenant_id)s',
$admin_url = 'http://127.0.0.1:8779/v1.0/%(tenant_id)s',
$internal_url = 'http://127.0.0.1:8779/v1.0/%(tenant_id)s',
# DEPRECATED PARAMETERS
$port = undef,
$public_port = undef,
$public_protocol = undef,
$public_address = undef,
$internal_protocol = undef,
$internal_address = undef,
$admin_protocol = undef,
$admin_address = undef,
$port = undef,
$public_port = undef,
$public_protocol = undef,
$public_address = undef,
$internal_protocol = undef,
$internal_address = undef,
$admin_protocol = undef,
$admin_address = undef,
) {
if $port {
@ -197,7 +202,7 @@ class trove::keystone::auth (
Keystone_user_role["${auth_name}@${tenant}"] ~> Service <| name == 'trove-server' |>
Keystone_endpoint<| title == "${region}/${real_service_name}" |>
Keystone_endpoint<| title == "${region}/${real_service_name}::${service_type}" |>
~> Service <| name == 'trove-server' |>
keystone::resource::service_identity { 'trove':
@ -206,7 +211,7 @@ class trove::keystone::auth (
configure_endpoint => $configure_endpoint,
service_name => $real_service_name,
service_type => $service_type,
service_description => 'Trove Database Service',
service_description => $service_description,
region => $region,
auth_name => $auth_name,
password => $password,

View File

@ -14,6 +14,8 @@ class trove::params {
$guestagent_service_name = 'openstack-trove-guestagent'
$taskmanager_package_name = 'openstack-trove-taskmanager'
$taskmanager_service_name = 'openstack-trove-taskmanager'
$sqlite_package_name = undef
$pymysql_package_name = undef
}
'Debian': {
$client_package_name = 'python-troveclient'
@ -26,6 +28,8 @@ class trove::params {
$guestagent_service_name = 'trove-guestagent'
$taskmanager_package_name = 'trove-taskmanager'
$taskmanager_service_name = 'trove-taskmanager'
$sqlite_package_name = 'python-pysqlite2'
$pymysql_package_name = 'python-pymysql'
}
default: {
fail("Unsupported osfamily: ${::osfamily} operatingsystem")

View File

@ -0,0 +1,43 @@
# == Class: trove::quota
#
# Setup and configure trove quotas.
#
# === Parameters
#
# [*max_instances_per_user*]
# (optional) Default maximum number of instances per tenant.
# Defaults to 5.
#
# [*max_accepted_volume_size*]
# (optional) Default maximum volume size (in GB) for an instance.
# Defaults to 5.
#
# [*max_volumes_per_user*]
# (optional) Default maximum volume capacity (in GB) spanning across
# all Trove volumes per tenant.
# Defaults to 20.
#
# [*max_backups_per_user*]
# (optional) Default maximum number of backups created by a tenant.
# Defaults to 50.
#
# [*quota_driver*]
# (optional) Default driver to use for quota checks.
# Defaults to 'trove.quota.quota.DbQuotaDriver'.
#
class trove::quota (
$max_instances_per_user = 5,
$max_accepted_volume_size = 5,
$max_volumes_per_user = 20,
$max_backups_per_user = 50,
$quota_driver = 'trove.quota.quota.DbQuotaDriver',
) {
trove_config {
'DEFAULT/max_instances_per_user': value => $max_instances_per_user;
'DEFAULT/max_accepted_volume_size': value => $max_accepted_volume_size;
'DEFAULT/max_volumes_per_user': value => $max_volumes_per_user;
'DEFAULT/max_backups_per_user': value => $max_backups_per_user;
'DEFAULT/quota_driver': value => $quota_driver;
}
}

View File

@ -1,106 +0,0 @@
# == Class: trove::rabbitmq
#
# Installs and manages rabbitmq server for trove
#
# == Parameters:
#
# [*userid*]
# (optional) The username to use when connecting to Rabbit
# Defaults to 'guest'
#
# [*password*]
# (optional) The password to use when connecting to Rabbit
# Defaults to 'guest'
#
# [*port*]
# (optional) The port to use when connecting to Rabbit
# Defaults to '5672'
#
# [*virtual_host*]
# (optional) The virtual host to use when connecting to Rabbit
# Defaults to '/'
#
# [*cluster_disk_nodes*]
# (optional) Enables/disables RabbitMQ clustering. Specify an array of Rabbit Broker
# IP addresses to configure clustering.
# Defaults to false
#
# [*enabled*]
# (optional) Whether to enable the Rabbit service
# Defaults to false
#
# [*rabbitmq_class*]
# (optional) Deprecated. The rabbitmq puppet class to depend on,
# which is dependent on the puppet-rabbitmq version.
# Use the default for 1.x, use 'rabbitmq' for 3.x.
# Use false if rabbitmq class should not be configured
# here
# Defaults to 'rabbitmq::server'
#
class trove::rabbitmq(
$userid ='guest',
$password ='guest',
$port ='55671',
$virtual_host ='/',
$cluster_disk_nodes = false,
$enabled = true,
# DEPRECATED PARAMETER
$rabbitmq_class = 'rabbitmq::server'
) {
if ($enabled) {
if $userid == 'guest' {
$delete_guest_user = false
} else {
$delete_guest_user = true
rabbitmq_user { $userid:
admin => true,
password => $password,
provider => 'rabbitmqctl',
}
# I need to figure out the appropriate permissions
rabbitmq_user_permissions { "${userid}@${virtual_host}":
configure_permission => '.*',
write_permission => '.*',
read_permission => '.*',
provider => 'rabbitmqctl',
}->Anchor<| title == 'trove-start' |>
}
$service_ensure = 'running'
} else {
$service_ensure = 'stopped'
}
# NOTE(bogdando) do not trove manage rabbitmq service
# if rabbitmq_class is set to False
if $rabbitmq_class {
warning('The rabbitmq_class parameter is deprecated.')
if $cluster_disk_nodes {
class { $rabbitmq_class:
service_ensure => $service_ensure,
port => $port,
delete_guest_user => $delete_guest_user,
config_cluster => true,
cluster_disk_nodes => $cluster_disk_nodes,
wipe_db_on_cookie_change => true,
}
} else {
class { $rabbitmq_class:
service_ensure => $service_ensure,
port => $port,
delete_guest_user => $delete_guest_user,
}
}
Class[$rabbitmq_class] -> Rabbitmq_user<| title == $userid |>
Class[$rabbitmq_class] -> Rabbitmq_vhost<| title == $virtual_host |>
# only configure trove after the queue is up
Class[$rabbitmq_class] -> Anchor<| title == 'trove-start' |>
}
if ($enabled) {
rabbitmq_vhost { $virtual_host:
provider => 'rabbitmqctl',
}
}
}

View File

@ -69,21 +69,36 @@
#
# [*guestagent_config_file*]
# (optional) Trove guest agent configuration file.
# Defaults to '/etc/trove/trove-guestmanager.conf'.
# Defaults to '/etc/trove/trove-guestagent.conf'.
#
# [*use_guestagent_template*]
# (optional) Use template to provision trove guest agent configuration file.
# Defaults to true.
#
# [*default_neutron_networks*]
# (optional) The network that trove will attach by default.
# Defaults to undef.
#
# [*taskmanager_queue*]
# (optional) Message queue name the Taskmanager will listen to.
# Defaults to 'taskmanager'.
#
class trove::taskmanager(
$enabled = true,
$manage_service = true,
$debug = false,
$verbose = false,
$log_file = '/var/log/trove/trove-taskmanager.log',
$log_dir = '/var/log/trove',
$use_syslog = false,
$log_facility = 'LOG_USER',
$auth_url = 'http://localhost:5000/v2.0',
$heat_url = false,
$ensure_package = 'present',
$guestagent_config_file = '/etc/trove/trove-guestmanager.conf'
$enabled = true,
$manage_service = true,
$debug = false,
$verbose = false,
$log_file = '/var/log/trove/trove-taskmanager.log',
$log_dir = '/var/log/trove',
$use_syslog = false,
$log_facility = 'LOG_USER',
$auth_url = 'http://localhost:5000/v2.0',
$heat_url = false,
$ensure_package = 'present',
$guestagent_config_file = '/etc/trove/trove-guestagent.conf',
$use_guestagent_template = true,
$default_neutron_networks = undef,
$taskmanager_queue = 'taskmanager',
) inherits trove {
include ::trove::params
@ -117,28 +132,60 @@ class trove::taskmanager(
'DEFAULT/nova_proxy_admin_user': value => $::trove::nova_proxy_admin_user;
'DEFAULT/nova_proxy_admin_pass': value => $::trove::nova_proxy_admin_pass;
'DEFAULT/nova_proxy_admin_tenant_name': value => $::trove::nova_proxy_admin_tenant_name;
'DEFAULT/rpc_backend': value => $::trove::rpc_backend;
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' {
trove_config {
'DEFAULT/taskmanager_queue': value => $taskmanager_queue;
}
# region name
if $::trove::os_region_name {
trove_taskmanager_config { 'DEFAULT/os_region_name': value => $::trove::os_region_name }
}
else {
trove_taskmanager_config {'DEFAULT/os_region_name': ensure => absent }
}
# services type
trove_taskmanager_config {
'DEFAULT/nova_compute_service_type': value => $::trove::nova_compute_service_type;
'DEFAULT/cinder_service_type': value => $::trove::cinder_service_type;
'DEFAULT/neutron_service_type': value => $::trove::neutron_service_type;
'DEFAULT/swift_service_type': value => $::trove::swift_service_type;
'DEFAULT/heat_service_type': value => $::trove::heat_service_type;
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_kombu' or $::trove::rpc_backend == 'rabbit'{
if ! $::trove::rabbit_password {
fail('When rpc_backend is rabbitmq, you must set rabbit password')
}
if $::trove::rabbit_hosts {
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_hosts': value => join($::trove::rabbit_hosts, ',') }
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_hosts': value => $::trove::rabbit_hosts }
} else {
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_host': value => $::trove::rabbit_host }
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_port': value => $::trove::rabbit_port }
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_hosts': value => "${::trove::rabbit_host}:${::trove::rabbit_port}" }
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
if $::trove::rabbit_ha_queues == undef {
if size($::trove::rabbit_hosts) > 1 {
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => true }
} else {
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => false }
}
} else {
trove_taskmanager_config { 'oslo_messaging_rabbit/rabbit_ha_queues': value => $::trove::rabbit_ha_queues }
}
trove_taskmanager_config {
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_user;
'oslo_messaging_rabbit/rabbit_userid': value => $::trove::rabbit_userid;
'oslo_messaging_rabbit/rabbit_password': value => $::trove::rabbit_password, secret => true;
'oslo_messaging_rabbit/rabbit_virtual_host': value => $::trove::rabbit_virtual_host;
'oslo_messaging_rabbit/rabbit_use_ssl': value => $::trove::rabbit_use_ssl;
'oslo_messaging_rabbit/kombu_reconnect_delay': value => $::trove::kombu_reconnect_delay;
# TODO(shaikapsar): remove the below lines once bug/1486319 merged to stable/liberty.
'oslo_messaging_rabbit/amqp_durable_queues': value => $::trove::amqp_durable_queues;
}
if $::trove::rabbit_use_ssl {
@ -177,19 +224,22 @@ class trove::taskmanager(
}
}
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' {
if $::trove::rpc_backend == 'trove.openstack.common.rpc.impl_qpid' or $::trove::rpc_backend == 'qpid'{
warning('Qpid driver is removed from Oslo.messaging in the Mitaka release')
trove_taskmanager_config {
'DEFAULT/qpid_hostname': value => $::trove::qpid_hostname;
'DEFAULT/qpid_port': value => $::trove::qpid_port;
'DEFAULT/qpid_username': value => $::trove::qpid_username;
'DEFAULT/qpid_password': value => $::trove::qpid_password, secret => true;
'DEFAULT/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'DEFAULT/qpid_protocol': value => $::trove::qpid_protocol;
'DEFAULT/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
'oslo_messaging_qpid/qpid_hostname': value => $::trove::qpid_hostname;
'oslo_messaging_qpid/qpid_port': value => $::trove::qpid_port;
'oslo_messaging_qpid/qpid_username': value => $::trove::qpid_username;
'oslo_messaging_qpid/qpid_password': value => $::trove::qpid_password, secret => true;
'oslo_messaging_qpid/qpid_heartbeat': value => $::trove::qpid_heartbeat;
'oslo_messaging_qpid/qpid_protocol': value => $::trove::qpid_protocol;
'oslo_messaging_qpid/qpid_tcp_nodelay': value => $::trove::qpid_tcp_nodelay;
}
if is_array($::trove::qpid_sasl_mechanisms) {
trove_taskmanager_config {
'DEFAULT/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
'oslo_messaging_qpid/qpid_sasl_mechanisms': value => join($::trove::qpid_sasl_mechanisms, ' ');
}
}
}
@ -198,28 +248,28 @@ class trove::taskmanager(
trove_config {
'DEFAULT/network_label_regex': value => '.*';
'DEFAULT/network_driver': value => 'trove.network.neutron.NeutronDriver';
'DEFAULT/default_neutron_networks': value => $default_neutron_networks;
}
trove_taskmanager_config {
'DEFAULT/network_label_regex': value => '.*';
'DEFAULT/network_driver': value => 'trove.network.neutron.NeutronDriver';
'DEFAULT/default_neutron_networks': value => $default_neutron_networks;
}
} else {
trove_config {
'DEFAULT/network_label_regex': value => '^private$';
'DEFAULT/network_driver': value => 'trove.network.nova.NovaNetwork';
'DEFAULT/default_neutron_networks': ensure => absent;
}
trove_taskmanager_config {
'DEFAULT/network_label_regex': value => '^private$';
'DEFAULT/network_driver': value => 'trove.network.nova.NovaNetwork';
'DEFAULT/default_neutron_networks': ensure => absent;
}
}
trove_config {
'DEFAULT/taskmanager_queue': value => 'taskmanager';
}
# Logging
if $log_file {
trove_taskmanager_config {
@ -261,9 +311,13 @@ class trove::taskmanager(
ensure_package => $ensure_package,
}
# (shaikapsar): Remove ::trove::guestagent declaraion from here.
if $guestagent_config_file {
file { $guestagent_config_file:
content => template('trove/trove-guestagent.conf.erb')
if $use_guestagent_template {
file { $guestagent_config_file:
content => template('trove/trove-guestagent.conf.erb'),
require => Package[$::trove::params::taskmanager_package_name]
}
}
trove_taskmanager_config {
@ -278,4 +332,9 @@ class trove::taskmanager(
'DEFAULT/exists_notification_transformer': ensure => absent,
}
}
trove_taskmanager_config {
'DEFAULT/use_nova_server_config_drive': value => true,
}
}

View File

@ -1,6 +1,6 @@
{
"name": "openstack-trove",
"version": "6.1.0",
"version": "7.1.0",
"author": "eNovance and OpenStack Contributors",
"summary": "Puppet module for OpenStack Trove",
"license": "Apache-2.0",
@ -32,8 +32,8 @@
"description": "Installs and configures OpenStack Trove (Database service).",
"dependencies": [
{ "name": "puppetlabs/inifile", "version_requirement": ">=1.0.0 <2.0.0" },
{ "name": "openstack/keystone", "version_requirement": ">=6.0.0 <7.0.0" },
{ "name": "openstack/keystone", "version_requirement": ">=7.1.0 <8.0.0" },
{ "name": "puppetlabs/stdlib", "version_requirement": ">=4.0.0 <5.0.0" },
{ "name": "openstack/openstacklib", "version_requirement": ">=6.0.0 <7.0.0" }
{ "name": "openstack/openstacklib", "version_requirement": ">=7.1.0 <8.0.0" }
]
}

View File

@ -6,41 +6,11 @@ describe 'basic trove' do
it 'should work with no errors' do
pp= <<-EOS
Exec { logoutput => 'on_failure' }
# Common resources
case $::osfamily {
'Debian': {
include ::apt
class { '::openstack_extras::repo::debian::ubuntu':
release => 'kilo',
package_require => true,
}
$package_provider = 'apt'
}
'RedHat': {
class { '::openstack_extras::repo::redhat::redhat':
release => 'kilo',
}
package { 'openstack-selinux': ensure => 'latest' }
$package_provider = 'yum'
}
default: {
fail("Unsupported osfamily (${::osfamily})")
}
}
class { '::mysql::server': }
class { '::rabbitmq':
delete_guest_user => true,
package_provider => $package_provider,
}
rabbitmq_vhost { '/':
provider => 'rabbitmqctl',
require => Class['rabbitmq'],
}
include ::openstack_integration
include ::openstack_integration::repos
include ::openstack_integration::rabbitmq
include ::openstack_integration::mysql
include ::openstack_integration::keystone
rabbitmq_user { 'trove':
admin => true,
@ -57,29 +27,9 @@ describe 'basic trove' do
require => Class['rabbitmq'],
}
# Keystone resources, needed by Trove to run
class { '::keystone::db::mysql':
password => 'keystone',
}
class { '::keystone':
verbose => true,
debug => true,
database_connection => 'mysql://keystone:keystone@127.0.0.1/keystone',
admin_token => 'admin_token',
enabled => true,
}
class { '::keystone::roles::admin':
email => 'test@example.tld',
password => 'a_big_secret',
}
class { '::keystone::endpoint':
public_url => "https://${::fqdn}:5000/",
admin_url => "https://${::fqdn}:35357/",
}
# Trove resources
class { '::trove':
database_connection => 'mysql://trove:a_big_secret@127.0.0.1/trove?charset=utf8',
database_connection => 'mysql+pymysql://trove:a_big_secret@127.0.0.1/trove?charset=utf8',
rabbit_userid => 'trove',
rabbit_password => 'an_even_bigger_secret',
rabbit_host => '127.0.0.1',
@ -94,10 +44,19 @@ describe 'basic trove' do
class { '::trove::api':
keystone_password => 'a_big_secret',
auth_url => 'http://127.0.0.1:35357/',
debug => true,
verbose => true,
}
class { '::trove::client': }
class { '::trove::conductor': }
class { '::trove::taskmanager': }
class { '::trove::conductor':
debug => true,
verbose => true,
}
class { '::trove::taskmanager':
debug => true,
verbose => true,
}
class { '::trove::quota': }
EOS

View File

@ -0,0 +1,11 @@
HOSTS:
centos-server-70-x64:
roles:
- master
platform: el-7-x86_64
box: puppetlabs/centos-7.0-64-nocm
box_url: https://vagrantcloud.com/puppetlabs/centos-7.0-64-nocm
hypervisor: vagrant
CONFIG:
log_level: debug
type: foss

View File

@ -1,9 +1,10 @@
HOSTS:
ubuntu-14.04-amd64:
ubuntu-server-14.04-amd64:
roles:
- master
platform: ubuntu-14.04-amd64
hypervisor : none
ip: 127.0.0.1
box: puppetlabs/ubuntu-14.04-64-nocm
box_url: https://vagrantcloud.com/puppetlabs/ubuntu-14.04-64-nocm
hypervisor: vagrant
CONFIG:
type: foss

View File

@ -3,7 +3,7 @@ HOSTS:
roles:
- master
platform: el-7-x86_64
hypervisor : none
hypervisor: none
ip: 127.0.0.1
CONFIG:
type: foss

View File

@ -3,7 +3,7 @@ HOSTS:
roles:
- master
platform: ubuntu-14.04-amd64
hypervisor : none
hypervisor: none
ip: 127.0.0.1
CONFIG:
type: foss

View File

@ -0,0 +1,11 @@
HOSTS:
ubuntu-server-14.04-amd64:
roles:
- master
platform: ubuntu-14.04-amd64
box: puppetlabs/ubuntu-14.04-64-nocm
box_url: https://vagrantcloud.com/puppetlabs/ubuntu-14.04-64-nocm
hypervisor: vagrant
CONFIG:
log_level: debug
type: foss

View File

@ -38,7 +38,13 @@ describe 'trove::api' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete'}"
nova_proxy_admin_pass => 'verysecrete',
os_region_name => 'RegionOne',
nova_compute_service_type => 'compute',
cinder_service_type => 'volume',
swift_service_type => 'object-store',
heat_service_type => 'orchestration',
neutron_service_type => 'network'}"
end
it 'installs trove-api package and service' do
@ -72,6 +78,38 @@ describe 'trove::api' do
is_expected.to contain_trove_config('keystone_authtoken/admin_tenant_name').with_value('_services_')
is_expected.to contain_trove_config('keystone_authtoken/admin_user').with_value('trove')
is_expected.to contain_trove_config('keystone_authtoken/admin_password').with_value('passw0rd')
is_expected.to contain_trove_config('DEFAULT/os_region_name').with_value('RegionOne')
is_expected.to contain_trove_config('DEFAULT/nova_compute_service_type').with_value('compute')
is_expected.to contain_trove_config('DEFAULT/cinder_service_type').with_value('volume')
is_expected.to contain_trove_config('DEFAULT/swift_service_type').with_value('object-store')
is_expected.to contain_trove_config('DEFAULT/heat_service_type').with_value('orchestration')
is_expected.to contain_trove_config('DEFAULT/neutron_service_type').with_value('network')
is_expected.to contain_trove_config('DEFAULT/http_get_rate').with_value('200')
is_expected.to contain_trove_config('DEFAULT/http_post_rate').with_value('200')
is_expected.to contain_trove_config('DEFAULT/http_put_rate').with_value('200')
is_expected.to contain_trove_config('DEFAULT/http_delete_rate').with_value('200')
is_expected.to contain_trove_config('DEFAULT/http_mgmt_post_rate').with_value('200')
end
context 'with overridden rate limit parameters' do
before :each do
params.merge!(
:http_get_rate => '1000',
:http_post_rate => '1000',
:http_put_rate => '1000',
:http_delete_rate => '1000',
:http_mgmt_post_rate => '2000',
)
end
it 'contains overrided rate limit values' do
is_expected.to contain_trove_config('DEFAULT/http_get_rate').with_value('1000')
is_expected.to contain_trove_config('DEFAULT/http_post_rate').with_value('1000')
is_expected.to contain_trove_config('DEFAULT/http_put_rate').with_value('1000')
is_expected.to contain_trove_config('DEFAULT/http_delete_rate').with_value('1000')
is_expected.to contain_trove_config('DEFAULT/http_mgmt_post_rate').with_value('2000')
end
end
context 'when using a single RabbitMQ server' do
@ -82,6 +120,23 @@ describe 'trove::api' do
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('false')
is_expected.to contain_trove_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('false')
end
end
context 'when using a single RabbitMQ server with enable ha options' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rabbit_ha_queues => 'true',
amqp_durable_queues => 'true',
rabbit_host => '10.0.0.1'}"
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
is_expected.to contain_trove_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('true')
end
end
@ -93,19 +148,47 @@ describe 'trove::api' do
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_config('oslo_messaging_rabbit/rabbit_hosts').with_value(['10.0.0.1,10.0.0.2'])
is_expected.to contain_trove_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
end
end
context 'when using MySQL' do
context 'when using qpid' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
database_connection => 'mysql://trove:pass@10.0.0.1/trove'}"
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password'}"
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_config('database/connection').with_value('mysql://trove:pass@10.0.0.1/trove')
it 'configures trove-api with qpid' do
is_expected.to contain_trove_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_protocol').with_value('tcp')
end
end
context 'when using qpid with SSL enabled' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password',
qpid_protocol => 'ssl'}"
end
it 'configures trove-api with qpid' do
is_expected.to contain_trove_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_config('oslo_messaging_qpid/qpid_protocol').with_value('ssl')
end
end
end
context 'with SSL enabled with kombu' do

View File

@ -41,6 +41,23 @@ describe 'trove::conductor' do
end
it 'configures trove-conductor with RabbitMQ' do
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('false')
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('false')
end
end
context 'when using a single RabbitMQ server with enable ha options' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rabbit_ha_queues => 'true',
amqp_durable_queues => 'true',
rabbit_host => '10.0.0.1'}"
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('true')
end
end
@ -52,6 +69,44 @@ describe 'trove::conductor' do
end
it 'configures trove-conductor with RabbitMQ' do
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/rabbit_hosts').with_value(['10.0.0.1,10.0.0.2'])
is_expected.to contain_trove_conductor_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
end
end
context 'when using qpid' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password'}"
end
it 'configures trove-conductor with qpid' do
is_expected.to contain_trove_conductor_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_protocol').with_value('tcp')
end
end
context 'when using qpid with SSL enabled' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password',
qpid_protocol => 'ssl'}"
end
it 'configures trove-conductor with qpid' do
is_expected.to contain_trove_conductor_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_conductor_config('oslo_messaging_qpid/qpid_protocol').with_value('ssl')
end
end

View File

@ -0,0 +1,119 @@
require 'spec_helper'
describe 'trove::db' do
shared_examples 'trove::db' do
context 'with default parameters' do
it { is_expected.to contain_trove_config('database/connection').with_value('sqlite:////var/lib/trove/trove.sqlite').with_secret(true) }
it { is_expected.to contain_trove_config('database/idle_timeout').with_value('3600') }
it { is_expected.to contain_trove_config('database/min_pool_size').with_value('1') }
it { is_expected.to contain_trove_config('database/max_pool_size').with_value('10') }
it { is_expected.to contain_trove_config('database/max_overflow').with_value('20') }
it { is_expected.to contain_trove_config('database/max_retries').with_value('10') }
it { is_expected.to contain_trove_config('database/retry_interval').with_value('10') }
end
context 'with specific parameters' do
let :params do
{ :database_connection => 'mysql+pymysql://trove:trove@localhost/trove',
:database_idle_timeout => '3601',
:database_min_pool_size => '2',
:database_max_pool_size => '21',
:database_max_retries => '11',
:database_max_overflow => '21',
:database_retry_interval => '11', }
end
it { is_expected.to contain_trove_config('database/connection').with_value('mysql+pymysql://trove:trove@localhost/trove').with_secret(true) }
it { is_expected.to contain_trove_config('database/idle_timeout').with_value('3601') }
it { is_expected.to contain_trove_config('database/min_pool_size').with_value('2') }
it { is_expected.to contain_trove_config('database/max_retries').with_value('11') }
it { is_expected.to contain_trove_config('database/max_pool_size').with_value('21') }
it { is_expected.to contain_trove_config('database/max_overflow').with_value('21') }
it { is_expected.to contain_trove_config('database/retry_interval').with_value('11') }
end
context 'with MySQL-python library as backend package' do
let :params do
{ :database_connection => 'mysql://trove:trove@localhost/trove', }
end
it { is_expected.to contain_package('python-mysqldb').with(:ensure => 'present') }
end
context 'with postgresql backend' do
let :params do
{ :database_connection => 'postgresql://trove:trove@localhost/trove', }
end
it 'install the proper backend package' do
is_expected.to contain_package('python-psycopg2').with(:ensure => 'present')
end
end
context 'with incorrect database_connection string' do
let :params do
{ :database_connection => 'redis://trove:trove@localhost/trove', }
end
it_raises 'a Puppet::Error', /validate_re/
end
context 'with incorrect pymysql database_connection string' do
let :params do
{ :database_connection => 'foo+pymysql://trove:trove@localhost/trove', }
end
it_raises 'a Puppet::Error', /validate_re/
end
end
context 'on Debian platforms' do
let :facts do
{ :osfamily => 'Debian',
:operatingsystem => 'Debian',
:operatingsystemrelease => 'jessie',
}
end
it_configures 'trove::db'
context 'using pymysql driver' do
let :params do
{ :database_connection => 'mysql+pymysql://trove:trove@localhost/trove', }
end
it 'install the proper backend package' do
is_expected.to contain_package('trove-backend-package').with(
:ensure => 'present',
:name => 'python-pymysql',
:tag => 'openstack'
)
end
end
end
context 'on Redhat platforms' do
let :facts do
{ :osfamily => 'RedHat',
:operatingsystemrelease => '7.1',
}
end
it_configures 'trove::db'
context 'using pymysql driver' do
let :params do
{ :database_connection => 'mysql+pymysql://trove:trove@localhost/trove', }
end
it { is_expected.not_to contain_package('trove-backend-package') }
end
end
end

View File

@ -8,6 +8,7 @@ describe 'trove::guestagent' do
let :pre_condition do
"class { 'trove':
os_region_name => 'RegionOne',
nova_proxy_admin_pass => 'verysecrete'}"
end
@ -28,9 +29,11 @@ describe 'trove::guestagent' do
it 'configures trove-guestagent with default parameters' do
is_expected.to contain_trove_guestagent_config('DEFAULT/verbose').with_value(false)
is_expected.to contain_trove_guestagent_config('DEFAULT/debug').with_value(false)
is_expected.to contain_trove_guestagent_config('DEFAULT/nova_proxy_admin_user').with_value('admin')
is_expected.to contain_trove_guestagent_config('DEFAULT/nova_proxy_admin_pass').with_value('verysecrete')
is_expected.to contain_trove_guestagent_config('DEFAULT/nova_proxy_admin_tenant_name').with_value('admin')
is_expected.to contain_trove_guestagent_config('DEFAULT/os_region_name').with_value('RegionOne')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_host').with_value('localhost')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_hosts').with_value(false)
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_port').with_value('5672')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_use_ssl').with_value(false)
end
context 'when using a single RabbitMQ server' do
@ -41,6 +44,23 @@ describe 'trove::guestagent' do
end
it 'configures trove-guestagent with RabbitMQ' do
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('false')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('false')
end
end
context 'when using a single RabbitMQ server with enable ha options' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rabbit_ha_queues => 'true',
amqp_durable_queues => 'true',
rabbit_host => '10.0.0.1'}"
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('true')
end
end
@ -52,6 +72,44 @@ describe 'trove::guestagent' do
end
it 'configures trove-guestagent with RabbitMQ' do
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_hosts').with_value(['10.0.0.1,10.0.0.2'])
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
end
end
context 'when using qpid' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password'}"
end
it 'configures trove-guestagent with qpid' do
is_expected.to contain_trove_guestagent_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_protocol').with_value('tcp')
end
end
context 'when using qpid with SSL enabled' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password',
qpid_protocol => 'ssl'}"
end
it 'configures trove-guestagent with qpid' do
is_expected.to contain_trove_guestagent_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_guestagent_config('oslo_messaging_qpid/qpid_protocol').with_value('ssl')
end
end
end
@ -64,11 +122,17 @@ describe 'trove::guestagent' do
let :params do
{ :auth_url => "http://10.0.0.1:5000/v2.0",
:swift_url => "http://10.0.0.1:8080/v1/AUTH_" }
:swift_url => "http://10.0.0.1:8080/v1/AUTH_",
:rabbit_host => '10.1.0.1',
:rabbit_port => '5673',
:rabbit_use_ssl => 'true'}
end
it 'configures trove-guestagent with custom parameters' do
is_expected.to contain_trove_guestagent_config('DEFAULT/trove_auth_url').with_value('http://10.0.0.1:5000/v2.0')
is_expected.to contain_trove_guestagent_config('DEFAULT/swift_url').with_value('http://10.0.0.1:8080/v1/AUTH_')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_host').with_value('10.1.0.1')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_port').with_value('5673')
is_expected.to contain_trove_guestagent_config('oslo_messaging_rabbit/rabbit_use_ssl').with_value('true')
end
end

View File

@ -23,10 +23,12 @@ require 'spec_helper'
describe 'trove' do
let :params do
{ :nova_proxy_admin_pass => 'passw0rd',
:nova_compute_url => 'http://localhost:8774/v2',
:cinder_url => 'http://localhost:8776/v1',
:swift_url => 'http://localhost:8080/v1/AUTH_' }
{ :nova_proxy_admin_pass => 'passw0rd',
:nova_compute_url => 'http://localhost:8774/v2',
:cinder_url => 'http://localhost:8776/v1',
:swift_url => 'http://localhost:8080/v1/AUTH_',
:neutron_url => 'http://localhost:9696/',
}
end
shared_examples_for 'trove' do
@ -37,6 +39,7 @@ describe 'trove' do
is_expected.to contain_trove_config('DEFAULT/nova_compute_url').with_value('http://localhost:8774/v2')
is_expected.to contain_trove_config('DEFAULT/cinder_url').with_value('http://localhost:8776/v1')
is_expected.to contain_trove_config('DEFAULT/swift_url').with_value('http://localhost:8080/v1/AUTH_')
is_expected.to contain_trove_config('DEFAULT/neutron_url').with_value('http://localhost:9696/')
}
end
end
@ -55,9 +58,10 @@ describe 'trove' do
end
it 'installs common package' do
should contain_package('trove').with(
is_expected.to contain_package('trove').with(
:name => 'openstack-trove',
:ensure => 'present',
:tag => ['openstack', 'trove-package'],
)
end

View File

@ -35,7 +35,6 @@ describe 'trove::keystone::auth' do
it { is_expected.to contain_keystone_user('trove').with(
:ensure => 'present',
:password => 'trove_password',
:tenant => 'foobar'
) }
it { is_expected.to contain_keystone_user_role('trove@foobar').with(
@ -43,13 +42,12 @@ describe 'trove::keystone::auth' do
:roles => ['admin']
)}
it { is_expected.to contain_keystone_service('trove').with(
it { is_expected.to contain_keystone_service('trove::database').with(
:ensure => 'present',
:type => 'database',
:description => 'Trove Database Service'
) }
it { is_expected.to contain_keystone_endpoint('RegionOne/trove').with(
it { is_expected.to contain_keystone_endpoint('RegionOne/trove::database').with(
:ensure => 'present',
:public_url => "http://127.0.0.1:8779/v1.0/%(tenant_id)s",
:admin_url => "http://127.0.0.1:8779/v1.0/%(tenant_id)s",
@ -76,7 +74,7 @@ describe 'trove::keystone::auth' do
:admin_url => 'http://10.10.10.12:81/v1.0/%(tenant_id)s' }
end
it { is_expected.to contain_keystone_endpoint('RegionOne/trove').with(
it { is_expected.to contain_keystone_endpoint('RegionOne/trove::database').with(
:ensure => 'present',
:public_url => 'https://10.10.10.10:80/v1.0/%(tenant_id)s',
:internal_url => 'http://10.10.10.11:81/v1.0/%(tenant_id)s',
@ -97,7 +95,7 @@ describe 'trove::keystone::auth' do
:admin_address => '10.10.10.12' }
end
it { is_expected.to contain_keystone_endpoint('RegionOne/trove').with(
it { is_expected.to contain_keystone_endpoint('RegionOne/trove::database').with(
:ensure => 'present',
:public_url => 'https://10.10.10.10:80/v1.0/%(tenant_id)s',
:internal_url => 'https://10.10.10.11:81/v1.0/%(tenant_id)s',
@ -113,8 +111,8 @@ describe 'trove::keystone::auth' do
it { is_expected.to contain_keystone_user('trovey') }
it { is_expected.to contain_keystone_user_role('trovey@services') }
it { is_expected.to contain_keystone_service('trovey') }
it { is_expected.to contain_keystone_endpoint('RegionOne/trovey') }
it { is_expected.to contain_keystone_service('trovey::database') }
it { is_expected.to contain_keystone_endpoint('RegionOne/trovey::database') }
end
describe 'when overriding service name' do
@ -126,8 +124,8 @@ describe 'trove::keystone::auth' do
it { is_expected.to contain_keystone_user('trove') }
it { is_expected.to contain_keystone_user_role('trove@services') }
it { is_expected.to contain_keystone_service('trove_service') }
it { is_expected.to contain_keystone_endpoint('RegionOne/trove_service') }
it { is_expected.to contain_keystone_service('trove_service::database') }
it { is_expected.to contain_keystone_endpoint('RegionOne/trove_service::database') }
end
describe 'when disabling endpoint configuration' do
@ -136,6 +134,6 @@ describe 'trove::keystone::auth' do
:password => 'trove_password' }
end
it { is_expected.to_not contain_keystone_endpoint('RegionOne/neutron') }
it { is_expected.to_not contain_keystone_endpoint('RegionOne/neutron::database') }
end
end

View File

@ -0,0 +1,39 @@
require 'spec_helper'
describe 'trove::quota' do
describe 'with default parameters' do
it 'contains default values' do
is_expected.to contain_trove_config('DEFAULT/max_instances_per_user').with(
:value => 5)
is_expected.to contain_trove_config('DEFAULT/max_accepted_volume_size').with(
:value => 5)
is_expected.to contain_trove_config('DEFAULT/max_volumes_per_user').with(
:value => 20)
is_expected.to contain_trove_config('DEFAULT/max_backups_per_user').with(
:value => 50)
is_expected.to contain_trove_config('DEFAULT/quota_driver').with(
:value => 'trove.quota.quota.DbQuotaDriver')
end
end
describe 'with overridden parameters' do
let :params do
{ :max_instances_per_user => 10,
:max_accepted_volume_size => 10,
:max_volumes_per_user => 100,
:max_backups_per_user => 100,
}
end
it 'contains overrided values' do
is_expected.to contain_trove_config('DEFAULT/max_instances_per_user').with(
:value => 10)
is_expected.to contain_trove_config('DEFAULT/max_accepted_volume_size').with(
:value => 10)
is_expected.to contain_trove_config('DEFAULT/max_volumes_per_user').with(
:value => 100)
is_expected.to contain_trove_config('DEFAULT/max_backups_per_user').with(
:value => 100)
end
end
end

View File

@ -27,7 +27,13 @@ describe 'trove::taskmanager' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete'}"
nova_proxy_admin_pass => 'verysecrete',
os_region_name => 'RegionOne',
nova_compute_service_type => 'compute',
cinder_service_type => 'volume',
swift_service_type => 'object-store',
heat_service_type => 'orchestration',
neutron_service_type => 'network'}"
end
it 'installs trove-taskmanager package and service' do
@ -50,6 +56,31 @@ describe 'trove::taskmanager' do
is_expected.to contain_trove_taskmanager_config('DEFAULT/nova_proxy_admin_user').with_value('admin')
is_expected.to contain_trove_taskmanager_config('DEFAULT/nova_proxy_admin_pass').with_value('verysecrete')
is_expected.to contain_trove_taskmanager_config('DEFAULT/nova_proxy_admin_tenant_name').with_value('admin')
is_expected.to contain_trove_taskmanager_config('DEFAULT/default_neutron_networks').with_value(nil)
is_expected.to contain_trove_config('DEFAULT/default_neutron_networks').with_value(nil)
is_expected.to contain_trove_taskmanager_config('DEFAULT/os_region_name').with_value('RegionOne')
is_expected.to contain_trove_taskmanager_config('DEFAULT/nova_compute_service_type').with_value('compute')
is_expected.to contain_trove_taskmanager_config('DEFAULT/cinder_service_type').with_value('volume')
is_expected.to contain_trove_taskmanager_config('DEFAULT/swift_service_type').with_value('object-store')
is_expected.to contain_trove_taskmanager_config('DEFAULT/heat_service_type').with_value('orchestration')
is_expected.to contain_trove_taskmanager_config('DEFAULT/neutron_service_type').with_value('network')
is_expected.to contain_trove_config('DEFAULT/taskmanager_queue').with_value('taskmanager')
is_expected.to contain_file('/etc/trove/trove-guestagent.conf')
end
context 'when set use_guestagent_template to false' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',}
class { 'trove::taskmanager':
use_guestagent_template => false,}"
end
it 'configures trove-taskmanager with trove::guestagent' do
is_expected.to contain_class('trove::guestagent').with(
:enabled => false,
:manage_service => false,
)
end
end
context 'when using a single RabbitMQ server' do
@ -60,6 +91,23 @@ describe 'trove::taskmanager' do
end
it 'configures trove-taskmanager with RabbitMQ' do
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('false')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('false')
end
end
context 'when using a single RabbitMQ server with enable ha options' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rabbit_ha_queues => 'true',
amqp_durable_queues => 'true'
rabbit_host => '10.0.0.1'}"
end
it 'configures trove-api with RabbitMQ' do
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/rabbit_host').with_value('10.0.0.1')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/amqp_durable_queues').with_value('true')
end
end
@ -71,6 +119,44 @@ describe 'trove::taskmanager' do
end
it 'configures trove-taskmanager with RabbitMQ' do
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/rabbit_hosts').with_value(['10.0.0.1,10.0.0.2'])
is_expected.to contain_trove_taskmanager_config('oslo_messaging_rabbit/rabbit_ha_queues').with_value('true')
end
end
context 'when using qpid' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password'}"
end
it 'configures trove-taskmanager with qpid' do
is_expected.to contain_trove_taskmanager_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_protocol').with_value('tcp')
end
end
context 'when using qpid with SSL enabled' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
rpc_backend => 'qpid',
qpid_hostname => '10.0.0.1',
qpid_username => 'guest',
qpid_password => 'password',
qpid_protocol => 'ssl'}"
end
it 'configures trove-taskmanager with qpid' do
is_expected.to contain_trove_taskmanager_config('DEFAULT/rpc_backend').with_value('qpid')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_hostname').with_value('10.0.0.1')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_username').with_value('guest')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_password').with_value('password')
is_expected.to contain_trove_taskmanager_config('oslo_messaging_qpid/qpid_protocol').with_value('ssl')
end
end
@ -88,12 +174,18 @@ describe 'trove::taskmanager' do
context 'when using Neutron' do
let :pre_condition do
"class { 'trove':
nova_proxy_admin_pass => 'verysecrete',
use_neutron => true}"
nova_proxy_admin_pass => 'verysecrete',
use_neutron => true}
class { 'trove::taskmanager':
default_neutron_networks => 'trove_service',
}
"
end
it 'configures trove to use the Neutron network driver' do
is_expected.to contain_trove_config('DEFAULT/default_neutron_networks').with_value('trove_service')
is_expected.to contain_trove_taskmanager_config('DEFAULT/default_neutron_networks').with_value('trove_service')
is_expected.to contain_trove_config('DEFAULT/network_driver').with_value('trove.network.neutron.NeutronDriver')
is_expected.to contain_trove_taskmanager_config('DEFAULT/network_driver').with_value('trove.network.neutron.NeutronDriver')

View File

@ -11,13 +11,15 @@ shared_examples 'generic trove service' do |service|
is_expected.to contain_package(service[:name]).with({
:name => service[:package_name],
:ensure => 'present',
:notify => "Service[#{service[:name]}]"
:notify => "Service[#{service[:name]}]",
:tag => ['openstack', 'trove-package'],
})
is_expected.to contain_service(service[:name]).with({
:name => service[:service_name],
:ensure => 'stopped',
:hasstatus => true,
:enable => false
:enable => false,
:tag => 'trove-service',
})
end
end
@ -32,13 +34,15 @@ shared_examples 'generic trove service' do |service|
is_expected.to contain_package(service[:name]).with({
:name => service[:package_name],
:ensure => '2014.1-1',
:notify => "Service[#{service[:name]}]"
:notify => "Service[#{service[:name]}]",
:tag => ['openstack', 'trove-package'],
})
is_expected.to contain_service(service[:name]).with({
:name => service[:service_name],
:ensure => 'running',
:hasstatus => true,
:enable => true
:enable => true,
:tag => 'trove-service',
})
end
end

View File

@ -5,3 +5,5 @@ RSpec.configure do |c|
c.alias_it_should_behave_like_to :it_configures, 'configures'
c.alias_it_should_behave_like_to :it_raises, 'raises'
end
at_exit { RSpec::Puppet::Coverage.report! }

View File

@ -38,7 +38,7 @@ RSpec.configure do |c|
zuul_clone_cmd += "git://git.openstack.org #{repo}"
on host, zuul_clone_cmd
else
on host, "git clone -b stable/kilo https://git.openstack.org/#{repo} #{repo}"
on host, "git clone https://git.openstack.org/#{repo} -b stable/liberty #{repo}"
end
on host, "ZUUL_REF=#{zuul_ref} ZUUL_BRANCH=#{zuul_branch} ZUUL_URL=#{zuul_url} bash #{repo}/install_modules.sh"

View File

@ -13,6 +13,17 @@ $LOAD_PATH.push(
'inifile',
'lib')
)
$LOAD_PATH.push(
File.join(
File.dirname(__FILE__),
'..',
'..',
'..',
'fixtures',
'modules',
'openstacklib',
'lib')
)
require 'spec_helper'
provider_class = Puppet::Type.type(:trove_config).provider(:ini_setting)
describe provider_class do
@ -34,4 +45,23 @@ describe provider_class do
expect(provider.section).to eq('dude')
expect(provider.setting).to eq('foo')
end
it 'should ensure absent when <SERVICE DEFAULT> is specified as a value' do
resource = Puppet::Type::Trove_config.new(
{:name => 'dude/foo', :value => '<SERVICE DEFAULT>'}
)
provider = provider_class.new(resource)
provider.exists?
expect(resource[:ensure]).to eq :absent
end
it 'should ensure absent when value matches ensure_absent_val' do
resource = Puppet::Type::Trove_config.new(
{:name => 'dude/foo', :value => 'foo', :ensure_absent_val => 'foo' }
)
provider = provider_class.new(resource)
provider.exists?
expect(resource[:ensure]).to eq :absent
end
end

View File

@ -0,0 +1,17 @@
require 'puppet/type/trove_conductor_config'
describe 'Puppet::Type.type(:trove_conductor_config)' do
before :each do
@trove_conductor_config = Puppet::Type.type(:trove_conductor_config).new(:name => 'DEFAULT/foo', :value => 'bar')
end
it 'should autorequire the package that installs the file' do
catalog = Puppet::Resource::Catalog.new
package = Puppet::Type.type(:package).new(:name => 'trove-conductor')
catalog.add_resource package, @trove_conductor_config
dependency = @trove_conductor_config.autorequire
expect(dependency.size).to eq(1)
expect(dependency[0].target).to eq(@trove_conductor_config)
expect(dependency[0].source).to eq(package)
end
end

View File

@ -0,0 +1,17 @@
require 'puppet/type/trove_guestagent_config'
describe 'Puppet::Type.type(:trove_guestagent_config)' do
before :each do
@trove_guestagent_config = Puppet::Type.type(:trove_guestagent_config).new(:name => 'DEFAULT/foo', :value => 'bar')
end
it 'should autorequire the package that installs the file' do
catalog = Puppet::Resource::Catalog.new
package = Puppet::Type.type(:package).new(:name => 'trove-guestagent')
catalog.add_resource package, @trove_guestagent_config
dependency = @trove_guestagent_config.autorequire
expect(dependency.size).to eq(1)
expect(dependency[0].target).to eq(@trove_guestagent_config)
expect(dependency[0].source).to eq(package)
end
end

View File

@ -49,4 +49,14 @@ describe 'Puppet::Type.type(:trove_config)' do
@trove_config[:ensure] = :latest
}.to raise_error(Puppet::Error, /Invalid value/)
end
it 'should autorequire the package that installs the file' do
catalog = Puppet::Resource::Catalog.new
package = Puppet::Type.type(:package).new(:name => 'trove-api')
catalog.add_resource package, @trove_config
dependency = @trove_config.autorequire
expect(dependency.size).to eq(1)
expect(dependency[0].target).to eq(@trove_config)
expect(dependency[0].source).to eq(package)
end
end

View File

@ -1,182 +0,0 @@
#!/bin/sh
#
# rabbitmq-server Trove RabbitMQ broker
#
# chkconfig: - 80 05
# description: Enable AMQP service provided by RabbitMQ
#
### BEGIN INIT INFO
# Provides: rabbitmq-server
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Description: RabbitMQ broker
# Short-Description: Enable AMQP service provided by RabbitMQ broker for Trove
### END INIT INFO
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
NAME="rabbitmq-server-trove"
DAEMON="/usr/sbin/rabbitmq-server"
CONTROL="/usr/sbin/rabbitmqctl"
DESC="Trove RabbitMQ Server"
USER="rabbitmq"
ROTATE_SUFFIX=".old"
export RABBITMQ_LOG_DIR="/var/log/rabbitmq"
export RABBITMQ_PID_FILE="/var/run/rabbitmq-trove/pid"
export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbitmq-trove"
export RABBITMQ_MNESIA_BASE="/var/lib/rabbitmq/mnesia-trove"
export RABBITMQ_LOG_BASE="/var/log/rabbitmq-trove"
export RABBITMQ_ENABLED_PLUGINS_FILE="/etc/rabbitmq/enabled_plugins_trove"
export RABBITMQ_NODENAME="trove@localhost"
export RABBITMQ_NODE_PORT="<%= @rabbit_port %>"
export RABBITMQ_NODE_IP_ADDRESS="0.0.0.0"
START_PROG="runuser rabbitmq --session-command"
LOCK_FILE="/var/lock/subsys/${NAME}"
test -x "${DAEMON}" || exit 0
test -x "${CONTROL}" || exit 0
CONTROL="${CONTROL} -n ${RABBITMQ_NODENAME}"
RETVAL="0"
[ -f /etc/default/${NAME} ] && . /etc/default/${NAME}
check_dir () {
mkdir -p "${1}"
chown -R "${USER}:${USER}" "${1}"
chmod "755" "${1}"
}
ensure_dirs () {
PID_DIR=`dirname ${RABBITMQ_PID_FILE}`
check_dir "${PID_DIR}"
check_dir "${RABBITMQ_LOG_DIR}"
check_dir "${RABBITMQ_LOG_BASE}"
check_dir "${RABBITMQ_MNESIA_BASE}"
}
remove_pid () {
rm -f "${RABBITMQ_PID_FILE}"
}
start_rabbitmq () {
status_rabbitmq quiet
if [ "${RETVAL}" = "0" ] ; then
echo "Trove RabbitMQ is currently running!"
RETVAL="0"
return
fi
ensure_dirs
${START_PROG} "${DAEMON}" 1> "${RABBITMQ_LOG_BASE}/startup_log" 2> "${RABBITMQ_LOG_BASE}/startup_err" 0<&- &
${CONTROL} wait "${RABBITMQ_PID_FILE}" 1> "/dev/null" 2>&1
RETVAL="${?}"
if [ "${RETVAL}" -gt "0" ]; then
remove_pid
echo "Trove RabbitMQ start FAILED!"
RETVAL="1"
else
echo "Trove RabbitMQ start SUCCESS!"
if [ -n "${LOCK_FILE}" ]; then
touch "${LOCK_FILE}"
fi
RETVAL="0"
fi
}
stop_rabbitmq () {
status_rabbitmq quiet
if [ "${RETVAL}" != 0 ]; then
echo "RabbitMQ is not running!"
RETVAL="0"
return
fi
${CONTROL} stop "${RABBITMQ_PID_FILE}" > "${RABBITMQ_LOG_BASE}/shutdown_log" 2> "${RABBITMQ_LOG_BASE}/shutdown_err"
RETVAL="${?}"
if [ "${RETVAL}" = "0" ] ; then
remove_pid
echo "Trove RabbitMQ stop SUCCESS!"
if [ -n "{$LOCK_FILE}" ] ; then
rm -f "${LOCK_FILE}"
fi
RETVAL="0"
else
echo "Trove RabbitMQ stop FAILED!"
RETVAL="1"
fi
}
status_rabbitmq () {
if [ "${1}" != "quiet" ] ; then
${CONTROL} status 2>&1
else
${CONTROL} status > /dev/null 2>&1
fi
if [ "${?}" != "0" ]; then
RETVAL="3"
fi
}
rotate_logs_rabbitmq () {
${CONTROL} rotate_logs "${ROTATE_SUFFIX}"
if [ $? != 0 ]; then
RETVAL="1"
fi
}
restart_running_rabbitmq () {
status_rabbitmq quiet
if [ "${RETVAL}" != "0" ]; then
echo "RabbitMQ is not runnning!"
exit 0
fi
restart_rabbitmq
}
restart_rabbitmq () {
stop_rabbitmq
start_rabbitmq
}
case "${1}" in
start)
echo "Starting $DESC"
start_rabbitmq
;;
stop)
echo "Stopping $DESC"
stop_rabbitmq
;;
status)
status_rabbitmq
;;
rotate-logs)
echo "Rotating log files for $DESC"
rotate_logs_rabbitmq
;;
force-reload|reload|restart)
echo "Restarting $DESC"
restart_rabbitmq
;;
try-restart)
echo "Restarting $DESC"
restart_running_rabbitmq
;;
*)
echo "Usage: $0 {start|stop|status|rotate-logs|restart|condrestart|try-restart|reload|force-reload}" >&2
exit 1
;;
esac
exit "${RETVAL}"

View File

@ -1,231 +0,0 @@
#!/bin/sh
#
# rabbitmq-server Trove RabbitMQ broker
#
# chkconfig: - 80 05
# description: Enable AMQP service provided by RabbitMQ
#
### BEGIN INIT INFO
# Provides: rabbitmq-server
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: RabbitMQ broker
# Short-Description: Enable AMQP service provided by RabbitMQ broker for Trove
### END INIT INFO
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
NAME="rabbitmq-server-trove"
DAEMON="/usr/sbin/rabbitmq-server"
CONTROL="/usr/sbin/rabbitmqctl"
DESC="Trove RabbitMQ Server"
USER="rabbitmq"
ROTATE_SUFFIX=".old"
export RABBITMQ_LOG_DIR="/var/log/rabbitmq"
export RABBITMQ_PID_FILE="/var/run/rabbitmq-trove/pid"
export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbitmq-trove"
export RABBITMQ_MNESIA_BASE="/var/lib/rabbitmq/mnesia-trove"
export RABBITMQ_LOG_BASE="/var/log/rabbitmq-trove"
export RABBITMQ_ENABLED_PLUGINS_FILE="/etc/rabbitmq/enabled_plugins_trove"
export RABBITMQ_NODENAME="trove@localhost"
export RABBITMQ_NODE_PORT="<%= @rabbit_port %>"
export RABBITMQ_NODE_IP_ADDRESS="0.0.0.0"
LOCK_DIR="/var/lock/rabbitmq"
LOCK_FILE="${LOCK_DIR}/${NAME}"
mkdir -p "${LOCK_DIR}"
chown -R "${USER}:${USER}" "${LOCK_DIR}"
test -x "${DAEMON}" || exit 0
test -x "${CONTROL}" || exit 0
CONTROL="${CONTROL} -n ${RABBITMQ_NODENAME}"
RETVAL="0"
[ -f /etc/default/${NAME} ] && . /etc/default/${NAME}
check_dir () {
mkdir -p "${1}"
chown -R "${USER}:${USER}" "${1}"
chmod "755" "${1}"
}
ensure_dirs () {
PID_DIR=`dirname ${RABBITMQ_PID_FILE}`
check_dir "${PID_DIR}"
check_dir "${RABBITMQ_LOG_DIR}"
check_dir "${RABBITMQ_LOG_BASE}"
check_dir "${RABBITMQ_MNESIA_BASE}"
}
remove_pid () {
rm -f "${RABBITMQ_PID_FILE}"
}
#####
c_start_rabbitmq () {
status_rabbitmq quiet
if [ $RETVAL != 0 ] ; then
#Slave nodes fail to start until master is not up and running
#So, give slaves several attempts to start
#Rabbit database will be moved out before last attempt.
local MAX_START_ATTEMPTS=3
printf '%s\n' "RabbitMQ is going to make ${MAX_START_ATTEMPTS} \
attempts to find master node and start."
while test $MAX_START_ATTEMPTS -ne 0
do
RETVAL=0
ensure_pid_dir
printf '%s\n' "${MAX_START_ATTEMPTS} attempts left to start \
RabbitMQ Server before consider start failed."
if [ $MAX_START_ATTEMPTS = 1 ] ; then
move_out_rabbit_database_to_backup
fi
set +e
RABBITMQ_PID_FILE=$PID_FILE start-stop-daemon --quiet \
--chuid rabbitmq --start --exec $DAEMON \
--pidfile "$RABBITMQ_PID_FILE" --background
$CONTROL wait $PID_FILE >/dev/null 2>&1
RETVAL=$?
set -e
if [ $RETVAL != 0 ] ; then
remove_pid
else
if [ $MAX_START_ATTEMPTS = 1 ] ; then
set_nova_rabbit_credentials
RETVAL=0
fi
break
fi
MAX_START_ATTEMPTS=$((MAX_START_ATTEMPTS - 1))
done
else
RETVAL=3
fi
}
#####
start_rabbitmq () {
status_rabbitmq quiet
if [ "${RETVAL}" = "0" ] ; then
echo "Trove RabbitMQ is currently running!"
RETVAL="0"
return
fi
ensure_dirs
start-stop-daemon --quiet --chuid rabbitmq \
--start --exec "${DAEMON}" \
--pidfile "${RABBITMQ_PID_FILE}" --background
${CONTROL} wait "${RABBITMQ_PID_FILE}" 1> "/dev/null" 2>&1
RETVAL="${?}"
if [ "${RETVAL}" -gt "0" ]; then
remove_pid
echo "Trove RabbitMQ start FAILED!"
RETVAL="1"
else
echo "Trove RabbitMQ start SUCCESS!"
if [ -n "${LOCK_FILE}" ]; then
touch "${LOCK_FILE}"
fi
RETVAL="0"
fi
}
stop_rabbitmq () {
status_rabbitmq quiet
if [ "${RETVAL}" != 0 ]; then
echo "RabbitMQ is not running!"
RETVAL="0"
return
fi
${CONTROL} stop "${RABBITMQ_PID_FILE}" > "${RABBITMQ_LOG_BASE}/shutdown_log" 2> "${RABBITMQ_LOG_BASE}/shutdown_err"
RETVAL="${?}"
if [ "${RETVAL}" = "0" ] ; then
remove_pid
echo "Trove RabbitMQ stop SUCCESS!"
if [ -n "{$LOCK_FILE}" ] ; then
rm -f "${LOCK_FILE}"
fi
RETVAL="0"
else
echo "Trove RabbitMQ stop FAILED!"
RETVAL="1"
fi
}
status_rabbitmq () {
if [ "${1}" != "quiet" ] ; then
${CONTROL} status 2>&1
else
${CONTROL} status > /dev/null 2>&1
fi
if [ "${?}" != "0" ]; then
RETVAL="3"
fi
}
rotate_logs_rabbitmq () {
${CONTROL} rotate_logs "${ROTATE_SUFFIX}"
if [ $? != 0 ]; then
RETVAL="1"
fi
}
restart_running_rabbitmq () {
status_rabbitmq quiet
if [ "${RETVAL}" != "0" ]; then
echo "RabbitMQ is not runnning!"
exit 0
fi
restart_rabbitmq
}
restart_rabbitmq () {
stop_rabbitmq
start_rabbitmq
}
case "${1}" in
start)
echo "Starting $DESC"
start_rabbitmq
;;
stop)
echo "Stopping $DESC"
stop_rabbitmq
;;
status)
status_rabbitmq
;;
rotate-logs)
echo "Rotating log files for $DESC"
rotate_logs_rabbitmq
;;
force-reload|reload|restart)
echo "Restarting $DESC"
restart_rabbitmq
;;
try-restart)
echo "Restarting $DESC"
restart_running_rabbitmq
;;
*)
echo "Usage: $0 {start|stop|status|rotate-logs|restart|condrestart|try-restart|reload|force-reload}" >&2
exit 1
;;
esac
exit "${RETVAL}"

View File

@ -1,7 +0,0 @@
[
{rabbit, [{tcp_listeners, [<%= @rabbit_port %>]}]},
{kernel,[
{inet_dist_listen_min, <%= @rabbit_cluster_port %>},
{inet_dist_listen_max, <%= @rabbit_cluster_port %>}
]}
].

View File

@ -1,20 +1,52 @@
[DEFAULT]
#=========== RPC Configuration ======================
# URL representing the messaging driver to use and its full configuration.
# If not set, we fall back to the 'rpc_backend' option and driver specific
# configuration.
#transport_url=<None>
# The messaging driver to use. Options include rabbit, qpid and zmq.
# Default is rabbit. (string value)
rpc_backend= <%= @rpc_backend %>
# The default exchange under which topics are scoped. May be
# overridden by an exchange name specified in the 'transport_url option.
control_exchange = <%= @control_exchange %>
# ========== Sample Logging Configuration ==========
# Show more verbose log output (sets INFO log level output)
verbose = <%= @verbose %>
# Show debugging output in logs (sets DEBUG log level output)
debug = <%= @debug %>
# Address to bind the API server
bind_host = 0.0.0.0
# Directory and path for log files
log_dir = <%= @log_dir %>
log_file = <%= @log_file %>
# Port the bind the API server to
bind_port = 8778
# ============ RabbitMQ connection options ========================
# AMQP Connection info
rabbit_user=<%= @rabbit_userid %>
# The RabbitMQ broker address where a single node is used.
# (string value)
rabbit_host=<%= @rabbit_host %>
# The RabbitMQ broker port where a single node is used.
# (integer value)
rabbit_port=<%= @rabbit_port %>
# The RabbitMQ userid. (string value)
rabbit_userid=<%= @rabbit_userid %>
# The RabbitMQ password. (string value)
rabbit_password=<%= @rabbit_password %>
# The RabbitMQ virtual host. (string value)
rabbit_virtual_host=<%= @rabbit_virtual_host %>
# Path to the extensions
api_extensions_path = trove/extensions/routes
@ -22,16 +54,13 @@ api_extensions_path = trove/extensions/routes
# These options are for an admin user in your keystone config.
# It proxies the token received from the user to send to nova via this admin users creds,
# basically acting like the client via that proxy token.
nova_proxy_admin_user = <%= @nova_proxy_admin_user %>
nova_proxy_admin_pass = <%= @nova_proxy_admin_pass %>
nova_proxy_admin_tenant_name = <%= @nova_proxy_admin_tenant_name %>
trove_auth_url = <%= @auth_url %>
swift_url = http://localhost:8080/v1/AUTH_
swift_url = <%= @swift_url %>
# Datastore management implementations. Format datastore:manager.impl
# datastore_registry_ext = mysql:trove.guestagent.datastore.mysql.manager.Manager, percona:trove.guestagent.datastore.mysql.manager.Manager
# Root configuration
# Permissions to grant "root" user by default
root_grant = ALL
root_grant_option = True
@ -41,21 +70,16 @@ root_grant_option = True
# used by passlib to generate root password
#default_password_length = 36
# For communicating with trove-conductor
control_exchange = <%= @control_exchange %>
# ============ kombu connection options ========================
rabbit_host=<%= @rabbit_host %>
# ============ Logging information =============================
log_dir = /tmp/
log_file = logfile.txt
# Users to ignore for user create/list/delete operations
ignore_users = os_admin
# Databases to ignore for db create/list/delete operations
ignore_dbs = lost+found, mysql, information_schema
# ========== Default Storage Options for backup ==========
# Default configuration for storage strategy and storage options
# for backups
# Strategy information for backups
backup_namespace = trove.guestagent.strategies.backup.mysql_impl
# Additional commandline options to be passed to the backup runner (by strategy). For example:
@ -71,3 +95,23 @@ backup_use_snet = False
backup_chunk_size = 65536
backup_segment_max_size = 2147483648
# ========== Datastore Specific Configuration Options ==========
[mysql]
# For mysql, the following are the defaults for backup, and restore:
# backup_strategy = InnoBackupEx
# backup_namespace = trove.guestagent.strategies.backup.mysql_impl
# restore_namespace = trove.guestagent.strategies.restore.mysql_impl
# Default configuration for mysql replication
# replication_strategy = MysqlBinlogReplication
# replication_namespace = trove.guestagent.strategies.replication.mysql_binlog
# replication_user = slave_user
# replication_password = slave_password
[vertica]
# For vertica, following are the defaults needed:
# mount_point = /var/lib/vertica
# readahead_size = 2048
# guestagent_strategy = trove.common.strategies.cluster.experimental.vertica.guestagent.VerticaGuestAgentStrategy

View File

@ -1,84 +1,264 @@
# These tasks will be merged into deployment graph. Here you
# can specify new tasks for any roles, even built-in ones.
- id: primary-trove
type: group
role: [primary-trove]
requires: [deploy_start]
required_for: [deploy_end]
tasks: &common_tasks
- hiera
- setup_repositories
- fuel_pkgs
- globals
- tools
- logging
- netconfig
- hosts
- firewall
- ssl-keys-saving
- ssl-add-trust-chain
- ssl-dns-setup
parameters:
strategy:
type: one_by_one
- id: trove
type: group
role: [trove]
requires: [deploy_start]
requires: [primary-trove]
required_for: [deploy_end]
tasks:
- fuel_pkgs
- hiera
- globals
- logging
- tools
- netconfig
- hosts
- firewall
tasks: *common_tasks
parameters:
strategy:
type: parallel
- id: trove-haproxy
- id: hiera-trove-override
version: 2.0.0
type: puppet
groups: ['primary-controller', 'controller']
required_for: [task-trove, deploy_end]
requires: [deploy_start, cluster-haproxy]
groups: [primary-trove, trove]
requires: [globals]
required_for: [logging, trove-service]
cross-depends:
- name: globals
parameters:
puppet_manifest: puppet/manifests/haproxy.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 1800
puppet_manifest: puppet/modules/dbaas_trove/modular/hiera_override.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: task-trove-db
- id: trove-firewall
version: 2.0.0
type: puppet
groups: ['primary-controller', 'controller']
required_for: [task-trove]
requires: [database]
groups: [primary-trove, trove]
requires: [hiera-trove-override, firewall]
required_for: [trove-cluster]
cross-depends:
- name: hiera-trove-override
- name: firewall
parameters:
puppet_manifest: puppet/manifests/db.pp
puppet_manifest: puppet/modules/dbaas_trove/modular/firewall.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 3600
- id: trove-ssl-keys-saving
version: 2.0.0
type: puppet
role: ['/.*/']
requires: [trove-firewall, ssl-keys-saving]
cross-depends:
- name: trove-firewall
- name: ssl-keys-saving
condition: "(settings:public_ssl.horizon.value == true or settings:public_ssl.services.value == true) and settings:public_ssl.cert_source.value == 'user_uploaded'"
required_for: [deploy_end]
parameters:
puppet_manifest: puppet/modules/dbaas_trove/modular/ssl_keys_saving.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
test_pre:
cmd: ruby /etc/puppet/modules/osnailyfacter/modular/ssl/ssl_keys_saving_pre.rb
- id: trove-ssl-add-trust-chain
type: puppet
version: 2.0.0
role: ['/.*/']
requires: [trove-firewall, trove-ssl-keys-saving]
cross-depends:
- name: trove-firewall
- name: trove-ssl-keys-saving
condition: "settings:public_ssl.horizon.value == true or settings:public_ssl.services.value == true"
required_for: [hosts]
parameters:
puppet_manifest: puppet/modules/dbaas_trove/modular/ssl_add_trust_chain.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
test_pre:
cmd: ruby /etc/puppet/modules/osnailyfacter/modular/ssl/ssl_keys_saving_pre.rb
- id: trove-ssl-dns-setup
type: puppet
version: 2.0.0
groups: [primary-controller, controller]
requires: [trove-firewall, trove-ssl-add-trust-chain]
cross-depends:
- name: trove-firewall
- name: trove-ssl-add-trust-chain
condition: "settings:public_ssl.horizon.value == true or settings:public_ssl.services.value == true"
required_for: [hosts]
parameters:
puppet_manifest: puppet/modules/dbaas_trove/modular/ssl_dns_setup.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: primary-trove-cluster
version: 2.0.0
type: puppet
groups: [primary-trove]
requires: [hosts, trove-firewall, hiera-trove-override]
required_for: [deploy_end]
cross-depends:
- name: hosts
- name: trove-firewall
- name: hiera-trove-override
parameters:
puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/cluster/cluster.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: trove-cluster
version: 2.0.0
type: puppet
groups: [trove]
requires: [hosts, trove-firewall, hiera-trove-override, primary-trove-cluster]
required_for: [deploy_end]
cross-depends:
- name: hosts
- name: trove-firewall
- name: hiera-trove-override
- name: primary-trove-cluster
parameters:
puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/cluster/cluster.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: primary-trove-rabbitmq
version: 2.0.0
type: puppet
groups: [primary-trove]
requires: [trove-firewall, primary-trove-cluster, trove-cluster, hiera-trove-override]
required_for: [trove-service]
cross-depends:
- name: trove-firewall
- name: hiera-trove-override
- name: /(primary-)?trove-cluster/
parameters:
puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/rabbitmq/rabbitmq.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: trove-rabbitmq
version: 2.0.0
type: puppet
groups: [trove]
requires: [trove-firewall, primary-trove-cluster, trove-cluster, hiera-trove-override, primary-trove-rabbitmq]
required_for: [trove-service]
cross-depends:
- name: trove-firewall
- name: hiera-trove-override
- name: /(primary-)?trove-cluster/
- name: primary-trove-rabbitmq
- name: trove-rabbitmq
parameters:
puppet_manifest: /etc/puppet/modules/osnailyfacter/modular/rabbitmq/rabbitmq.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: trove-db
version: 2.0.0
type: puppet
groups: [primary-controller]
requires: [primary-database, database]
required_for: [trove-service]
cross-depends:
- name: /(primary-)?database/
parameters:
puppet_manifest: puppet/modules/dbaas_trove/modular/db.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 1800
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: trove-keystone
version: 2.0.0
type: puppet
groups: ['primary-controller', 'controller']
required_for: [task-trove]
requires: [keystone]
groups: [primary-controller]
requires: [primary-keystone, keystone]
required_for: [trove-service]
cross-depends:
- name: /(primary-)?keystone/
parameters:
puppet_manifest: puppet/manifests/keystone.pp
puppet_modules: puppet/modules:/etc/puppet/modules
puppet_manifest: puppet/modules/dbaas_trove/modular/keystone.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 1800
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: task-trove
- id: openstack-haproxy-trove
type: puppet
groups: [trove]
version: 2.0.0
groups: [primary-controller, controller]
requires: [primary-cluster-haproxy, cluster-haproxy]
required_for: [trove-service]
cross-depends:
- name: /(primary-)?cluster-haproxy/
parameters:
puppet_manifest: puppet/modules/dbaas_trove/modular/openstack-haproxy-trove.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 3600
# reexecute_on is needed for scale-down operations
reexecute_on:
- deploy_changes
- id: trove-service
version: 2.0.0
type: puppet
groups: [primary-trove, trove]
requires: [trove-rabbitmq, trove-db, trove-keystone, openstack-haproxy-trove]
required_for: [deploy_end]
requires: [rabbitmq, trove-haproxy, task-trove-db, trove-keystone, task-rabbitmq]
cross-depends:
- name: /(primary-)?trove-rabbitmq/
- name: trove-db
- name: trove-keystone
- name: openstack-haproxy-trove
cross-depended-by:
- name: deploy_end
parameters:
puppet_manifest: puppet/manifests/trove.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 1800
##############################################
# RabbitMQ and Cluster
# Deployment tasks
- id: task-rabbitmq
type: puppet
groups: [trove]
requires: [task-rabbitmq-cluster]
required_for: [task-trove]
parameters:
puppet_manifest: puppet/manifests/rabbitmq.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 1800
- id: task-rabbitmq-cluster
type: puppet
groups: [trove]
requires: [hosts, firewall, deploy_start]
required_for: [task-rabbitmq]
parameters:
puppet_manifest: puppet/manifests/cluster.pp
puppet_modules: puppet/modules:/etc/puppet/modules
puppet_manifest: puppet/modules/dbaas_trove/modular/trove.pp
puppet_modules: /etc/puppet/modules:puppet/modules
timeout: 1800

177
docs/Makefile Normal file
View File

@ -0,0 +1,177 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OpenStackTrovepluginforFuel.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OpenStackTrovepluginforFuel.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/OpenStackTrovepluginforFuel"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OpenStackTrovepluginforFuel"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

340
docs/source/conf.py Normal file
View File

@ -0,0 +1,340 @@
# -*- coding: utf-8 -*-
#
# OpenStack Trove plugin for Fuel documentation build configuration file, created by
# sphinx-quickstart on Tue Aug 16 20:00:41 2016.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.intersphinx',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.mathjax',
'sphinx.ext.ifconfig',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'OpenStack Trove plugin for Fuel'
copyright = u'2016, AT&T Services, Inc.'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.0-1.0.3-1'
# The full version, including alpha/beta/rc tags.
release = '1.0-1.0.3-1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'OpenStackTrovepluginforFueldoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'OpenStackTrovepluginforFuel.tex', u'OpenStack Trove plugin for Fuel Documentation',
u'AT\\&T Services, Inc.', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'openstacktrovepluginforfuel', u'OpenStack Trove plugin for Fuel Documentation',
[u'AT&T Services, Inc.'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'OpenStackTrovepluginforFuel', u'OpenStack Trove plugin for Fuel Documentation',
u'AT&T Services, Inc.', 'OpenStackTrovepluginforFuel', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# -- Options for Epub output ----------------------------------------------
# Bibliographic Dublin Core info.
epub_title = u'OpenStack Trove plugin for Fuel'
epub_author = u'AT&T Services, Inc.'
epub_publisher = u'AT&T Services, Inc.'
epub_copyright = u'2016, AT&T Services, Inc.'
# The basename for the epub file. It defaults to the project name.
#epub_basename = u'OpenStack Trove plugin for Fuel'
# The HTML theme for the epub output. Since the default themes are not optimized
# for small screen space, using the same theme for HTML and epub output is
# usually not wise. This defaults to 'epub', a theme designed to save visual
# space.
#epub_theme = 'epub'
# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
#epub_guide = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True
# Choose between 'default' and 'includehidden'.
#epub_tocscope = 'default'
# Fix unsupported image types using the PIL.
#epub_fix_images = False
# Scale large images.
#epub_max_image_width = 0
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#epub_show_urls = 'inline'
# If false, no index is generated.
#epub_use_index = True
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {'http://docs.python.org/': None}

24
docs/source/index.rst Normal file
View File

@ -0,0 +1,24 @@
.. OpenStack Trove plugin for Fuel documentation master file, created by
sphinx-quickstart on Tue Aug 16 20:00:41 2016.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to OpenStack Trove plugin for Fuel's documentation!
===========================================================
Contents:
.. toctree::
:maxdepth: 2
overview
installation_guide
user_guide
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@ -0,0 +1,45 @@
.. _installation:
Installation Guide
==================
#. Start with `installing Fuel Master node`_.
#. Install `Fuel Plugin Builder on Fuel Master node`_.
#. Install Git on Fuel Master node::
[root@fuel ~]# yum install git -y
#. Clone the plugin from `Github`_.::
[root@fuel ~]# git clone http://github.com/openstack/fuel-plugin-dbaas-trove.git -b stable/8.0
[root@fuel ~]# cd fuel-plugin-dbaas-trove
#. Download Liberty Trove Debian packages from `Ubuntu Repo`_ and stage
into repositories/ubuntu/ directory.
.. note:: Liberty version is '4.0.0-0ubuntu1~cloud0_all'
#. Build the plugin::
[root@fuel ~]# fpb --build .
#. Install the plugin::
[root@fuel ~]# fuel plugins --install fuel-plugin-dbaas-trove-1.0-1.0.3-1.noarch.rpm
#. Verify that the plugin is installed correctly::
[root@nailgun ~]# fuel plugins
id | name | version | package_version
---|-------------------------|---------|----------------
1 | fuel-plugin-dbaas-trove | 1.0.3 | 4.0.0
.. target-notes::
.. _installing Fuel Master node: https://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-install-guide.html#introduction-to-fuel-installation
.. _Fuel Plugin Builder on Fuel Master node: https://wiki.openstack.org/wiki/Fuel/Plugins#install_latest
.. _Github: http://github.com/openstack/fuel-plugin-dbaas-trove.git
.. _Ubuntu Repo: http://ubuntu-cloud.archive.canonical.com/ubuntu/pool/main/o/openstack-trove

53
docs/source/overview.rst Normal file
View File

@ -0,0 +1,53 @@
.. _overview:
Document purpose
================
This document provides instructions for installing, configuring and using
OpenStack Trove plugin for Fuel.
OpenStack Trove plugin
----------------------
The OpenStack Trove plugin provides ability to install an OpenStack
environment with Trove deployed on dedicated nodes. Trove provides scalable
and reliable Cloud Database as a Service provisioning functionality for both
relational and non-relational database engines, and to continue to improve
its fully-featured and extensible open source framework.
Plugin is hot-pluggable and It can be enabled in a new environment or existing
deployed environment without the plugin.
Requirements
------------
+----------------------------+--------------------+
| Requirement | Version/Comment |
+============================+====================+
| Fuel | 8.0 release |
+----------------------------+--------------------+
| OpenStack compatibility | Liberty |
+----------------------------+--------------------+
| Operating systems | Ubuntu 14.04 LTS |
+----------------------------+--------------------+
Limitations
-----------
OpenStack Trove plugin deploys a dedicated RabbitMQ Cluster on Trove nodes for
for security reasons.
`Dedicated RabbitMQ <http://lists.openstack.org/pipermail/openstack-dev/2015-April/061759.html/>`_.
If the OpenStack Trove plugin is enabled for an environment, it is impossible
to assign Trove and Controller roles to the same node.
There is a Detach RabbitMQ plugin, which enable user to install RabbitMQ
on separate nodes. Detach RabbitMQ plugin role should not be used together
with Trove plugin role, User should ensure that:
* Trove and RabbitMQ roles shoud not to be assigned to the same nodes
Trove Guest service on Tenant VM will comminicate with Trove RabbitMQ VIP
over SSL Connection only when the environment is confifured with SSL support.

View File

@ -0,0 +1,63 @@
.. _user-guide:
User Guide
==========
#. After the plugin is installed, `create a new OpenStack environment`_.
#. Open the Settings tab of the Fuel web UI and then select the OpenStack
Services menu. Select "Trove Setting" checkbox.
.. image:: _static/enable_plugin.png
#. Go to the Nodes tab and here push Add Nodes button
.. image:: _static/nodes_tab.png
Note that now Trove role is available in the roles list.
#. Add nodes to the environment with RabbitMQ role assigned to some of them.
On the screenshot below you may see environment with 1 CONTROLLER,
1 (COMPUTE + CINDER) and 1 TROVE node. You can assign Trove role to more
than one node.
.. image:: _static/env_nodes.png
#. Finish `configuring your environment`_.
#. `Deploy your environment`_.
.. image:: _static/env_ready.png
How it works
------------
With the plugin enabled, Fuel deploys RabbitMQ and Trove Services on Trove
nodes and here RabbitMQ is also managed by Pacemaker. Also note that two
separate Pacemaker clusters are running on the Controller and Trove nodes
and they are not aware of each other.
The Trove service logs could be found at :
- on Trove node in /var/log/trove directory
When the plugin is enabled, RabbitMQ log could be found in its regular place:
- on Trove node in /var/log/rabbitmq directory
- on master node in /var/log/remote/<node-name>/rabbitmq-\*.log files
The same applies to log of Pacemaker which manages RabbitMQ. Its location is:
- on Trove node /var/log/pacemaker.log
- on master node in the following files:
- /var/log/remote/<node-name>/attrd.log
- /var/log/remote/<node-name>/crmd.log
- /var/log/remote/<node-name>/cib.log
- /var/log/remote/<node-name>/lrmd.log
- /var/log/remote/<node-name>/pengine.log
.. target-notes::
.. _create a new OpenStack environment: https://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-user-guide.html#create-a-new-openstack-environment
.. _configuring your environment: http://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-user-guide.html#configure-your-environment
.. _Deploy your environment: http://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-user-guide.html#deploy-changes

View File

@ -1,11 +1,84 @@
attributes:
metadata:
label: "Trove Service"
weight: 90
db_password:
generator: "password"
user_password:
generator: "password"
rabbit_password:
generator: "password"
rabbit_user: "trove"
attributes:
metadata:
# Settings group can be one of "general", "security", "compute", "network",
# "storage", "logging", "openstack_services" and "other".
group: 'openstack_services'
label: "Trove Settings"
auth_name:
value: 'trove'
label: 'Auth Username'
description: ''
weight: 20
type: "text"
regex:
source: '^[\S]{4,}$'
error: "Username length should not be less than 4 characters"
restrictions:
- action: hide
condition: settings:fuel-plugin-dbaas-trove.metadata.enabled == false
auth_password:
label: 'Auth Password'
description: ''
weight: 21
type: 'password'
value: 'NN2eNK27rPLQM2cf2JrNPnwc'
regex:
source: '^[\S]{8,}$'
error: "Password length should not be less than 8 characters"
restrictions:
- action: hide
condition: settings:fuel-plugin-dbaas-trove.metadata.enabled == false
db_password:
label: 'Database Password'
description: ''
weight: 22
type: 'password'
value: 'nupTgLU9a6SyFCBnsMfYH7Ag'
regex:
source: '^[\S]{8,}$'
error: "Password length should not be less than 8 characters"
restrictions:
- action: hide
condition: settings:fuel-plugin-dbaas-trove.metadata.enabled == false
rabbit_user:
label: 'RabbitMQ Username'
description: ''
weight: 23
type: 'text'
value: 'trove'
regex:
source: '^[\S]{4,}$'
error: "Username length should not be less than 4 characters"
restrictions:
- action: hide
condition: settings:fuel-plugin-dbaas-trove.metadata.enabled == false
rabbit_password:
label: 'RabbitMQ Password'
description: ''
weight: 24
type: 'password'
value: '9sk9rWwXWbZnxmBFfhGtrGfP'
regex:
source: '^[\S]{8,}$'
error: "Password length should not be less than 8 characters"
restrictions:
- action: hide
condition: settings:fuel-plugin-dbaas-trove.metadata.enabled == false
rabbit_port:
value: "55671"
label: "RabbitMQ Port"
description: ""
weight: 25
type: "text"
restrictions:
- action: hide
condition: settings:fuel-plugin-dbaas-trove.metadata.enabled == false
regex:
source: '^(102[4-9]|10[3-9]\d|1[1-9]\d{2}|[2-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$'
error: "Invalid Port, Enter a port between 1024 and 65535"

View File

@ -3,38 +3,32 @@ name: fuel-plugin-dbaas-trove
# Human-readable name for your plugin
title: Trove Service
# Plugin version
version: '1.0.0'
# Description
description: Trove plugin for Fuel provides the functionality to deploy OpenStack Trove for providing scalable and reliable Cloud Database as a Service provisioning functionality
version: '1.0.3'
#Description
description: Deploys the Trove services in OpenStack Fuel environment.
# Required fuel version
fuel_version: ['7.0']
fuel_version: ['8.0']
# Specify license of your plugin
licenses: ['Apache License Version 2.0']
# Specify author or company name
authors: ['Shaik Apsar']
authors: ['Shaik Apsar', 'Bhaskara Duvvuri']
# A link to the plugin's page
homepage: 'https://github.com/openstack/fuel-plugin-dbaas-trove'
# Specify a group which your plugin implements, possible options:
# network, storage, storage::cinder, storage::glance, hypervisor
# network, storage, storage::cinder, storage::glance, hypervisor,
# equipment
groups: []
# Change `false` to `true` if the plugin can be installed in the environment
# after the deployment.
is_hotpluggable: true
# The plugin is compatible with releases in the list
releases:
- os: ubuntu
version: 2015.1.0-7.0
mode: ['ha', 'multinode']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/ubuntu
- os: ubuntu
version: 2015.2.0-7.0
mode: ['ha', 'multinode']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/ubuntu
- os: ubuntu
version: 2015.2.0-8.0
version: liberty-8.0
mode: ['ha']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/ubuntu
# Version of plugin package
package_version: '3.0.0'
package_version: '4.0.0'

View File

@ -9,3 +9,7 @@
gateway: true
# List of VIPs to be allocated
vip: []
# Unique VIP name
# - name: "vip_name"
# Optional linux namespace for VIP
# namespace: "haproxy"

View File

@ -2,17 +2,34 @@ trove:
# Role name
name: "Trove"
# Role description
description: "Trove"
# If primaty then during orchestration this role will be
# splitted into primary-role and role
has_primary: false
description: |
Trove provides Cloud Database as a Service (DBaaS) by deploying
the Trove components along with the separate RabbitMQ Cluster
installed on the Trove node as well.
# If primary then during orchestration this role will be
# separated into primary-role and role
has_primary: true
# Assign public IP to node if true
public_ip_required: false
# Weight that will be used to sort out the
# roles on the Fuel web UI
weight: 100
weight: 1000
update_required:
- trove
- controller
conflicts:
- controller
- compute-vmware
- compute
- cinder-vmware
- virt
- base-os
- controller
- ceph-osd
- ironic
- cinder
- cinder-block-device
limits:
recommended: 3
min: 0
restrictions:
- condition: "settings:fuel-plugin-dbaas-trove.metadata.enabled == false"
action: hide

View File

@ -1,3 +1,5 @@
#!/bin/bash
# Nothing here
# Add here any the actions which are required before plugin build
# like packages building, packages downloading from mirrors and so on.
# The script should return 0 if there were no errors.

26
tasks.yaml Normal file
View File

@ -0,0 +1,26 @@
# WARNING: `tasks.yaml` will be deprecated in further releases.
# Please, use `deployment_tasks.yaml` to describe tasks instead.
# This tasks will be applied on controller nodes,
# here you can also specify several roles, for example
# ['cinder', 'compute'] will be applied only on
# cinder and compute nodes
- role: ['controller']
stage: post_deployment
type: shell
parameters:
cmd: bash deploy.sh
timeout: 42
# Task is applied for all roles
- role: '*'
stage: pre_deployment
type: shell
parameters:
cmd: echo all > /tmp/plugin.all
timeout: 42
# "reboot" task reboots the nodes and waits until they get back online
- role: '*'
stage: pre_deployment
type: reboot
parameters:
timeout: 600

View File

@ -1,8 +1,7 @@
volumes_roles_mapping:
# Default role mapping
fuel-plugin-dbaas-trove:
trove:
- {allocate_size: "min", id: "os"}
- {allocate_size: "min", id: "logs"}
# Set here new volumes for your role
volumes: []