diff options
author | James Casey <james@opscode.com> | 2014-02-21 11:32:25 -0800 |
---|---|---|
committer | James Casey <james@opscode.com> | 2014-02-21 11:32:25 -0800 |
commit | b3b677d3164861376e01c230eae94c3fa26a2234 (patch) | |
tree | 7cdd4129180821756b36a338efbda01c3afac2a0 | |
parent | a4c7d9154afcdb760ff867cbb98118e5cf4089cd (diff) | |
parent | 4e9159347cd60ad14b57f3f273859c3b0459074b (diff) | |
download | chef-b3b677d3164861376e01c230eae94c3fa26a2234.tar.gz |
Merge pull request #1272 from opscode/jc/OC-130/knife-delete-validator
Add a --force option to protect against accidental deletion of validators
-rw-r--r-- | lib/chef/knife/client_delete.rb | 16 | ||||
-rw-r--r-- | spec/unit/knife/client_delete_spec.rb | 45 |
2 files changed, 59 insertions, 2 deletions
diff --git a/lib/chef/knife/client_delete.rb b/lib/chef/knife/client_delete.rb index 6a6fae7ea0..56814de1b2 100644 --- a/lib/chef/knife/client_delete.rb +++ b/lib/chef/knife/client_delete.rb @@ -27,6 +27,11 @@ class Chef require 'chef/json_compat' end + option :force, + :short => "-f", + :long => "--force", + :description => "Force deletion of client if it's a validator" + banner "knife client delete CLIENT (options)" def run @@ -38,7 +43,16 @@ class Chef exit 1 end - delete_object(Chef::ApiClient, @client_name) + delete_object(Chef::ApiClient, @client_name, 'client') { + object = Chef::ApiClient.load(@client_name) + if object.validator + unless config[:force] + ui.fatal("You must specify --force to delete the validator client #{@client_name}") + exit 2 + end + end + object.destroy + } end end diff --git a/spec/unit/knife/client_delete_spec.rb b/spec/unit/knife/client_delete_spec.rb index 9ebccbae15..a7ec14ce83 100644 --- a/spec/unit/knife/client_delete_spec.rb +++ b/spec/unit/knife/client_delete_spec.rb @@ -21,12 +21,16 @@ require 'spec_helper' describe Chef::Knife::ClientDelete do before(:each) do @knife = Chef::Knife::ClientDelete.new + # defaults + @knife.config = { + :force => false + } @knife.name_args = [ 'adam' ] end describe 'run' do it 'should delete the client' do - @knife.should_receive(:delete_object).with(Chef::ApiClient, 'adam') + @knife.should_receive(:delete_object).with(Chef::ApiClient, 'adam', 'client') @knife.run end @@ -37,4 +41,43 @@ describe Chef::Knife::ClientDelete do lambda { @knife.run }.should raise_error(SystemExit) end end + + describe 'with a validator' do + before(:each) do + Chef::Knife::UI.stub(:confirm).and_return(true) + @knife.stub(:confirm).and_return(true) + @client = Chef::ApiClient.new + Chef::ApiClient.should_receive(:load).and_return(@client) + end + + it 'should delete non-validator client if --force is not set' do + @knife.config[:force] = false + @client.should_receive(:destroy).and_return(@client) + @knife.should_receive(:msg) + + @knife.run + end + + it 'should delete non-validator client if --force is set' do + @knife.config[:force] = true + @client.should_receive(:destroy).and_return(@client) + @knife.should_receive(:msg) + + @knife.run + end + + it 'should not delete validator client if --force is not set' do + @client.validator(true) + @knife.ui.should_receive(:fatal) + lambda { @knife.run}.should raise_error(SystemExit) + end + + it 'should delete validator client if --force is set' do + @knife.config[:force] = true + @client.should_receive(:destroy).and_return(@client) + @knife.should_receive(:msg) + + @knife.run + end + end end |