microwave 1.0.4 → 11.400.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +2 -2
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/chef-solo +0 -2
  7. data/bin/shef +6 -5
  8. data/lib/chef.rb +2 -4
  9. data/spec/data/big_json.json +2 -1
  10. data/spec/data/big_json_plus_one.json +2 -1
  11. data/spec/data/cookbooks/chefignore +2 -0
  12. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  13. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  14. data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
  15. data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
  16. data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
  17. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  18. data/spec/data/nodes/default.rb +3 -3
  19. data/spec/data/nodes/test.example.com.rb +3 -3
  20. data/spec/data/nodes/test.rb +3 -3
  21. data/spec/data/partial_one.erb +1 -0
  22. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  23. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  24. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  25. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  26. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  27. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  28. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  29. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  30. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  31. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  32. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  33. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  34. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  35. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  36. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  37. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  38. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  39. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  40. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  41. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  42. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  43. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  44. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  45. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  46. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  47. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  48. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  49. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  50. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  51. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  52. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  53. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  54. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  55. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  56. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  57. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  58. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  59. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  60. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  61. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  62. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  63. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  64. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  65. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  66. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  67. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  68. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  69. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  70. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  71. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  72. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  73. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  74. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  75. data/spec/data/shef-config.rb +10 -0
  76. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  77. data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
  78. data/spec/functional/knife/exec_spec.rb +4 -6
  79. data/spec/functional/knife/smoke_test.rb +34 -0
  80. data/spec/functional/knife/ssh_spec.rb +64 -3
  81. data/spec/functional/resource/cookbook_file_spec.rb +33 -2
  82. data/spec/functional/resource/deploy_revision_spec.rb +515 -0
  83. data/spec/functional/resource/directory_spec.rb +4 -0
  84. data/spec/functional/resource/file_spec.rb +56 -22
  85. data/spec/functional/resource/link_spec.rb +12 -10
  86. data/spec/functional/resource/registry_spec.rb +572 -0
  87. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  88. data/spec/functional/resource/remote_file_spec.rb +28 -3
  89. data/spec/functional/resource/template_spec.rb +23 -2
  90. data/spec/functional/run_lock_spec.rb +238 -0
  91. data/spec/functional/shell_spec.rb +101 -0
  92. data/spec/functional/tiny_server_spec.rb +5 -4
  93. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  94. data/spec/functional/win32/security_spec.rb +37 -0
  95. data/spec/spec_helper.rb +15 -3
  96. data/spec/stress/win32/security_spec.rb +5 -5
  97. data/spec/support/chef_helpers.rb +14 -3
  98. data/spec/support/lib/chef/resource/cat.rb +3 -5
  99. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  100. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  101. data/spec/support/matchers/leak.rb +1 -1
  102. data/spec/support/platform_helpers.rb +18 -0
  103. data/spec/support/shared/functional/directory_resource.rb +85 -23
  104. data/spec/support/shared/functional/file_resource.rb +198 -53
  105. data/spec/support/shared/functional/securable_resource.rb +140 -105
  106. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  107. data/spec/support/shared/unit/file_system_support.rb +110 -0
  108. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  109. data/spec/tiny_server.rb +29 -10
  110. data/spec/unit/api_client/registration_spec.rb +172 -0
  111. data/spec/unit/api_client_spec.rb +156 -103
  112. data/spec/unit/application/apply.rb +84 -0
  113. data/spec/unit/application/knife_spec.rb +5 -0
  114. data/spec/unit/application_spec.rb +57 -2
  115. data/spec/unit/chef_fs/diff_spec.rb +329 -0
  116. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  117. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  118. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  119. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  120. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  121. data/spec/unit/client_spec.rb +188 -16
  122. data/spec/unit/config_spec.rb +54 -4
  123. data/spec/unit/cookbook/chefignore_spec.rb +2 -1
  124. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  125. data/spec/unit/cookbook_loader_spec.rb +153 -91
  126. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  127. data/spec/unit/cookbook_spec.rb +3 -20
  128. data/spec/unit/cookbook_version_spec.rb +23 -122
  129. data/spec/unit/digester_spec.rb +50 -0
  130. data/spec/unit/dsl/data_query_spec.rb +66 -0
  131. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  132. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  133. data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
  134. data/spec/unit/environment_spec.rb +0 -130
  135. data/spec/unit/exceptions_spec.rb +2 -3
  136. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
  137. data/spec/unit/json_compat_spec.rb +69 -0
  138. data/spec/unit/knife/bootstrap_spec.rb +81 -28
  139. data/spec/unit/knife/client_reregister_spec.rb +23 -22
  140. data/spec/unit/knife/configure_spec.rb +29 -26
  141. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  142. data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
  143. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  144. data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
  145. data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
  146. data/spec/unit/knife/core/ui_spec.rb +156 -7
  147. data/spec/unit/knife/data_bag_create_spec.rb +14 -0
  148. data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
  149. data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
  150. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  151. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  152. data/spec/unit/knife/knife_help.rb +7 -7
  153. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  154. data/spec/unit/knife/ssh_spec.rb +121 -15
  155. data/spec/unit/knife/status_spec.rb +2 -2
  156. data/spec/unit/knife/user_create_spec.rb +86 -0
  157. data/spec/unit/knife/user_delete_spec.rb +39 -0
  158. data/spec/unit/knife/user_edit_spec.rb +42 -0
  159. data/spec/unit/knife/user_list_spec.rb +32 -0
  160. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  161. data/spec/unit/knife/user_show_spec.rb +41 -0
  162. data/spec/unit/knife_spec.rb +53 -0
  163. data/spec/unit/lwrp_spec.rb +59 -17
  164. data/spec/unit/mixin/checksum_spec.rb +2 -2
  165. data/spec/unit/mixin/deep_merge_spec.rb +56 -491
  166. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  167. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  168. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  169. data/spec/unit/mixin/securable_spec.rb +5 -3
  170. data/spec/unit/mixin/template_spec.rb +119 -0
  171. data/spec/unit/node/attribute_spec.rb +272 -137
  172. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  173. data/spec/unit/node_spec.rb +411 -339
  174. data/spec/unit/platform_spec.rb +8 -8
  175. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  176. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  177. data/spec/unit/provider/deploy/revision_spec.rb +2 -8
  178. data/spec/unit/provider/deploy_spec.rb +6 -40
  179. data/spec/unit/provider/directory_spec.rb +103 -68
  180. data/spec/unit/provider/erl_call_spec.rb +0 -2
  181. data/spec/unit/provider/file_spec.rb +69 -59
  182. data/spec/unit/provider/git_spec.rb +0 -10
  183. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  184. data/spec/unit/provider/group/usermod_spec.rb +2 -2
  185. data/spec/unit/provider/http_request_spec.rb +28 -69
  186. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  187. data/spec/unit/provider/link_spec.rb +1 -1
  188. data/spec/unit/provider/ohai_spec.rb +4 -4
  189. data/spec/unit/provider/package/apt_spec.rb +0 -1
  190. data/spec/unit/provider/package/ips_spec.rb +0 -1
  191. data/spec/unit/provider/package/rubygems_spec.rb +0 -18
  192. data/spec/unit/provider/package/yum_spec.rb +79 -15
  193. data/spec/unit/provider/package_spec.rb +7 -5
  194. data/spec/unit/provider/registry_key_spec.rb +269 -0
  195. data/spec/unit/provider/remote_directory_spec.rb +24 -7
  196. data/spec/unit/provider/remote_file_spec.rb +36 -0
  197. data/spec/unit/provider/route_spec.rb +3 -6
  198. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  199. data/spec/unit/provider/service/arch_service_spec.rb +4 -4
  200. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  201. data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
  202. data/spec/unit/provider/service/init_service_spec.rb +26 -3
  203. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  204. data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
  205. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  206. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  207. data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
  208. data/spec/unit/provider/service_spec.rb +2 -2
  209. data/spec/unit/provider/subversion_spec.rb +1 -1
  210. data/spec/unit/provider/template_spec.rb +35 -11
  211. data/spec/unit/provider/user/dscl_spec.rb +57 -31
  212. data/spec/unit/provider/user_spec.rb +7 -16
  213. data/spec/unit/provider_spec.rb +4 -3
  214. data/spec/unit/recipe_spec.rb +10 -8
  215. data/spec/unit/registry_helper_spec.rb +376 -0
  216. data/spec/unit/resource/log_spec.rb +9 -0
  217. data/spec/unit/resource/registry_key_spec.rb +171 -0
  218. data/spec/unit/resource/remote_file_spec.rb +21 -23
  219. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  220. data/spec/unit/resource/service_spec.rb +11 -0
  221. data/spec/unit/resource_spec.rb +27 -4
  222. data/spec/unit/rest/auth_credentials_spec.rb +2 -14
  223. data/spec/unit/rest_spec.rb +122 -187
  224. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  225. data/spec/unit/run_context_spec.rb +18 -4
  226. data/spec/unit/run_list_spec.rb +0 -209
  227. data/spec/unit/run_lock_spec.rb +37 -0
  228. data/spec/unit/runner_spec.rb +101 -2
  229. data/spec/unit/scan_access_control_spec.rb +4 -4
  230. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  231. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  232. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
  233. data/spec/unit/shell_out_spec.rb +18 -0
  234. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  235. data/spec/unit/user_spec.rb +255 -0
  236. metadata +162 -157
  237. data/README.rdoc +0 -177
  238. data/spec/unit/certificate_spec.rb +0 -76
  239. data/spec/unit/checksum_cache_spec.rb +0 -209
  240. data/spec/unit/checksum_spec.rb +0 -94
  241. data/spec/unit/couchdb_spec.rb +0 -274
  242. data/spec/unit/index_queue_spec.rb +0 -391
  243. data/spec/unit/json_compat_spect.rb +0 -53
  244. data/spec/unit/mixin/language_spec.rb +0 -305
  245. data/spec/unit/openid_registration_spec.rb +0 -153
  246. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  247. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  248. data/spec/unit/solr_query_spec.rb +0 -203
  249. data/spec/unit/webui_user_spec.rb +0 -238
@@ -75,8 +75,22 @@ describe Chef::Knife::DataBagCreate do
75
75
  @knife.should_receive(:create_object).and_yield(@plain_data)
76
76
  data_bag_item = Chef::DataBagItem.from_hash(@enc_data)
77
77
  data_bag_item.data_bag("sudoing_admins")
78
+
79
+ # Random IV is used each time the data bag item is encrypted, so values
80
+ # will not be equal if we re-encrypt.
81
+ Chef::EncryptedDataBagItem.should_receive(:encrypt_data_bag_item).and_return(@enc_data)
82
+
78
83
  @rest.should_receive(:post_rest).with("data", {'name' => 'sudoing_admins'}).ordered
79
84
  @rest.should_receive(:post_rest).with("data/sudoing_admins", data_bag_item).ordered
85
+
86
+ @secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
87
+ @secret_file.puts(@secret)
88
+ @secret_file.flush
89
+ end
90
+
91
+ after do
92
+ @secret_file.close
93
+ @secret_file.unlink
80
94
  end
81
95
 
82
96
  it "creates an encrypted data bag item via --secret" do
@@ -59,6 +59,19 @@ describe Chef::Knife::DataBagEdit do
59
59
  @enc_edited_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@edited_data,
60
60
  @secret)
61
61
  Chef::DataBagItem.stub!(:load).with('bag_name', 'item_name').and_return(@enc_data)
62
+
63
+ # Random IV is used each time the data bag item is encrypted, so values
64
+ # will not be equal if we encrypt same value twice.
65
+ Chef::EncryptedDataBagItem.should_receive(:encrypt_data_bag_item).and_return(@enc_edited_data)
66
+
67
+ @secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
68
+ @secret_file.puts(@secret)
69
+ @secret_file.flush
70
+ end
71
+
72
+ after do
73
+ @secret_file.close
74
+ @secret_file.unlink
62
75
  end
63
76
 
64
77
  it "decrypts and encrypts via --secret" do
@@ -70,10 +83,7 @@ describe Chef::Knife::DataBagEdit do
70
83
  end
71
84
 
72
85
  it "decrypts and encrypts via --secret_file" do
73
- secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
74
- secret_file.puts(@secret)
75
- secret_file.flush
76
- @knife.stub!(:config).and_return({:secret_file => secret_file.path})
86
+ @knife.stub!(:config).and_return({:secret_file => @secret_file.path})
77
87
  @knife.should_receive(:edit_data).with(@plain_data).and_return(@edited_data)
78
88
  @rest.should_receive(:put_rest).with("data/bag_name/item_name", @enc_edited_data).ordered
79
89
 
@@ -142,6 +142,19 @@ describe Chef::Knife::DataBagFromFile do
142
142
  @secret = "abc123SECRET"
143
143
  @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
144
144
  @secret)
145
+
146
+ # Random IV is used each time the data bag item is encrypted, so values
147
+ # will not be equal if we re-encrypt.
148
+ Chef::EncryptedDataBagItem.should_receive(:encrypt_data_bag_item).and_return(@enc_data)
149
+
150
+ @secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
151
+ @secret_file.puts(@secret)
152
+ @secret_file.flush
153
+ end
154
+
155
+ after do
156
+ @secret_file.close
157
+ @secret_file.unlink
145
158
  end
146
159
 
147
160
  it "encrypts values when given --secret" do
@@ -157,10 +170,7 @@ describe Chef::Knife::DataBagFromFile do
157
170
  end
158
171
 
159
172
  it "encrypts values when given --secret_file" do
160
- secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
161
- secret_file.puts(@secret)
162
- secret_file.flush
163
- @knife.stub!(:config).and_return({:secret_file => secret_file.path})
173
+ @knife.stub!(:config).and_return({:secret_file => @secret_file.path})
164
174
 
165
175
  @knife.loader.stub!(:load_from).with("data_bags", 'bag_name', @db_file.path).and_return(@plain_data)
166
176
  dbag = Chef::DataBagItem.new
@@ -177,7 +187,9 @@ describe Chef::Knife::DataBagFromFile do
177
187
  it "prints help if given no arguments" do
178
188
  @knife.instance_variable_set(:@name_args, [])
179
189
  lambda { @knife.run }.should raise_error(SystemExit)
180
- @stdout.string.should match(/^knife data bag from file BAG FILE|FOLDER [FILE|FOLDER..] \(options\)/)
190
+ help_text = "knife data bag from file BAG FILE|FOLDER [FILE|FOLDER..] (options)"
191
+ help_text_regex = Regexp.new("^#{Regexp.escape(help_text)}")
192
+ @stdout.string.should match(help_text_regex)
181
193
  end
182
194
  end
183
195
 
@@ -57,6 +57,7 @@ describe Chef::Knife::DataBagShow do
57
57
 
58
58
  @knife.run
59
59
  Chef::JSONCompat.from_json(@stdout.string).should == data_item.raw_data
60
+
60
61
  end
61
62
 
62
63
  describe "encrypted data bag items" do
@@ -70,6 +71,15 @@ describe Chef::Knife::DataBagShow do
70
71
  @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
71
72
  @secret)
72
73
  @knife.instance_variable_set(:@name_args, ['bag_name', 'item_name'])
74
+
75
+ @secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
76
+ @secret_file.puts(@secret)
77
+ @secret_file.flush
78
+ end
79
+
80
+ after do
81
+ @secret_file.close
82
+ @secret_file.unlink
73
83
  end
74
84
 
75
85
  it "prints the decrypted contents of an item when given --secret" do
@@ -82,10 +92,7 @@ describe Chef::Knife::DataBagShow do
82
92
  end
83
93
 
84
94
  it "prints the decrypted contents of an item when given --secret_file" do
85
- secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
86
- secret_file.puts(@secret)
87
- secret_file.flush
88
- @knife.stub!(:config).and_return({:secret_file => secret_file.path})
95
+ @knife.stub!(:config).and_return({:secret_file => @secret_file.path})
89
96
  Chef::EncryptedDataBagItem.should_receive(:load).
90
97
  with('bag_name', 'item_name', @secret).
91
98
  and_return(Chef::EncryptedDataBagItem.new(@enc_data, @secret))
@@ -19,47 +19,110 @@
19
19
  require 'spec_helper'
20
20
 
21
21
  describe Chef::Knife::IndexRebuild do
22
- before do
23
- Chef::Config[:node_name] = "webmonkey.example.com"
24
- @knife = Chef::Knife::IndexRebuild.new
25
- @rest_client = mock("Chef::REST (mock)", :post_rest => { :result => :true })
26
- @knife.ui.stub!(:output)
27
- @knife.stub!(:rest).and_return(@rest_client)
28
-
29
- @out = StringIO.new
30
- @knife.ui.stub!(:stdout).and_return(@out)
31
- end
32
22
 
33
- it "asks a yes/no confirmation and aborts on 'no'" do
34
- @knife.ui.stub!(:stdin).and_return(StringIO.new("NO\n"))
35
- @knife.should_receive(:puts)
36
- @knife.should_receive(:exit).with(7)
37
- @knife.run
38
- @out.string.should match(/yes\/no/)
23
+ let(:knife){Chef::Knife::IndexRebuild.new}
24
+ let(:rest_client){mock(Chef::REST)}
25
+
26
+ let(:stub_rest!) do
27
+ knife.should_receive(:rest).and_return(rest_client)
39
28
  end
40
29
 
41
- it "asks a confirmation and continues on 'yes'" do
42
- @knife.ui.stub!(:stdin).and_return(StringIO.new("yes\n"))
43
- @knife.should_not_receive(:exit)
44
- @knife.run
45
- @out.string.should match(/yes\/no/)
30
+ before :each do
31
+ # This keeps the test output clean
32
+ knife.ui.stub!(:stdout).and_return(StringIO.new)
46
33
  end
47
34
 
48
- describe "after confirming the operation" do
49
- before do
50
- @knife.ui.stub!(:print)
51
- @knife.ui.stub!(:puts)
52
- @knife.stub!(:nag)
53
- @knife.ui.stub!(:output)
35
+ context "#grab_api_info" do
36
+ let(:http_not_found_response) do
37
+ e = Net::HTTPNotFound.new("1.1", 404, "blah")
38
+ e.stub(:[]).with("x-ops-api-info").and_return(api_header_value)
39
+ e
40
+ end
41
+
42
+ let(:http_server_exception) do
43
+ Net::HTTPServerException.new("404: Not Found", http_not_found_response)
44
+ end
45
+
46
+ before(:each) do
47
+ stub_rest!
48
+ rest_client.stub(:get_rest).and_raise(http_server_exception)
49
+ end
50
+
51
+ context "against a Chef 11 server" do
52
+ let(:api_header_value){"flavor=osc;version=11.0.0;erchef=1.2.3"}
53
+ it "retrieves API information" do
54
+ knife.grab_api_info.should == {"flavor" => "osc", "version" => "11.0.0", "erchef" => "1.2.3"}
55
+ end
56
+ end # Chef 11
57
+
58
+ context "against a Chef 10 server" do
59
+ let(:api_header_value){nil}
60
+ it "finds no API information" do
61
+ knife.grab_api_info.should == {}
62
+ end
63
+ end # Chef 10
64
+ end # grab_api_info
65
+
66
+ context "#unsupported_version?" do
67
+ context "with Chef 11 API metadata" do
68
+ it "is unsupported" do
69
+ knife.unsupported_version?({"version" => "11.0.0", "flavor" => "osc", "erchef" => "1.2.3"}).should be_true
70
+ end
71
+
72
+ it "only truly relies on the version being non-nil" do
73
+ knife.unsupported_version?({"version" => "1", "flavor" => "osc", "erchef" => "1.2.3"}).should be_true
74
+ end
54
75
  end
55
76
 
56
- it "POSTs to /search/reindex and displays the result" do
57
- @rest_client = mock("Chef::REST")
58
- @knife.stub!(:rest).and_return(@rest_client)
59
- @rest_client.should_receive(:post_rest).with("/search/reindex", {}).and_return("monkey")
60
- @knife.should_receive(:output).with("monkey")
61
- @knife.run
77
+ context "with Chef 10 API metadata" do
78
+ it "is supported" do
79
+ # Chef 10 will have no metadata
80
+ knife.unsupported_version?({}).should be_false
81
+ end
82
+ end
83
+ end # unsupported_version?
84
+
85
+ context "Simulating a 'knife index rebuild' run" do
86
+
87
+ before :each do
88
+ knife.should_receive(:grab_api_info).and_return(api_info)
89
+ server_specific_stubs!
90
+ end
91
+
92
+ context "against a Chef 11 server" do
93
+ let(:api_info) do
94
+ {"flavor" => "osc",
95
+ "version" => "11.0.0",
96
+ "erchef" => "1.2.3"
97
+ }
98
+ end
99
+ let(:server_specific_stubs!) do
100
+ knife.should_receive(:unsupported_server_message).with(api_info)
101
+ knife.should_receive(:exit).with(1)
102
+ end
103
+
104
+ it "should not be allowed" do
105
+ knife.run
106
+ end
107
+ end
108
+
109
+ context "against a Chef 10 server" do
110
+ let(:api_info){ {} }
111
+ let(:server_specific_stubs!) do
112
+ stub_rest!
113
+ rest_client.should_receive(:post_rest).with("/search/reindex", {}).and_return("representative output")
114
+ knife.should_not_receive(:unsupported_server_message)
115
+ knife.should_receive(:deprecated_server_message)
116
+ knife.should_receive(:nag)
117
+ knife.should_receive(:output).with("representative output")
118
+ end
119
+ it "should be allowed" do
120
+ knife.run
121
+ end
62
122
  end
63
123
  end
64
124
 
65
125
  end
126
+
127
+
128
+
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,7 +21,7 @@ require 'spec_helper'
21
21
  describe Chef::Knife::Help do
22
22
  before(:each) do
23
23
  # Perilously use the build in list even though it is dynamic so we don't get warnings about the constant
24
- # HELP_TOPICS = [ "foo", "bar", "knife-kittens", "ceiling-cat", "shef" ]
24
+ # HELP_TOPICS = [ "foo", "bar", "knife-kittens", "ceiling-cat", "shell" ]
25
25
  @knife = Chef::Knife::Help.new
26
26
  end
27
27
 
@@ -30,8 +30,8 @@ describe Chef::Knife::Help do
30
30
  end
31
31
 
32
32
  it "should run man for you" do
33
- @knife.name_args = [ "shef" ]
34
- @knife.should_receive(:exec).with(/^man \/.*\/shef.1$/)
33
+ @knife.name_args = [ "shell" ]
34
+ @knife.should_receive(:exec).with(/^man \/.*\/shell.1$/)
35
35
  @knife.run
36
36
  end
37
37
 
@@ -47,9 +47,9 @@ describe Chef::Knife::Help do
47
47
 
48
48
  describe "find_manpage_path" do
49
49
  it "should find the man page in the gem" do
50
- @knife.find_manpage_path("shef").should =~ /distro\/common\/man\/man1\/shef.1$/
50
+ @knife.find_manpage_path("shell").should =~ /distro\/common\/man\/man1\/chef-shell.1$/
51
51
  end
52
-
52
+
53
53
  it "should provide the man page name if not in the gem" do
54
54
  @knife.find_manpage_path("foo").should == "foo"
55
55
  end
@@ -25,6 +25,7 @@ describe Chef::Knife::NodeRunListRemove do
25
25
  @knife.config[:print_after] = nil
26
26
  @knife.name_args = [ "adam", "role[monkey]" ]
27
27
  @node = Chef::Node.new()
28
+ @node.name("knifetest-node")
28
29
  @node.run_list << "role[monkey]"
29
30
  @node.stub!(:save).and_return(true)
30
31
 
@@ -52,7 +53,7 @@ describe Chef::Knife::NodeRunListRemove do
52
53
 
53
54
  it "should print the run list" do
54
55
  @knife.config[:print_after] = true
55
- @knife.ui.should_receive(:output).with({ 'run_list' => [] })
56
+ @knife.ui.should_receive(:output).with({ "knifetest-node" => { 'run_list' => [] } })
56
57
  @knife.run
57
58
  end
58
59
 
@@ -34,14 +34,14 @@ describe Chef::Knife::Ssh do
34
34
 
35
35
  before do
36
36
  @knife = Chef::Knife::Ssh.new
37
- @knife.config = {}
37
+ @knife.merge_configs
38
38
  @knife.config[:attribute] = "fqdn"
39
- @node_foo = Chef::Node.new('foo')
40
- @node_foo[:fqdn] = "foo.example.org"
41
- @node_foo[:ipaddress] = "10.0.0.1"
42
- @node_bar = Chef::Node.new('bar')
43
- @node_bar[:fqdn] = "bar.example.org"
44
- @node_bar[:ipaddress] = "10.0.0.2"
39
+ @node_foo = Chef::Node.new
40
+ @node_foo.automatic_attrs[:fqdn] = "foo.example.org"
41
+ @node_foo.automatic_attrs[:ipaddress] = "10.0.0.1"
42
+ @node_bar = Chef::Node.new
43
+ @node_bar.automatic_attrs[:fqdn] = "bar.example.org"
44
+ @node_bar.automatic_attrs[:ipaddress] = "10.0.0.2"
45
45
  end
46
46
 
47
47
  describe "#configure_session" do
@@ -64,7 +64,7 @@ describe Chef::Knife::Ssh do
64
64
  @knife.should_receive(:session_from_list).with(['10.0.0.1', '10.0.0.2'])
65
65
  @knife.configure_session
66
66
  end
67
-
67
+
68
68
  it "returns an array of the attributes specified on the command line even when a config value is set" do
69
69
  @knife.config[:attribute] = "config_file" # this value will be the config file
70
70
  @knife.config[:override_attribute] = "ipaddress" # this is the value of the command line via #configure_attribute
@@ -84,10 +84,8 @@ describe Chef::Knife::Ssh do
84
84
 
85
85
  context "when cloud hostnames are available" do
86
86
  before do
87
- @node_foo[:cloud] = Mash.new
88
- @node_bar[:cloud] = Mash.new
89
- @node_foo[:cloud][:public_hostname] = "ec2-10-0-0-1.compute-1.amazonaws.com"
90
- @node_bar[:cloud][:public_hostname] = "ec2-10-0-0-2.compute-1.amazonaws.com"
87
+ @node_foo.automatic_attrs[:cloud][:public_hostname] = "ec2-10-0-0-1.compute-1.amazonaws.com"
88
+ @node_bar.automatic_attrs[:cloud][:public_hostname] = "ec2-10-0-0-2.compute-1.amazonaws.com"
91
89
  end
92
90
 
93
91
  it "returns an array of cloud public hostnames" do
@@ -109,8 +107,8 @@ describe Chef::Knife::Ssh do
109
107
  context "when there are some hosts found but they do not have an attribute to connect with" do
110
108
  before do
111
109
  @query.stub!(:search).and_return([[@node_foo, @node_bar]])
112
- @node_foo[:fqdn] = nil
113
- @node_bar[:fqdn] = nil
110
+ @node_foo.automatic_attrs[:fqdn] = nil
111
+ @node_bar.automatic_attrs[:fqdn] = nil
114
112
  Chef::Search::Query.stub!(:new).and_return(@query)
115
113
  end
116
114
 
@@ -180,5 +178,113 @@ describe Chef::Knife::Ssh do
180
178
  end
181
179
  end
182
180
 
183
- end
181
+ describe "#session_from_list" do
182
+ before :each do
183
+ @knife.instance_variable_set(:@longest, 0)
184
+ ssh_config = {:timeout => 50, :user => "locutus", :port => 23 }
185
+ Net::SSH.stub!(:configuration_for).with('the.b.org').and_return(ssh_config)
186
+ end
187
+
188
+ it "uses the port from an ssh config file" do
189
+ @knife.session_from_list(['the.b.org'])
190
+ @knife.session.servers[0].port.should == 23
191
+ end
192
+
193
+ it "uses the user from an ssh config file" do
194
+ @knife.session_from_list(['the.b.org'])
195
+ @knife.session.servers[0].user.should == "locutus"
196
+ end
197
+ end
198
+
199
+ describe "#ssh_command" do
200
+ let(:execution_channel) { double(:execution_channel, :on_data => nil) }
201
+ let(:session_channel) { double(:session_channel, :request_pty => nil)}
202
+
203
+ let(:execution_channel2) { double(:execution_channel, :on_data => nil) }
204
+ let(:session_channel2) { double(:session_channel, :request_pty => nil)}
205
+
206
+ let(:session) { double(:session, :loop => nil) }
207
+
208
+ let(:command) { "false" }
209
+
210
+ before do
211
+ execution_channel.
212
+ should_receive(:on_request).
213
+ and_yield(nil, double(:data_stream, :read_long => exit_status))
214
+
215
+ session_channel.
216
+ should_receive(:exec).
217
+ with(command).
218
+ and_yield(execution_channel, true)
219
+
220
+ execution_channel2.
221
+ should_receive(:on_request).
222
+ and_yield(nil, double(:data_stream, :read_long => exit_status2))
223
+
224
+ session_channel2.
225
+ should_receive(:exec).
226
+ with(command).
227
+ and_yield(execution_channel2, true)
228
+
229
+ session.
230
+ should_receive(:open_channel).
231
+ and_yield(session_channel).
232
+ and_yield(session_channel2)
233
+ end
234
+
235
+ context "both connections return 0" do
236
+ let(:exit_status) { 0 }
237
+ let(:exit_status2) { 0 }
238
+
239
+ it "returns a 0 exit code" do
240
+ @knife.ssh_command(command, session).should == 0
241
+ end
242
+ end
243
+
244
+ context "the first connection returns 1 and the second returns 0" do
245
+ let(:exit_status) { 1 }
246
+ let(:exit_status2) { 0 }
247
+
248
+ it "returns a non-zero exit code" do
249
+ @knife.ssh_command(command, session).should == 1
250
+ end
251
+ end
252
+
253
+ context "the first connection returns 1 and the second returns 2" do
254
+ let(:exit_status) { 1 }
255
+ let(:exit_status2) { 2 }
256
+
257
+ it "returns a non-zero exit code" do
258
+ @knife.ssh_command(command, session).should == 2
259
+ end
260
+ end
261
+ end
262
+
263
+ describe "#run" do
264
+ before do
265
+ @query = Chef::Search::Query.new
266
+ @query.should_receive(:search).and_return([[@node_foo]])
267
+ Chef::Search::Query.stub!(:new).and_return(@query)
268
+ @knife.stub(:ssh_command).and_return(exit_code)
269
+ @knife.name_args = ['*:*', 'false']
270
+ end
271
+
272
+ context "with an error" do
273
+ let(:exit_code) { 1 }
274
+
275
+ it "should exit with a non-zero exit code" do
276
+ @knife.should_receive(:exit).with(exit_code)
277
+ @knife.run
278
+ end
279
+ end
184
280
 
281
+ context "with no error" do
282
+ let(:exit_code) { 0 }
283
+
284
+ it "should not exit" do
285
+ @knife.should_not_receive(:exit)
286
+ @knife.run
287
+ end
288
+ end
289
+ end
290
+ end