chef 11.4.4 → 11.6.0.hotfix.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (504) hide show
  1. data/README.md +1 -1
  2. data/Rakefile +18 -1
  3. data/bin/chef-service-manager +37 -0
  4. data/distro/common/html/chef-client.8.html +4 -4
  5. data/distro/common/html/chef-expander.8.html +4 -4
  6. data/distro/common/html/chef-expanderctl.8.html +4 -4
  7. data/distro/common/html/chef-server-webui.8.html +4 -4
  8. data/distro/common/html/chef-server.8.html +4 -4
  9. data/distro/common/html/chef-shell.1.html +4 -4
  10. data/distro/common/html/chef-solo.8.html +12 -18
  11. data/distro/common/html/chef-solr.8.html +4 -4
  12. data/distro/common/html/knife-bootstrap.1.html +4 -4
  13. data/distro/common/html/knife-client.1.html +4 -4
  14. data/distro/common/html/knife-configure.1.html +4 -4
  15. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  16. data/distro/common/html/knife-cookbook.1.html +7 -10
  17. data/distro/common/html/knife-data-bag.1.html +7 -10
  18. data/distro/common/html/knife-environment.1.html +6 -8
  19. data/distro/common/html/knife-exec.1.html +4 -4
  20. data/distro/common/html/knife-index.1.html +4 -4
  21. data/distro/common/html/knife-node.1.html +4 -4
  22. data/distro/common/html/knife-role.1.html +4 -4
  23. data/distro/common/html/knife-search.1.html +4 -4
  24. data/distro/common/html/knife-ssh.1.html +4 -4
  25. data/distro/common/html/knife-status.1.html +4 -4
  26. data/distro/common/html/knife-tag.1.html +4 -4
  27. data/distro/common/html/knife.1.html +4 -4
  28. data/distro/common/man/man1/chef-shell.1 +1 -1
  29. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  30. data/distro/common/man/man1/knife-client.1 +1 -1
  31. data/distro/common/man/man1/knife-configure.1 +1 -1
  32. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  33. data/distro/common/man/man1/knife-cookbook.1 +2 -15
  34. data/distro/common/man/man1/knife-data-bag.1 +2 -15
  35. data/distro/common/man/man1/knife-environment.1 +2 -12
  36. data/distro/common/man/man1/knife-exec.1 +1 -1
  37. data/distro/common/man/man1/knife-index.1 +1 -1
  38. data/distro/common/man/man1/knife-node.1 +1 -1
  39. data/distro/common/man/man1/knife-role.1 +1 -1
  40. data/distro/common/man/man1/knife-search.1 +1 -1
  41. data/distro/common/man/man1/knife-ssh.1 +1 -1
  42. data/distro/common/man/man1/knife-status.1 +1 -1
  43. data/distro/common/man/man1/knife-tag.1 +1 -1
  44. data/distro/common/man/man1/knife.1 +1 -1
  45. data/distro/common/man/man8/chef-client.8 +1 -1
  46. data/distro/common/man/man8/chef-expander.8 +1 -1
  47. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  48. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  49. data/distro/common/man/man8/chef-server.8 +1 -1
  50. data/distro/common/man/man8/chef-solo.8 +4 -36
  51. data/distro/common/man/man8/chef-solr.8 +1 -1
  52. data/distro/debian/etc/init.d/chef-client +4 -2
  53. data/distro/windows/service_manager.rb +2 -146
  54. data/lib/chef.rb +1 -1
  55. data/lib/chef/application.rb +5 -12
  56. data/lib/chef/application/apply.rb +2 -0
  57. data/lib/chef/application/client.rb +12 -12
  58. data/lib/chef/application/knife.rb +2 -2
  59. data/lib/chef/application/solo.rb +4 -5
  60. data/lib/chef/application/windows_service.rb +113 -56
  61. data/lib/chef/application/windows_service_manager.rb +179 -0
  62. data/lib/chef/chef_fs.rb +2 -4
  63. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  64. data/lib/chef/chef_fs/command_line.rb +145 -93
  65. data/lib/chef/chef_fs/config.rb +205 -0
  66. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  67. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  68. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  69. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  70. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  71. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  72. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  73. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  74. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  75. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  76. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  77. data/lib/chef/chef_fs/file_system.rb +195 -127
  78. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  79. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  80. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  81. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  82. data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
  83. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  84. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  85. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  86. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  87. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
  88. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
  89. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
  90. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
  91. data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
  92. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  94. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
  95. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
  96. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
  97. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  98. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  99. data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
  100. data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
  101. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  102. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  103. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  104. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  105. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
  106. data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
  107. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
  108. data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
  109. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  110. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  111. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
  112. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
  113. data/lib/chef/chef_fs/knife.rb +68 -29
  114. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  115. data/lib/chef/chef_fs/path_utils.rb +29 -3
  116. data/lib/chef/chef_fs/raw_request.rb +79 -0
  117. data/lib/chef/client.rb +46 -20
  118. data/lib/chef/config.rb +59 -61
  119. data/lib/chef/cookbook/chefignore.rb +2 -1
  120. data/lib/chef/cookbook/synchronizer.rb +8 -6
  121. data/lib/chef/cookbook/syntax_check.rb +17 -2
  122. data/lib/chef/cookbook_uploader.rb +10 -1
  123. data/lib/chef/cookbook_version.rb +0 -109
  124. data/lib/chef/data_bag.rb +15 -6
  125. data/lib/chef/deprecation/mixin/template.rb +49 -0
  126. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  127. data/lib/chef/deprecation/provider/file.rb +197 -0
  128. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  129. data/lib/chef/deprecation/provider/template.rb +63 -0
  130. data/lib/chef/deprecation/warnings.rb +38 -0
  131. data/lib/chef/encrypted_data_bag_item.rb +153 -61
  132. data/lib/chef/environment.rb +34 -3
  133. data/lib/chef/event_dispatch/base.rb +3 -0
  134. data/lib/chef/exceptions.rb +27 -2
  135. data/lib/chef/file_access_control/unix.rb +64 -7
  136. data/lib/chef/file_access_control/windows.rb +22 -11
  137. data/lib/chef/file_content_management/content_base.rb +56 -0
  138. data/lib/chef/file_content_management/deploy.rb +38 -0
  139. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  140. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  141. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  142. data/lib/chef/file_content_management/tempfile.rb +61 -0
  143. data/lib/chef/formatters/doc.rb +1 -1
  144. data/lib/chef/formatters/error_descriptor.rb +5 -4
  145. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  146. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
  147. data/lib/chef/json_compat.rb +3 -0
  148. data/lib/chef/knife.rb +12 -3
  149. data/lib/chef/knife/bootstrap.rb +46 -2
  150. data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
  151. data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
  152. data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
  153. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
  154. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
  155. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
  156. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
  157. data/lib/chef/knife/client_show.rb +2 -5
  158. data/lib/chef/knife/configure.rb +3 -3
  159. data/lib/chef/knife/cookbook_create.rb +6 -5
  160. data/lib/chef/knife/cookbook_download.rb +13 -5
  161. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  162. data/lib/chef/knife/cookbook_test.rb +1 -0
  163. data/lib/chef/knife/cookbook_upload.rb +4 -9
  164. data/lib/chef/knife/core/bootstrap_context.rb +10 -4
  165. data/lib/chef/knife/core/generic_presenter.rb +16 -0
  166. data/lib/chef/knife/core/node_editor.rb +1 -1
  167. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  168. data/lib/chef/knife/core/ui.rb +19 -4
  169. data/lib/chef/knife/delete.rb +76 -9
  170. data/lib/chef/knife/deps.rb +139 -0
  171. data/lib/chef/knife/diff.rb +22 -5
  172. data/lib/chef/knife/download.rb +16 -3
  173. data/lib/chef/knife/edit.rb +76 -0
  174. data/lib/chef/knife/environment_show.rb +2 -7
  175. data/lib/chef/knife/list.rb +91 -47
  176. data/lib/chef/knife/node_run_list_set.rb +66 -0
  177. data/lib/chef/knife/node_show.rb +1 -7
  178. data/lib/chef/knife/raw.rb +20 -64
  179. data/lib/chef/knife/role_show.rb +2 -4
  180. data/lib/chef/knife/search.rb +5 -6
  181. data/lib/chef/knife/show.rb +34 -11
  182. data/lib/chef/knife/ssh.rb +8 -0
  183. data/lib/chef/knife/upload.rb +23 -4
  184. data/lib/chef/knife/user_show.rb +2 -5
  185. data/lib/chef/knife/xargs.rb +265 -0
  186. data/lib/chef/log.rb +2 -2
  187. data/lib/chef/mixin/file_class.rb +0 -9
  188. data/lib/chef/mixin/language_include_recipe.rb +1 -1
  189. data/lib/chef/mixin/params_validate.rb +19 -9
  190. data/lib/chef/mixin/template.rb +126 -36
  191. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  192. data/lib/chef/monkey_patches/file.rb +26 -0
  193. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  194. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  195. data/lib/chef/monologger.rb +93 -0
  196. data/lib/chef/node.rb +4 -0
  197. data/lib/chef/platform.rb +4 -490
  198. data/lib/chef/platform/provider_mapping.rb +529 -0
  199. data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
  200. data/lib/chef/provider.rb +12 -9
  201. data/lib/chef/provider/batch.rb +35 -0
  202. data/lib/chef/provider/cookbook_file.rb +9 -78
  203. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  204. data/lib/chef/provider/deploy.rb +24 -20
  205. data/lib/chef/provider/deploy/revision.rb +27 -0
  206. data/lib/chef/provider/directory.rb +19 -22
  207. data/lib/chef/provider/execute.rb +22 -5
  208. data/lib/chef/provider/file.rb +299 -217
  209. data/lib/chef/provider/file/content.rb +39 -0
  210. data/lib/chef/provider/git.rb +76 -43
  211. data/lib/chef/provider/group/usermod.rb +2 -2
  212. data/lib/chef/provider/ifconfig.rb +25 -35
  213. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  214. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  215. data/lib/chef/provider/link.rb +10 -3
  216. data/lib/chef/provider/mount.rb +1 -1
  217. data/lib/chef/provider/mount/mount.rb +8 -3
  218. data/lib/chef/provider/mount/windows.rb +4 -1
  219. data/lib/chef/provider/package/portage.rb +9 -4
  220. data/lib/chef/provider/package/rubygems.rb +45 -10
  221. data/lib/chef/provider/package/smartos.rb +47 -36
  222. data/lib/chef/provider/package/yum.rb +19 -12
  223. data/lib/chef/provider/package/zypper.rb +45 -55
  224. data/lib/chef/provider/powershell_script.rb +77 -0
  225. data/lib/chef/provider/remote_directory.rb +5 -6
  226. data/lib/chef/provider/remote_file.rb +12 -108
  227. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  228. data/lib/chef/provider/remote_file/content.rb +75 -0
  229. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  230. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  231. data/lib/chef/provider/remote_file/http.rb +124 -0
  232. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  233. data/lib/chef/provider/route.rb +6 -2
  234. data/lib/chef/provider/script.rb +14 -2
  235. data/lib/chef/provider/service/macosx.rb +16 -10
  236. data/lib/chef/provider/service/solaris.rb +6 -5
  237. data/lib/chef/provider/template.rb +16 -78
  238. data/lib/chef/provider/template/content.rb +61 -0
  239. data/lib/chef/provider/user/solaris.rb +90 -0
  240. data/lib/chef/provider/user/useradd.rb +76 -63
  241. data/lib/chef/provider/windows_script.rb +73 -0
  242. data/lib/chef/providers.rb +16 -0
  243. data/lib/chef/resource.rb +23 -2
  244. data/lib/chef/resource/batch.rb +31 -0
  245. data/lib/chef/resource/conditional.rb +4 -0
  246. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  247. data/lib/chef/resource/file.rb +31 -3
  248. data/lib/chef/resource/link.rb +17 -0
  249. data/lib/chef/resource/lwrp_base.rb +1 -1
  250. data/lib/chef/resource/mount.rb +29 -2
  251. data/lib/chef/resource/powershell_script.rb +31 -0
  252. data/lib/chef/resource/remote_file.rb +47 -1
  253. data/lib/chef/resource/route.rb +1 -1
  254. data/lib/chef/resource/template.rb +145 -0
  255. data/lib/chef/resource/windows_script.rb +62 -0
  256. data/lib/chef/resource_collection.rb +45 -11
  257. data/lib/chef/resource_reporter.rb +81 -52
  258. data/lib/chef/resources.rb +2 -0
  259. data/lib/chef/rest.rb +13 -4
  260. data/lib/chef/rest/rest_request.rb +5 -1
  261. data/lib/chef/run_context/cookbook_compiler.rb +3 -3
  262. data/lib/chef/run_list/run_list_expansion.rb +1 -1
  263. data/lib/chef/run_lock.rb +7 -1
  264. data/lib/chef/runner.rb +0 -1
  265. data/lib/chef/scan_access_control.rb +6 -1
  266. data/lib/chef/search/query.rb +2 -2
  267. data/lib/chef/shell/shell_session.rb +2 -2
  268. data/lib/chef/util/backup.rb +84 -0
  269. data/lib/chef/util/diff.rb +145 -0
  270. data/lib/chef/util/file_edit.rb +1 -1
  271. data/lib/chef/util/selinux.rb +100 -0
  272. data/lib/chef/util/windows/net_user.rb +14 -1
  273. data/lib/chef/util/windows/volume.rb +2 -2
  274. data/lib/chef/version.rb +1 -1
  275. data/lib/chef/version/platform.rb +42 -0
  276. data/lib/chef/version_class.rb +1 -1
  277. data/lib/chef/version_constraint.rb +6 -5
  278. data/lib/chef/version_constraint/platform.rb +26 -0
  279. data/lib/chef/win32/api/file.rb +8 -2
  280. data/lib/chef/win32/version.rb +25 -8
  281. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  282. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  283. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  284. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  285. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  286. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  287. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  288. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  289. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  290. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  291. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  292. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  293. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  294. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  295. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  296. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  297. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  298. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  299. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  300. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  301. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  302. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  303. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  304. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  305. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  306. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  307. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  308. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  309. data/spec/data/apt/var/www/apt/db/version +4 -0
  310. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  311. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  312. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  313. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  314. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  315. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  316. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  317. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  318. data/spec/data/bootstrap/secret.erb +9 -0
  319. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  320. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  321. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  322. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  323. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  324. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  325. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  326. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  327. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  328. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  329. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  330. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  331. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  332. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  333. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  334. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  335. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  336. data/spec/data/null_config.rb +1 -0
  337. data/spec/data/partial_one.erb +1 -1
  338. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  339. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  340. data/spec/functional/knife/exec_spec.rb +2 -2
  341. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  342. data/spec/functional/resource/batch_spec.rb +64 -0
  343. data/spec/functional/resource/cookbook_file_spec.rb +2 -3
  344. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  345. data/spec/functional/resource/directory_spec.rb +2 -2
  346. data/spec/functional/resource/file_spec.rb +17 -1
  347. data/spec/functional/resource/git_spec.rb +259 -0
  348. data/spec/functional/resource/link_spec.rb +422 -388
  349. data/spec/functional/resource/package_spec.rb +297 -0
  350. data/spec/functional/resource/powershell_spec.rb +188 -0
  351. data/spec/functional/resource/registry_spec.rb +8 -4
  352. data/spec/functional/resource/remote_directory_spec.rb +2 -2
  353. data/spec/functional/resource/remote_file_spec.rb +97 -29
  354. data/spec/functional/resource/template_spec.rb +173 -17
  355. data/spec/functional/resource/user_spec.rb +547 -0
  356. data/spec/functional/run_lock_spec.rb +5 -0
  357. data/spec/functional/shell_spec.rb +2 -1
  358. data/spec/functional/win32/service_manager_spec.rb +269 -0
  359. data/spec/functional/win32/versions_spec.rb +78 -0
  360. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  361. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  362. data/spec/integration/knife/chefignore_spec.rb +271 -0
  363. data/spec/integration/knife/delete_spec.rb +944 -0
  364. data/spec/integration/knife/deps_spec.rb +648 -0
  365. data/spec/integration/knife/diff_spec.rb +536 -0
  366. data/spec/integration/knife/download_spec.rb +962 -0
  367. data/spec/integration/knife/list_spec.rb +633 -0
  368. data/spec/integration/knife/raw_spec.rb +166 -0
  369. data/spec/integration/knife/redirection_spec.rb +57 -0
  370. data/spec/integration/knife/show_spec.rb +158 -0
  371. data/spec/integration/knife/upload_spec.rb +1060 -0
  372. data/spec/integration/solo/solo_spec.rb +41 -0
  373. data/spec/spec_helper.rb +55 -1
  374. data/spec/support/chef_helpers.rb +32 -0
  375. data/spec/support/platform_helpers.rb +40 -0
  376. data/spec/support/platforms/win32/spec_service.rb +59 -0
  377. data/spec/support/shared/functional/directory_resource.rb +43 -16
  378. data/spec/support/shared/functional/file_resource.rb +661 -20
  379. data/spec/support/shared/functional/securable_resource.rb +109 -8
  380. data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
  381. data/spec/support/shared/integration/integration_helper.rb +166 -0
  382. data/spec/support/shared/integration/knife_support.rb +171 -0
  383. data/spec/support/shared/unit/execute_resource.rb +125 -0
  384. data/spec/support/shared/unit/file_system_support.rb +8 -48
  385. data/spec/support/shared/unit/provider/file.rb +609 -0
  386. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  387. data/spec/support/shared/unit/script_resource.rb +52 -0
  388. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  389. data/spec/tiny_server.rb +13 -11
  390. data/spec/unit/application/client_spec.rb +39 -1
  391. data/spec/unit/application/knife_spec.rb +12 -0
  392. data/spec/unit/application/solo_spec.rb +1 -1
  393. data/spec/unit/application_spec.rb +57 -2
  394. data/spec/unit/chef_fs/diff_spec.rb +30 -31
  395. data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
  396. data/spec/unit/chef_fs/file_system_spec.rb +2 -3
  397. data/spec/unit/client_spec.rb +20 -1
  398. data/spec/unit/config_spec.rb +70 -52
  399. data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
  400. data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
  401. data/spec/unit/cookbook_loader_spec.rb +3 -2
  402. data/spec/unit/daemon_spec.rb +7 -7
  403. data/spec/unit/data_bag_spec.rb +7 -0
  404. data/spec/unit/deprecation_spec.rb +86 -0
  405. data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
  406. data/spec/unit/environment_spec.rb +98 -0
  407. data/spec/unit/exceptions_spec.rb +6 -1
  408. data/spec/unit/file_access_control_spec.rb +21 -1
  409. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  410. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  411. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  412. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  413. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
  414. data/spec/unit/knife/bootstrap_spec.rb +128 -29
  415. data/spec/unit/knife/configure_spec.rb +42 -26
  416. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  417. data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
  418. data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
  419. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  420. data/spec/unit/knife/core/ui_spec.rb +41 -0
  421. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  422. data/spec/unit/knife_spec.rb +21 -0
  423. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
  424. data/spec/unit/mixin/params_validate_spec.rb +35 -0
  425. data/spec/unit/mixin/template_spec.rb +69 -57
  426. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  427. data/spec/unit/node_spec.rb +7 -0
  428. data/spec/unit/platform_spec.rb +15 -1
  429. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  430. data/spec/unit/provider/cookbook_file_spec.rb +26 -183
  431. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  432. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  433. data/spec/unit/provider/deploy_spec.rb +2 -2
  434. data/spec/unit/provider/directory_spec.rb +23 -23
  435. data/spec/unit/provider/execute_spec.rb +27 -1
  436. data/spec/unit/provider/file/content_spec.rb +101 -0
  437. data/spec/unit/provider/file_spec.rb +25 -484
  438. data/spec/unit/provider/git_spec.rb +224 -28
  439. data/spec/unit/provider/group/usermod_spec.rb +3 -1
  440. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  441. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  442. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  443. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  444. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  445. data/spec/unit/provider/mount_spec.rb +16 -6
  446. data/spec/unit/provider/package/portage_spec.rb +44 -0
  447. data/spec/unit/provider/package/rubygems_spec.rb +44 -1
  448. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  449. data/spec/unit/provider/package/yum_spec.rb +36 -39
  450. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  451. data/spec/unit/provider/package_spec.rb +0 -4
  452. data/spec/unit/provider/powershell_spec.rb +38 -0
  453. data/spec/unit/provider/remote_directory_spec.rb +0 -4
  454. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  455. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  456. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  457. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  458. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  459. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  460. data/spec/unit/provider/remote_file_spec.rb +33 -295
  461. data/spec/unit/provider/route_spec.rb +25 -9
  462. data/spec/unit/provider/service/macosx_spec.rb +176 -152
  463. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  464. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  465. data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
  466. data/spec/unit/provider/service_spec.rb +3 -3
  467. data/spec/unit/provider/template/content_spec.rb +78 -0
  468. data/spec/unit/provider/template_spec.rb +52 -184
  469. data/spec/unit/provider/user/solaris_spec.rb +80 -0
  470. data/spec/unit/provider/user/useradd_spec.rb +12 -358
  471. data/spec/unit/resource/batch_spec.rb +48 -0
  472. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  473. data/spec/unit/resource/execute_spec.rb +3 -101
  474. data/spec/unit/resource/file_spec.rb +0 -5
  475. data/spec/unit/resource/group_spec.rb +9 -0
  476. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  477. data/spec/unit/resource/link_spec.rb +1 -0
  478. data/spec/unit/resource/mount_spec.rb +37 -0
  479. data/spec/unit/resource/powershell_spec.rb +48 -0
  480. data/spec/unit/resource/remote_file_spec.rb +44 -4
  481. data/spec/unit/resource/route_spec.rb +1 -1
  482. data/spec/unit/resource/script_spec.rb +13 -36
  483. data/spec/unit/resource/template_spec.rb +111 -8
  484. data/spec/unit/resource/user_spec.rb +7 -0
  485. data/spec/unit/resource_collection_spec.rb +61 -32
  486. data/spec/unit/resource_reporter_spec.rb +115 -102
  487. data/spec/unit/resource_spec.rb +170 -1
  488. data/spec/unit/rest/auth_credentials_spec.rb +2 -2
  489. data/spec/unit/rest_spec.rb +6 -2
  490. data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
  491. data/spec/unit/runner_spec.rb +1 -1
  492. data/spec/unit/scan_access_control_spec.rb +4 -2
  493. data/spec/unit/shell/shell_session_spec.rb +15 -2
  494. data/spec/unit/util/backup_spec.rb +149 -0
  495. data/spec/unit/util/diff_spec.rb +596 -0
  496. data/spec/unit/util/selinux_spec.rb +172 -0
  497. data/spec/unit/version/platform_spec.rb +61 -0
  498. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  499. data/spec/unit/version_constraint_spec.rb +5 -0
  500. metadata +233 -10
  501. data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
  502. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
  503. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
  504. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
@@ -19,7 +19,7 @@
19
19
  require 'spec_helper'
20
20
  require 'chef/encrypted_data_bag_item'
21
21
 
22
- module Version1Encryptor
22
+ module Version0Encryptor
23
23
  def self.encrypt_value(plaintext_data, key)
24
24
  data = plaintext_data.to_yaml
25
25
 
@@ -34,205 +34,300 @@ end
34
34
 
35
35
  describe Chef::EncryptedDataBagItem::Encryptor do
36
36
 
37
+ subject(:encryptor) { described_class.new(plaintext_data, key) }
38
+ let(:plaintext_data) { {"foo" => "bar"} }
39
+ let(:key) { "passwd" }
40
+
41
+ it "encrypts to format version 1 by default" do
42
+ encryptor.should be_a_kind_of(Chef::EncryptedDataBagItem::Encryptor::Version1Encryptor)
43
+ end
44
+
37
45
  describe "generating a random IV" do
38
46
  it "generates a new IV for each encryption pass" do
39
- encryptor1 = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
40
- encryptor2 = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
47
+ encryptor2 = Chef::EncryptedDataBagItem::Encryptor.new(plaintext_data, key)
41
48
 
42
49
  # No API in ruby OpenSSL to get the iv it used for the encryption back
43
50
  # out. Instead we test if the encrypted data is the same. If it *is* the
44
51
  # same, we assume the IV was the same each time.
45
- encryptor1.encrypted_data.should_not == encryptor2.encrypted_data
52
+ encryptor.encrypted_data.should_not eq encryptor2.encrypted_data
46
53
  end
47
54
  end
48
55
 
49
56
  describe "when encrypting a non-hash non-array value" do
57
+ let(:plaintext_data) { 5 }
50
58
  it "serializes the value in a de-serializable way" do
51
- encryptor = Chef::EncryptedDataBagItem::Encryptor.new(5, "passwd")
52
- Chef::JSONCompat.from_json(encryptor.serialized_data)["json_wrapper"].should == 5
59
+ Chef::JSONCompat.from_json(subject.serialized_data)["json_wrapper"].should eq 5
53
60
  end
54
61
 
55
62
  end
56
63
 
57
64
  describe "wrapping secret values in an envelope" do
58
65
  it "wraps the encrypted data in an envelope with the iv and version" do
59
- encryptor = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
60
66
  final_data = encryptor.for_encrypted_item
61
- final_data["encrypted_data"].should == encryptor.encrypted_data
62
- final_data["iv"].should == Base64.encode64(encryptor.iv)
63
- final_data["version"].should == 1
64
- final_data["cipher"].should == "aes-256-cbc"
67
+ final_data["encrypted_data"].should eq encryptor.encrypted_data
68
+ final_data["iv"].should eq Base64.encode64(encryptor.iv)
69
+ final_data["version"].should eq 1
70
+ final_data["cipher"].should eq"aes-256-cbc"
71
+ end
72
+ end
73
+
74
+ describe "when using version 2 format" do
75
+
76
+ before do
77
+ @original_config = Chef::Config.hash_dup
78
+ Chef::Config[:data_bag_encrypt_version] = 2
65
79
  end
66
80
 
81
+ after do
82
+ Chef::Config.configuration = @original_config
83
+ end
84
+
85
+ it "creates a version 2 encryptor" do
86
+ encryptor.should be_a_kind_of(Chef::EncryptedDataBagItem::Encryptor::Version2Encryptor)
87
+ end
88
+
89
+ it "generates an hmac based on ciphertext including iv" do
90
+ encryptor2 = Chef::EncryptedDataBagItem::Encryptor.new(plaintext_data, key)
91
+ encryptor.hmac.should_not eq(encryptor2.hmac)
92
+ end
93
+
94
+ it "includes the hmac in the envelope" do
95
+ final_data = encryptor.for_encrypted_item
96
+ final_data["hmac"].should eq(encryptor.hmac)
97
+ end
67
98
  end
68
99
 
69
100
  end
70
101
 
71
102
  describe Chef::EncryptedDataBagItem::Decryptor do
103
+
104
+ subject(:decryptor) { described_class.for(encrypted_value, decryption_key) }
105
+ let(:plaintext_data) { {"foo" => "bar"} }
106
+ let(:encryption_key) { "passwd" }
107
+ let(:decryption_key) { encryption_key }
108
+
109
+ context "when decrypting a version 2 (JSON+aes-256-cbc+hmac-sha256+random iv) encrypted value" do
110
+ let(:encrypted_value) do
111
+ Chef::EncryptedDataBagItem::Encryptor::Version2Encryptor.new(plaintext_data, encryption_key).for_encrypted_item
112
+ end
113
+
114
+ let(:bogus_hmac) do
115
+ digest = OpenSSL::Digest::Digest.new("sha256")
116
+ raw_hmac = OpenSSL::HMAC.digest(digest, "WRONG", encrypted_value["encrypted_data"])
117
+ Base64.encode64(raw_hmac)
118
+ end
119
+
120
+ it "rejects the data if the hmac is wrong" do
121
+ encrypted_value["hmac"] = bogus_hmac
122
+ lambda { decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::DecryptionFailure)
123
+ end
124
+
125
+ it "rejects the data if the hmac is missing" do
126
+ encrypted_value.delete("hmac")
127
+ lambda { decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::DecryptionFailure)
128
+ end
129
+
130
+ end
131
+
72
132
  context "when decrypting a version 1 (JSON+aes-256-cbc+random iv) encrypted value" do
73
- before do
74
- @encryptor = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
75
- @encrypted_value = @encryptor.for_encrypted_item
76
133
 
77
- @decryptor = Chef::EncryptedDataBagItem::Decryptor.for(@encrypted_value, "passwd")
134
+ let(:encrypted_value) do
135
+ Chef::EncryptedDataBagItem::Encryptor.new(plaintext_data, encryption_key).for_encrypted_item
78
136
  end
79
137
 
80
138
  it "selects the correct strategy for version 1" do
81
- @decryptor.should be_a_kind_of Chef::EncryptedDataBagItem::Decryptor::Version1Decryptor
139
+ decryptor.should be_a_kind_of Chef::EncryptedDataBagItem::Decryptor::Version1Decryptor
82
140
  end
83
141
 
84
142
  it "decrypts the encrypted value" do
85
- @decryptor.decrypted_data.should == {"json_wrapper" => {"foo" => "bar"}}.to_json
143
+ decryptor.decrypted_data.should eq({"json_wrapper" => plaintext_data}.to_json)
86
144
  end
87
145
 
88
146
  it "unwraps the encrypted data and returns it" do
89
- @decryptor.for_decrypted_item.should == {"foo" => "bar"}
147
+ decryptor.for_decrypted_item.should eq plaintext_data
90
148
  end
91
149
 
92
- context "and the provided key is incorrect" do
93
- before do
94
- @decryptor = Chef::EncryptedDataBagItem::Decryptor.for(@encrypted_value, "wrong-passwd")
150
+ describe "and the decryption step returns invalid data" do
151
+ it "raises a decryption failure error" do
152
+ # Over a large number of tests on a variety of systems, we occasionally
153
+ # see the decryption step "succeed" but return invalid data (e.g., not
154
+ # the original plain text) [CHEF-3858]
155
+ decryptor.should_receive(:decrypted_data).and_return("lksajdf")
156
+ lambda { decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::DecryptionFailure)
95
157
  end
158
+ end
159
+
160
+ context "and the provided key is incorrect" do
161
+ let(:decryption_key) { "wrong-passwd" }
96
162
 
97
163
  it "raises a sensible error" do
98
- lambda { @decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::DecryptionFailure)
164
+ lambda { decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::DecryptionFailure)
99
165
  end
100
166
  end
101
167
 
102
168
  context "and the cipher is not supported" do
103
- before do
104
- @encrypted_value["cipher"] = "aes-256-foo"
169
+ let(:encrypted_value) do
170
+ ev = Chef::EncryptedDataBagItem::Encryptor.new(plaintext_data, encryption_key).for_encrypted_item
171
+ ev["cipher"] = "aes-256-foo"
172
+ ev
105
173
  end
106
174
 
107
175
  it "raises a sensible error" do
108
- lambda { @decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::UnsupportedCipher)
176
+ lambda { decryptor.for_decrypted_item }.should raise_error(Chef::EncryptedDataBagItem::UnsupportedCipher)
177
+ end
178
+ end
179
+
180
+ context "and version 2 format is required" do
181
+ before do
182
+ @original_config = Chef::Config.hash_dup
183
+ Chef::Config[:data_bag_decrypt_minimum_version] = 2
184
+ end
185
+
186
+ after do
187
+ Chef::Config.configuration = @original_config
188
+ end
189
+
190
+ it "raises an error attempting to decrypt" do
191
+ lambda { decryptor }.should raise_error(Chef::EncryptedDataBagItem::UnacceptableEncryptedDataBagItemFormat)
109
192
  end
193
+
110
194
  end
111
195
 
112
196
  end
113
197
 
114
198
  context "when decrypting a version 0 (YAML+aes-256-cbc+no iv) encrypted value" do
115
- before do
116
- @encrypted_value = Version1Encryptor.encrypt_value({"foo" => "bar"}, "passwd")
117
-
118
- @decryptor = Chef::EncryptedDataBagItem::Decryptor.for(@encrypted_value, "passwd")
199
+ let(:encrypted_value) do
200
+ Version0Encryptor.encrypt_value(plaintext_data, encryption_key)
119
201
  end
120
202
 
121
203
  it "selects the correct strategy for version 0" do
122
- @decryptor.should be_a_kind_of(Chef::EncryptedDataBagItem::Decryptor::Version0Decryptor)
204
+ decryptor.should be_a_kind_of(Chef::EncryptedDataBagItem::Decryptor::Version0Decryptor)
123
205
  end
124
206
 
125
207
  it "decrypts the encrypted value" do
126
- @decryptor.for_decrypted_item.should == {"foo" => "bar"}
208
+ decryptor.for_decrypted_item.should eq plaintext_data
209
+ end
210
+
211
+ context "and version 1 format is required" do
212
+ before do
213
+ @original_config = Chef::Config.hash_dup
214
+ Chef::Config[:data_bag_decrypt_minimum_version] = 1
215
+ end
216
+
217
+ after do
218
+ Chef::Config.configuration = @original_config
219
+ end
220
+
221
+ it "raises an error attempting to decrypt" do
222
+ lambda { decryptor }.should raise_error(Chef::EncryptedDataBagItem::UnacceptableEncryptedDataBagItemFormat)
223
+ end
224
+
127
225
  end
226
+
128
227
  end
129
228
  end
130
229
 
131
230
  describe Chef::EncryptedDataBagItem do
132
- before(:each) do
133
- @secret = "abc123SECRET"
134
- @plain_data = {
231
+ subject { described_class }
232
+ let(:encrypted_data_bag_item) { subject.new(encoded_data, secret) }
233
+ let(:plaintext_data) {{
135
234
  "id" => "item_name",
136
235
  "greeting" => "hello",
137
236
  "nested" => { "a1" => [1, 2, 3], "a2" => { "b1" => true }}
138
- }
139
- @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
140
- @secret)
141
- end
142
-
237
+ }}
238
+ let(:secret) { "abc123SECRET" }
239
+ let(:encoded_data) { subject.encrypt_data_bag_item(plaintext_data, secret) }
143
240
 
144
241
  describe "encrypting" do
145
242
 
146
- it "should not encrypt the 'id' key" do
147
- @enc_data["id"].should == "item_name"
243
+ it "doesn't encrypt the 'id' key" do
244
+ encoded_data["id"].should eq "item_name"
148
245
  end
149
246
 
150
- it "should encrypt non-collection objects" do
151
- @enc_data["greeting"]["version"].should == 1
152
- @enc_data["greeting"].should have_key("iv")
247
+ it "encrypts non-collection objects" do
248
+ encoded_data["greeting"]["version"].should eq 1
249
+ encoded_data["greeting"].should have_key("iv")
153
250
 
154
- iv = @enc_data["greeting"]["iv"]
155
- encryptor = Chef::EncryptedDataBagItem::Encryptor.new("hello", @secret, iv)
251
+ iv = encoded_data["greeting"]["iv"]
252
+ encryptor = Chef::EncryptedDataBagItem::Encryptor.new("hello", secret, iv)
156
253
 
157
- @enc_data["greeting"]["encrypted_data"].should == encryptor.for_encrypted_item["encrypted_data"]
254
+ encoded_data["greeting"]["encrypted_data"].should eq(encryptor.for_encrypted_item["encrypted_data"])
158
255
  end
159
256
 
160
- it "should encrypt nested values" do
161
- @enc_data["nested"]["version"].should == 1
162
- @enc_data["nested"].should have_key("iv")
257
+ it "encrypts nested values" do
258
+ encoded_data["nested"]["version"].should eq 1
259
+ encoded_data["nested"].should have_key("iv")
163
260
 
164
- iv = @enc_data["nested"]["iv"]
165
- encryptor = Chef::EncryptedDataBagItem::Encryptor.new(@plain_data["nested"], @secret, iv)
261
+ iv = encoded_data["nested"]["iv"]
262
+ encryptor = Chef::EncryptedDataBagItem::Encryptor.new(plaintext_data["nested"], secret, iv)
166
263
 
167
- @enc_data["nested"]["encrypted_data"].should == encryptor.for_encrypted_item["encrypted_data"]
264
+ encoded_data["nested"]["encrypted_data"].should eq(encryptor.for_encrypted_item["encrypted_data"])
168
265
  end
169
266
 
170
267
  end
171
268
 
172
269
  describe "decrypting" do
173
- before(:each) do
174
- @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
175
- @secret)
176
- @eh = Chef::EncryptedDataBagItem.new(@enc_data, @secret)
177
- end
178
270
 
179
271
  it "doesn't try to decrypt 'id'" do
180
- @eh["id"].should == @plain_data["id"]
272
+ encrypted_data_bag_item["id"].should eq(plaintext_data["id"])
181
273
  end
182
274
 
183
275
  it "decrypts 'greeting'" do
184
- @eh["greeting"].should == @plain_data["greeting"]
276
+ encrypted_data_bag_item["greeting"].should eq(plaintext_data["greeting"])
185
277
  end
186
278
 
187
279
  it "decrypts 'nested'" do
188
- @eh["nested"].should == @plain_data["nested"]
280
+ encrypted_data_bag_item["nested"].should eq(plaintext_data["nested"])
189
281
  end
190
282
 
191
283
  it "decrypts everyting via to_hash" do
192
- @eh.to_hash.should == @plain_data
284
+ encrypted_data_bag_item.to_hash.should eq(plaintext_data)
193
285
  end
194
286
 
195
287
  it "handles missing keys gracefully" do
196
- @eh["no-such-key"].should be_nil
288
+ encrypted_data_bag_item["no-such-key"].should be_nil
197
289
  end
198
290
  end
199
291
 
200
292
  describe "loading" do
201
293
  it "should defer to Chef::DataBagItem.load" do
202
- Chef::DataBagItem.stub(:load).with(:the_bag, "my_codes").and_return(@enc_data)
203
- edbi = Chef::EncryptedDataBagItem.load(:the_bag, "my_codes", @secret)
204
- edbi["greeting"].should == @plain_data["greeting"]
294
+ Chef::DataBagItem.stub(:load).with(:the_bag, "my_codes").and_return(encoded_data)
295
+ edbi = Chef::EncryptedDataBagItem.load(:the_bag, "my_codes", secret)
296
+ edbi["greeting"].should eq(plaintext_data["greeting"])
205
297
  end
206
298
  end
207
299
 
208
- describe "load_secret" do
209
- it "should read from the default path" do
210
- default_path = "/etc/chef/encrypted_data_bag_secret"
211
- ::File.stub(:exists?).with(default_path).and_return(true)
212
- IO.stub(:read).with(default_path).and_return("opensesame")
213
- Chef::EncryptedDataBagItem.load_secret().should == "opensesame"
300
+ describe ".load_secret" do
301
+ subject(:loaded_secret) { Chef::EncryptedDataBagItem.load_secret(path) }
302
+ let(:path) { "/var/mysecret" }
303
+ let(:secret) { "opensesame" }
304
+ let(:stubbed_path) { path }
305
+ before do
306
+ ::File.stub(:exist?).with(stubbed_path).and_return(true)
307
+ IO.stub(:read).with(stubbed_path).and_return(secret)
308
+ Kernel.stub(:open).with(path).and_return(StringIO.new(secret))
214
309
  end
215
310
 
216
- it "should read from Chef::Config[:encrypted_data_bag_secret]" do
217
- path = "/var/mysecret"
218
- Chef::Config[:encrypted_data_bag_secret] = path
219
- ::File.stub(:exists?).with(path).and_return(true)
220
- IO.stub(:read).with(path).and_return("opensesame")
221
- Chef::EncryptedDataBagItem.load_secret().should == "opensesame"
311
+ it "reads from a specified path" do
312
+ loaded_secret.should eq secret
222
313
  end
223
314
 
224
- it "should read from a specified path" do
225
- path = "/var/mysecret"
226
- ::File.stub(:exists?).with(path).and_return(true)
227
- IO.stub(:read).with(path).and_return("opensesame")
228
- Chef::EncryptedDataBagItem.load_secret(path).should == "opensesame"
315
+ context "path argument is nil" do
316
+ let(:path) { nil }
317
+ let(:stubbed_path) { "/etc/chef/encrypted_data_bag_secret" }
318
+
319
+ it "reads from Chef::Config[:encrypted_data_bag_secret]" do
320
+ Chef::Config[:encrypted_data_bag_secret] = stubbed_path
321
+ loaded_secret.should eq secret
322
+ end
229
323
  end
230
324
 
231
- it "should read from a URL" do
232
- path = "http://www.opscode.com/"
233
- fake_file = StringIO.new("opensesame")
234
- Kernel.stub(:open).with(path).and_return(fake_file)
235
- Chef::EncryptedDataBagItem.load_secret(path).should == "opensesame"
325
+ context "path argument is a URL" do
326
+ let(:path) { "http://www.opscode.com/" }
327
+
328
+ it "reads the URL" do
329
+ loaded_secret.should eq secret
330
+ end
236
331
  end
237
332
  end
238
333
  end
@@ -2,6 +2,7 @@
2
2
  # Author:: Stephen Delano (<stephen@ospcode.com>)
3
3
  # Author:: Seth Falcon (<seth@ospcode.com>)
4
4
  # Author:: John Keiser (<jkeiser@ospcode.com>)
5
+ # Author:: Kyle Goodwin (<kgoodwin@primerevenue.com>)
5
6
  # Copyright:: Copyright 2010-2011 Opscode, Inc.
6
7
  # License:: Apache License, Version 2.0
7
8
  #
@@ -271,8 +272,27 @@ describe Chef::Environment do
271
272
  Chef::Environment.validate_cookbook_version(Chef::CookbookVersion.new("meta")).should == false
272
273
  Chef::Environment.validate_cookbook_version("= 1.2.3a").should == false
273
274
  Chef::Environment.validate_cookbook_version("= 1").should == false
275
+ Chef::Environment.validate_cookbook_version("= a").should == false
274
276
  Chef::Environment.validate_cookbook_version("= 1.2.3.4").should == false
275
277
  end
278
+
279
+ describe "in solo mode" do
280
+ before do
281
+ Chef::Config[:solo] = true
282
+ end
283
+
284
+ after do
285
+ Chef::Config[:solo] = false
286
+ end
287
+
288
+ it "should raise and exception" do
289
+ lambda {
290
+ Chef::Environment.validate_cookbook_version("= 1.2.3.4")
291
+ }.should raise_error Chef::Exceptions::IllegalVersionConstraint,
292
+ "Environment cookbook version constraints not allowed in chef-solo"
293
+ end
294
+ end
295
+
276
296
  end
277
297
 
278
298
  describe "when updating from a parameter hash" do
@@ -359,4 +379,82 @@ describe Chef::Environment do
359
379
  end
360
380
  end
361
381
 
382
+ describe "when loading" do
383
+ describe "in solo mode" do
384
+ before do
385
+ Chef::Config[:solo] = true
386
+ Chef::Config[:environment_path] = '/var/chef/environments'
387
+ end
388
+
389
+ after do
390
+ Chef::Config[:solo] = false
391
+ end
392
+
393
+ it "should get the environment from the environment_path" do
394
+ File.should_receive(:directory?).with(Chef::Config[:environment_path]).and_return(true)
395
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.json')).and_return(false)
396
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.rb')).exactly(2).times.and_return(true)
397
+ File.should_receive(:readable?).with(File.join(Chef::Config[:environment_path], 'foo.rb')).and_return(true)
398
+ role_dsl="name \"foo\"\ndescription \"desc\"\n"
399
+ IO.should_receive(:read).with(File.join(Chef::Config[:environment_path], 'foo.rb')).and_return(role_dsl)
400
+ Chef::Environment.load('foo')
401
+ end
402
+
403
+ it "should return a Chef::Environment object from JSON" do
404
+ File.should_receive(:directory?).with(Chef::Config[:environment_path]).and_return(true)
405
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.json')).and_return(true)
406
+ environment_hash = {
407
+ "name" => "foo",
408
+ "default_attributes" => {
409
+ "foo" => {
410
+ "bar" => 1
411
+ }
412
+ },
413
+ "json_class" => "Chef::Environment",
414
+ "description" => "desc",
415
+ "chef_type" => "environment"
416
+ }
417
+ IO.should_receive(:read).with(File.join(Chef::Config[:environment_path], 'foo.json')).and_return(JSON.dump(environment_hash))
418
+ environment = Chef::Environment.load('foo')
419
+
420
+ environment.should be_a_kind_of(Chef::Environment)
421
+ environment.name.should == environment_hash['name']
422
+ environment.description.should == environment_hash['description']
423
+ environment.default_attributes.should == environment_hash['default_attributes']
424
+ end
425
+
426
+ it "should return a Chef::Environment object from Ruby DSL" do
427
+ File.should_receive(:directory?).with(Chef::Config[:environment_path]).and_return(true)
428
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.json')).and_return(false)
429
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.rb')).exactly(2).times.and_return(true)
430
+ File.should_receive(:readable?).with(File.join(Chef::Config[:environment_path], 'foo.rb')).and_return(true)
431
+ role_dsl="name \"foo\"\ndescription \"desc\"\n"
432
+ IO.should_receive(:read).with(File.join(Chef::Config[:environment_path], 'foo.rb')).and_return(role_dsl)
433
+ environment = Chef::Environment.load('foo')
434
+
435
+ environment.should be_a_kind_of(Chef::Environment)
436
+ environment.name.should == 'foo'
437
+ environment.description.should == 'desc'
438
+ end
439
+
440
+ it 'should raise an error if the configured environment_path is invalid' do
441
+ File.should_receive(:directory?).with(Chef::Config[:environment_path]).and_return(false)
442
+
443
+ lambda {
444
+ Chef::Environment.load('foo')
445
+ }.should raise_error Chef::Exceptions::InvalidEnvironmentPath, "Environment path '/var/chef/environments' is invalid"
446
+ end
447
+
448
+ it 'should raise an error if the file does not exist' do
449
+ File.should_receive(:directory?).with(Chef::Config[:environment_path]).and_return(true)
450
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.json')).and_return(false)
451
+ File.should_receive(:exists?).with(File.join(Chef::Config[:environment_path], 'foo.rb')).and_return(false)
452
+
453
+ lambda {
454
+ Chef::Environment.load('foo')
455
+ }.should raise_error Chef::Exceptions::EnvironmentNotFound, "Environment 'foo' could not be loaded from disk"
456
+ end
457
+ end
458
+ end
459
+
362
460
  end