forked from rodjek/puppet-pacemaker
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
329 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,224 @@ | ||
require 'rexml/document' | ||
|
||
Puppet::Type.type(:ha_crm_clone).provide(:crm) do | ||
desc "CRM shell support" | ||
|
||
commands :crm => "crm" | ||
commands :crm_resource => "crm_resource" | ||
|
||
def create | ||
crm "-F", "configure", "ms", resource[:id], resource[:resource] | ||
end | ||
|
||
def destroy | ||
crm "-F", "configure", "delete", resource[:id] | ||
end | ||
|
||
def exists? | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:ensure] == :present ? true : false | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
primitive = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']") | ||
!primitive.nil? | ||
end | ||
end | ||
|
||
def priority | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:priority] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='priority']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def priority=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "priority" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "priority", "-v", value | ||
end | ||
end | ||
|
||
def target_role | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:target_role] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='target-role']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def target_role=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "target-role" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "target-role", "-v", value.to_s.capitalize | ||
end | ||
end | ||
|
||
def is_managed | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:is_managed] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='is-managed']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def is_managed=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "is-managed" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "is-managed", "-v", value.to_s | ||
end | ||
end | ||
|
||
def clone_max | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:clone_max] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='resource-stickiness']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def clone_max=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "clone-max" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "clone-max", "-v", value.to_s | ||
end | ||
end | ||
|
||
def clone_node_max | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.vaule(:fqdn) | ||
resource[:clone_node_max] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='clone-node-max']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def clone_node_max=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "clone-node-max" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "clone-node-max", "-v", value.to_s | ||
end | ||
end | ||
|
||
def notify_clones | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:notify_clones] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='notify']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def notify_clones=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "notify" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "notify", "-v", value.to_s | ||
end | ||
end | ||
|
||
def globally_unique | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:globally_unique] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='globally-unique']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def globally_unique=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "globally-unique" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "globally-unique", "-v", value.to_s | ||
end | ||
end | ||
|
||
def ordered | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:ordered] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='ordered']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def ordered=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "ordered" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "ordered", "-v", value.to_s | ||
end | ||
end | ||
|
||
def interleave | ||
if resource[:only_run_on_dc] and Facter.value(:ha_cluster_dc) != Facter.value(:fqdn) | ||
resource[:interleave] | ||
else | ||
cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") | ||
nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/master[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='interleave']") | ||
if nvpair.nil? | ||
:absent | ||
else | ||
nvpair.attribute(:value).value | ||
end | ||
end | ||
end | ||
|
||
def interleave=(value) | ||
if value == :absent | ||
crm_resource "-m", "-r", resource[:id], "-d", "interleave" | ||
else | ||
crm_resource "-m", "-r", resource[:id], "-p", "interleave", "-v", value.to_s | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
Puppet::Type.newtype(:ha_crm_clone) do | ||
@doc = "Manage Pacemaker clones" | ||
|
||
ensurable | ||
|
||
newparam(:id) do | ||
desc "The name of the resource" | ||
|
||
isnamevar | ||
end | ||
|
||
newparam(:resource) do | ||
desc "The name of the cluster resource (primitive) that will be cloned" | ||
end | ||
|
||
newparam(:only_run_on_dc, :boolean => true) do | ||
desc "In order to prevent race conditions, we generally only want to | ||
make changes to the CIB on a single machine (in this case, the | ||
Designated Controller)." | ||
|
||
newvalues(:true, :false) | ||
defaultto(:true) | ||
end | ||
|
||
newproperty(:priority) do | ||
desc "The priority of the resource" | ||
|
||
newvalues(:absent, /\d+/) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:target_role) do | ||
desc "What state should the cluster attempt to keep this resource in? | ||
Allowed values: | ||
* stopped - Force the resource not to run | ||
* started - Allow the resource to be started | ||
* master - Allow the resource to be started and promoted to Master" | ||
|
||
newvalues(:absent, :stopped, :started, :master) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:is_managed) do | ||
desc "Is the cluster allowed to start and stop the resource?" | ||
|
||
newvalues(:absent, :true, :false) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:clone_max) do | ||
desc "How many copies of the resource to start. If absent, will default | ||
to the number of nodes in the cluster." | ||
|
||
newvalues(:absent, /\d+/) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:clone_node_max) do | ||
desc "How many copies of the resource can be started on a single node. | ||
If absent, defaults to 1." | ||
|
||
newvalues(:absent, /\d+/) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:notify_clones) do | ||
desc "When stopping or starting a copy of the clone, tell all the other | ||
copies beforehand and when the cation was successful. If absent, | ||
defaults to false." | ||
|
||
newvalues(:absent, :true, :false) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:globally_unique) do | ||
desc "Does each copy of the clone perform a different function? If absent, | ||
defaults to true." | ||
|
||
newvalues(:absent, :true, :false) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:ordered) do | ||
desc "Should the copies be started in series (instead of in parallel). If | ||
absent, defaults to false." | ||
|
||
newvalues(:absent, :true, :false) | ||
defaultto :absent | ||
end | ||
|
||
newproperty(:interleave) do | ||
desc "Changes the behavior of ordering constraints (between clones/masters) | ||
so that instances can start/stop as soon as their peer instance has | ||
(rather than waiting for every instance of the other clone has). If | ||
absent, defaults to false." | ||
|
||
newvalues(:absent, :true, :false) | ||
defaultto :absent | ||
end | ||
|
||
validate do | ||
raise Puppet::Error, "You must specify the resource to be cloned" unless @parameters.include?(:resource) | ||
end | ||
end |