summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Casey <james@opscode.com>2014-02-21 11:32:25 -0800
committerJames Casey <james@opscode.com>2014-02-21 11:32:25 -0800
commitb3b677d3164861376e01c230eae94c3fa26a2234 (patch)
tree7cdd4129180821756b36a338efbda01c3afac2a0
parenta4c7d9154afcdb760ff867cbb98118e5cf4089cd (diff)
parent4e9159347cd60ad14b57f3f273859c3b0459074b (diff)
downloadchef-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.rb16
-rw-r--r--spec/unit/knife/client_delete_spec.rb45
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