knife-cloud 1.2.1 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/lib/chef/knife/cloud/chefbootstrap/bootstrap_distribution.rb +2 -2
  4. data/lib/chef/knife/cloud/chefbootstrap/bootstrap_options.rb +115 -133
  5. data/lib/chef/knife/cloud/chefbootstrap/bootstrap_protocol.rb +6 -6
  6. data/lib/chef/knife/cloud/chefbootstrap/bootstrapper.rb +11 -12
  7. data/lib/chef/knife/cloud/chefbootstrap/ssh_bootstrap_protocol.rb +49 -54
  8. data/lib/chef/knife/cloud/chefbootstrap/unix_distribution.rb +3 -3
  9. data/lib/chef/knife/cloud/chefbootstrap/windows_distribution.rb +3 -3
  10. data/lib/chef/knife/cloud/chefbootstrap/winrm_bootstrap_protocol.rb +11 -12
  11. data/lib/chef/knife/cloud/command.rb +24 -27
  12. data/lib/chef/knife/cloud/exceptions.rb +1 -2
  13. data/lib/chef/knife/cloud/fog/options.rb +8 -8
  14. data/lib/chef/knife/cloud/fog/service.rb +54 -60
  15. data/lib/chef/knife/cloud/helpers.rb +2 -3
  16. data/lib/chef/knife/cloud/list_resource_command.rb +6 -7
  17. data/lib/chef/knife/cloud/list_resource_options.rb +5 -5
  18. data/lib/chef/knife/cloud/server/create_command.rb +30 -35
  19. data/lib/chef/knife/cloud/server/create_options.rb +33 -34
  20. data/lib/chef/knife/cloud/server/delete_command.rb +12 -15
  21. data/lib/chef/knife/cloud/server/delete_options.rb +7 -8
  22. data/lib/chef/knife/cloud/server/list_command.rb +22 -22
  23. data/lib/chef/knife/cloud/server/list_options.rb +9 -10
  24. data/lib/chef/knife/cloud/server/options.rb +7 -7
  25. data/lib/chef/knife/cloud/server/show_command.rb +5 -5
  26. data/lib/chef/knife/cloud/server/show_options.rb +5 -6
  27. data/lib/chef/knife/cloud/service.rb +12 -13
  28. data/lib/knife-cloud/version.rb +2 -2
  29. data/lib/test/fixtures/knife.rb +3 -3
  30. data/lib/test/fixtures/validation.pem +27 -0
  31. data/lib/test/knife-utils/helper.rb +11 -11
  32. data/lib/test/knife-utils/knife_test_utils.rb +4 -4
  33. data/lib/test/knife-utils/matchers.rb +3 -3
  34. data/lib/test/knife-utils/test_bed.rb +38 -38
  35. data/lib/test/templates/windows-chef-client-msi.erb +3 -4
  36. data/lib/test/templates/windows-shell.erb +2 -2
  37. metadata +12 -152
  38. data/.gitignore +0 -33
  39. data/.travis.yml +0 -6
  40. data/CHANGELOG.md +0 -133
  41. data/CONTRIBUTING.md +0 -5
  42. data/Gemfile +0 -9
  43. data/README.md +0 -421
  44. data/Rakefile +0 -35
  45. data/ci.gemfile +0 -18
  46. data/knife-cloud.gemspec +0 -26
  47. data/spec/resource_spec_helper.rb +0 -49
  48. data/spec/server_command_common_spec_helper.rb +0 -48
  49. data/spec/spec_helper.rb +0 -25
  50. data/spec/support/shared_examples_for_command.rb +0 -35
  51. data/spec/support/shared_examples_for_servercreatecommand.rb +0 -144
  52. data/spec/support/shared_examples_for_serverdeletecommand.rb +0 -77
  53. data/spec/support/shared_examples_for_service.rb +0 -85
  54. data/spec/unit/bootstrap_protocol_spec.rb +0 -98
  55. data/spec/unit/bootstrapper_spec.rb +0 -171
  56. data/spec/unit/cloud_command_spec.rb +0 -35
  57. data/spec/unit/command_spec.rb +0 -49
  58. data/spec/unit/fog_service_spec.rb +0 -163
  59. data/spec/unit/list_resource_command_spec.rb +0 -140
  60. data/spec/unit/server_create_command_spec.rb +0 -198
  61. data/spec/unit/server_delete_command_spec.rb +0 -25
  62. data/spec/unit/server_list_command_spec.rb +0 -119
  63. data/spec/unit/server_show_command_spec.rb +0 -64
  64. data/spec/unit/service_spec.rb +0 -46
  65. data/spec/unit/ssh_bootstrap_protocol_spec.rb +0 -116
  66. data/spec/unit/unix_distribution_spec.rb +0 -37
  67. data/spec/unit/windows_distribution_spec.rb +0 -37
  68. data/spec/unit/winrm_bootstrap_protocol_spec.rb +0 -108
data/Rakefile DELETED
@@ -1,35 +0,0 @@
1
- # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
2
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
3
-
4
- require 'bundler'
5
- Bundler::GemHelper.install_tasks
6
-
7
- require 'rubygems'
8
- require 'rubygems/package_task'
9
-
10
- task default: :all
11
- task all: [:spec, :uninstall, :install]
12
-
13
- # Packaging
14
- GEM_NAME = 'knife-cloud'.freeze
15
- require File.dirname(__FILE__) + '/lib/knife-cloud/version'
16
- spec = eval(File.read('knife-cloud.gemspec'))
17
- Gem::PackageTask.new(spec) do |pkg|
18
- pkg.gem_spec = spec
19
- end
20
-
21
- desc "uninstall #{GEM_NAME}-#{Knife::Cloud::VERSION}.gem from system..."
22
- task :uninstall do
23
- sh %(gem uninstall #{GEM_NAME} -x -v #{Knife::Cloud::VERSION} )
24
- end
25
-
26
- # rspec
27
- begin
28
- require 'rspec/core/rake_task'
29
- desc 'Run all specs in spec directory'
30
- RSpec::Core::RakeTask.new(:spec) do |t|
31
- t.pattern = 'spec/unit/**/*_spec.rb'
32
- end
33
- rescue LoadError
34
- STDERR.puts "\n*** RSpec not available. (sudo) gem install rspec to run unit tests. ***\n\n"
35
- end
data/ci.gemfile DELETED
@@ -1,18 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in knife-cloud.gemspec
4
- gemspec
5
-
6
- if ENV['CHEF_VERSION'] == 'master'
7
- gem 'chef', github: 'chef/chef'
8
- elsif ENV['CHEF_VERSION'] == '< 12'
9
- gem 'ohai', '7.4.1'
10
- gem 'chef', ENV['CHEF_VERSION']
11
- else
12
- gem 'chef', ENV['CHEF_VERSION']
13
- end
14
-
15
- group :development do
16
- gem 'rake'
17
- gem 'knife-windows'
18
- end
@@ -1,26 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
- require 'knife-cloud/version'
4
-
5
- Gem::Specification.new do |s|
6
- s.name = 'knife-cloud'
7
- s.version = Knife::Cloud::VERSION
8
- s.platform = Gem::Platform::RUBY
9
- s.extra_rdoc_files = ['README.md', 'LICENSE']
10
- s.authors = ['Kaustubh Deorukhkar', 'Ameya Varade']
11
- s.email = ['dev@chef.io']
12
- s.homepage = 'https://github.com/chef/knife-cloud'
13
- s.summary = 'knife-cloud plugin'
14
- s.description = s.summary
15
-
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
19
- s.require_paths = %w(lib spec)
20
-
21
- s.add_dependency 'knife-windows', '>= 0.5.14'
22
- s.add_dependency 'chef', '>= 0.10.10'
23
- s.add_dependency 'mixlib-shellout'
24
-
25
- %w(rspec-core rspec-expectations rspec-mocks rspec_junit_formatter fog rubocop).each { |gem| s.add_development_dependency gem }
26
- end
@@ -1,49 +0,0 @@
1
- #
2
- # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
- # Copyright:: Copyright (c) 2014 Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- $:.unshift File.expand_path('../../lib', __FILE__)
19
- require 'json'
20
-
21
- # Creates a resource class that can dynamically add attributes to
22
- # instances and set the values
23
- module JSONModule
24
- def to_json
25
- hash = {}
26
- self.instance_variables.each do |var|
27
- hash[var] = self.instance_variable_get var
28
- end
29
- hash.to_json
30
- end
31
- def from_json! string
32
- JSON.load(string).each do |var, val|
33
- self.instance_variable_set var, val
34
- end
35
- end
36
- end
37
-
38
- class TestResource
39
- include JSONModule
40
- def initialize(*args)
41
- args.each do |arg|
42
- arg.each do |key, value|
43
- add_attribute = "class << self; attr_accessor :#{key}; end"
44
- eval(add_attribute)
45
- eval("@#{key} = value")
46
- end
47
- end
48
- end
49
- end
@@ -1,48 +0,0 @@
1
- #
2
- # Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
3
- # Copyright:: Copyright (c) 2014 Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- $:.unshift File.expand_path('../../lib', __FILE__)
19
-
20
- # Common helper methods used accrossed knife plugin during Integration testing.
21
- #
22
- # run_cmd_check_status_and_output: It checks knife plugin command exitstatus(i.e '0' = succeed and '1' = fails)
23
- # and also checks command output(i.e stdout or stderr)
24
- #
25
- # run_cmd_check_stdout: It checks commands stdout.
26
- #
27
- # server_create_common_bfr_aftr: Its contains common before and after blocks used for server create
28
-
29
- def run_cmd_check_status_and_output(expected_status = "succeed", expected_result = nil)
30
- it do
31
- match_status("should #{expected_status}")
32
- expect(cmd_output).to include(expected_result) if expected_result
33
- end
34
- end
35
-
36
- def run_cmd_check_stdout(expected_result)
37
- it { match_stdout(/#{expected_result}/) }
38
- end
39
-
40
- def server_create_common_bfr_aftr(platform = "linux")
41
- before { create_node_name(platform) }
42
- after { run(delete_instance_cmd("#{cmd_output}")) }
43
- end
44
-
45
- def rm_known_host
46
- known_hosts = File.expand_path("~") + "/.ssh/known_hosts"
47
- FileUtils.rm_rf(known_hosts)
48
- end
@@ -1,25 +0,0 @@
1
- #
2
- # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
3
- # Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
4
- # Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- $:.unshift File.expand_path('../../lib', __FILE__)
20
- require 'json'
21
- require 'chef/knife/cloud/exceptions'
22
- require 'chef/exceptions'
23
- require 'chef/config'
24
- require 'resource_spec_helper'
25
- require 'server_command_common_spec_helper'
@@ -1,35 +0,0 @@
1
- #
2
- # Author:: Mukta Aphale (<mukta.aphale@clogeny.com>)
3
- # Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
4
- # Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- require 'chef/knife/cloud/command'
20
- require 'chef/knife/cloud/service'
21
-
22
- shared_examples_for Chef::Knife::Cloud::Command do |instance|
23
- it "runs with correct method calls" do
24
- allow(instance).to receive(:execute_command)
25
- allow(instance).to receive(:create_service_instance).and_return(Chef::Knife::Cloud::Service.new)
26
- expect(instance).to receive(:set_default_config).ordered
27
- expect(instance).to receive(:validate!).ordered
28
- expect(instance).to receive(:validate_params!).ordered
29
- expect(instance).to receive(:create_service_instance).ordered
30
- expect(instance).to receive(:before_exec_command).ordered
31
- expect(instance).to receive(:execute_command).ordered
32
- expect(instance).to receive(:after_exec_command).ordered
33
- instance.run
34
- end
35
- end
@@ -1,144 +0,0 @@
1
- #
2
- # Author:: Mukta Aphale (<mukta.aphale@clogeny.com>)
3
- # Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
4
- # Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- require 'spec_helper'
20
- require 'chef/knife/cloud/server/create_command'
21
-
22
- def get_mock_resource(id)
23
- obj = Object.new
24
- allow(obj).to receive(:id).and_return(id)
25
- obj
26
- end
27
-
28
- shared_examples_for Chef::Knife::Cloud::ServerCreateCommand do |instance|
29
- before do
30
- instance.service = double
31
- allow(instance.ui).to receive(:fatal)
32
-
33
- allow(instance.service).to receive(:get_image).and_return(get_mock_resource('image_id'))
34
-
35
- allow(instance.service).to receive(:get_flavor).and_return(get_mock_resource('flavor_id'))
36
- end
37
-
38
- describe "#before_exec_command" do
39
- it "calls create_server_dependencies" do
40
- expect(instance.service).to receive(:create_server_dependencies)
41
- instance.before_exec_command
42
- end
43
- it "delete_server_dependencies on any error" do
44
- allow(instance).to receive(:execute_command)
45
- allow(instance).to receive(:after_exec_command)
46
- allow(instance).to receive(:validate!)
47
- allow(instance).to receive(:validate_params!)
48
- instance.service = Chef::Knife::Cloud::Service.new
49
- allow(instance).to receive(:create_service_instance).and_return(instance.service)
50
- allow(instance.service).to receive(:get_image).and_return(get_mock_resource('image_id'))
51
- allow(instance.service).to receive(:get_flavor).and_return(get_mock_resource('flavor_id'))
52
- allow(instance.service).to receive(:create_server_dependencies).and_raise(Chef::Knife::Cloud::CloudExceptions::ServerCreateDependenciesError)
53
- expect(instance.service).to receive(:delete_server_dependencies)
54
- expect(instance.service).to_not receive(:delete_server_on_failure)
55
- expect(instance).to receive(:exit)
56
- instance.run
57
- end
58
- end
59
-
60
- describe "#execute_command" do
61
- it "calls create_server" do
62
- expect(instance.service).to receive(:create_server).and_return(true)
63
- expect(instance.service).to receive(:server_summary)
64
- instance.execute_command
65
- end
66
-
67
- it "delete_server_dependencies on any error" do
68
- allow(instance).to receive(:before_exec_command)
69
- allow(instance).to receive(:after_exec_command)
70
- allow(instance).to receive(:validate!)
71
- allow(instance).to receive(:validate_params!)
72
- instance.service = Chef::Knife::Cloud::Service.new
73
- allow(instance).to receive(:create_service_instance).and_return(instance.service)
74
- allow(instance.service).to receive(:create_server).and_raise(Chef::Knife::Cloud::CloudExceptions::ServerCreateError)
75
- expect(instance.service).to receive(:delete_server_dependencies)
76
- expect(instance.service).to_not receive(:delete_server_on_failure)
77
- expect(instance).to receive(:exit)
78
- instance.run
79
- end
80
- end
81
-
82
- describe "#bootstrap" do
83
- it "execute with correct method calls" do
84
- @bootstrap = Object.new
85
- allow(@bootstrap).to receive(:bootstrap)
86
- allow(instance.ui).to receive(:info)
87
- allow(Chef::Knife::Cloud::Bootstrapper).to receive(:new).and_return(@bootstrap)
88
- expect(instance).to receive(:before_bootstrap).ordered
89
- expect(instance).to receive(:after_bootstrap).ordered
90
- instance.bootstrap
91
- end
92
- end
93
-
94
- describe "#after_bootstrap" do
95
- it "display server summary" do
96
- expect(instance.service).to receive(:server_summary)
97
- instance.after_bootstrap
98
- end
99
- end
100
-
101
- describe "#get_node_name" do
102
- it "auto generates chef_node_name" do
103
- instance.config[:bootstrap_protocol] = 'ssh'
104
- instance.config[:ssh_password] = 'password'
105
- instance.config[:image_os_type] = 'linux'
106
- instance.config[:chef_node_name_prefix] = 'os'
107
- expect(instance).to receive(:get_node_name).and_call_original
108
- instance.validate_params!
109
- expect(instance.config[:chef_node_name]).to be =~ /os-*/
110
- end
111
-
112
- it "auto generates unique chef_node_name" do
113
- node_names = []
114
- instance.config[:bootstrap_protocol] = 'ssh'
115
- instance.config[:ssh_password] = 'password'
116
- instance.config[:image_os_type] = 'linux'
117
- instance.config[:chef_node_name_prefix] = 'os'
118
- 5.times do
119
- instance.config[:chef_node_name] = nil
120
- instance.validate_params!
121
- expect(node_names).to_not include(instance.config[:chef_node_name])
122
- node_names.push(instance.config[:chef_node_name])
123
- end
124
- end
125
- end
126
-
127
- describe "#cleanup_on_failure" do
128
- it "delete server dependencies on delete_server_on_failure set" do
129
- instance.config[:delete_server_on_failure] = true
130
- instance.service = Chef::Knife::Cloud::Service.new
131
- expect(instance.service).to receive(:delete_server_dependencies)
132
- expect(instance.service).to receive(:delete_server_on_failure)
133
- instance.cleanup_on_failure
134
- end
135
-
136
- it "don't delete server dependencies on delete_server_on_failure option is missing" do
137
- instance.config[:delete_server_on_failure] = false
138
- Chef::Config[:knife].delete(:delete_server_on_failure)
139
- expect(instance.service).to_not receive(:delete_server_dependencies)
140
- expect(instance.service).to_not receive(:delete_server_on_failure)
141
- instance.cleanup_on_failure
142
- end
143
- end
144
- end
@@ -1,77 +0,0 @@
1
- #
2
- # Author:: Mukta Aphale (<mukta.aphale@clogeny.com>)
3
- # Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
4
- # Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- require 'chef/knife/cloud/server/delete_command'
20
-
21
- shared_examples_for Chef::Knife::Cloud::ServerDeleteCommand do |instance|
22
- describe "#delete_from_chef" do
23
- it "expects chef warning message when purge option is disabled" do
24
- server_name = "testserver"
25
- expect(instance.ui).to receive(:warn).with("Corresponding node and client for the #{server_name} server were not deleted and remain registered with the Chef Server")
26
- instance.delete_from_chef(server_name)
27
- end
28
-
29
- it "deletes chef node and client when purge option is enabled" do
30
- instance.config[:purge] = true
31
- server_name = "testserver"
32
- expect(instance).to receive(:destroy_item).with(Chef::Node, server_name, "node").ordered
33
- expect(instance).to receive(:destroy_item).with(Chef::ApiClient, server_name, "client").ordered
34
- instance.delete_from_chef(server_name)
35
- end
36
-
37
- it "deletes chef node specified with node-name option overriding the instance server_name" do
38
- instance.config[:purge] = true
39
- server_name = "testserver"
40
- chef_node_name = "testnode"
41
- instance.config[:chef_node_name] = chef_node_name
42
- expect(instance).to receive(:destroy_item).with(Chef::Node, chef_node_name, "node").ordered
43
- expect(instance).to receive(:destroy_item).with(Chef::ApiClient, chef_node_name, "client").ordered
44
- instance.delete_from_chef(chef_node_name)
45
- end
46
- end
47
-
48
- describe "#execute_command" do
49
- it "execute with correct method calls" do
50
- instance::name_args = ["testserver"]
51
- instance.service = double
52
- expect(instance.service).to receive(:delete_server).ordered
53
- expect(instance).to receive(:delete_from_chef).ordered
54
- instance.execute_command
55
- end
56
- end
57
-
58
- describe "#destroy_item" do
59
- it "destroy chef node" do
60
- node_name = "testnode"
61
- test_obj = Object.new
62
- allow(Chef::Node).to receive(:load).and_return(test_obj)
63
- allow(test_obj).to receive(:destroy)
64
- expect(instance.ui).to receive(:warn).with("Deleted node #{node_name}")
65
- instance.destroy_item(Chef::Node, node_name, "node")
66
- end
67
-
68
- it "destroy chef client" do
69
- client_name = "testclient"
70
- test_obj = Object.new
71
- allow(Chef::ApiClient).to receive(:load).and_return(test_obj)
72
- allow(test_obj).to receive(:destroy)
73
- expect(instance.ui).to receive(:warn).with("Deleted client #{client_name}")
74
- instance.destroy_item(Chef::ApiClient, client_name, "client")
75
- end
76
- end
77
- end