Add support for pcmk resource op defaults
This adds support for setting op defaults via pcs. Tested via: include ::pacemaker::resource_op_defaults A) No defaults set to start with: [root@controller-0 pacemaker]# pcs resource op defaults No defaults set B) Hiera key to pass a new default: [root@controller-0 pacemaker]# hiera -c /etc/puppet/hiera.yaml pacemaker::resource_op_defaults::defaults {"timeout_test"=>{"name"=>"timeout", "value"=>"60s"}} C) Puppet apply: [root@controller-0 pacemaker]# puppet apply /tmp/test.pp Notice: Compiled catalog for controller-0.redhat.local in environment production in 0.06 seconds Notice: /Stage[main]/Pacemaker::Resource_op_defaults/Pcmk_resource_op_default[timeout_test]/ensure: created Notice: Applied catalog in 2.89 seconds D) Correct results [root@controller-0 pacemaker]# pcs resource op defaults timeout: 60s E) Change value: [root@controller-0 pacemaker]# hiera -c /etc/puppet/hiera.yaml pacemaker::resource_op_defaults::defaults {"timeout_test"=>{"name"=>"timeout", "value"=>"65s"}} [root@controller-0 pacemaker]# puppet apply /tmp/test.pp [root@controller-0 pacemaker]# pcs resource op defaults timeout: 65s F) Idempotency: [root@controller-0 pacemaker]# puppet apply /tmp/test.pp Notice: Compiled catalog for controller-0.redhat.local in environment production in 0.05 seconds Notice: Applied catalog in 0.97 seconds Change-Id: Id72941260c264081cec253382d8e4c975c4a6104
This commit is contained in:
parent
447cef0ad8
commit
9beb316c73
|
@ -0,0 +1,40 @@
|
||||||
|
require_relative '../pcmk_common'
|
||||||
|
|
||||||
|
# Currently the implementation is somewhat naive (will not work great
|
||||||
|
# with ensure => absent, unless the correct current value is also
|
||||||
|
# specified). For more proper handling, prefetching should be
|
||||||
|
# implemented and `value` should be switched from a param to a
|
||||||
|
# property. This should be possible to do without breaking the
|
||||||
|
# interface of the resource type.
|
||||||
|
Puppet::Type.type(:pcmk_resource_op_default).provide(:pcs) do
|
||||||
|
desc 'Manages default values for pacemaker resource operations via pcs'
|
||||||
|
|
||||||
|
def create
|
||||||
|
name = @resource[:name]
|
||||||
|
value = @resource[:value]
|
||||||
|
|
||||||
|
cmd = "resource op defaults #{name}='#{value}'"
|
||||||
|
|
||||||
|
pcs('create', name, cmd, @resource[:tries], @resource[:try_sleep],
|
||||||
|
@resource[:verify_on_create], @resource[:post_success_sleep])
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
name = @resource[:name]
|
||||||
|
|
||||||
|
cmd = "resource defaults #{name}="
|
||||||
|
pcs('create', name, cmd, @resource[:tries], @resource[:try_sleep],
|
||||||
|
@resource[:verify_on_create], @resource[:post_success_sleep])
|
||||||
|
end
|
||||||
|
|
||||||
|
def exists?
|
||||||
|
name = @resource[:name]
|
||||||
|
value = @resource[:value]
|
||||||
|
|
||||||
|
cmd = "resource op defaults | grep '^#{name}: #{value}\$'"
|
||||||
|
Puppet.debug("defaults exists #{cmd}")
|
||||||
|
status = pcs('show', name, cmd, @resource[:tries], @resource[:try_sleep],
|
||||||
|
@resource[:verify_on_create], @resource[:post_success_sleep])
|
||||||
|
return status == false ? false : true
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,81 @@
|
||||||
|
require 'puppet/parameter/boolean'
|
||||||
|
|
||||||
|
Puppet::Type.newtype(:pcmk_resource_op_default) do
|
||||||
|
@doc = "A default value for pacemaker resource op options"
|
||||||
|
|
||||||
|
ensurable
|
||||||
|
|
||||||
|
newparam(:name) do
|
||||||
|
desc "A unique name of the option"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:value) do
|
||||||
|
desc "A default value for the option"
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:post_success_sleep) do
|
||||||
|
desc "The time to sleep after successful pcs action. The reason to set
|
||||||
|
this is to avoid immediate back-to-back 'pcs resource create' calls
|
||||||
|
when creating multiple resources. Defaults to '0'."
|
||||||
|
|
||||||
|
munge do |value|
|
||||||
|
if value.is_a?(String)
|
||||||
|
unless value =~ /^[-\d.]+$/
|
||||||
|
raise ArgumentError, "post_success_sleep must be a number"
|
||||||
|
end
|
||||||
|
value = Float(value)
|
||||||
|
end
|
||||||
|
raise ArgumentError, "post_success_sleep cannot be a negative number" if value < 0
|
||||||
|
value
|
||||||
|
end
|
||||||
|
|
||||||
|
defaultto 0
|
||||||
|
end
|
||||||
|
|
||||||
|
## borrowed from exec.rb
|
||||||
|
newparam(:tries) do
|
||||||
|
desc "The number of times to attempt to create a pcs resource.
|
||||||
|
Defaults to '1'."
|
||||||
|
|
||||||
|
munge do |value|
|
||||||
|
if value.is_a?(String)
|
||||||
|
unless value =~ /^[\d]+$/
|
||||||
|
raise ArgumentError, "Tries must be an integer"
|
||||||
|
end
|
||||||
|
value = Integer(value)
|
||||||
|
end
|
||||||
|
raise ArgumentError, "Tries must be an integer >= 1" if value < 1
|
||||||
|
value
|
||||||
|
end
|
||||||
|
|
||||||
|
defaultto 1
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:try_sleep) do
|
||||||
|
desc "The time to sleep in seconds between 'tries'."
|
||||||
|
|
||||||
|
munge do |value|
|
||||||
|
if value.is_a?(String)
|
||||||
|
unless value =~ /^[-\d.]+$/
|
||||||
|
raise ArgumentError, "try_sleep must be a number"
|
||||||
|
end
|
||||||
|
value = Float(value)
|
||||||
|
end
|
||||||
|
raise ArgumentError, "try_sleep cannot be a negative number" if value < 0
|
||||||
|
value
|
||||||
|
end
|
||||||
|
|
||||||
|
defaultto 0
|
||||||
|
end
|
||||||
|
|
||||||
|
newparam(:verify_on_create, :boolean => true, :parent => Puppet::Parameter::Boolean) do
|
||||||
|
desc "Whether to verify pcs resource creation with an additional
|
||||||
|
call to 'pcs resource show' rather than just relying on the exit
|
||||||
|
status of 'pcs resource create'. When true, $try_sleep
|
||||||
|
determines how long to wait to verify and $post_success_sleep is
|
||||||
|
ignored. Defaults to `false`."
|
||||||
|
|
||||||
|
defaultto false
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,74 @@
|
||||||
|
# == Class: pacemaker::resource_defaults
|
||||||
|
#
|
||||||
|
# Defaults to set for pcs resources
|
||||||
|
#
|
||||||
|
# === Parameters:
|
||||||
|
#
|
||||||
|
# [*defaults*]
|
||||||
|
# (required) Comma separated string of key=value pairs specifying defaults.
|
||||||
|
#
|
||||||
|
# [*post_success_sleep*]
|
||||||
|
# (optional) How long to wait acfter successful action
|
||||||
|
# Defaults to 0
|
||||||
|
#
|
||||||
|
# [*tries*]
|
||||||
|
# (optional) How many times to attempt to create the constraint
|
||||||
|
# Defaults to 1
|
||||||
|
#
|
||||||
|
# [*try_sleep*]
|
||||||
|
# (optional) How long to wait between tries, in seconds
|
||||||
|
# Defaults to 0
|
||||||
|
#
|
||||||
|
# [*verify_on_create*]
|
||||||
|
# (optional) Whether to verify creation of resource
|
||||||
|
# Defaults to false
|
||||||
|
#
|
||||||
|
# [*ensure*]
|
||||||
|
# (optional) Whether to create or remove the defaults
|
||||||
|
# Defaults to present
|
||||||
|
#
|
||||||
|
# === Dependencies
|
||||||
|
#
|
||||||
|
# None
|
||||||
|
#
|
||||||
|
# === Authors
|
||||||
|
#
|
||||||
|
# Crag Wolfe <cwolfe@redhat.com>
|
||||||
|
# Jason Guiditta <jguiditt@redhat.com>
|
||||||
|
#
|
||||||
|
# === Copyright
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016 Red Hat Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
class pacemaker::resource_op_defaults(
|
||||||
|
$defaults,
|
||||||
|
$post_success_sleep = 0,
|
||||||
|
$tries = 1,
|
||||||
|
$try_sleep = 0,
|
||||||
|
$verify_on_create = false,
|
||||||
|
$ensure = 'present',
|
||||||
|
) {
|
||||||
|
create_resources(
|
||||||
|
'pcmk_resource_op_default',
|
||||||
|
$defaults,
|
||||||
|
{
|
||||||
|
ensure => $ensure,
|
||||||
|
post_success_sleep => $post_success_sleep,
|
||||||
|
tries => $tries,
|
||||||
|
try_sleep => $try_sleep,
|
||||||
|
verify_on_create => $verify_on_create,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
#
|
||||||
|
# Copyright (C) 2017 Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe 'pacemaker::resource_op_defaults', type: :class do
|
||||||
|
|
||||||
|
let(:title) { 'foo' }
|
||||||
|
|
||||||
|
shared_examples_for 'pacemaker::resource_op_defaults' do
|
||||||
|
context 'with params' do
|
||||||
|
let(:params) { {
|
||||||
|
:defaults => { 'timeout_test' => { 'name' => 'timeout', 'value' => '60s', }, },
|
||||||
|
:tries => 10,
|
||||||
|
:try_sleep => 20,
|
||||||
|
} }
|
||||||
|
it { is_expected.to compile.with_all_deps }
|
||||||
|
|
||||||
|
it {
|
||||||
|
is_expected.to contain_pcmk_resource_op_default('timeout_test').with(
|
||||||
|
:name => 'timeout',
|
||||||
|
:value => '60s',
|
||||||
|
:tries => 10,
|
||||||
|
:try_sleep => 20,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
on_supported_os.each do |os, facts|
|
||||||
|
context "on #{os}" do
|
||||||
|
let(:facts) do
|
||||||
|
facts.merge({ :hostname => 'node.example.com' })
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'pacemaker::resource_op_defaults'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue