chef 11.12.8 → 11.14.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -2
  3. data/distro/common/html/_sources/index.txt +6 -0
  4. data/distro/common/html/_sources/knife_ssl_check.txt +41 -0
  5. data/distro/common/html/_sources/knife_ssl_fetch.txt +41 -0
  6. data/distro/common/html/_static/basic.css +2 -5
  7. data/distro/common/html/_static/doctools.js +5 -14
  8. data/distro/common/html/_static/jquery.js +2 -154
  9. data/distro/common/html/_static/pygments.css +2 -2
  10. data/distro/common/html/_static/searchtools.js +212 -150
  11. data/distro/common/html/_static/underscore.js +29 -21
  12. data/distro/common/html/_static/websupport.js +1 -1
  13. data/distro/common/html/ctl_chef_client.html +15 -18
  14. data/distro/common/html/ctl_chef_server.html +7 -7
  15. data/distro/common/html/ctl_chef_shell.html +6 -6
  16. data/distro/common/html/ctl_chef_solo.html +7 -8
  17. data/distro/common/html/index.html +34 -24
  18. data/distro/common/html/knife.html +23 -24
  19. data/distro/common/html/knife_bootstrap.html +13 -9
  20. data/distro/common/html/knife_client.html +10 -11
  21. data/distro/common/html/knife_common_options.html +6 -7
  22. data/distro/common/html/knife_configure.html +3 -4
  23. data/distro/common/html/knife_cookbook.html +18 -11
  24. data/distro/common/html/knife_cookbook_site.html +14 -14
  25. data/distro/common/html/knife_data_bag.html +24 -23
  26. data/distro/common/html/knife_delete.html +4 -5
  27. data/distro/common/html/knife_deps.html +4 -5
  28. data/distro/common/html/knife_diff.html +6 -7
  29. data/distro/common/html/knife_download.html +12 -13
  30. data/distro/common/html/knife_edit.html +4 -5
  31. data/distro/common/html/knife_environment.html +8 -9
  32. data/distro/common/html/knife_exec.html +9 -10
  33. data/distro/common/html/knife_index_rebuild.html +4 -5
  34. data/distro/common/html/knife_list.html +8 -9
  35. data/distro/common/html/knife_node.html +34 -33
  36. data/distro/common/html/knife_raw.html +2 -3
  37. data/distro/common/html/knife_recipe_list.html +3 -4
  38. data/distro/common/html/knife_role.html +30 -29
  39. data/distro/common/html/knife_search.html +7 -7
  40. data/distro/common/html/knife_show.html +4 -5
  41. data/distro/common/html/knife_ssh.html +2 -3
  42. data/distro/common/html/knife_ssl_check.html +148 -0
  43. data/distro/common/html/knife_ssl_fetch.html +152 -0
  44. data/distro/common/html/knife_status.html +4 -5
  45. data/distro/common/html/knife_tag.html +2 -3
  46. data/distro/common/html/knife_upload.html +5 -6
  47. data/distro/common/html/knife_user.html +9 -10
  48. data/distro/common/html/knife_using.html +12 -12
  49. data/distro/common/html/knife_xargs.html +11 -12
  50. data/distro/common/html/search.html +1 -2
  51. data/distro/common/html/searchindex.js +1 -1
  52. data/distro/common/man/man1/chef-shell.1 +19 -11
  53. data/distro/common/man/man1/knife-bootstrap.1 +35 -19
  54. data/distro/common/man/man1/knife-client.1 +111 -28
  55. data/distro/common/man/man1/knife-configure.1 +30 -14
  56. data/distro/common/man/man1/knife-cookbook-site.1 +105 -22
  57. data/distro/common/man/man1/knife-cookbook.1 +164 -23
  58. data/distro/common/man/man1/knife-data-bag.1 +157 -33
  59. data/distro/common/man/man1/knife-delete.1 +21 -17
  60. data/distro/common/man/man1/knife-deps.1 +60 -16
  61. data/distro/common/man/man1/knife-diff.1 +37 -17
  62. data/distro/common/man/man1/knife-download.1 +68 -24
  63. data/distro/common/man/man1/knife-edit.1 +19 -15
  64. data/distro/common/man/man1/knife-environment.1 +105 -17
  65. data/distro/common/man/man1/knife-exec.1 +78 -18
  66. data/distro/common/man/man1/knife-index-rebuild.1 +16 -8
  67. data/distro/common/man/man1/knife-list.1 +39 -23
  68. data/distro/common/man/man1/knife-node.1 +170 -22
  69. data/distro/common/man/man1/knife-raw.1 +33 -13
  70. data/distro/common/man/man1/knife-recipe-list.1 +17 -5
  71. data/distro/common/man/man1/knife-role.1 +86 -18
  72. data/distro/common/man/man1/knife-search.1 +80 -16
  73. data/distro/common/man/man1/knife-show.1 +30 -14
  74. data/distro/common/man/man1/knife-ssh.1 +54 -14
  75. data/distro/common/man/man1/knife-ssl-check.1 +207 -0
  76. data/distro/common/man/man1/knife-ssl-fetch.1 +207 -0
  77. data/distro/common/man/man1/knife-status.1 +48 -12
  78. data/distro/common/man/man1/knife-tag.1 +30 -10
  79. data/distro/common/man/man1/knife-upload.1 +72 -20
  80. data/distro/common/man/man1/knife-user.1 +79 -23
  81. data/distro/common/man/man1/knife-xargs.1 +61 -53
  82. data/distro/common/man/man8/chef-client.8 +87 -29
  83. data/distro/common/man/man8/chef-solo.8 +36 -15
  84. data/lib/chef/application.rb +19 -14
  85. data/lib/chef/application/client.rb +5 -0
  86. data/lib/chef/application/solo.rb +5 -0
  87. data/lib/chef/application/windows_service_manager.rb +3 -0
  88. data/lib/chef/chef_fs/chef_fs_data_store.rb +72 -24
  89. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +20 -4
  90. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +20 -1
  91. data/lib/chef/chef_fs/file_system/file_system_entry.rb +10 -2
  92. data/lib/chef/client.rb +2 -3
  93. data/lib/chef/config.rb +34 -8
  94. data/lib/chef/cookbook/cookbook_version_loader.rb +45 -4
  95. data/lib/chef/cookbook_version.rb +38 -30
  96. data/lib/chef/dsl/recipe.rb +4 -1
  97. data/lib/chef/event_dispatch/base.rb +14 -0
  98. data/lib/chef/event_dispatch/events_output_stream.rb +29 -0
  99. data/lib/chef/exceptions.rb +8 -0
  100. data/lib/chef/formatters/base.rb +16 -45
  101. data/lib/chef/formatters/doc.rb +51 -26
  102. data/lib/chef/formatters/indentable_output_stream.rb +165 -0
  103. data/lib/chef/knife/node_environment_set.rb +54 -0
  104. data/lib/chef/knife/user_create.rb +1 -1
  105. data/lib/chef/monkey_patches/pathname.rb +32 -0
  106. data/lib/chef/node.rb +1 -1
  107. data/lib/chef/platform/provider_mapping.rb +345 -338
  108. data/lib/chef/policy_builder/expand_node_object.rb +1 -1
  109. data/lib/chef/policy_builder/policyfile.rb +1 -1
  110. data/lib/chef/provider.rb +1 -0
  111. data/lib/chef/provider/git.rb +1 -1
  112. data/lib/chef/provider/link.rb +2 -2
  113. data/lib/chef/provider/remote_file/content.rb +1 -1
  114. data/lib/chef/provider/remote_file/local_file.rb +8 -2
  115. data/lib/chef/provider/service/arch.rb +0 -1
  116. data/lib/chef/provider/service/debian.rb +0 -2
  117. data/lib/chef/provider/service/freebsd.rb +2 -1
  118. data/lib/chef/provider/service/gentoo.rb +1 -1
  119. data/lib/chef/provider/service/init.rb +0 -1
  120. data/lib/chef/provider/service/insserv.rb +0 -2
  121. data/lib/chef/provider/service/invokercd.rb +0 -2
  122. data/lib/chef/provider/service/macosx.rb +2 -1
  123. data/lib/chef/provider/service/redhat.rb +0 -1
  124. data/lib/chef/provider/service/simple.rb +1 -0
  125. data/lib/chef/provider/service/solaris.rb +1 -0
  126. data/lib/chef/provider/service/systemd.rb +1 -1
  127. data/lib/chef/provider/service/upstart.rb +1 -1
  128. data/lib/chef/provider/user.rb +9 -9
  129. data/lib/chef/provider/user/solaris.rb +2 -0
  130. data/lib/chef/resource.rb +1 -0
  131. data/lib/chef/resource/remote_file.rb +32 -6
  132. data/lib/chef/run_context.rb +22 -0
  133. data/lib/chef/run_lock.rb +43 -4
  134. data/lib/chef/version.rb +2 -2
  135. data/spec/functional/http/simple_spec.rb +84 -0
  136. data/spec/functional/resource/remote_file_spec.rb +107 -43
  137. data/spec/functional/rest_spec.rb +94 -0
  138. data/spec/functional/run_lock_spec.rb +1 -1
  139. data/spec/functional/win32/service_manager_spec.rb +6 -0
  140. data/spec/integration/knife/chef_fs_data_store_spec.rb +2 -0
  141. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +76 -0
  142. data/spec/spec_helper.rb +2 -0
  143. data/spec/support/mock/platform.rb +7 -0
  144. data/spec/support/pedant/pedant_config.rb +121 -0
  145. data/spec/support/pedant/run_pedant.rb +63 -0
  146. data/spec/support/pedant/stickywicket.pem +27 -0
  147. data/spec/support/shared/functional/http.rb +242 -0
  148. data/spec/support/shared/unit/api_error_inspector.rb +2 -2
  149. data/spec/unit/api_client_spec.rb +2 -2
  150. data/spec/unit/application/client_spec.rb +6 -1
  151. data/spec/unit/application/knife_spec.rb +4 -0
  152. data/spec/unit/application/solo_spec.rb +2 -0
  153. data/spec/unit/application_spec.rb +7 -0
  154. data/spec/unit/client_spec.rb +16 -0
  155. data/spec/unit/config_spec.rb +3 -20
  156. data/spec/unit/cookbook_version_spec.rb +224 -122
  157. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +2 -2
  158. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +2 -2
  159. data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +2 -2
  160. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +2 -2
  161. data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +2 -2
  162. data/spec/unit/handler_spec.rb +0 -1
  163. data/spec/unit/knife/client_bulk_delete_spec.rb +3 -0
  164. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +2 -0
  165. data/spec/unit/knife/cookbook_metadata_spec.rb +2 -2
  166. data/spec/unit/knife/cookbook_site_install_spec.rb +3 -1
  167. data/spec/unit/knife/cookbook_upload_spec.rb +10 -10
  168. data/spec/unit/knife/node_environment_set_spec.rb +80 -0
  169. data/spec/unit/knife/user_create_spec.rb +6 -4
  170. data/spec/unit/knife/user_edit_spec.rb +5 -0
  171. data/spec/unit/knife_spec.rb +3 -0
  172. data/spec/unit/mixin/securable_spec.rb +18 -20
  173. data/spec/unit/node/attribute_spec.rb +15 -2
  174. data/spec/unit/node/immutable_collections_spec.rb +4 -4
  175. data/spec/unit/provider/cron_spec.rb +14 -14
  176. data/spec/unit/provider/git_spec.rb +4 -4
  177. data/spec/unit/provider/group_spec.rb +1 -1
  178. data/spec/unit/provider/ohai_spec.rb +2 -2
  179. data/spec/unit/provider/remote_file/content_spec.rb +58 -35
  180. data/spec/unit/provider/remote_file/local_file_spec.rb +23 -0
  181. data/spec/unit/provider/service/solaris_smf_service_spec.rb +13 -13
  182. data/spec/unit/resource/mount_spec.rb +0 -1
  183. data/spec/unit/resource/remote_file_spec.rb +29 -0
  184. data/spec/unit/resource_spec.rb +1 -1
  185. data/spec/unit/run_context_spec.rb +7 -0
  186. data/spec/unit/run_lock_spec.rb +98 -0
  187. data/spec/unit/version_constraint_spec.rb +1 -1
  188. metadata +164 -151
  189. data/distro/common/html/_static/chef.css +0 -507
  190. data/distro/common/html/_static/chef_logo.png +0 -0
  191. data/lib/chef/checksum/storage.rb +0 -18
  192. data/lib/chef/checksum/storage/filesystem.rb +0 -56
  193. data/spec/unit/checksum/storage/filesystem_spec.rb +0 -70
@@ -1,4 +1,4 @@
1
- #
1
+
2
2
  # Author:: Daniel DeLeo (<dan@opscode.com>)
3
3
  # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
4
4
  # License:: Apache License, Version 2.0
@@ -17,7 +17,7 @@
17
17
 
18
18
  class Chef
19
19
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
20
- VERSION = '11.12.8'
20
+ VERSION = '11.14.0.alpha.2'
21
21
  end
22
22
 
23
23
  # NOTE: the Chef::Version class is defined in version_class.rb
@@ -0,0 +1,84 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@getchef.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
+
19
+ require 'spec_helper'
20
+ require 'tiny_server'
21
+ require 'support/shared/functional/http'
22
+
23
+ describe Chef::HTTP::Simple do
24
+ include ChefHTTPShared
25
+
26
+ let(:http_client) { described_class.new(source) }
27
+ let(:http_client_disable_gzip) { described_class.new(source, { :disable_gzip => true } ) }
28
+
29
+ before(:all) do
30
+ start_tiny_server
31
+ end
32
+
33
+ after(:all) do
34
+ stop_tiny_server
35
+ end
36
+
37
+ shared_examples_for "downloads requests correctly" do
38
+ it "successfully downloads a streaming request" do
39
+ tempfile = http_client.streaming_request(source, {})
40
+ tempfile.close
41
+ expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
42
+ end
43
+ it "successfully does a non-streaming GET request" do
44
+ expect(Digest::MD5.hexdigest(http_client.get(source))).to eq(Digest::MD5.hexdigest(expected_content))
45
+ end
46
+ end
47
+
48
+ shared_examples_for "validates content length and throws an exception" do
49
+ it "successfully downloads a streaming request" do
50
+ expect { http_client.streaming_request(source) }.to raise_error(Chef::Exceptions::ContentLengthMismatch)
51
+ end
52
+ it "successfully does a non-streaming GET request" do
53
+ expect { http_client.get(source) }.to raise_error(Chef::Exceptions::ContentLengthMismatch)
54
+ end
55
+ end
56
+
57
+ shared_examples_for "an endpoint that 403s" do
58
+ it "fails with a Net::HTTPServerException for a streaming request" do
59
+ expect { http_client.streaming_request(source) }.to raise_error(Net::HTTPServerException)
60
+ end
61
+
62
+ it "fails with a Net::HTTPServerException for a GET request" do
63
+ expect { http_client.get(source) }.to raise_error(Net::HTTPServerException)
64
+ end
65
+ end
66
+
67
+ # see CHEF-5100
68
+ shared_examples_for "a 403 after a successful request when reusing the request object" do
69
+ it "fails with a Net::HTTPServerException for a streaming request" do
70
+ tempfile = http_client.streaming_request(source)
71
+ tempfile.close
72
+ expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
73
+ expect { http_client.streaming_request(source2) }.to raise_error(Net::HTTPServerException)
74
+ end
75
+
76
+ it "fails with a Net::HTTPServerException for a GET request" do
77
+ expect(Digest::MD5.hexdigest(http_client.get(source))).to eq(Digest::MD5.hexdigest(expected_content))
78
+ expect { http_client.get(source2) }.to raise_error(Net::HTTPServerException)
79
+ end
80
+ end
81
+
82
+ it_behaves_like "downloading all the things"
83
+ end
84
+
@@ -18,8 +18,10 @@
18
18
 
19
19
  require 'spec_helper'
20
20
  require 'tiny_server'
21
+ require 'support/shared/functional/http'
21
22
 
22
23
  describe Chef::Resource::RemoteFile do
24
+ include ChefHTTPShared
23
25
 
24
26
  let(:file_cache_path) { Dir.mktmpdir }
25
27
 
@@ -52,28 +54,6 @@ describe Chef::Resource::RemoteFile do
52
54
 
53
55
  let(:default_mode) { ((0100666 - File.umask) & 07777).to_s(8) }
54
56
 
55
- def start_tiny_server(server_opts={})
56
- @server = TinyServer::Manager.new(server_opts)
57
- @server.start
58
- @api = TinyServer::API.instance
59
- @api.clear
60
- @api.get("/nyan_cat.png", 200) {
61
- File.open(File.join(CHEF_SPEC_DATA, 'remote_file', 'nyan_cat.png'), "rb") do |f|
62
- f.read
63
- end
64
- }
65
- @api.get("/nyan_cat.png.gz", 200, nil, { 'Content-Type' => 'application/gzip', 'Content-Encoding' => 'gzip' } ) {
66
- File.open(File.join(CHEF_SPEC_DATA, 'remote_file', 'nyan_cat.png.gz'), "rb") do |f|
67
- f.read
68
- end
69
- }
70
- end
71
-
72
- def stop_tiny_server
73
- @server.stop
74
- @server = @api = nil
75
- end
76
-
77
57
  context "when fetching files over HTTP" do
78
58
  before(:all) do
79
59
  start_tiny_server
@@ -98,13 +78,7 @@ describe Chef::Resource::RemoteFile do
98
78
 
99
79
  context "when using normal encoding" do
100
80
  let(:source) { 'http://localhost:9000/nyan_cat.png' }
101
- let(:expected_content) do
102
- content = File.open(File.join(CHEF_SPEC_DATA, 'remote_file', 'nyan_cat.png'), "rb") do |f|
103
- f.read
104
- end
105
- content.force_encoding(Encoding::BINARY) if content.respond_to?(:force_encoding)
106
- content
107
- end
81
+ let(:expected_content) { binread(nyan_uncompressed_filename) }
108
82
 
109
83
  it_behaves_like "a file resource"
110
84
 
@@ -113,13 +87,7 @@ describe Chef::Resource::RemoteFile do
113
87
 
114
88
  context "when using gzip encoding" do
115
89
  let(:source) { 'http://localhost:9000/nyan_cat.png.gz' }
116
- let(:expected_content) do
117
- content = File.open(File.join(CHEF_SPEC_DATA, 'remote_file', 'nyan_cat.png.gz'), "rb") do |f|
118
- f.read
119
- end
120
- content.force_encoding(Encoding::BINARY) if content.respond_to?(:force_encoding)
121
- content
122
- end
90
+ let(:expected_content) { binread(nyan_compressed_filename) }
123
91
 
124
92
  it_behaves_like "a file resource"
125
93
 
@@ -150,16 +118,112 @@ describe Chef::Resource::RemoteFile do
150
118
 
151
119
  let(:source) { 'https://localhost:9000/nyan_cat.png' }
152
120
 
153
- let(:expected_content) do
154
- content = File.open(File.join(CHEF_SPEC_DATA, 'remote_file', 'nyan_cat.png'), "rb") do |f|
155
- f.read
156
- end
157
- content.force_encoding(Encoding::BINARY) if content.respond_to?(:force_encoding)
158
- content
159
- end
121
+ let(:expected_content) { binread(nyan_uncompressed_filename) }
160
122
 
161
123
  it_behaves_like "a file resource"
162
124
 
163
125
  end
164
126
 
127
+ context "when dealing with content length checking" do
128
+ before(:all) do
129
+ start_tiny_server
130
+ end
131
+
132
+ after(:all) do
133
+ stop_tiny_server
134
+ end
135
+
136
+ context "when downloading compressed data" do
137
+ let(:expected_content) { binread(nyan_uncompressed_filename) }
138
+ let(:source) { 'http://localhost:9000/nyan_cat_content_length_compressed.png' }
139
+
140
+ before do
141
+ File.should_not exist(path)
142
+ resource.run_action(:create)
143
+ end
144
+
145
+ it "should create the file" do
146
+ File.should exist(path)
147
+ end
148
+
149
+ it "should mark the resource as updated" do
150
+ resource.should be_updated_by_last_action
151
+ end
152
+
153
+ it "has the correct content" do
154
+ binread(path).should == expected_content
155
+ end
156
+ end
157
+
158
+ context "when downloding uncompressed data" do
159
+ let(:expected_content) { binread(nyan_uncompressed_filename) }
160
+ let(:source) { 'http://localhost:9000/nyan_cat_content_length.png' }
161
+
162
+ before do
163
+ File.should_not exist(path)
164
+ resource.run_action(:create)
165
+ end
166
+
167
+ it "should create the file" do
168
+ File.should exist(path)
169
+ end
170
+
171
+ it "should mark the resource as updated" do
172
+ resource.should be_updated_by_last_action
173
+ end
174
+
175
+ it "has the correct content" do
176
+ binread(path).should == expected_content
177
+ end
178
+ end
179
+
180
+ context "when downloading truncated compressed data" do
181
+ let(:source) { 'http://localhost:9000/nyan_cat_truncated_compressed.png' }
182
+
183
+ before do
184
+ File.should_not exist(path)
185
+ end
186
+
187
+ it "should raise ContentLengthMismatch" do
188
+ lambda { resource.run_action(:create) }.should raise_error(Chef::Exceptions::ContentLengthMismatch)
189
+ #File.should_not exist(path) # XXX: CHEF-5081
190
+ end
191
+ end
192
+
193
+ context "when downloding truncated uncompressed data" do
194
+ let(:source) { 'http://localhost:9000/nyan_cat_truncated.png' }
195
+
196
+ before do
197
+ File.should_not exist(path)
198
+ end
199
+
200
+ it "should raise ContentLengthMismatch" do
201
+ lambda { resource.run_action(:create) }.should raise_error(Chef::Exceptions::ContentLengthMismatch)
202
+ #File.should_not exist(path) # XXX: CHEF-5081
203
+ end
204
+ end
205
+
206
+ context "when downloding data with transfer-encoding set" do
207
+ let(:expected_content) { binread(nyan_uncompressed_filename) }
208
+ let(:source) { 'http://localhost:9000/nyan_cat_transfer_encoding.png' }
209
+
210
+ before do
211
+ File.should_not exist(path)
212
+ resource.run_action(:create)
213
+ end
214
+
215
+ it "should create the file" do
216
+ File.should exist(path)
217
+ end
218
+
219
+ it "should mark the resource as updated" do
220
+ resource.should be_updated_by_last_action
221
+ end
222
+
223
+ it "has the correct content" do
224
+ binread(path).should == expected_content
225
+ end
226
+ end
227
+
228
+ end
165
229
  end
@@ -0,0 +1,94 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@getchef.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
+
19
+ require 'spec_helper'
20
+ require 'tiny_server'
21
+ require 'support/shared/functional/http'
22
+
23
+ describe Chef::REST do
24
+ include ChefHTTPShared
25
+
26
+ let(:http_client) { described_class.new(source) }
27
+ let(:http_client_disable_gzip) { described_class.new(source, Chef::Config[:node_name], Chef::Config[:client_key], { :disable_gzip => true } ) }
28
+
29
+ shared_examples_for "downloads requests correctly" do
30
+ it "successfully downloads a streaming request" do
31
+ tempfile = http_client.streaming_request(source, {})
32
+ tempfile.close
33
+ expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
34
+ end
35
+
36
+ it "successfully downloads a GET request" do
37
+ tempfile = http_client.get(source, {})
38
+ tempfile.close
39
+ expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
40
+ end
41
+ end
42
+
43
+ shared_examples_for "validates content length and throws an exception" do
44
+ it "fails validation on a streaming download" do
45
+ expect { http_client.streaming_request(source, {}) }.to raise_error(Chef::Exceptions::ContentLengthMismatch)
46
+ end
47
+
48
+ it "fails validation on a GET request" do
49
+ expect { http_client.get(source, {}) }.to raise_error(Chef::Exceptions::ContentLengthMismatch)
50
+ end
51
+ end
52
+
53
+ shared_examples_for "an endpoint that 403s" do
54
+ it "fails with a Net::HTTPServerException on a streaming download" do
55
+ expect { http_client.streaming_request(source, {}) }.to raise_error(Net::HTTPServerException)
56
+ end
57
+
58
+ it "fails with a Net::HTTPServerException on a GET request" do
59
+ expect { http_client.get(source, {}) }.to raise_error(Net::HTTPServerException)
60
+ end
61
+ end
62
+
63
+ # see CHEF-5100
64
+ shared_examples_for "a 403 after a successful request when reusing the request object" do
65
+ it "fails with a Net::HTTPServerException on a streaming download" do
66
+ tempfile = http_client.streaming_request(source, {})
67
+ tempfile.close
68
+ expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
69
+ expect { http_client.streaming_request(source2, {}) }.to raise_error(Net::HTTPServerException)
70
+ end
71
+
72
+ it "fails with a Net::HTTPServerException on a GET request" do
73
+ tempfile = http_client.get(source, {})
74
+ tempfile.close
75
+ expect(Digest::MD5.hexdigest(binread(tempfile.path))).to eq(Digest::MD5.hexdigest(expected_content))
76
+ expect { http_client.get(source2, {}) }.to raise_error(Net::HTTPServerException)
77
+ end
78
+ end
79
+
80
+ before do
81
+ Chef::Config[:node_name] = "webmonkey.example.com"
82
+ Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
83
+ end
84
+
85
+ before(:all) do
86
+ start_tiny_server
87
+ end
88
+
89
+ after(:all) do
90
+ stop_tiny_server
91
+ end
92
+
93
+ it_behaves_like "downloading all the things"
94
+ end
@@ -276,6 +276,7 @@ E
276
276
  end
277
277
 
278
278
  wait_on_lock
279
+ sleep 0.5 # Possible race condition on Solaris which pid is observed as 0
279
280
  File.read(lockfile).should == p1.to_s
280
281
 
281
282
  Process.waitpid2(p1)
@@ -283,4 +284,3 @@ E
283
284
 
284
285
  end
285
286
  end
286
-
@@ -148,6 +148,12 @@ describe "Chef::Application::WindowsServiceManager", :windows_only, :system_wind
148
148
  service_manager.run(["-a", "install"])
149
149
  end
150
150
 
151
+ it "should have an own-process, non-interactive type" do
152
+ status = ::Win32::Service.status("spec-service")
153
+ status[:service_type].should == "own process"
154
+ status[:interactive].should be_false
155
+ end
156
+
151
157
  it "install => should say service already exists" do
152
158
  service_manager.run(["-a", "install"])
153
159
  @service_manager_output.grep(/already exists/).length.should > 0
@@ -188,6 +188,7 @@ EOM
188
188
  when_the_repository 'is empty' do
189
189
  context 'POST /TYPE/NAME' do
190
190
  file 'empty.json', { 'name' => 'z' }
191
+ file 'empty_x.json', { 'name' => 'x' }
191
192
  file 'empty_id.json', { 'id' => 'z' }
192
193
  file 'rolestuff.json', '{"description":"hi there","name":"x"}'
193
194
  file 'cookbooks_to_upload/z/metadata.rb', "version '1.0.0'"
@@ -211,6 +212,7 @@ EOM
211
212
  end
212
213
 
213
214
  it 'knife raw -z -i empty.json -m POST /data/x' do
215
+ knife("raw -z -i #{path_to('empty_x.json')} -m POST /data").should_succeed /uri/
214
216
  knife("raw -z -i #{path_to('empty_id.json')} -m POST /data/x").should_succeed /"z"/
215
217
  knife('list --local -Rfp /data_bags').should_succeed "/data_bags/x/\n/data_bags/x/z.json\n"
216
218
  end
@@ -0,0 +1,76 @@
1
+ require 'support/shared/integration/integration_helper'
2
+ require 'chef/mixin/shell_out'
3
+
4
+ describe "LWRPs with inline resources" do
5
+ extend IntegrationSupport
6
+ include Chef::Mixin::ShellOut
7
+
8
+ let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
9
+
10
+ # Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
11
+ # following constraints are satisfied:
12
+ # * Windows: windows can only run batch scripts as bare executables. Rubygems
13
+ # creates batch wrappers for installed gems, but we don't have batch wrappers
14
+ # in the source tree.
15
+ # * Other `chef-client` in PATH: A common case is running the tests on a
16
+ # machine that has omnibus chef installed. In that case we need to ensure
17
+ # we're running `chef-client` from the source tree and not the external one.
18
+ # cf. CHEF-4914
19
+ let(:chef_client) { "ruby #{chef_dir}/chef-client" }
20
+
21
+ when_the_repository "has a cookbook with a nested LWRP" do
22
+ directory 'cookbooks/x' do
23
+
24
+ file 'resources/do_nothing.rb', <<EOM
25
+ actions :create, :nothing
26
+ default_action :create
27
+ EOM
28
+ file 'providers/do_nothing.rb', <<EOM
29
+ action :create do
30
+ end
31
+ EOM
32
+
33
+ file 'resources/my_machine.rb', <<EOM
34
+ actions :create, :nothing
35
+ default_action :create
36
+ EOM
37
+ file 'providers/my_machine.rb', <<EOM
38
+ use_inline_resources
39
+ action :create do
40
+ x_do_nothing 'a'
41
+ x_do_nothing 'b'
42
+ end
43
+ EOM
44
+
45
+ file 'recipes/default.rb', <<EOM
46
+ x_my_machine "me"
47
+ x_my_machine "you"
48
+ EOM
49
+
50
+ end # directory 'cookbooks/x'
51
+
52
+ it "should complete with success" do
53
+ file 'config/client.rb', <<EOM
54
+ local_mode true
55
+ cookbook_path "#{path_to('cookbooks')}"
56
+ log_level :warn
57
+ EOM
58
+
59
+ result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" --no-color -F doc -o 'x::default'", :cwd => chef_dir)
60
+ actual = result.stdout.lines.map { |l| l.chomp }.join("\n")
61
+ expected = <<EOM
62
+ * x_my_machine[me] action create
63
+ * x_do_nothing[a] action create (up to date)
64
+ * x_do_nothing[b] action create (up to date)
65
+ (up to date)
66
+ * x_my_machine[you] action create
67
+ * x_do_nothing[a] action create (up to date)
68
+ * x_do_nothing[b] action create (up to date)
69
+ (up to date)
70
+ EOM
71
+ expected = expected.lines.map { |l| l.chomp }.join("\n")
72
+ actual.should include(expected)
73
+ result.error!
74
+ end
75
+ end
76
+ end