chef 12.4.3 → 12.5.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -2
  3. data/lib/chef.rb +1 -1
  4. data/lib/chef/application/solo.rb +1 -1
  5. data/lib/chef/application/windows_service_manager.rb +17 -12
  6. data/lib/chef/chef_class.rb +7 -0
  7. data/lib/chef/chef_fs/config.rb +22 -24
  8. data/lib/chef/chef_fs/file_pattern.rb +4 -15
  9. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +1 -0
  10. data/lib/chef/chef_fs/knife.rb +35 -7
  11. data/lib/chef/chef_fs/path_utils.rb +65 -34
  12. data/lib/chef/constants.rb +27 -0
  13. data/lib/chef/delayed_evaluator.rb +21 -0
  14. data/lib/chef/dsl/recipe.rb +20 -2
  15. data/lib/chef/event_dispatch/base.rb +40 -16
  16. data/lib/chef/event_dispatch/dsl.rb +64 -0
  17. data/lib/chef/exceptions.rb +6 -1
  18. data/lib/chef/formatters/doc.rb +3 -1
  19. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +3 -1
  20. data/lib/chef/http/http_request.rb +1 -1
  21. data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
  22. data/lib/chef/knife/ssl_check.rb +3 -2
  23. data/lib/chef/knife/user_edit.rb +1 -2
  24. data/lib/chef/mixin/params_validate.rb +362 -135
  25. data/lib/chef/node.rb +19 -0
  26. data/lib/chef/platform/handler_map.rb +0 -5
  27. data/lib/chef/platform/rebooter.rb +1 -1
  28. data/lib/chef/property.rb +539 -0
  29. data/lib/chef/provider.rb +129 -12
  30. data/lib/chef/provider/deploy.rb +3 -5
  31. data/lib/chef/provider/lwrp_base.rb +1 -75
  32. data/lib/chef/provider/package.rb +1 -1
  33. data/lib/chef/provider/powershell_script.rb +32 -19
  34. data/lib/chef/provider/registry_key.rb +5 -5
  35. data/lib/chef/provider/service/macosx.rb +5 -1
  36. data/lib/chef/recipe.rb +1 -8
  37. data/lib/chef/resource.rb +499 -84
  38. data/lib/chef/resource/file/verification.rb +7 -1
  39. data/lib/chef/resource/lwrp_base.rb +1 -7
  40. data/lib/chef/run_context.rb +404 -83
  41. data/lib/chef/version.rb +1 -1
  42. data/lib/chef/win32/registry.rb +10 -2
  43. data/lib/chef/workstation_config_loader.rb +3 -158
  44. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -0
  45. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -0
  46. data/spec/functional/rebooter_spec.rb +1 -1
  47. data/spec/functional/resource/{powershell_spec.rb → powershell_script_spec.rb} +3 -3
  48. data/spec/functional/win32/registry_helper_spec.rb +12 -0
  49. data/spec/functional/win32/service_manager_spec.rb +2 -2
  50. data/spec/integration/knife/chef_repo_path_spec.rb +13 -11
  51. data/spec/integration/recipes/recipe_dsl_spec.rb +0 -15
  52. data/spec/integration/recipes/resource_action_spec.rb +343 -0
  53. data/spec/spec_helper.rb +1 -0
  54. data/spec/support/shared/functional/win32_service.rb +2 -1
  55. data/spec/unit/application/solo_spec.rb +4 -3
  56. data/spec/unit/chef_class_spec.rb +23 -0
  57. data/spec/unit/chef_fs/path_util_spec.rb +108 -0
  58. data/spec/unit/event_dispatch/dsl_spec.rb +87 -0
  59. data/spec/unit/json_compat_spec.rb +4 -3
  60. data/spec/unit/knife/ssl_check_spec.rb +4 -0
  61. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  62. data/spec/unit/node_spec.rb +7 -0
  63. data/spec/unit/property/state_spec.rb +506 -0
  64. data/spec/unit/property/validation_spec.rb +658 -0
  65. data/spec/unit/property_spec.rb +968 -0
  66. data/spec/unit/provider/{powershell_spec.rb → powershell_script_spec.rb} +0 -0
  67. data/spec/unit/provider/registry_key_spec.rb +12 -0
  68. data/spec/unit/provider/service/macosx_spec.rb +4 -4
  69. data/spec/unit/provider_spec.rb +1 -3
  70. data/spec/unit/recipe_spec.rb +0 -4
  71. data/spec/unit/registry_helper_spec.rb +15 -1
  72. data/spec/unit/resource/file/verification_spec.rb +33 -5
  73. data/spec/unit/resource/{powershell_spec.rb → powershell_script_spec.rb} +0 -0
  74. data/spec/unit/resource_spec.rb +2 -2
  75. data/spec/unit/run_context/child_run_context_spec.rb +133 -0
  76. data/spec/unit/run_context_spec.rb +7 -0
  77. metadata +25 -25
  78. data/spec/unit/workstation_config_loader_spec.rb +0 -283
@@ -21,7 +21,7 @@
21
21
 
22
22
  class Chef
23
23
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
24
- VERSION = '12.4.3'
24
+ VERSION = '12.5.0.alpha.1'
25
25
  end
26
26
 
27
27
  #
@@ -203,7 +203,7 @@ class Chef
203
203
  key_exists!(key_path)
204
204
  hive, key = get_hive_and_key(key_path)
205
205
  hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
206
- return true if reg.any? {|val| val == value[:name] }
206
+ return true if reg.any? {|val| safely_downcase(val) == safely_downcase(value[:name]) }
207
207
  end
208
208
  return false
209
209
  end
@@ -213,7 +213,7 @@ class Chef
213
213
  hive, key = get_hive_and_key(key_path)
214
214
  hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
215
215
  reg.each do |val_name, val_type, val_data|
216
- if val_name == value[:name] &&
216
+ if safely_downcase(val_name) == safely_downcase(value[:name]) &&
217
217
  val_type == get_type_from_name(value[:type]) &&
218
218
  val_data == value[:data]
219
219
  return true
@@ -289,6 +289,14 @@ class Chef
289
289
 
290
290
  private
291
291
 
292
+
293
+ def safely_downcase(val)
294
+ if val.is_a? String
295
+ return val.downcase
296
+ end
297
+ return val
298
+ end
299
+
292
300
  def node
293
301
  run_context && run_context.node
294
302
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Author:: Daniel DeLeo (<dan@getchef.com>)
2
+ # Author:: Claire McQuin (<claire@chef.io>)
3
3
  # Copyright:: Copyright (c) 2014 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
@@ -16,163 +16,8 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/config_fetcher'
20
- require 'chef/config'
21
- require 'chef/null_logger'
22
- require 'chef/util/path_helper'
19
+ require 'chef-config/workstation_config_loader'
23
20
 
24
21
  class Chef
25
-
26
- class WorkstationConfigLoader
27
-
28
- # Path to a config file requested by user, (e.g., via command line option). Can be nil
29
- attr_accessor :explicit_config_file
30
-
31
- # TODO: initialize this with a logger for Chef and Knife
32
- def initialize(explicit_config_file, logger=nil)
33
- @explicit_config_file = explicit_config_file
34
- @config_location = nil
35
- @logger = logger || NullLogger.new
36
- end
37
-
38
- def no_config_found?
39
- config_location.nil?
40
- end
41
-
42
- def config_location
43
- @config_location ||= (explicit_config_file || locate_local_config)
44
- end
45
-
46
- def chef_config_dir
47
- if @chef_config_dir.nil?
48
- @chef_config_dir = false
49
- full_path = working_directory.split(File::SEPARATOR)
50
- (full_path.length - 1).downto(0) do |i|
51
- candidate_directory = File.join(full_path[0..i] + [".chef" ])
52
- if File.exist?(candidate_directory) && File.directory?(candidate_directory)
53
- @chef_config_dir = candidate_directory
54
- break
55
- end
56
- end
57
- end
58
- @chef_config_dir
59
- end
60
-
61
- def load
62
- # Ignore it if there's no explicit_config_file and can't find one at a
63
- # default path.
64
- return false if config_location.nil?
65
-
66
- if explicit_config_file && !path_exists?(config_location)
67
- raise Exceptions::ConfigurationError, "Specified config file #{config_location} does not exist"
68
- end
69
-
70
- # Have to set Chef::Config.config_file b/c other config is derived from it.
71
- Chef::Config.config_file = config_location
72
- read_config(IO.read(config_location), config_location)
73
- end
74
-
75
- # (Private API, public for test purposes)
76
- def env
77
- ENV
78
- end
79
-
80
- # (Private API, public for test purposes)
81
- def path_exists?(path)
82
- Pathname.new(path).expand_path.exist?
83
- end
84
-
85
- private
86
-
87
- def have_config?(path)
88
- if path_exists?(path)
89
- logger.info("Using config at #{path}")
90
- true
91
- else
92
- logger.debug("Config not found at #{path}, trying next option")
93
- false
94
- end
95
- end
96
-
97
- def locate_local_config
98
- candidate_configs = []
99
-
100
- # Look for $KNIFE_HOME/knife.rb (allow multiple knives config on same machine)
101
- if env['KNIFE_HOME']
102
- candidate_configs << File.join(env['KNIFE_HOME'], 'config.rb')
103
- candidate_configs << File.join(env['KNIFE_HOME'], 'knife.rb')
104
- end
105
- # Look for $PWD/knife.rb
106
- if Dir.pwd
107
- candidate_configs << File.join(Dir.pwd, 'config.rb')
108
- candidate_configs << File.join(Dir.pwd, 'knife.rb')
109
- end
110
- # Look for $UPWARD/.chef/knife.rb
111
- if chef_config_dir
112
- candidate_configs << File.join(chef_config_dir, 'config.rb')
113
- candidate_configs << File.join(chef_config_dir, 'knife.rb')
114
- end
115
- # Look for $HOME/.chef/knife.rb
116
- Chef::Util::PathHelper.home('.chef') do |dot_chef_dir|
117
- candidate_configs << File.join(dot_chef_dir, 'config.rb')
118
- candidate_configs << File.join(dot_chef_dir, 'knife.rb')
119
- end
120
-
121
- candidate_configs.find do | candidate_config |
122
- have_config?(candidate_config)
123
- end
124
- end
125
-
126
- def working_directory
127
- a = if Chef::Platform.windows?
128
- env['CD']
129
- else
130
- env['PWD']
131
- end || Dir.pwd
132
-
133
- a
134
- end
135
-
136
- def read_config(config_content, config_file_path)
137
- Chef::Config.from_string(config_content, config_file_path)
138
- rescue SignalException
139
- raise
140
- rescue SyntaxError => e
141
- message = ""
142
- message << "You have invalid ruby syntax in your config file #{config_file_path}\n\n"
143
- message << "#{e.class.name}: #{e.message}\n"
144
- if file_line = e.message[/#{Regexp.escape(config_file_path)}:[\d]+/]
145
- line = file_line[/:([\d]+)$/, 1].to_i
146
- message << highlight_config_error(config_file_path, line)
147
- end
148
- raise Exceptions::ConfigurationError, message
149
- rescue Exception => e
150
- message = "You have an error in your config file #{config_file_path}\n\n"
151
- message << "#{e.class.name}: #{e.message}\n"
152
- filtered_trace = e.backtrace.grep(/#{Regexp.escape(config_file_path)}/)
153
- filtered_trace.each {|bt_line| message << " " << bt_line << "\n" }
154
- if !filtered_trace.empty?
155
- line_nr = filtered_trace.first[/#{Regexp.escape(config_file_path)}:([\d]+)/, 1]
156
- message << highlight_config_error(config_file_path, line_nr.to_i)
157
- end
158
- raise Exceptions::ConfigurationError, message
159
- end
160
-
161
-
162
- def highlight_config_error(file, line)
163
- config_file_lines = []
164
- IO.readlines(file).each_with_index {|l, i| config_file_lines << "#{(i + 1).to_s.rjust(3)}: #{l.chomp}"}
165
- if line == 1
166
- lines = config_file_lines[0..3]
167
- else
168
- lines = config_file_lines[Range.new(line - 2, line)]
169
- end
170
- "Relevant file content:\n" + lines.join("\n") + "\n"
171
- end
172
-
173
- def logger
174
- @logger
175
- end
176
-
177
- end
22
+ WorkstationConfigLoader = ChefConfig::WorkstationConfigLoader
178
23
  end
@@ -0,0 +1,24 @@
1
+ module ::RanResources
2
+ def self.resources
3
+ @resources ||= []
4
+ end
5
+ end
6
+ class RunContextCustomResource < Chef::Resource
7
+ action :create do
8
+ ruby_block '4' do
9
+ block { RanResources.resources << 4 }
10
+ end
11
+ recipe_eval do
12
+ ruby_block '1' do
13
+ block { RanResources.resources << 1 }
14
+ end
15
+ include_recipe 'include::includee'
16
+ ruby_block '3' do
17
+ block { RanResources.resources << 3 }
18
+ end
19
+ end
20
+ ruby_block '5' do
21
+ block { RanResources.resources << 5 }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,3 @@
1
+ ruby_block '2' do
2
+ block { RanResources.resources << 2 }
3
+ end
@@ -43,7 +43,7 @@ describe Chef::Platform::Rebooter do
43
43
 
44
44
  let(:expected) do
45
45
  {
46
- :windows => 'shutdown /r /t 5 /c "rebooter spec test"',
46
+ :windows => 'shutdown /r /t 300 /c "rebooter spec test"',
47
47
  :linux => 'shutdown -r +5 "rebooter spec test"'
48
48
  }
49
49
  end
@@ -125,16 +125,16 @@ describe Chef::Resource::WindowsScript::PowershellScript, :windows_only do
125
125
  expect { resource.run_action(:run) }.not_to raise_error
126
126
  end
127
127
 
128
- it "raises an error if the script is not syntactically correct and returns is not set to 1" do
128
+ it "raises a Mixlib::ShellOut::ShellCommandFailed error if the script is not syntactically correct" do
129
129
  resource.code('if({)')
130
130
  resource.returns(0)
131
131
  expect { resource.run_action(:run) }.to raise_error(Mixlib::ShellOut::ShellCommandFailed)
132
132
  end
133
133
 
134
- it "returns 1 if the script provided to the code attribute is not syntactically correct" do
134
+ it "raises an error if the script is not syntactically correct even if returns is set to 1 which is what powershell.exe returns for syntactically invalid scripts" do
135
135
  resource.code('if({)')
136
136
  resource.returns(1)
137
- expect { resource.run_action(:run) }.not_to raise_error
137
+ expect { resource.run_action(:run) }.to raise_error(Mixlib::ShellOut::ShellCommandFailed)
138
138
  end
139
139
 
140
140
  # This somewhat ambiguous case, two failures of different types,
@@ -130,6 +130,9 @@ describe 'Chef::Win32::Registry', :windows_only do
130
130
  it "returns true if the value exists" do
131
131
  expect(@registry.value_exists?("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"Petals"})).to eq(true)
132
132
  end
133
+ it "returns true if the value exists with a case mismatch on the value name" do
134
+ expect(@registry.value_exists?("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"petals"})).to eq(true)
135
+ end
133
136
  it "returns false if the value does not exist" do
134
137
  expect(@registry.value_exists?("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"FOOBAR"})).to eq(false)
135
138
  end
@@ -145,6 +148,9 @@ describe 'Chef::Win32::Registry', :windows_only do
145
148
  it "returns true if the value exists" do
146
149
  expect(@registry.value_exists!("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"Petals"})).to eq(true)
147
150
  end
151
+ it "returns true if the value exists with a case mismatch on the value name" do
152
+ expect(@registry.value_exists!("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"petals"})).to eq(true)
153
+ end
148
154
  it "throws an exception if the value does not exist" do
149
155
  expect {@registry.value_exists!("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"FOOBAR"})}.to raise_error(Chef::Exceptions::Win32RegValueMissing)
150
156
  end
@@ -160,6 +166,9 @@ describe 'Chef::Win32::Registry', :windows_only do
160
166
  it "returns true if all the data matches" do
161
167
  expect(@registry.data_exists?("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"Petals", :type=>:multi_string, :data=>["Pink", "Delicate"]})).to eq(true)
162
168
  end
169
+ it "returns true if all the data matches with a case mismatch on the data name" do
170
+ expect(@registry.data_exists?("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"petals", :type=>:multi_string, :data=>["Pink", "Delicate"]})).to eq(true)
171
+ end
163
172
  it "returns false if the name does not exist" do
164
173
  expect(@registry.data_exists?("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"slateP", :type=>:multi_string, :data=>["Pink", "Delicate"]})).to eq(false)
165
174
  end
@@ -181,6 +190,9 @@ describe 'Chef::Win32::Registry', :windows_only do
181
190
  it "returns true if all the data matches" do
182
191
  expect(@registry.data_exists!("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"Petals", :type=>:multi_string, :data=>["Pink", "Delicate"]})).to eq(true)
183
192
  end
193
+ it "returns true if all the data matches with a case mismatch on the data name" do
194
+ expect(@registry.data_exists!("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"petals", :type=>:multi_string, :data=>["Pink", "Delicate"]})).to eq(true)
195
+ end
184
196
  it "throws an exception if the name does not exist" do
185
197
  expect {@registry.data_exists!("HKCU\\Software\\Root\\Branch\\Flower", {:name=>"slateP", :type=>:multi_string, :data=>["Pink", "Delicate"]})}.to raise_error(Chef::Exceptions::Win32RegDataMissing)
186
198
  end
@@ -33,7 +33,7 @@ end
33
33
  # directories.
34
34
  #
35
35
 
36
- describe "Chef::Application::WindowsServiceManager", :windows_only, :system_windows_service_gem_only do
36
+ describe "Chef::Application::WindowsServiceManager", :windows_only, :system_windows_service_gem_only, :appveyor_only do
37
37
 
38
38
  include_context "using Win32::Service"
39
39
 
@@ -43,7 +43,7 @@ describe "Chef::Application::WindowsServiceManager", :windows_only, :system_wind
43
43
  end
44
44
 
45
45
  it "throws an error with required missing options" do
46
- test_service.each do |key,value|
46
+ [:service_name, :service_display_name, :service_description, :service_file_path].each do |key|
47
47
  service_def = test_service.dup
48
48
  service_def.delete(key)
49
49
 
@@ -24,6 +24,8 @@ describe 'chef_repo_path tests', :workstation do
24
24
  include IntegrationSupport
25
25
  include KnifeSupport
26
26
 
27
+ let(:error_rel_path_outside_repo) { /^ERROR: Attempt to use relative path '' when current directory is outside the repository path/ }
28
+
27
29
  # TODO alternate repo_path / *_path
28
30
  context 'alternate *_path' do
29
31
  when_the_repository 'has clients and clients2, cookbooks and cookbooks2, etc.' do
@@ -109,14 +111,14 @@ EOM
109
111
  context 'when cwd is at the top level' do
110
112
  before { cwd '.' }
111
113
  it 'knife list --local -Rfp fails' do
112
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
114
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
113
115
  end
114
116
  end
115
117
 
116
118
  context 'when cwd is inside the data_bags directory' do
117
119
  before { cwd 'data_bags' }
118
120
  it 'knife list --local -Rfp fails' do
119
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
121
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
120
122
  end
121
123
  end
122
124
 
@@ -192,14 +194,14 @@ EOM
192
194
  context 'when cwd is inside the data_bags directory' do
193
195
  before { cwd 'data_bags' }
194
196
  it 'knife list --local -Rfp fails' do
195
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
197
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
196
198
  end
197
199
  end
198
200
 
199
201
  context 'when cwd is inside chef_repo2' do
200
202
  before { cwd 'chef_repo2' }
201
203
  it 'knife list -Rfp fails' do
202
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
204
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
203
205
  end
204
206
  end
205
207
 
@@ -225,14 +227,14 @@ EOM
225
227
  context 'when cwd is at the top level' do
226
228
  before { cwd '.' }
227
229
  it 'knife list --local -Rfp fails' do
228
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
230
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
229
231
  end
230
232
  end
231
233
 
232
234
  context 'when cwd is inside the data_bags directory' do
233
235
  before { cwd 'data_bags' }
234
236
  it 'knife list --local -Rfp fails' do
235
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
237
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
236
238
  end
237
239
  end
238
240
 
@@ -445,7 +447,7 @@ EOM
445
447
  context 'when cwd is at the top level' do
446
448
  before { cwd '.' }
447
449
  it 'knife list --local -Rfp fails' do
448
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
450
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
449
451
  end
450
452
  end
451
453
 
@@ -621,14 +623,14 @@ EOM
621
623
  context 'when cwd is at the top level' do
622
624
  before { cwd '.' }
623
625
  it 'knife list --local -Rfp fails' do
624
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
626
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
625
627
  end
626
628
  end
627
629
 
628
630
  context 'when cwd is inside the data_bags directory' do
629
631
  before { cwd 'data_bags' }
630
632
  it 'knife list --local -Rfp fails' do
631
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
633
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
632
634
  end
633
635
  end
634
636
 
@@ -782,7 +784,7 @@ EOM
782
784
  context 'when cwd is at the top level' do
783
785
  before { cwd '.' }
784
786
  it 'knife list --local -Rfp fails' do
785
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
787
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
786
788
  end
787
789
  end
788
790
 
@@ -823,7 +825,7 @@ EOM
823
825
  context 'when cwd is inside chef_repo2/data_bags' do
824
826
  before { cwd 'chef_repo2/data_bags' }
825
827
  it 'knife list --local -Rfp fails' do
826
- knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
828
+ knife('list --local -Rfp').should_fail(error_rel_path_outside_repo)
827
829
  end
828
830
  end
829
831
  end
@@ -794,21 +794,6 @@ describe "Recipe DSL methods" do
794
794
  end
795
795
  end
796
796
 
797
- context "when Thingy9 provides :thingy9" do
798
- before(:context) {
799
- class RecipeDSLSpecNamespace::Thingy9 < BaseThingy
800
- resource_name :thingy9
801
- end
802
- }
803
-
804
- it "declaring a resource providing the same :thingy9 produces a warning" do
805
- expect(Chef::Log).to receive(:warn).with("You declared a new resource RecipeDSLSpecNamespace::Thingy9AlternateProvider for resource thingy9, but it comes alphabetically after RecipeDSLSpecNamespace::Thingy9 and has the same filters ({}), so it will not be used. Use override: true if you want to use it for thingy9.")
806
- class RecipeDSLSpecNamespace::Thingy9AlternateProvider < BaseThingy
807
- resource_name :thingy9
808
- end
809
- end
810
- end
811
-
812
797
  context "when Thingy10 provides :thingy10" do
813
798
  before(:context) {
814
799
  class RecipeDSLSpecNamespace::Thingy10 < BaseThingy