handle creation errors more robustly

We have seen strange cases where creation of a new CIB object apparently
failed:

  http://pastebin.suse.de/9346

Even though this is strange, we should certainly expect
Pacemaker::CIBObject.from_name to return nil in a few cases, so we need
to handle that properly.
This commit is contained in:
Adam Spiers 2014-03-14 15:33:53 +00:00
parent 7493171164
commit 4febff5dc7
2 changed files with 31 additions and 6 deletions

View File

@ -46,13 +46,16 @@ class Chef
action :nothing action :nothing
end.run_action(:run) end.run_action(:run)
cib_object = Pacemaker::CIBObject.from_name(new_resource.name) created_cib_object = Pacemaker::CIBObject.from_name(new_resource.name)
if cib_object.exists?
new_resource.updated_by_last_action(true) raise "Failed to create #{cib_object}" if created_cib_object.nil?
::Chef::Log.info "Successfully configured #{cib_object}" unless created_cib_object.exists?
else # This case seems pretty unlikely
::Chef::Log.error "Failed to configure #{cib_object}" raise "Definition missing for #{created_cib_object} after creation"
end end
new_resource.updated_by_last_action(true)
::Chef::Log.info "Successfully configured #{created_cib_object}"
end end
def standard_delete_resource def standard_delete_resource

View File

@ -110,6 +110,28 @@ describe "Chef::Provider::PacemakerPrimitive" do
expect(@resource).to be_updated expect(@resource).to be_updated
end end
it "should barf if crm fails to create the primitive" do
stub_shellout("", ["crm configure failed", "oh noes", 3])
expect { provider.run_action :create }.to \
raise_error(RuntimeError, "Failed to create #{fixture}")
expect(@chef_run).to run_execute(fixture.crm_configure_command)
expect(@resource).not_to be_updated
end
# This scenario seems rather artificial and unlikely, but it doesn't
# do any harm to test it.
it "should barf if crm creates a primitive with empty definition" do
stub_shellout("", "")
expect { provider.run_action :create }.to \
raise_error(RuntimeError, "Failed to create #{fixture}")
expect(@chef_run).to run_execute(fixture.crm_configure_command)
expect(@resource).not_to be_updated
end
it "should barf if the primitive is already defined with the wrong agent" do it "should barf if the primitive is already defined with the wrong agent" do
existing_agent = "ocf:openstack:something-else" existing_agent = "ocf:openstack:something-else"
definition = fixture.definition_string.sub(fixture.agent, existing_agent) definition = fixture.definition_string.sub(fixture.agent, existing_agent)