
In Pacemaker, target-role defaults to 'Started', but we want to allow consumers of the LWRPs the choice whether their newly created resource gets started or not, and we also want to adhere to the Principle of Least Surprise. Therefore we stick to the intuitive semantics that action :create creates the resource with target-role="Stopped" in order to prevent it from starting immediately, whereas action [:create, :start] creates the resource and then starts it. Since we are honouring :start / :stop actions to determine the target-role value, if target-role is specified via meta, it will just be overridden anyway. So we also deprecate direct use of target-role meta parameter in recipes.
117 lines
3.9 KiB
Ruby
117 lines
3.9 KiB
Ruby
require ::File.expand_path('../../../pacemaker/cib_object',
|
|
File.dirname(__FILE__))
|
|
|
|
# Common code used by Pacemaker LWRP providers
|
|
|
|
class Chef
|
|
module Mixin::Pacemaker
|
|
module StandardCIBObject
|
|
def standard_create_action
|
|
name = new_resource.name
|
|
|
|
if @current_resource_definition.nil?
|
|
create_resource(name)
|
|
else
|
|
maybe_modify_resource(name)
|
|
end
|
|
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.
|
|
#
|
|
# http://docs.opscode.com/lwrp_custom_provider_ruby.html#load-current-resource
|
|
def standard_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
|
|
|
|
# In Pacemaker, target-role defaults to 'Started', but we want
|
|
# to allow consumers of the LWRPs the choice whether their
|
|
# newly created resource gets started or not, and we also want
|
|
# to adhere to the Principle of Least Surprise. Therefore we
|
|
# stick to the intuitive semantics that
|
|
#
|
|
# action :create
|
|
#
|
|
# creates the resource with target-role="Stopped" in order to
|
|
# prevent it from starting immediately, whereas
|
|
#
|
|
# action [:create, :start]
|
|
#
|
|
# creates the resource and then starts it.
|
|
#
|
|
# Consequently we deprecate setting target-role values directly
|
|
# via the meta attribute.
|
|
def deprecate_target_role
|
|
if new_resource.respond_to? :meta
|
|
meta = new_resource.meta
|
|
if meta && meta['target-role']
|
|
::Chef::Log.warn "#{new_resource} used deprecated target-role " +
|
|
"#{meta['target-role']}; use action :start / :stop instead"
|
|
end
|
|
end
|
|
end
|
|
|
|
def standard_create_resource
|
|
deprecate_target_role
|
|
|
|
cib_object = cib_object_class.from_chef_resource(new_resource)
|
|
|
|
# We don't want resources to automatically start on creation;
|
|
# only when the :create action is invoked. However Pacemaker
|
|
# defaults target-role to "Started", so we need to override it.
|
|
if cib_object.respond_to? :meta # might be a constraint
|
|
cib_object.meta['target-role'] = 'Stopped'
|
|
end
|
|
|
|
cmd = cib_object.configure_command
|
|
|
|
::Chef::Log.info "Creating new #{cib_object}"
|
|
|
|
execute cmd do
|
|
action :nothing
|
|
end.run_action(:run)
|
|
|
|
created_cib_object = ::Pacemaker::CIBObject.from_name(new_resource.name)
|
|
|
|
raise "Failed to create #{cib_object}" if created_cib_object.nil?
|
|
unless created_cib_object.exists?
|
|
# This case seems pretty unlikely
|
|
raise "Definition missing for #{created_cib_object} after creation"
|
|
end
|
|
|
|
new_resource.updated_by_last_action(true)
|
|
::Chef::Log.info "Successfully configured #{created_cib_object}"
|
|
end
|
|
|
|
def standard_delete_resource
|
|
execute @current_cib_object.delete_command do
|
|
action :nothing
|
|
end.run_action(:run)
|
|
new_resource.updated_by_last_action(true)
|
|
Chef::Log.info "Deleted #{@current_cib_object}'."
|
|
end
|
|
end
|
|
end
|
|
end
|