From 0c4bdc07e03522374b7aff219fdf8cc60cf97e35 Mon Sep 17 00:00:00 2001 From: Aimon Bustardo Date: Fri, 19 Oct 2012 22:16:39 -0700 Subject: [PATCH] New Feature: ha_crm_group type and provider --- lib/puppet/provider/ha_crm_group/crm.rb | 46 +++++++++++++++++++++++++ lib/puppet/type/ha_crm_group.rb | 31 +++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 lib/puppet/provider/ha_crm_group/crm.rb create mode 100644 lib/puppet/type/ha_crm_group.rb diff --git a/lib/puppet/provider/ha_crm_group/crm.rb b/lib/puppet/provider/ha_crm_group/crm.rb new file mode 100644 index 0000000..9d6d65c --- /dev/null +++ b/lib/puppet/provider/ha_crm_group/crm.rb @@ -0,0 +1,46 @@ +require 'rexml/document' + +Puppet::Type.type(:ha_crm_group).provide(:crm) do + + commands :crm => "crm" + commands :crm_resource => "crm_resource" + + def create + with_rsc = resource[:resources] + + crm "-F", "configure", "group", resource[:id], with_rsc + end + + def destroy + crm "-F", "configure", "delete", resource[:id] + end + + def target_role + cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") + nvpair = REXML::XPath.first(cib, "//cib/configuration/resources/group[@id='#{resource[:id]}']/meta_attributes/nvpair[@name='target-role']") + if nvpair.nil? + :absent + else + nvpair.attribute(:value).value + 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 exists? + cib = REXML::Document.new File.open("/var/lib/heartbeat/crm/cib.xml") + colocation = REXML::XPath.first(cib, "//group[@id='#{resource[:id]}']") + + if colocation + true + else + false + end + end +end diff --git a/lib/puppet/type/ha_crm_group.rb b/lib/puppet/type/ha_crm_group.rb new file mode 100644 index 0000000..a1cb3be --- /dev/null +++ b/lib/puppet/type/ha_crm_group.rb @@ -0,0 +1,31 @@ +Puppet::Type.newtype(:ha_crm_group) do + @desc = "Manages Pacemaker resource groups." + + ensurable + + newparam(:id) do + desc "A unique name for the group" + + isnamevar + end + + newparam(:resources) do + desc "Array of resources to group. They will be started in the order they are ordered in the array." + 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 + + validate do + raise Puppet::Error, "You must specify a list of resources" unless @parameters.include?(:resources) + end +end