 162de47f95
			
		
	
	162de47f95
	
	
	
		
			
			Newly created primitive resources weren't being marked as updated in real runs, because exists? was being run on an old object. Furthermore, the tests didn't catch this because #exists? on any instance of Pacemaker::Resource::Primitive was being mocked to return true. The fix requires re-invoking Pacemaker::CIBObject.from_name after attempting to create the new primitive, so that cib_object.exists? accurately reflects whether the creation succeeded. However, testing this required mocking Mixlib::Shellout#stdout to first return "" and then secondly a definition string for the created resource, and unfortunately this exposed a nasty bug in rspec-mocks: https://github.com/rspec/rspec-mocks/issues/559 So we revamp the mocking of Mixlib::Shellout#stdout to use doubles instead of #expect_any_instance_of.
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require File.expand_path('cib_object', File.dirname(__FILE__))
 | |
| 
 | |
| module Chef::RSpec
 | |
|   module Pacemaker
 | |
|     module RunnableResource
 | |
|       def expect_running(running)
 | |
|         expect_any_instance_of(cib_object_class) \
 | |
|           .to receive(:running?) \
 | |
|           .and_return(running)
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| shared_examples "a runnable resource" do |fixture|
 | |
| 
 | |
|   include Chef::RSpec::Pacemaker::RunnableResource
 | |
| 
 | |
|   describe ":delete action" do
 | |
|     it_should_behave_like "action on non-existent resource", \
 | |
|       :delete, "crm configure delete #{fixture.name}", nil
 | |
| 
 | |
|     it "should not delete a running resource" do
 | |
|       expect_definitions(fixture.definition_string)
 | |
|       expect_running(true)
 | |
| 
 | |
|       expected_error = "Cannot delete running #{fixture}"
 | |
|       expect { provider.run_action :delete }.to \
 | |
|         raise_error(RuntimeError, expected_error)
 | |
| 
 | |
|       cmd = "crm configure delete '#{fixture.name}'"
 | |
|       expect(@chef_run).not_to run_execute(cmd)
 | |
|       expect(@resource).not_to be_updated
 | |
|     end
 | |
| 
 | |
|     it "should delete a non-running resource" do
 | |
|       expect_definitions(fixture.definition_string)
 | |
|       expect_running(false)
 | |
| 
 | |
|       provider.run_action :delete
 | |
| 
 | |
|       cmd = "crm configure delete '#{fixture.name}'"
 | |
|       expect(@chef_run).to run_execute(cmd)
 | |
|       expect(@resource).to be_updated
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe ":start action" do
 | |
|     it_should_behave_like "action on non-existent resource", \
 | |
|       :start,
 | |
|       "crm resource start #{fixture.name}", \
 | |
|       "Cannot start non-existent #{fixture}"
 | |
| 
 | |
|     it "should do nothing to a started resource" do
 | |
|       expect_definitions(fixture.definition_string)
 | |
|       expect_running(true)
 | |
| 
 | |
|       provider.run_action :start
 | |
| 
 | |
|       cmd = "crm resource start #{fixture.name}"
 | |
|       expect(@chef_run).not_to run_execute(cmd)
 | |
|       expect(@resource).not_to be_updated
 | |
|     end
 | |
| 
 | |
|     it "should start a stopped resource" do
 | |
|       config = fixture.definition_string.sub("Started", "Stopped")
 | |
|       expect_definitions(config)
 | |
|       expect_running(false)
 | |
| 
 | |
|       provider.run_action :start
 | |
| 
 | |
|       cmd = "crm resource start '#{fixture.name}'"
 | |
|       expect(@chef_run).to run_execute(cmd)
 | |
|       expect(@resource).to be_updated
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe ":stop action" do
 | |
|     it_should_behave_like "action on non-existent resource", \
 | |
|       :stop,
 | |
|       "crm resource stop #{fixture.name}", \
 | |
|       "Cannot stop non-existent #{fixture}"
 | |
| 
 | |
|     it "should do nothing to a stopped resource" do
 | |
|       expect_definitions(fixture.definition_string)
 | |
|       expect_running(false)
 | |
| 
 | |
|       provider.run_action :stop
 | |
| 
 | |
|       cmd = "crm resource start #{fixture.name}"
 | |
|       expect(@chef_run).not_to run_execute(cmd)
 | |
|       expect(@resource).not_to be_updated
 | |
|     end
 | |
| 
 | |
|     it "should stop a started resource" do
 | |
|       expect_definitions(fixture.definition_string)
 | |
|       expect_running(true)
 | |
| 
 | |
|       provider.run_action :stop
 | |
| 
 | |
|       cmd = "crm resource stop '#{fixture.name}'"
 | |
|       expect(@chef_run).to run_execute(cmd)
 | |
|       expect(@resource).to be_updated
 | |
|     end
 | |
|   end
 | |
| 
 | |
| end
 |