chef 12.11.18 → 12.12.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/Rakefile +3 -2
  4. data/VERSION +1 -1
  5. data/acceptance/Gemfile.lock +22 -23
  6. data/acceptance/data-collector/test/integration/default/serverspec/default_spec.rb +2 -41
  7. data/lib/chef/application/solo.rb +7 -0
  8. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
  9. data/lib/chef/data_collector.rb +79 -43
  10. data/lib/chef/data_collector/messages.rb +4 -33
  11. data/lib/chef/data_collector/messages/helpers.rb +2 -2
  12. data/lib/chef/data_collector/resource_report.rb +21 -11
  13. data/lib/chef/decorator/unchain.rb +43 -0
  14. data/lib/chef/exceptions.rb +5 -0
  15. data/lib/chef/http.rb +5 -5
  16. data/lib/chef/knife/cookbook_create.rb +4 -0
  17. data/lib/chef/knife/cookbook_site_download.rb +8 -1
  18. data/lib/chef/knife/cookbook_site_install.rb +8 -0
  19. data/lib/chef/knife/cookbook_site_list.rb +8 -1
  20. data/lib/chef/knife/cookbook_site_search.rb +8 -1
  21. data/lib/chef/knife/cookbook_site_share.rb +8 -1
  22. data/lib/chef/knife/cookbook_site_show.rb +14 -3
  23. data/lib/chef/knife/cookbook_site_unshare.rb +8 -1
  24. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  25. data/lib/chef/knife/supermarket_download.rb +33 -0
  26. data/lib/chef/knife/supermarket_install.rb +33 -0
  27. data/lib/chef/knife/supermarket_list.rb +33 -0
  28. data/lib/chef/knife/supermarket_search.rb +33 -0
  29. data/lib/chef/knife/supermarket_share.rb +33 -0
  30. data/lib/chef/knife/supermarket_show.rb +33 -0
  31. data/lib/chef/knife/supermarket_unshare.rb +33 -0
  32. data/lib/chef/node.rb +13 -32
  33. data/lib/chef/node/attribute.rb +123 -70
  34. data/lib/chef/node/attribute_collections.rb +9 -130
  35. data/lib/chef/node/common_api.rb +124 -0
  36. data/lib/chef/node/immutable_collections.rb +27 -2
  37. data/lib/chef/property.rb +6 -2
  38. data/lib/chef/provider.rb +4 -5
  39. data/lib/chef/provider/batch.rb +1 -1
  40. data/lib/chef/provider/directory.rb +3 -1
  41. data/lib/chef/provider/package/openbsd.rb +1 -1
  42. data/lib/chef/provider/package/rubygems.rb +9 -3
  43. data/lib/chef/provider/package/windows/exe.rb +2 -5
  44. data/lib/chef/provider/powershell_script.rb +1 -1
  45. data/lib/chef/provider/remote_directory.rb +2 -0
  46. data/lib/chef/resource.rb +22 -17
  47. data/lib/chef/resource_builder.rb +9 -4
  48. data/lib/chef/shell.rb +1 -1
  49. data/lib/chef/version.rb +1 -1
  50. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +2 -4
  51. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +2 -3
  52. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
  53. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
  54. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +2 -3
  55. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +2 -3
  56. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +2 -3
  57. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +2 -3
  58. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +2 -3
  59. data/spec/functional/assets/chocolatey_feed/test-A.1.0.nupkg +0 -0
  60. data/spec/functional/assets/chocolatey_feed/test-A.1.5.nupkg +0 -0
  61. data/spec/functional/assets/chocolatey_feed/test-A.2.0.nupkg +0 -0
  62. data/spec/functional/assets/chocolatey_feed/test-B.1.0.nupkg +0 -0
  63. data/spec/functional/resource/dsc_script_spec.rb +1 -0
  64. data/spec/functional/resource/package_spec.rb +1 -1
  65. data/spec/functional/resource/template_spec.rb +3 -3
  66. data/spec/functional/shell_spec.rb +1 -1
  67. data/spec/integration/knife/client_bulk_delete_spec.rb +130 -0
  68. data/spec/integration/knife/client_create_spec.rb +69 -0
  69. data/spec/integration/knife/client_delete_spec.rb +63 -0
  70. data/spec/integration/knife/client_key_create_spec.rb +65 -0
  71. data/spec/integration/knife/client_key_delete_spec.rb +42 -0
  72. data/spec/integration/knife/client_key_list_spec.rb +60 -0
  73. data/spec/integration/knife/client_key_show_spec.rb +44 -0
  74. data/spec/integration/knife/client_list_spec.rb +48 -0
  75. data/spec/integration/knife/client_show_spec.rb +36 -0
  76. data/spec/integration/knife/cookbook_bulk_delete_spec.rb +64 -0
  77. data/spec/integration/knife/cookbook_download_spec.rb +95 -0
  78. data/spec/integration/knife/cookbook_list_spec.rb +54 -0
  79. data/spec/integration/knife/cookbook_show_spec.rb +159 -0
  80. data/spec/integration/knife/cookbook_upload_spec.rb +90 -0
  81. data/spec/integration/knife/data_bag_create_spec.rb +58 -0
  82. data/spec/integration/knife/data_bag_delete_spec.rb +58 -0
  83. data/spec/integration/knife/data_bag_from_file_spec.rb +115 -0
  84. data/spec/integration/knife/data_bag_list_spec.rb +43 -0
  85. data/spec/integration/knife/data_bag_show_spec.rb +53 -0
  86. data/spec/integration/knife/environment_compare_spec.rb +74 -0
  87. data/spec/integration/knife/environment_create_spec.rb +40 -0
  88. data/spec/integration/knife/environment_delete_spec.rb +36 -0
  89. data/spec/integration/knife/environment_from_file_spec.rb +115 -0
  90. data/spec/integration/knife/environment_list_spec.rb +41 -0
  91. data/spec/integration/knife/environment_show_spec.rb +56 -0
  92. data/spec/integration/knife/node_bulk_delete_spec.rb +51 -0
  93. data/spec/integration/knife/node_create_spec.rb +46 -0
  94. data/spec/integration/knife/node_delete_spec.rb +47 -0
  95. data/spec/integration/knife/node_environment_set_spec.rb +42 -0
  96. data/spec/integration/knife/node_from_file_spec.rb +58 -0
  97. data/spec/integration/knife/node_list_spec.rb +44 -0
  98. data/spec/integration/knife/node_run_list_add_spec.rb +53 -0
  99. data/spec/integration/knife/node_run_list_remove_spec.rb +35 -0
  100. data/spec/integration/knife/node_run_list_set_spec.rb +40 -0
  101. data/spec/integration/knife/node_show_spec.rb +35 -0
  102. data/spec/integration/knife/role_bulk_delete_spec.rb +51 -0
  103. data/spec/integration/knife/role_create_spec.rb +40 -0
  104. data/spec/integration/knife/role_delete_spec.rb +47 -0
  105. data/spec/integration/knife/role_from_file_spec.rb +95 -0
  106. data/spec/integration/knife/role_list_spec.rb +44 -0
  107. data/spec/integration/knife/role_show_spec.rb +50 -0
  108. data/spec/support/shared/integration/knife_support.rb +10 -3
  109. data/spec/unit/application/solo_spec.rb +7 -0
  110. data/spec/unit/cookbook_version_spec.rb +4 -4
  111. data/spec/unit/data_collector/messages/helpers_spec.rb +3 -7
  112. data/spec/unit/data_collector/messages_spec.rb +28 -45
  113. data/spec/unit/data_collector_spec.rb +40 -47
  114. data/spec/unit/knife/cookbook_create_spec.rb +1 -0
  115. data/spec/unit/knife/cookbook_site_download_spec.rb +1 -0
  116. data/spec/unit/knife/node_environment_set_spec.rb +0 -24
  117. data/spec/unit/knife/node_run_list_set_spec.rb +0 -25
  118. data/spec/unit/node/attribute_spec.rb +7 -9
  119. data/spec/unit/node/immutable_collections_spec.rb +4 -0
  120. data/spec/unit/node/vivid_mash_spec.rb +344 -0
  121. data/spec/unit/node_spec.rb +115 -26
  122. data/spec/unit/provider/directory_spec.rb +11 -1
  123. data/spec/unit/provider/package/windows/exe_spec.rb +14 -9
  124. data/spec/unit/provider/powershell_script_spec.rb +4 -4
  125. data/spec/unit/provider/remote_directory_spec.rb +15 -0
  126. data/spec/unit/recipe_spec.rb +31 -6
  127. data/spec/unit/run_context_spec.rb +2 -2
  128. data/spec/unit/shell/shell_session_spec.rb +1 -1
  129. data/tasks/dependencies.rb +0 -2
  130. metadata +55 -786
  131. data/acceptance/.bundle/config +0 -2
  132. data/acceptance/basics/.kitchen/logs/chef-current-install-ubuntu-1404.log +0 -2
  133. data/acceptance/basics/.kitchen/logs/kitchen.log +0 -3
  134. data/acceptance/fips/.kitchen/logs/fips-integration-centos-6.log +0 -3
  135. data/acceptance/fips/.kitchen/logs/fips-integration-windows-2012r2.log +0 -3
  136. data/acceptance/fips/.kitchen/logs/fips-unit-functional-centos-6.log +0 -3
  137. data/acceptance/fips/.kitchen/logs/fips-unit-functional-windows-2012r2.log +0 -3
  138. data/acceptance/fips/.kitchen/logs/kitchen.log +0 -6
  139. data/acceptance/trivial/.kitchen/logs/chef-current-install-windows-2012r2.log +0 -2
  140. data/acceptance/trivial/.kitchen/logs/kitchen.log +0 -3
  141. data/acceptance/windows-service/.kitchen/logs/chef-windows-service-windows-2012r2.log +0 -2
  142. data/acceptance/windows-service/.kitchen/logs/kitchen.log +0 -3
@@ -16,15 +16,15 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ require "chef/node/common_api"
20
+
19
21
  class Chef
20
22
  class Node
21
-
22
23
  # == AttrArray
23
24
  # AttrArray is identical to Array, except that it keeps a reference to the
24
25
  # "root" (Chef::Node::Attribute) object, and will trigger a cache
25
26
  # invalidation on that object when mutated.
26
27
  class AttrArray < Array
27
-
28
28
  MUTATOR_METHODS = [
29
29
  :<<,
30
30
  :[]=,
@@ -62,8 +62,9 @@ class Chef
62
62
  # Node::Attribute object.
63
63
  MUTATOR_METHODS.each do |mutator|
64
64
  define_method(mutator) do |*args, &block|
65
+ ret = super(*args, &block)
65
66
  root.reset_cache(root.top_level_breadcrumb)
66
- super(*args, &block)
67
+ ret
67
68
  end
68
69
  end
69
70
 
@@ -96,14 +97,12 @@ class Chef
96
97
  # in the creation of a new VividMash for that key. (This only works when
97
98
  # using the element reference method, `[]` -- other methods, such as
98
99
  # #fetch, work as normal).
99
- # * It supports a set_unless flag (via the root Attribute object) which
100
- # allows `||=` style behavior (`||=` does not work with
101
- # auto-vivification). This is only implemented for #[]=; methods such as
102
- # #store work as normal.
103
100
  # * attr_accessor style element set and get are supported via method_missing
104
101
  class VividMash < Mash
105
102
  attr_reader :root
106
103
 
104
+ include CommonAPI
105
+
107
106
  # Methods that mutate a VividMash. Each of them is overridden so that it
108
107
  # also invalidates the cached merged_attributes on the root Attribute
109
108
  # object.
@@ -148,12 +147,9 @@ class Chef
148
147
 
149
148
  def []=(key, value)
150
149
  root.top_level_breadcrumb ||= key
151
- if set_unless? && key?(key) && !self[key].nil?
152
- self[key]
153
- else
154
- root.reset_cache(root.top_level_breadcrumb)
155
- super
156
- end
150
+ ret = super
151
+ root.reset_cache(root.top_level_breadcrumb)
152
+ ret
157
153
  end
158
154
 
159
155
  alias :attribute? :has_key?
@@ -176,10 +172,6 @@ class Chef
176
172
  end
177
173
  end
178
174
 
179
- def set_unless?
180
- @root.set_unless?
181
- end
182
-
183
175
  def convert_key(key)
184
176
  super
185
177
  end
@@ -206,118 +198,5 @@ class Chef
206
198
  end
207
199
 
208
200
  end
209
-
210
- # == MultiMash
211
- # This is a Hash-like object that contains multiple VividMashes in it. Its
212
- # purpose is so that the user can descend into the mash and delete a subtree
213
- # from all of the Mash objects (used to delete all values in a subtree from
214
- # default, force_default, role_default and env_default at the same time). The
215
- # assignment operator strictly does assignment (does no merging) and works
216
- # by deleting the subtree and then assigning to the last mash which passed in
217
- # the initializer.
218
- #
219
- # A lot of the complexity of this class comes from the fact that at any key
220
- # value some or all of the mashes may walk off their ends and become nil or
221
- # true or something. The schema may change so that one precidence leve may
222
- # be 'true' object and another may be a VividMash. It is also possible that
223
- # one or many of them may transition from VividMashes to Hashes or Arrays.
224
- #
225
- # It also supports the case where you may be deleting a key using node.rm
226
- # in which case if intermediate keys all walk off into nil then you don't want
227
- # to be autovivifying keys as you go. On the other hand you may be using
228
- # node.force_default! in which case you'll wind up with a []= operator at the
229
- # end and you want autovivification, so we conditionally have to support either
230
- # operation.
231
- #
232
- # @todo: can we have an autovivify class that decorates a class that doesn't
233
- # autovivify or something so that the code is less awful?
234
- #
235
- class MultiMash
236
- attr_reader :root
237
- attr_reader :mashes
238
- attr_reader :opts
239
- attr_reader :primary_mash
240
-
241
- # Initialize with an array of mashes. For the delete return value to work
242
- # properly the mashes must come from the same attribute level (i.e. all
243
- # override or all default, but not a mix of both).
244
- def initialize(root, primary_mash, mashes, opts = {})
245
- @root = root
246
- @primary_mash = primary_mash
247
- @mashes = mashes
248
- @opts = opts
249
- @opts[:autovivify] = true if @opts[:autovivify].nil?
250
- end
251
-
252
- def [](key)
253
- # handle the secondary mashes
254
- new_mashes = []
255
- mashes.each do |mash|
256
- new_mash = safe_evalute_key(mash, key)
257
- # secondary mashes never autovivify so once they fall into nil, we just stop tracking them
258
- new_mashes.push(new_mash) unless new_mash.nil?
259
- end
260
-
261
- new_primary_mash = safe_evalute_key(primary_mash, key)
262
-
263
- if new_primary_mash.nil? && @opts[:autovivify]
264
- primary_mash[key] = VividMash.new(root)
265
- new_primary_mash = primary_mash[key]
266
- end
267
-
268
- MultiMash.new(root, new_primary_mash, new_mashes, opts)
269
- end
270
-
271
- def []=(key, value)
272
- if primary_mash.nil?
273
- # This theoretically should never happen since node#force_default! setter methods will autovivify and
274
- # node#rm methods do not end in #[]= operators.
275
- raise TypeError, "No autovivification was specified initially on a method chain ending in assignment"
276
- end
277
- ret = delete(key)
278
- primary_mash[key] = value
279
- ret
280
- end
281
-
282
- # mash.element('foo', 'bar') is the same as mash['foo']['bar']
283
- def element(key = nil, *subkeys)
284
- return self if key.nil?
285
- submash = self[key]
286
- subkeys.empty? ? submash : submash.element(*subkeys)
287
- end
288
-
289
- def delete(key)
290
- # the return value is a deep merge which is correct semantics when
291
- # merging between attributes on the same level (this would be incorrect
292
- # if passed both override and default attributes which would need hash_only
293
- # merging).
294
- ret = mashes.inject(Mash.new) do |merged, mash|
295
- Chef::Mixin::DeepMerge.merge(merged, mash)
296
- end
297
- ret = Chef::Mixin::DeepMerge.merge(ret, primary_mash)
298
- mashes.each do |mash|
299
- mash.delete(key) if mash.respond_to?(:delete)
300
- end
301
- primary_mash.delete(key) if primary_mash.respond_to?(:delete)
302
- ret[key]
303
- end
304
-
305
- private
306
-
307
- def safe_evalute_key(mash, key)
308
- if mash.respond_to?(:[])
309
- if mash.respond_to?(:has_key?)
310
- if mash.has_key?(key)
311
- return mash[key] if mash[key].respond_to?(:[])
312
- end
313
- elsif !mash[key].nil?
314
- return mash[key] if mash[key].respond_to?(:[])
315
- end
316
- end
317
- return nil
318
- end
319
-
320
- end
321
-
322
201
  end
323
202
  end
@@ -0,0 +1,124 @@
1
+ #--
2
+ # Copyright:: Copyright 2016, Chef Software, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ class Chef
19
+ class Node
20
+ # shared API between VividMash and ImmutableMash, writer code can be
21
+ # 'shared' to keep it logically in this file by adding them to the
22
+ # block list in ImmutableMash.
23
+ module CommonAPI
24
+ # method-style access to attributes
25
+
26
+ def valid_container?(obj, key)
27
+ return obj.is_a?(Hash) || (obj.is_a?(Array) && key.is_a?(Fixnum))
28
+ end
29
+
30
+ private :valid_container?
31
+
32
+ # - autovivifying / autoreplacing writer
33
+ # - non-container-ey intermediate objects are replaced with hashes
34
+ def write(*args, &block)
35
+ value = block_given? ? yield : args.pop
36
+ last = args.pop
37
+ prev_memo = prev_key = nil
38
+ chain = args.inject(self) do |memo, key|
39
+ if !valid_container?(memo, key)
40
+ prev_memo[prev_key] = {}
41
+ memo = prev_memo[prev_key]
42
+ end
43
+ prev_memo = memo
44
+ prev_key = key
45
+ memo[key]
46
+ end
47
+ if !valid_container?(chain, last)
48
+ prev_memo[prev_key] = {}
49
+ chain = prev_memo[prev_key]
50
+ end
51
+ chain[last] = value
52
+ end
53
+
54
+ # this autovivifies, but can throw NoSuchAttribute when trying to access #[] on
55
+ # something that is not a container ("schema violation" issues).
56
+ #
57
+ def write!(*args, &block)
58
+ value = block_given? ? yield : args.pop
59
+ last = args.pop
60
+ obj = args.inject(self) do |memo, key|
61
+ raise Chef::Exceptions::AttributeTypeMismatch unless valid_container?(memo, key)
62
+ memo[key]
63
+ end
64
+ raise Chef::Exceptions::AttributeTypeMismatch unless valid_container?(obj, last)
65
+ obj[last] = value
66
+ end
67
+
68
+ # FIXME:(?) does anyone need a non-autovivifying writer for attributes that throws exceptions?
69
+
70
+ # return true or false based on if the attribute exists
71
+ def exist?(*path)
72
+ path.inject(self) do |memo, key|
73
+ return false unless valid_container?(memo, key)
74
+ if memo.is_a?(Hash)
75
+ if memo.key?(key)
76
+ memo[key]
77
+ else
78
+ return false
79
+ end
80
+ elsif memo.is_a?(Array)
81
+ if memo.length > key
82
+ memo[key]
83
+ else
84
+ return false
85
+ end
86
+ end
87
+ end
88
+ return true
89
+ end
90
+
91
+ # this is a safe non-autovivifying reader that returns nil if the attribute does not exist
92
+ def read(*path)
93
+ begin
94
+ read!(*path)
95
+ rescue Chef::Exceptions::NoSuchAttribute
96
+ nil
97
+ end
98
+ end
99
+
100
+ # non-autovivifying reader that throws an exception if the attribute does not exist
101
+ def read!(*path)
102
+ raise Chef::Exceptions::NoSuchAttribute unless exist?(*path)
103
+ path.inject(self) do |memo, key|
104
+ memo[key]
105
+ end
106
+ end
107
+
108
+ # FIXME:(?) does anyone really like the autovivifying reader that we have and wants the same behavior? readers that write? ugh...
109
+
110
+ def unlink(*path, last)
111
+ hash = path.empty? ? self : read(*path)
112
+ return nil unless hash.is_a?(Hash) || hash.is_a?(Array)
113
+ root.top_level_breadcrumb ||= last
114
+ hash.delete(last)
115
+ end
116
+
117
+ def unlink!(*path)
118
+ raise Chef::Exceptions::NoSuchAttribute unless exist?(*path)
119
+ unlink(*path)
120
+ end
121
+
122
+ end
123
+ end
124
+ end
@@ -1,3 +1,21 @@
1
+ #--
2
+ # Copyright:: Copyright 2012-2016, Chef Software, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "chef/node/common_api"
1
19
 
2
20
  class Chef
3
21
  class Node
@@ -124,6 +142,7 @@ class Chef
124
142
  class ImmutableMash < Mash
125
143
 
126
144
  include Immutablize
145
+ include CommonAPI
127
146
 
128
147
  alias :internal_set :[]=
129
148
  private :internal_set
@@ -144,6 +163,10 @@ class Chef
144
163
  :replace,
145
164
  :select!,
146
165
  :shift,
166
+ :write,
167
+ :write!,
168
+ :unlink,
169
+ :unlink!,
147
170
  ]
148
171
 
149
172
  def initialize(mash_data)
@@ -167,13 +190,15 @@ class Chef
167
190
  end
168
191
 
169
192
  def method_missing(symbol, *args)
170
- if args.empty?
193
+ if symbol == :to_ary
194
+ super
195
+ elsif args.empty?
171
196
  if key?(symbol)
172
197
  self[symbol]
173
198
  else
174
199
  raise NoMethodError, "Undefined method or attribute `#{symbol}' on `node'"
175
200
  end
176
- # This will raise a ImmutableAttributeModification error:
201
+ # This will raise a ImmutableAttributeModification error:
177
202
  elsif symbol.to_s =~ /=$/
178
203
  key_to_set = symbol.to_s[/^(.+)=$/, 1]
179
204
  self[key_to_set] = (args.length == 1 ? args[0] : args)
@@ -531,8 +531,6 @@ class Chef
531
531
  end
532
532
  end
533
533
 
534
- protected
535
-
536
534
  #
537
535
  # The options this Property will use for get/set behavior and validation.
538
536
  #
@@ -583,6 +581,7 @@ class Chef
583
581
  (options.has_key?(:is) && resource.send(:_pv_is, { name => nil }, name, options[:is], raise_error: false))
584
582
  end
585
583
 
584
+ # @api private
586
585
  def get_value(resource)
587
586
  if instance_variable_name
588
587
  resource.instance_variable_get(instance_variable_name)
@@ -591,6 +590,7 @@ class Chef
591
590
  end
592
591
  end
593
592
 
593
+ # @api private
594
594
  def set_value(resource, value)
595
595
  if instance_variable_name
596
596
  resource.instance_variable_set(instance_variable_name, value)
@@ -599,6 +599,7 @@ class Chef
599
599
  end
600
600
  end
601
601
 
602
+ # @api private
602
603
  def value_is_set?(resource)
603
604
  if instance_variable_name
604
605
  resource.instance_variable_defined?(instance_variable_name)
@@ -607,6 +608,7 @@ class Chef
607
608
  end
608
609
  end
609
610
 
611
+ # @api private
610
612
  def reset_value(resource)
611
613
  if instance_variable_name
612
614
  if value_is_set?(resource)
@@ -617,6 +619,8 @@ class Chef
617
619
  end
618
620
  end
619
621
 
622
+ private
623
+
620
624
  def exec_in_resource(resource, proc, *args)
621
625
  if resource
622
626
  if proc.arity > args.size
@@ -423,9 +423,9 @@ class Chef
423
423
 
424
424
  module DeprecatedLWRPClass
425
425
  def const_missing(class_name)
426
- if deprecated_constants[class_name.to_sym]
426
+ if Chef::Provider.deprecated_constants[class_name.to_sym]
427
427
  Chef.log_deprecation("Using an LWRP provider by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::ProviderResolver.new(node, resource, action) instead.")
428
- deprecated_constants[class_name.to_sym]
428
+ Chef::Provider.deprecated_constants[class_name.to_sym]
429
429
  else
430
430
  raise NameError, "uninitialized constant Chef::Provider::#{class_name}"
431
431
  end
@@ -438,13 +438,12 @@ class Chef
438
438
  if Chef::Provider.const_defined?(class_name, false)
439
439
  Chef::Log.warn "Chef::Provider::#{class_name} already exists! Cannot create deprecation class for #{provider_class}"
440
440
  else
441
- deprecated_constants[class_name.to_sym] = provider_class
441
+ Chef::Provider.deprecated_constants[class_name.to_sym] = provider_class
442
442
  end
443
443
  end
444
444
 
445
- private
446
-
447
445
  def deprecated_constants
446
+ raise "Deprecated constants should be called only on Chef::Provider" unless self == Chef::Provider
448
447
  @deprecated_constants ||= {}
449
448
  end
450
449
  end
@@ -29,7 +29,7 @@ class Chef
29
29
  end
30
30
 
31
31
  def command
32
- basepath = is_forced_32bit ? wow64_directory : run_context.node.kernel.os_info.system_directory
32
+ basepath = is_forced_32bit ? wow64_directory : run_context.node["kernel"]["os_info"]["system_directory"]
33
33
 
34
34
  interpreter_path = Chef::Util::PathHelper.join(basepath, interpreter)
35
35