Merge "Add Pacemaker service wrapper"

This commit is contained in:
Jenkins 2015-01-31 19:57:07 +00:00 committed by Gerrit Code Review
commit 7cd7e010cc
6 changed files with 413 additions and 0 deletions

View File

@ -0,0 +1,56 @@
#
# Copyright (C) 2015 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Configure a Pacemaker colocation rule
#
# === Parameters
#
# [*service*]
# (required) Name of the service to be colocated with others
# Defaults to $name
#
# [*colocated_with*]
# (optional) List of services to be colocated with service1
# Should be an array.
# Defaults to []
#
# [*order*]
# (optional) Do not use in a manifest. It is used to iterate
# through the list of services to be colocated with $service.
# Defaults to '0'
define cloud::clustering::pacemaker_colocation(
$service = $name,
$colocated_with = [],
$order = '0'
) {
$service1 = inline_template('<%= @colocated_with[@order.to_i] %>')
if $service1 {
$colocation_name = "${service}-with-${service1}"
cs_colocation { $colocation_name :
primitives => [ "p_${service}", "p_${service1}" ],
}
$neworder = inline_template('<%= @order.to_i + 1 %>')
cloud::clustering::pacemaker_colocation { "${service}-${neworder}":
service => $service,
colocated_with => $colocated_with,
order => $neworder
}
}
}

View File

@ -0,0 +1,56 @@
#
# Copyright (C) 2015 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Configure a Pacemaker order constraint
#
# === Parameters
#
# [*first*]
# (required) List of services to be executed before $service
# Should be an array.
# Defaults to []
#
# [*service*]
# (optional) Service to be executed after all services in $first
# Defaults to $name
#
# [*order*]
# (optional) Do not use in a manifest. It is used to iterate
# through the list of services to be executed before $service.
# Defaults to '0'
define cloud::clustering::pacemaker_order(
$first = [],
$service = $name,
$order = '0'
) {
$service1 = inline_template('<%= @first[@order.to_i] %>')
if $service1 {
$order_name = "${service1}-before-${service}"
cs_order { $order_name :
first => "p_${service1}",
second => "p_${service}",
}
$neworder = inline_template('<%= @order.to_i + 1 %>')
cloud::clustering::pacemaker_order { "${service}-${neworder}":
first => $first,
service => $service,
order => $neworder
}
}
}

View File

@ -0,0 +1,113 @@
#
# Copyright (C) 2015 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Configure a service to be controlled by Pacemaker
#
#
# === Parameters
#
# [*service_name*]
# (optional) Name of the service to be put under Pacemaker control
# Defaults to $name
#
# [*primitive_class*]
# (optional) Pacemaker primitive class
# Defaults to 'systemd'
#
# [*primitive_provider*]
# (optional) Pacemaker primitive provider for OCF scripts
# Examples: 'ocf','heartbeat'
# Defaults to false
#
# [*primitive_type*]
# (optional) The type of the primitive: OCF file name, or operating
# system-native service if using systemd, upstart or lsb as
# primitive_class
# Defaults to $service_name
#
# [*clone*]
# (optional) Create a cloned resource
# Defaults to false
#
# [*colocated_services*]
# (optional) A list of resources that should be colocated with this
# one
# Example: ["service2","service3"]
# Defaults to []
#
# [*start_after*]
# (optional) A list of resources that should be started before this
# resource can be started. This will create a set of order constraints
# where every resourece in $start_after should be started before this
# resource can start
# Example: ["service2","service3"]
# Defaults to []
#
# [*requires*]
# (optional) A list of required Puppet resources
# Defaults to []
#
# Example:
# cloud::clustering::pacemaker_service { 'openstack-glance-api' :
# service_name => 'openstack-glance-api',
# primitive_class => 'systemd',
# primitive_provider => false,
# primitive_type => 'openstack-glance-api',
# clone => false,
# colocated_services => ["openstack-keystone"],
# start_after => ["openstack-keystone"],
# requires => Package['openstack-glance'],
# }
define cloud::clustering::pacemaker_service (
$service_name = $name,
$primitive_class = 'systemd',
$primitive_provider = false,
$primitive_type = $service_name,
$clone = false,
$colocated_services = [],
$start_after = [],
$requires = [],
) {
openstack_extras::pacemaker::service { $service_name :
ensure => present,
metadata => {},
ms_metadata => {},
operations => {},
parameters => {},
primitive_class => $primitive_class,
primitive_provider => $primitive_provider,
primitive_type => $primitive_type,
use_handler => false,
clone => $clone,
require => $requires,
}
if $colocated_services {
cloud::clustering::pacemaker_colocation { $service_name :
service => $service_name,
colocated_with => $colocated_services
}
}
if $start_after {
cloud::clustering::pacemaker_order { $service_name :
first => $start_after,
service => $service_name
}
}
}

View File

@ -0,0 +1,47 @@
#
# Copyright (C) 2015 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Spec tests for cloud::clustering::pacemaker_colocation
require 'spec_helper'
describe 'cloud::clustering::pacemaker_colocation', :type => :define do
let (:title) { 'service1' }
let :params do
{
:service => 'service1',
:colocated_with => ['service2','service3']
}
end
context 'with default parameters' do
it 'should create a colocation constraint' do
should contain_cs_colocation('service1-with-service2').with(
{
'primitives' => ["p_service1", "p_service2"],
}
)
should contain_cs_colocation('service1-with-service3').with(
{
'primitives' => ["p_service1", "p_service3"],
}
)
end
end
end

View File

@ -0,0 +1,49 @@
#
# Copyright (C) 2015 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Spec tests for cloud::clustering::pacemaker_order
require 'spec_helper'
describe 'cloud::clustering::pacemaker_order', :type => :define do
let (:title) { 'service1' }
let :params do
{
:service => 'service1',
:first => ['service2','service3']
}
end
context 'with default parameters' do
it 'should create two order constraints' do
should contain_cs_order('service2-before-service1').with(
{
'first' => "p_service2",
'second' => "p_service1"
}
)
should contain_cs_order('service3-before-service1').with(
{
'first' => "p_service3",
'second' => "p_service1"
}
)
end
end
end

View File

@ -0,0 +1,92 @@
#
# Copyright (C) 2015 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Spec tests for cloud::clustering::pacemaker_service
require 'spec_helper'
describe 'cloud::clustering::pacemaker_service', :type => :define do
let :pre_condition do
"service { ['foo-api','bar-api']:
ensure => running
}"
end
let (:title) { 'foo-api' }
let :params do
{
:service_name => 'foo-api',
:primitive_class => 'systemd',
:primitive_provider => false,
:primitive_type => 'foo-api',
:clone => false,
:colocated_services => [],
:start_after => [],
:requires => []
}
end
context 'with default parameters' do
it 'should create a Pacemaker service' do
should contain_openstack_extras__pacemaker__service('foo-api').with(
{
'ensure' => :present,
'primitive_class' => params[:primitive_class],
'primitive_provider' => params[:primitive_provider],
'primitive_type' => params[:primitive_type],
'clone' => params[:clone],
'require' => params[:requires]
}
)
end
end
context 'with colocated services and start ordering' do
before :each do
params.merge!(
:colocated_services => ["bar-api"],
:start_after => ["foo-api"],
)
end
it 'creates a colocation constraint' do
is_expected.to contain_cloud__clustering__pacemaker_colocation('foo-api')
end
it 'creates an order constraint' do
is_expected.to contain_cloud__clustering__pacemaker_order('foo-api')
end
end
context 'with clone=true' do
before :each do
params.merge!(
:clone => true,
)
end
it 'creates a cloned resource' do
is_expected.to contain_openstack_extras__pacemaker__service('foo-api').with(
{
'clone' => :true
}
)
end
end
end