support changing of attributes in primitives
This commit is contained in:
parent
54c66607a2
commit
bcafd6ff31
@ -26,30 +26,15 @@ include Chef::Libraries::Pacemaker::CIBObjects
|
|||||||
|
|
||||||
action :create do
|
action :create do
|
||||||
name = new_resource.name
|
name = new_resource.name
|
||||||
agent = new_resource.agent
|
|
||||||
|
|
||||||
next if cib_object_exists?(name)
|
if @current_resource_definition.nil?
|
||||||
|
create_resource(name)
|
||||||
cmd = "crm configure primitive #{name} #{agent}"
|
else
|
||||||
cmd << resource_params_string(new_resource.params)
|
if @current_resource.agent != new_resource.agent
|
||||||
cmd << resource_meta_string(new_resource.meta)
|
raise "Existing primitive '#{name}' has agent but recipe wanted #{new_resource.agent}"
|
||||||
cmd << resource_op_string(new_resource.op)
|
|
||||||
|
|
||||||
# 'Execute' resource doesn't throw exception even when command fails..
|
|
||||||
# So, Mixlib::ShellOut was used instead.
|
|
||||||
cmd_ = Mixlib::ShellOut.new(cmd)
|
|
||||||
cmd_.environment['HOME'] = ENV.fetch('HOME', '/root')
|
|
||||||
cmd_.run_command
|
|
||||||
begin
|
|
||||||
cmd_.error!
|
|
||||||
if cib_object_exists?(name)
|
|
||||||
new_resource.updated_by_last_action(true)
|
|
||||||
Chef::Log.info "Successfully configured primitive '#{name}'."
|
|
||||||
else
|
|
||||||
Chef::Log.error "Failed to configure primitive #{name}."
|
|
||||||
end
|
end
|
||||||
rescue
|
|
||||||
Chef::Log.error "Failed to configure primitive #{name}."
|
modify_resource(name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -91,24 +76,68 @@ end
|
|||||||
def load_current_resource
|
def load_current_resource
|
||||||
name = @new_resource.name
|
name = @new_resource.name
|
||||||
|
|
||||||
return unless cib_object_exists?(name)
|
|
||||||
|
|
||||||
obj_definition = get_cib_object_definition(name)
|
obj_definition = get_cib_object_definition(name)
|
||||||
if obj_definition.nil?
|
return unless obj_definition
|
||||||
raise "CIB object '#{name}' existed but definition was nil?!"
|
|
||||||
end
|
if obj_definition.empty? # probably overly paranoid
|
||||||
if obj_definition.empty?
|
|
||||||
raise "CIB object '#{name}' existed but definition was empty?!"
|
raise "CIB object '#{name}' existed but definition was empty?!"
|
||||||
end
|
end
|
||||||
|
|
||||||
return unless cib_object_type(obj_definition) =~ /\Aprimitive #{name} (\S+)/
|
unless obj_definition =~ /\Aprimitive #{name} (\S+)/
|
||||||
|
Chef::Log.warn "Resource '#{name}' was not a primitive"
|
||||||
|
return
|
||||||
|
end
|
||||||
agent = $1
|
agent = $1
|
||||||
|
|
||||||
|
@current_resource_definition = obj_definition
|
||||||
@current_resource = Chef::Resource::PacemakerPrimitive.new(name)
|
@current_resource = Chef::Resource::PacemakerPrimitive.new(name)
|
||||||
@current_resource.agent(agent)
|
@current_resource.agent(agent)
|
||||||
|
|
||||||
%w(params meta op).each do |data_type|
|
%w(params meta).each do |data_type|
|
||||||
extract_hash(obj_definition, data_type)
|
h = extract_hash(name, obj_definition, data_type)
|
||||||
|
@current_resource.send(data_type.to_sym, h)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_resource(name)
|
||||||
|
cmd = "crm configure primitive #{name} #{new_resource.agent}"
|
||||||
|
cmd << resource_params_string(new_resource.params)
|
||||||
|
cmd << resource_meta_string(new_resource.meta)
|
||||||
|
cmd << resource_op_string(new_resource.op)
|
||||||
|
|
||||||
|
Chef::Log.debug "creating new primitive #{name} via #{cmd}"
|
||||||
|
|
||||||
|
execute cmd do
|
||||||
|
action :nothing
|
||||||
|
end.run_action(:run)
|
||||||
|
|
||||||
|
if cib_object_exists?(name)
|
||||||
|
new_resource.updated_by_last_action(true)
|
||||||
|
Chef::Log.info "Successfully configured primitive '#{name}'."
|
||||||
|
else
|
||||||
|
Chef::Log.error "Failed to configure primitive #{name}."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def modify_resource(name)
|
||||||
|
configure_cmd_prefix = "crm_resource --resource keystone"
|
||||||
|
|
||||||
|
cmds = []
|
||||||
|
new_resource.params.each do |k, v|
|
||||||
|
if @current_resource.params[k] == v
|
||||||
|
Chef::Log.debug("#{name}'s #{k} param didn't change")
|
||||||
|
else
|
||||||
|
Chef::Log.info("#{name}'s #{k} param changed to #{v}")
|
||||||
|
cmds << configure_cmd_prefix + " --set-parameter #{k} --parameter-value #{v}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
cmds.each do |cmd|
|
||||||
|
converge_by("execute #{cmd}") do
|
||||||
|
result = shell_out!(cmd)
|
||||||
|
Chef::Log.info("#{cmd} ran successfully")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
new_resource.updated_by_last_action(true) unless cmds.empty?
|
||||||
|
end
|
||||||
|
@ -4,13 +4,13 @@ require_relative File.join(%w(.. helpers keystone_config))
|
|||||||
|
|
||||||
describe "Chef::Provider::PacemakerPrimitive" do
|
describe "Chef::Provider::PacemakerPrimitive" do
|
||||||
before do
|
before do
|
||||||
@chef_run = ::ChefSpec::Runner.new(step_into: ['pacemaker_primitive']) #::OPENSUSE_OPTS
|
runner_opts = {
|
||||||
|
:step_into => ['pacemaker_primitive']
|
||||||
|
}
|
||||||
|
@chef_run = ::ChefSpec::Runner.new(runner_opts) #::OPENSUSE_OPTS
|
||||||
@chef_run.converge "pacemaker::default"
|
@chef_run.converge "pacemaker::default"
|
||||||
@node = @chef_run.node
|
@node = @chef_run.node
|
||||||
|
@run_context = @chef_run.run_context
|
||||||
@cookbook_collection = Chef::CookbookCollection.new([])
|
|
||||||
@events = Chef::EventDispatch::Dispatcher.new
|
|
||||||
@run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
|
|
||||||
|
|
||||||
@resource = Chef::Resource::PacemakerPrimitive.new("keystone", @run_context)
|
@resource = Chef::Resource::PacemakerPrimitive.new("keystone", @run_context)
|
||||||
|
|
||||||
@ -24,18 +24,50 @@ describe "Chef::Provider::PacemakerPrimitive" do
|
|||||||
describe ":create action" do
|
describe ":create action" do
|
||||||
let(:ra) { Chef::RSpec::Pacemaker::Config::RA }
|
let(:ra) { Chef::RSpec::Pacemaker::Config::RA }
|
||||||
|
|
||||||
it "should do nothing if the primitive already exists" do
|
it "should modify the primitive if it already exists" do
|
||||||
provider = Chef::Provider::PacemakerPrimitive.new(@resource, @run_context)
|
provider = Chef::Provider::PacemakerPrimitive.new(@resource, @run_context)
|
||||||
expect(provider).to receive(:cib_object_exists?).at_least(:once).and_return(true)
|
|
||||||
|
# get_cib_object_definition is invoked by load_current_resource
|
||||||
|
# and later used to see whether to create or modify.
|
||||||
expect(provider).to receive(:get_cib_object_definition).and_return(ra[:config])
|
expect(provider).to receive(:get_cib_object_definition).and_return(ra[:config])
|
||||||
expect(Mixlib::ShellOut).not_to receive(:new)
|
|
||||||
|
configure_cmd_prefix = "crm_resource --resource keystone"
|
||||||
|
expected_configure_cmd_args = [
|
||||||
|
"--set-parameter os_password --parameter-value newpasswd",
|
||||||
|
"--delete-parameter os_tenant_name",
|
||||||
|
"--set-parameter target-role --parameter-value Stopped --meta",
|
||||||
|
]
|
||||||
|
|
||||||
provider.run_action :create
|
provider.run_action :create
|
||||||
|
expected_configure_cmd_args.each do |args|
|
||||||
|
cmd = configure_cmd_prefix + " " + args
|
||||||
|
expect(@chef_run).to run_execute(cmd)
|
||||||
|
end
|
||||||
|
expect(@resource).to be_updated
|
||||||
end
|
end
|
||||||
|
|
||||||
# it "should create a primitive" do
|
it "should create a primitive if it doesn't already exist" do
|
||||||
# pending "foo"
|
provider = Chef::Provider::PacemakerPrimitive.new(@resource, @run_context)
|
||||||
# @resource.run_action :create
|
|
||||||
# end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
# get_cib_object_definition is invoked by load_current_resource
|
||||||
|
# and later used to see whether to create or modify.
|
||||||
|
expect(provider).to receive(:get_cib_object_definition).and_return(nil)
|
||||||
|
|
||||||
|
cmd = "crm configure primitive keystone #{ra[:agent]}" + \
|
||||||
|
ra[:params_string] + ra[:meta_string] + ra[:op_string]
|
||||||
|
|
||||||
|
# Later, the :create action calls cib_object_exists? to check
|
||||||
|
# that creation succeeded.
|
||||||
|
expect(provider).to receive(:cib_object_exists?).and_return(true)
|
||||||
|
|
||||||
|
provider.run_action :create
|
||||||
|
|
||||||
|
expect(@chef_run).to run_execute(cmd)
|
||||||
|
expect(@resource).to be_updated
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should barf if the primitive has the wrong agent" do
|
||||||
|
pending "not implemented yet"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user