
The previous use of require caused File.join on several occasions to calculate different paths to the same library, depending on which __FILE__ the library was being calculated as relative to; e.g. /some/path/prefix/spec/one/bar.rb would do the equivalent of: require '/some/path/prefix/spec/one/../../libraries/foo/mylib.rb' and /some/path/prefix/spec/two/baz.rb would do the equivalent of: require '/some/path/prefix/spec/two/../../libraries/foo/mylib.rb' This would result in mylib.rb being loaded multiple times, causing warnings from constants being redefined, and worse, multiple objects representing the same class hierarchy (@@foo) variables. The latter actually broke the @@subclasses registration mechanism in Pacemaker::CIBObject. By switching to File.expand_path, we ensure we always refer to each library using a single absolute path, which means Ruby's require mechanism works as it should, only loading the code the first time round.
55 lines
1.7 KiB
Ruby
55 lines
1.7 KiB
Ruby
require 'chef/application'
|
|
require ::File.expand_path('../libraries/pacemaker', ::File.dirname(__FILE__))
|
|
|
|
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
|
|
|
|
def standard_create_resource
|
|
cib_object = cib_object_class.from_chef_resource(new_resource)
|
|
cmd = cib_object.crm_configure_command
|
|
|
|
::Chef::Log.info "Creating new #{cib_object}"
|
|
|
|
execute cmd do
|
|
action :nothing
|
|
end.run_action(:run)
|
|
|
|
if cib_object.exists?
|
|
new_resource.updated_by_last_action(true)
|
|
::Chef::Log.info "Successfully configured #{cib_object}"
|
|
else
|
|
::Chef::Log.error "Failed to configure #{cib_object}"
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|