diff --git a/Guardfile b/Guardfile index cbe857e..c95dddc 100644 --- a/Guardfile +++ b/Guardfile @@ -23,6 +23,7 @@ group :rspec do watch(%r{^libraries/(.+)\.rb$}) { |m| "spec/libraries/#{m[1]}_spec.rb" } + watch(%r{^providers/common\.rb$}) { all_specs } watch(%r{^(resources|providers)/(.+)\.rb$}) { |m| "spec/providers/#{m[1]}_spec.rb" } diff --git a/libraries/pacemaker/resource.rb b/libraries/pacemaker/resource.rb index 3d0639a..99c8000 100644 --- a/libraries/pacemaker/resource.rb +++ b/libraries/pacemaker/resource.rb @@ -5,6 +5,11 @@ module Pacemaker class Resource < Pacemaker::CIBObject include Chef::Mixin::ShellOut + def self.description + type = self.to_s.split('::').last + "#{type} resource" + end + def running? cmd = shell_out! "crm", "resource", "status", name Chef::Log.info cmd.stdout diff --git a/providers/common.rb b/providers/common.rb new file mode 100644 index 0000000..c2253da --- /dev/null +++ b/providers/common.rb @@ -0,0 +1,36 @@ +require 'chef/application' +require ::File.join(::File.dirname(__FILE__), + *%w(.. libraries pacemaker cib_object)) + +class Chef + module Mixin::PacemakerCommon + # Instantiate @current_resource and read details about the existing + # primitive (if any) via "crm configure show" into it, so that we + # can compare it against the resource requested by the recipe, and + # create / delete / modify as necessary. + # + # http://docs.opscode.com/lwrp_custom_provider_ruby.html#load-current-resource + def load_current_resource + name = @new_resource.name + + cib_object = Pacemaker::CIBObject.from_name(name) + unless cib_object + ::Chef::Log.debug "CIB object definition nil or empty" + return + end + + unless cib_object.is_a? cib_object_class + expected_type = cib_object_class.description + ::Chef::Log.warn "CIB object '#{name}' was a #{cib_object.type} not a #{expected_type}" + return + end + + ::Chef::Log.debug "CIB object definition #{cib_object.definition}" + @current_resource_definition = cib_object.definition + cib_object.parse_definition + + @current_cib_object = cib_object + init_current_resource + end + end +end diff --git a/providers/primitive.rb b/providers/primitive.rb index e7279b6..3779f23 100644 --- a/providers/primitive.rb +++ b/providers/primitive.rb @@ -18,6 +18,9 @@ # require ::File.join(::File.dirname(__FILE__), *%w(.. libraries pacemaker)) +require ::File.join(::File.dirname(__FILE__), 'common') + +include Chef::Mixin::PacemakerCommon # For vagrant env, switch to the following 'require' command. #require "/srv/chef/file_store/cookbooks/pacemaker/providers/helper" @@ -80,36 +83,17 @@ action :stop do Chef::Log.info "Successfully stopped primitive '#{name}'." end -# Instantiate @current_resource and read details about the existing -# primitive (if any) via "crm configure show" into it, so that we -# can compare it against the resource requested by the recipe, and -# create / delete / modify as necessary. +def cib_object_class + Pacemaker::Resource::Primitive +end -# http://docs.opscode.com/lwrp_custom_provider_ruby.html#load-current-resource -def load_current_resource +def init_current_resource name = @new_resource.name - - primitive = Pacemaker::CIBObject.from_name(name) - unless primitive - Chef::Log.debug "CIB object definition nil or empty" - return - end - - unless primitive.is_a? Pacemaker::Resource::Primitive - Chef::Log.warn "CIB object '#{name}' was a #{primitive.type} not a resource primitive" - return - end - - Chef::Log.debug "CIB object definition #{primitive.definition}" - @current_resource_definition = primitive.definition - primitive.parse_definition - - @current_primitive = primitive @current_resource = Chef::Resource::PacemakerPrimitive.new(name) - @current_resource.agent(primitive.agent) + @current_resource.agent(@current_cib_object.agent) %w(params meta).each do |data_type| method = data_type.to_sym - value = primitive.send(method) + value = @current_cib_object.send(method) @current_resource.send(method, value) Chef::Log.debug "detected #{name} has #{data_type} #{value}" end @@ -139,8 +123,8 @@ def maybe_modify_resource(name) cmds = [] desired_primitive = Pacemaker::Resource::Primitive.from_chef_resource(new_resource) - if desired_primitive.op_string != @current_primitive.op_string - Chef::Log.debug "op changed from [#{@current_primitive.op_string}] to [#{desired_primitive.op_string}]" + if desired_primitive.op_string != @current_cib_object.op_string + Chef::Log.debug "op changed from [#{@current_cib_object.op_string}] to [#{desired_primitive.op_string}]" to_echo = desired_primitive.definition_string.chomp to_echo.gsub!('\\') { '\\\\' } to_echo.gsub!("'", "\\'")