Skip to content

Commit

Permalink
Initial clone type
Browse files Browse the repository at this point in the history
  • Loading branch information
rodjek committed May 31, 2010
1 parent fdfa75f commit 290a850
Show file tree
Hide file tree
Showing 2 changed files with 329 additions and 0 deletions.
224 changes: 224 additions & 0 deletions lib/puppet/provider/ha_crm_clone/crm.rb
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
105 changes: 105 additions & 0 deletions lib/puppet/type/ha_crm_clone.rb
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

0 comments on commit 290a850

Please sign in to comment.