chef 11.16.4-x86-mingw32 → 11.18.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -2
  3. data/lib/chef/api_client.rb +1 -1
  4. data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -2
  5. data/lib/chef/chef_fs/command_line.rb +3 -2
  6. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +5 -1
  7. data/lib/chef/chef_fs/file_system/acl_entry.rb +2 -1
  8. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +2 -1
  9. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +3 -2
  10. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +5 -4
  11. data/lib/chef/config_fetcher.rb +1 -1
  12. data/lib/chef/cookbook/cookbook_version_loader.rb +4 -4
  13. data/lib/chef/cookbook/metadata.rb +1 -1
  14. data/lib/chef/cookbook_version.rb +2 -2
  15. data/lib/chef/data_bag.rb +1 -1
  16. data/lib/chef/data_bag_item.rb +1 -1
  17. data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
  18. data/lib/chef/environment.rb +1 -1
  19. data/lib/chef/exceptions.rb +19 -2
  20. data/lib/chef/json_compat.rb +64 -45
  21. data/lib/chef/knife/bootstrap.rb +2 -2
  22. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  23. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  24. data/lib/chef/knife/bootstrap/chef-aix.erb +2 -2
  25. data/lib/chef/knife/bootstrap/chef-full.erb +2 -2
  26. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  27. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  28. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  29. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  30. data/lib/chef/knife/cookbook_site_download.rb +1 -1
  31. data/lib/chef/knife/cookbook_site_install.rb +34 -10
  32. data/lib/chef/knife/cookbook_site_list.rb +1 -1
  33. data/lib/chef/knife/cookbook_site_search.rb +1 -1
  34. data/lib/chef/knife/cookbook_site_share.rb +2 -2
  35. data/lib/chef/knife/cookbook_site_show.rb +3 -3
  36. data/lib/chef/knife/cookbook_site_unshare.rb +1 -1
  37. data/lib/chef/knife/core/subcommand_loader.rb +24 -0
  38. data/lib/chef/knife/deps.rb +3 -2
  39. data/lib/chef/node.rb +1 -1
  40. data/lib/chef/provider/deploy/revision.rb +1 -1
  41. data/lib/chef/provider/dsc_script.rb +32 -5
  42. data/lib/chef/provider/env.rb +25 -10
  43. data/lib/chef/provider/remote_file/cache_control_data.rb +1 -1
  44. data/lib/chef/resource.rb +1 -1
  45. data/lib/chef/resource/dsc_script.rb +2 -16
  46. data/lib/chef/resource_collection.rb +1 -1
  47. data/lib/chef/resource_reporter.rb +3 -3
  48. data/lib/chef/role.rb +1 -1
  49. data/lib/chef/run_list.rb +1 -1
  50. data/lib/chef/user.rb +1 -1
  51. data/lib/chef/util/dsc/local_configuration_manager.rb +15 -11
  52. data/lib/chef/util/powershell/cmdlet_result.rb +2 -2
  53. data/lib/chef/version.rb +1 -2
  54. data/spec/data/bootstrap/test-hints.erb +1 -1
  55. data/spec/data/bootstrap/test.erb +1 -1
  56. data/spec/functional/knife/cookbook_delete_spec.rb +3 -3
  57. data/spec/functional/knife/exec_spec.rb +1 -1
  58. data/spec/functional/resource/dsc_script_spec.rb +92 -47
  59. data/spec/functional/resource/env_spec.rb +3 -4
  60. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -2
  61. data/spec/integration/knife/chef_fs_data_store_spec.rb +1 -1
  62. data/spec/integration/knife/chef_repo_path_spec.rb +6 -1
  63. data/spec/integration/knife/chef_repository_file_system_spec.rb +1 -1
  64. data/spec/integration/knife/chefignore_spec.rb +1 -1
  65. data/spec/integration/knife/common_options_spec.rb +1 -1
  66. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
  67. data/spec/integration/knife/delete_spec.rb +1 -1
  68. data/spec/integration/knife/deps_spec.rb +1 -1
  69. data/spec/integration/knife/diff_spec.rb +3 -3
  70. data/spec/integration/knife/download_spec.rb +3 -3
  71. data/spec/integration/knife/list_spec.rb +1 -1
  72. data/spec/integration/knife/raw_spec.rb +11 -1
  73. data/spec/integration/knife/redirection_spec.rb +1 -1
  74. data/spec/integration/knife/serve_spec.rb +1 -1
  75. data/spec/integration/knife/show_spec.rb +1 -1
  76. data/spec/integration/knife/upload_spec.rb +9 -9
  77. data/spec/spec_helper.rb +6 -0
  78. data/spec/support/shared/integration/integration_helper.rb +1 -2
  79. data/spec/support/shared/shared_examples.rb +10 -0
  80. data/spec/tiny_server.rb +2 -1
  81. data/spec/unit/api_client_spec.rb +3 -3
  82. data/spec/unit/chef_fs/data_handler/group_handler_spec.rb +63 -0
  83. data/spec/unit/config_fetcher_spec.rb +1 -1
  84. data/spec/unit/cookbook/metadata_spec.rb +7 -3
  85. data/spec/unit/cookbook_loader_spec.rb +1 -1
  86. data/spec/unit/cookbook_version_spec.rb +4 -0
  87. data/spec/unit/data_bag_item_spec.rb +5 -1
  88. data/spec/unit/data_bag_spec.rb +5 -1
  89. data/spec/unit/deprecation_spec.rb +1 -1
  90. data/spec/unit/encrypted_data_bag_item_spec.rb +14 -7
  91. data/spec/unit/environment_spec.rb +7 -3
  92. data/spec/unit/exceptions_spec.rb +6 -0
  93. data/spec/unit/json_compat_spec.rb +58 -17
  94. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +0 -1
  95. data/spec/unit/knife/cookbook_site_download_spec.rb +2 -1
  96. data/spec/unit/knife/cookbook_site_install_spec.rb +161 -116
  97. data/spec/unit/knife/cookbook_site_share_spec.rb +6 -6
  98. data/spec/unit/knife/core/bootstrap_context_spec.rb +2 -2
  99. data/spec/unit/knife/core/subcommand_loader_spec.rb +66 -1
  100. data/spec/unit/knife/data_bag_from_file_spec.rb +1 -2
  101. data/spec/unit/node_spec.rb +4 -0
  102. data/spec/unit/provider/dsc_script_spec.rb +134 -105
  103. data/spec/unit/provider/env/windows_spec.rb +2 -2
  104. data/spec/unit/provider/env_spec.rb +76 -11
  105. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +1 -1
  106. data/spec/unit/resource/dsc_script_spec.rb +0 -29
  107. data/spec/unit/resource_collection_spec.rb +5 -1
  108. data/spec/unit/resource_reporter_spec.rb +3 -3
  109. data/spec/unit/resource_spec.rb +5 -1
  110. data/spec/unit/role_spec.rb +4 -0
  111. data/spec/unit/run_list_spec.rb +5 -1
  112. data/spec/unit/user_spec.rb +5 -1
  113. data/spec/unit/util/dsc/local_configuration_manager_spec.rb +15 -10
  114. metadata +11 -9
@@ -126,7 +126,7 @@ class Chef
126
126
  :short => "-j JSON_ATTRIBS",
127
127
  :long => "--json-attributes",
128
128
  :description => "A JSON string to be added to the first run of chef-client",
129
- :proc => lambda { |o| JSON.parse(o) },
129
+ :proc => lambda { |o| Chef::JSONCompat.parse(o) },
130
130
  :default => {}
131
131
 
132
132
  option :host_key_verify,
@@ -141,7 +141,7 @@ class Chef
141
141
  :proc => Proc.new { |h|
142
142
  Chef::Config[:knife][:hints] ||= Hash.new
143
143
  name, path = h.split("=")
144
- Chef::Config[:knife][:hints][name] = path ? JSON.parse(::File.read(path)) : Hash.new }
144
+ Chef::Config[:knife][:hints][name] = path ? Chef::JSONCompat.parse(::File.read(path)) : Hash.new }
145
145
 
146
146
  option :secret,
147
147
  :short => "-s SECRET",
@@ -29,7 +29,7 @@ mkdir -p /etc/chef/ohai/hints
29
29
 
30
30
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
31
31
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
32
- <%= hash.to_json %>
32
+ <%= Chef::JSONCompat.to_json(hash) %>
33
33
  EOP
34
34
  <% end -%>
35
35
  <% end -%>
@@ -56,7 +56,7 @@ https_proxy "<%= knife_config[:bootstrap_proxy] %>"
56
56
  EOP
57
57
 
58
58
  cat > /etc/chef/first-boot.json <<'EOP'
59
- <%= first_boot.to_json %>
59
+ <%= Chef::JSONCompat.to_json(first_boot) %>
60
60
  EOP
61
61
 
62
62
  <%= start_chef %>'
@@ -46,7 +46,7 @@ mkdir -p /etc/chef/ohai/hints
46
46
 
47
47
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
48
48
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
49
- <%= hash.to_json %>
49
+ <%= Chef::JSONCompat.to_json(hash) %>
50
50
  EOP
51
51
  <% end -%>
52
52
  <% end -%>
@@ -56,7 +56,7 @@ cat > /etc/chef/client.rb <<'EOP'
56
56
  EOP
57
57
 
58
58
  cat > /etc/chef/first-boot.json <<'EOP'
59
- <%= first_boot.to_json %>
59
+ <%= Chef::JSONCompat.to_json(first_boot) %>
60
60
  EOP
61
61
 
62
62
  <%= start_chef %>'
@@ -42,7 +42,7 @@ mkdir -p /etc/chef/ohai/hints
42
42
 
43
43
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
44
44
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
45
- <%= hash.to_json %>
45
+ <%= Chef::JSONCompat.to_json(hash) %>
46
46
  EOP
47
47
  <% end -%>
48
48
  <% end -%>
@@ -52,7 +52,7 @@ cat > /etc/chef/client.rb <<'EOP'
52
52
  EOP
53
53
 
54
54
  cat > /etc/chef/first-boot.json <<'EOP'
55
- <%= first_boot.to_json %>
55
+ <%= Chef::JSONCompat.to_json(first_boot) %>
56
56
  EOP
57
57
 
58
58
  <%= start_chef %>'
@@ -57,7 +57,7 @@ mkdir -p /etc/chef/ohai/hints
57
57
 
58
58
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
59
59
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
60
- <%= hash.to_json %>
60
+ <%= Chef::JSONCompat.to_json(hash) %>
61
61
  EOP
62
62
  <% end -%>
63
63
  <% end -%>
@@ -67,7 +67,7 @@ cat > /etc/chef/client.rb <<'EOP'
67
67
  EOP
68
68
 
69
69
  cat > /etc/chef/first-boot.json <<'EOP'
70
- <%= first_boot.to_json %>
70
+ <%= Chef::JSONCompat.to_json(first_boot) %>
71
71
  EOP
72
72
 
73
73
  echo "Starting first Chef Client run..."
@@ -28,7 +28,7 @@ mkdir -p /etc/chef/ohai/hints
28
28
 
29
29
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
30
30
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
31
- <%= hash.to_json %>
31
+ <%= Chef::JSONCompat.to_json(hash) %>
32
32
  EOP
33
33
  <% end -%>
34
34
  <% end -%>
@@ -38,7 +38,7 @@ cat > /etc/chef/client.rb <<'EOP'
38
38
  EOP
39
39
 
40
40
  cat > /etc/chef/first-boot.json <<'EOP'
41
- <%= first_boot.to_json %>
41
+ <%= Chef::JSONCompat.to_json(first_boot) %>
42
42
  EOP
43
43
 
44
44
  <%= start_chef %>'
@@ -28,7 +28,7 @@ mkdir -p /etc/chef/ohai/hints
28
28
 
29
29
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
30
30
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
31
- <%= hash.to_json %>
31
+ <%= Chef::JSONCompat.to_json(hash) %>
32
32
  EOP
33
33
  <% end -%>
34
34
  <% end -%>
@@ -47,7 +47,7 @@ echo 'https_proxy "knife_config[:bootstrap_proxy]"' >> /etc/chef/client.rb
47
47
  <% end -%>
48
48
 
49
49
  cat > /etc/chef/first-boot.json <<'EOP'
50
- <%= first_boot.to_json %>
50
+ <%= Chef::JSONCompat.to_json(first_boot) %>
51
51
  EOP
52
52
 
53
53
  <%= start_chef %>'
@@ -32,7 +32,7 @@ mkdir -p /etc/chef/ohai/hints
32
32
 
33
33
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
34
34
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
35
- <%= hash.to_json %>
35
+ <%= Chef::JSONCompat.to_json(hash) %>
36
36
  EOP
37
37
  <% end -%>
38
38
  <% end -%>
@@ -42,7 +42,7 @@ cat > /etc/chef/client.rb <<'EOP'
42
42
  EOP
43
43
 
44
44
  cat > /etc/chef/first-boot.json <<'EOP'
45
- <%= first_boot.to_json %>
45
+ <%= Chef::JSONCompat.to_json(first_boot) %>
46
46
  EOP
47
47
 
48
48
  <%= start_chef %>'
@@ -30,7 +30,7 @@ mkdir -p /etc/chef/ohai/hints
30
30
 
31
31
  <% @chef_config[:knife][:hints].each do |name, hash| -%>
32
32
  cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
33
- <%= hash.to_json %>
33
+ <%= Chef::JSONCompat.to_json(hash) %>
34
34
  EOP
35
35
  <% end -%>
36
36
  <% end -%>
@@ -40,7 +40,7 @@ cat > /etc/chef/client.rb <<'EOP'
40
40
  EOP
41
41
 
42
42
  cat > /etc/chef/first-boot.json <<'EOP'
43
- <%= first_boot.to_json %>
43
+ <%= Chef::JSONCompat.to_json(first_boot) %>
44
44
  EOP
45
45
 
46
46
  <%= start_chef %>'
@@ -58,7 +58,7 @@ class Chef
58
58
 
59
59
  private
60
60
  def cookbooks_api_url
61
- 'http://cookbooks.opscode.com/api/v1/cookbooks'
61
+ 'https://supermarket.getchef.com/api/v1/cookbooks'
62
62
  end
63
63
 
64
64
  def current_cookbook_data
@@ -17,11 +17,11 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
+ require 'chef/exceptions'
20
21
  require 'shellwords'
21
22
 
22
23
  class Chef
23
24
  class Knife
24
-
25
25
  class CookbookSiteInstall < Knife
26
26
 
27
27
  deps do
@@ -107,11 +107,8 @@ class Chef
107
107
  end
108
108
  end
109
109
 
110
-
111
110
  unless config[:no_deps]
112
- md = Chef::Cookbook::Metadata.new
113
- md.from_file(File.join(@install_path, @cookbook_name, "metadata.rb"))
114
- md.dependencies.each do |cookbook, version_list|
111
+ preferred_metadata.dependencies.each do |cookbook, version_list|
115
112
  # Doesn't do versions.. yet
116
113
  nv = self.class.new
117
114
  nv.config = config
@@ -144,6 +141,7 @@ class Chef
144
141
 
145
142
  def extract_cookbook(upstream_file, version)
146
143
  ui.info("Uncompressing #{@cookbook_name} version #{version}.")
144
+ # FIXME: Detect if we have the bad tar from git on Windows: https://github.com/opscode/chef/issues/1753
147
145
  shell_out!("tar zxvf #{convert_path upstream_file}", :cwd => @install_path)
148
146
  end
149
147
 
@@ -153,11 +151,37 @@ class Chef
153
151
  end
154
152
 
155
153
  def convert_path(upstream_file)
156
- if ENV['MSYSTEM'] == 'MINGW32'
157
- return upstream_file.sub(/^([[:alpha:]]):/, '/\1')
158
- else
159
- return Shellwords.escape upstream_file
160
- end
154
+ # converts a Windows path (C:\foo) to a mingw path (/c/foo)
155
+ if ENV['MSYSTEM'] == 'MINGW32'
156
+ return upstream_file.sub(/^([[:alpha:]]):/, '/\1')
157
+ else
158
+ return Shellwords.escape upstream_file
159
+ end
160
+ end
161
+
162
+ # Get the preferred metadata path on disk. Chef prefers the metadata.rb
163
+ # over the metadata.json.
164
+ #
165
+ # @raise if there is no metadata in the cookbook
166
+ #
167
+ # @return [Chef::Cookbook::Metadata]
168
+ def preferred_metadata
169
+ md = Chef::Cookbook::Metadata.new
170
+
171
+ rb = File.join(@install_path, @cookbook_name, "metadata.rb")
172
+ if File.exist?(rb)
173
+ md.from_file(rb)
174
+ return md
175
+ end
176
+
177
+ json = File.join(@install_path, @cookbook_name, "metadata.json")
178
+ if File.exist?(json)
179
+ json = IO.read(json)
180
+ md.from_json(json)
181
+ return md
182
+ end
183
+
184
+ raise Chef::Exceptions::MetadataNotFound.new(@install_path, @cookbook_name)
161
185
  end
162
186
  end
163
187
  end
@@ -41,7 +41,7 @@ class Chef
41
41
  end
42
42
 
43
43
  def get_cookbook_list(items=10, start=0, cookbook_collection={})
44
- cookbooks_url = "http://cookbooks.opscode.com/api/v1/cookbooks?items=#{items}&start=#{start}"
44
+ cookbooks_url = "https://supermarket.getchef.com/api/v1/cookbooks?items=#{items}&start=#{start}"
45
45
  cr = noauth_rest.get_rest(cookbooks_url)
46
46
  cr["items"].each do |cookbook|
47
47
  cookbook_collection[cookbook["cookbook_name"]] = cookbook
@@ -29,7 +29,7 @@ class Chef
29
29
  end
30
30
 
31
31
  def search_cookbook(query, items=10, start=0, cookbook_collection={})
32
- cookbooks_url = "http://cookbooks.opscode.com/api/v1/search?q=#{query}&items=#{items}&start=#{start}"
32
+ cookbooks_url = "https://supermarket.getchef.com/api/v1/search?q=#{query}&items=#{items}&start=#{start}"
33
33
  cr = noauth_rest.get_rest(cookbooks_url)
34
34
  cr["items"].each do |cookbook|
35
35
  cookbook_collection[cookbook["cookbook_name"]] = cookbook
@@ -85,9 +85,9 @@ class Chef
85
85
  end
86
86
 
87
87
  def do_upload(cookbook_filename, cookbook_category, user_id, user_secret_filename)
88
- uri = "http://cookbooks.opscode.com/api/v1/cookbooks"
88
+ uri = "https://supermarket.getchef.com/api/v1/cookbooks"
89
89
 
90
- category_string = { 'category'=>cookbook_category }.to_json
90
+ category_string = Chef::JSONCompat.to_json({ 'category'=>cookbook_category })
91
91
 
92
92
  http_resp = Chef::CookbookSiteStreamingUploader.post(uri, user_id, user_secret_filename, {
93
93
  :tarball => File.open(cookbook_filename),
@@ -31,14 +31,14 @@ class Chef
31
31
  def get_cookbook_data
32
32
  case @name_args.length
33
33
  when 1
34
- noauth_rest.get_rest("http://cookbooks.opscode.com/api/v1/cookbooks/#{@name_args[0]}")
34
+ noauth_rest.get_rest("https://supermarket.getchef.com/api/v1/cookbooks/#{@name_args[0]}")
35
35
  when 2
36
- noauth_rest.get_rest("http://cookbooks.opscode.com/api/v1/cookbooks/#{@name_args[0]}/versions/#{name_args[1].gsub('.', '_')}")
36
+ noauth_rest.get_rest("https://supermarket.getchef.com/api/v1/cookbooks/#{@name_args[0]}/versions/#{name_args[1].gsub('.', '_')}")
37
37
  end
38
38
  end
39
39
 
40
40
  def get_cookbook_list(items=10, start=0, cookbook_collection={})
41
- cookbooks_url = "http://cookbooks.opscode.com/api/v1/cookbooks?items=#{items}&start=#{start}"
41
+ cookbooks_url = "https://supermarket.getchef.com/api/v1/cookbooks?items=#{items}&start=#{start}"
42
42
  cr = noauth_rest.get_rest(cookbooks_url)
43
43
  cr["items"].each do |cookbook|
44
44
  cookbook_collection[cookbook["cookbook_name"]] = cookbook
@@ -41,7 +41,7 @@ class Chef
41
41
  confirm "Do you really want to unshare the cookbook #{@cookbook_name}"
42
42
 
43
43
  begin
44
- rest.delete_rest "http://cookbooks.opscode.com/api/v1/cookbooks/#{@name_args[0]}"
44
+ rest.delete_rest "https://supermarket.getchef.com/api/v1/cookbooks/#{@name_args[0]}"
45
45
  rescue Net::HTTPServerException => e
46
46
  raise e unless e.message =~ /Forbidden/
47
47
  ui.error "Forbidden: You must be the maintainer of #{@cookbook_name} to unshare it."
@@ -21,6 +21,9 @@ class Chef
21
21
  class Knife
22
22
  class SubcommandLoader
23
23
 
24
+ MATCHES_CHEF_GEM = %r{/chef-[\d]+\.[\d]+\.[\d]+}.freeze
25
+ MATCHES_THIS_CHEF_GEM = %r{/chef-#{Chef::VERSION}/}.freeze
26
+
24
27
  attr_reader :chef_config_dir
25
28
  attr_reader :env
26
29
 
@@ -121,6 +124,14 @@ class Chef
121
124
  subcommand_files = {}
122
125
  files.each do |file|
123
126
  rel_path = file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1]
127
+
128
+ # When not installed as a gem (ChefDK/appbundler in particular), AND
129
+ # a different version of Chef is installed via gems, `files` will
130
+ # include some files from the 'other' Chef install. If this contains
131
+ # a knife command that doesn't exist in this version of Chef, we will
132
+ # get a LoadError later when we try to require it.
133
+ next if from_different_chef_version?(file)
134
+
124
135
  subcommand_files[rel_path] = file
125
136
  end
126
137
 
@@ -184,6 +195,19 @@ class Chef
184
195
 
185
196
  Dir[glob].map { |f| f.untaint }
186
197
  end
198
+
199
+ def from_different_chef_version?(path)
200
+ matches_any_chef_gem?(path) && !matches_this_chef_gem?(path)
201
+ end
202
+
203
+ def matches_any_chef_gem?(path)
204
+ path =~ MATCHES_CHEF_GEM
205
+ end
206
+
207
+ def matches_this_chef_gem?(path)
208
+ path =~ MATCHES_THIS_CHEF_GEM
209
+ end
210
+
187
211
  end
188
212
  end
189
213
  end
@@ -9,6 +9,7 @@ class Chef
9
9
 
10
10
  deps do
11
11
  require 'chef/chef_fs/file_system'
12
+ require 'chef/json_compat'
12
13
  require 'chef/run_list'
13
14
  end
14
15
 
@@ -77,7 +78,7 @@ class Chef
77
78
  return entry.chef_object.metadata.dependencies.keys.map { |cookbook| "/cookbooks/#{cookbook}" }
78
79
 
79
80
  elsif entry.parent && entry.parent.path == '/nodes'
80
- node = JSON.parse(entry.read, :create_additions => false)
81
+ node = Chef::JSONCompat.parse(entry.read, :create_additions => false)
81
82
  result = []
82
83
  if node['chef_environment'] && node['chef_environment'] != '_default'
83
84
  result << "/environments/#{node['chef_environment']}.json"
@@ -88,7 +89,7 @@ class Chef
88
89
  result
89
90
 
90
91
  elsif entry.parent && entry.parent.path == '/roles'
91
- role = JSON.parse(entry.read, :create_additions => false)
92
+ role = Chef::JSONCompat.parse(entry.read, :create_additions => false)
92
93
  result = []
93
94
  if role['run_list']
94
95
  dependencies_from_runlist(role['run_list']).each do |dependency|
@@ -416,7 +416,7 @@ class Chef
416
416
 
417
417
  # Serialize this object as a hash
418
418
  def to_json(*a)
419
- for_json.to_json(*a)
419
+ Chef::JSONCompat.to_json(for_json, *a)
420
420
  end
421
421
 
422
422
  def for_json
@@ -97,7 +97,7 @@ class Chef
97
97
  end
98
98
 
99
99
  def save_cache(cache)
100
- Chef::FileCache.store("revision-deploys/#{new_resource.name}", cache.to_json)
100
+ Chef::FileCache.store("revision-deploys/#{new_resource.name}", Chef::JSONCompat.to_json(cache))
101
101
  cache
102
102
  end
103
103
 
@@ -46,9 +46,11 @@ class Chef
46
46
  end
47
47
 
48
48
  def load_current_resource
49
- @dsc_resources_info = run_configuration(:test)
50
- @resource_converged = @dsc_resources_info.all? do |resource|
51
- !resource.changes_state?
49
+ if supports_dsc?
50
+ @dsc_resources_info = run_configuration(:test)
51
+ @resource_converged = @dsc_resources_info.all? do |resource|
52
+ !resource.changes_state?
53
+ end
52
54
  end
53
55
  end
54
56
 
@@ -56,8 +58,26 @@ class Chef
56
58
  true
57
59
  end
58
60
 
61
+ def define_resource_requirements
62
+ requirements.assert(:run) do |a|
63
+ err = [
64
+ 'Could not find PowerShell DSC support on the system',
65
+ powershell_info_str,
66
+ "Powershell 4.0 or higher was not detected on your system and is required to use the dsc_script resource.",
67
+ ]
68
+ a.assertion { supports_dsc? }
69
+ a.failure_message Chef::Exceptions::NoProviderAvailable, err.join(' ')
70
+ a.whyrun err + ["Assuming a previous resource installs Powershell 4.0 or higher."]
71
+ a.block_action!
72
+ end
73
+ end
74
+
59
75
  protected
60
76
 
77
+ def supports_dsc?
78
+ run_context && Chef::Platform.supports_dsc?(node)
79
+ end
80
+
61
81
  def run_configuration(operation)
62
82
  config_directory = ::Dir.mktmpdir("chef-dsc-script")
63
83
  configuration_data_path = get_configuration_data_path(config_directory)
@@ -77,9 +97,8 @@ class Chef
77
97
  end
78
98
 
79
99
  def get_augmented_configuration_flags(configuration_data_path)
80
- updated_flags = nil
100
+ updated_flags = @dsc_resource.flags.nil? ? {} : @dsc_resource.flags.dup
81
101
  if configuration_data_path
82
- updated_flags = @dsc_resource.flags.nil? ? {} : @dsc_resource.flags.dup
83
102
  Chef::Util::PathHelper.validate_path(configuration_data_path)
84
103
  updated_flags[:configurationdata] = configuration_data_path
85
104
  end
@@ -143,6 +162,14 @@ class Chef
143
162
  end
144
163
  end
145
164
  end
165
+
166
+ def powershell_info_str
167
+ if run_context && run_context.node[:languages] && run_context.node[:languages][:powershell]
168
+ install_info = "Powershell #{run_context.node[:languages][:powershell][:version]} was found on the system."
169
+ else
170
+ install_info = 'Powershell was not found.'
171
+ end
172
+ end
146
173
  end
147
174
  end
148
175
  end