chef-dk 0.15.16 → 0.16.28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (331) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -26
  3. data/Gemfile +10 -4
  4. data/Gemfile.lock +73 -64
  5. data/LICENSE +201 -201
  6. data/README.md +2 -1
  7. data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +27 -27
  8. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +288 -288
  9. data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +52 -52
  10. data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -51
  11. data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
  12. data/acceptance/Gemfile +3 -0
  13. data/acceptance/Gemfile.lock +24 -24
  14. data/acceptance/README.md +132 -132
  15. data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
  16. data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
  17. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  18. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  19. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  20. data/acceptance/trivial/.kitchen.yml +7 -7
  21. data/acceptance/trivial/test/integration/chefdk-current-install/inspec/chef_client_spec.rb +5 -5
  22. data/bin/chef +25 -25
  23. data/chef-dk.gemspec +1 -1
  24. data/lib/chef-dk.rb +19 -19
  25. data/lib/chef-dk/authenticated_http.rb +40 -40
  26. data/lib/chef-dk/chef_runner.rb +12 -4
  27. data/lib/chef-dk/command/base.rb +79 -79
  28. data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
  29. data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
  30. data/lib/chef-dk/command/delete_policy.rb +122 -122
  31. data/lib/chef-dk/command/delete_policy_group.rb +122 -122
  32. data/lib/chef-dk/command/diff.rb +316 -316
  33. data/lib/chef-dk/command/env.rb +90 -90
  34. data/lib/chef-dk/command/exec.rb +45 -45
  35. data/lib/chef-dk/command/gem.rb +47 -47
  36. data/lib/chef-dk/command/generator_commands/app.rb +107 -107
  37. data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
  38. data/lib/chef-dk/command/generator_commands/base.rb +3 -0
  39. data/lib/chef-dk/command/generator_commands/build_cookbook.rb +4 -4
  40. data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -0
  41. data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +39 -0
  42. data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +40 -0
  43. data/lib/chef-dk/command/generator_commands/cookbook.rb +63 -8
  44. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  45. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  46. data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -177
  47. data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
  48. data/lib/chef-dk/command/generator_commands/policyfile.rb +127 -127
  49. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  50. data/lib/chef-dk/command/generator_commands/repo.rb +125 -125
  51. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  52. data/lib/chef-dk/command/install.rb +121 -121
  53. data/lib/chef-dk/command/provision.rb +438 -438
  54. data/lib/chef-dk/command/push.rb +118 -118
  55. data/lib/chef-dk/command/push_archive.rb +126 -126
  56. data/lib/chef-dk/command/shell_init.rb +180 -180
  57. data/lib/chef-dk/command/show_policy.rb +165 -165
  58. data/lib/chef-dk/command/undelete.rb +155 -155
  59. data/lib/chef-dk/command/update.rb +148 -148
  60. data/lib/chef-dk/command/verify.rb +31 -26
  61. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  62. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  63. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  64. data/lib/chef-dk/configurable.rb +69 -69
  65. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  66. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  67. data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
  68. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  69. data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
  70. data/lib/chef-dk/exceptions.rb +129 -129
  71. data/lib/chef-dk/helpers.rb +10 -0
  72. data/lib/chef-dk/pager.rb +106 -106
  73. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  74. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
  75. data/lib/chef-dk/policyfile/community_cookbook_source.rb +97 -97
  76. data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
  77. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  78. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  79. data/lib/chef-dk/policyfile/cookbook_sources.rb +22 -22
  80. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +90 -90
  81. data/lib/chef-dk/policyfile/differ.rb +266 -266
  82. data/lib/chef-dk/policyfile/dsl.rb +261 -261
  83. data/lib/chef-dk/policyfile/lister.rb +232 -232
  84. data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
  85. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  86. data/lib/chef-dk/policyfile/reports/install.rb +70 -70
  87. data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
  88. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  89. data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
  90. data/lib/chef-dk/policyfile/storage_config.rb +100 -100
  91. data/lib/chef-dk/policyfile/undo_record.rb +142 -142
  92. data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
  93. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  94. data/lib/chef-dk/policyfile_compiler.rb +419 -419
  95. data/lib/chef-dk/policyfile_lock.rb +552 -552
  96. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  97. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
  98. data/lib/chef-dk/policyfile_services/export_repo.rb +421 -421
  99. data/lib/chef-dk/policyfile_services/install.rb +126 -126
  100. data/lib/chef-dk/policyfile_services/push_archive.rb +204 -204
  101. data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
  102. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
  103. data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
  104. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  105. data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
  106. data/lib/chef-dk/service_exception_inspectors.rb +25 -25
  107. data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
  108. data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
  109. data/lib/chef-dk/service_exceptions.rb +143 -143
  110. data/lib/chef-dk/shell_out.rb +36 -36
  111. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
  112. data/lib/chef-dk/skeletons/code_generator/files/default/{build-cookbook → build_cookbook}/.kitchen.yml +2 -2
  113. data/lib/chef-dk/skeletons/code_generator/files/default/{build-cookbook → build_cookbook}/README.md +11 -11
  114. data/lib/chef-dk/skeletons/code_generator/files/default/{build-cookbook → build_cookbook}/test-fixture-recipe.rb +0 -0
  115. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +102 -102
  116. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  117. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
  118. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +2 -2
  119. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +21 -0
  120. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
  121. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +9 -13
  122. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +5 -5
  123. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
  124. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
  125. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
  126. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +3 -5
  127. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  128. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  129. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  130. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  131. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -24
  132. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  133. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  134. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
  135. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -2
  136. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  137. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +5 -13
  138. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
  139. data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +30 -7
  140. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +12 -14
  141. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
  142. data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
  143. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
  144. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +40 -27
  145. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +67 -67
  146. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +1 -1
  147. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  148. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  149. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  150. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  151. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  152. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  153. data/lib/chef-dk/skeletons/code_generator/templates/default/{build-cookbook → build_cookbook}/Berksfile.erb +0 -0
  154. data/lib/chef-dk/skeletons/code_generator/templates/default/{build-cookbook → build_cookbook}/metadata.rb.erb +1 -1
  155. data/lib/chef-dk/skeletons/code_generator/templates/default/{build-cookbook → build_cookbook}/recipe.rb.erb +1 -1
  156. data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +18 -0
  157. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +2 -5
  158. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +2 -5
  159. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
  160. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  161. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
  162. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
  163. data/lib/chef-dk/ui.rb +58 -58
  164. data/lib/chef-dk/version.rb +1 -1
  165. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
  166. data/omnibus_overrides.rb +3 -3
  167. data/spec/shared/a_file_generator.rb +125 -125
  168. data/spec/shared/a_generated_file.rb +12 -12
  169. data/spec/shared/command_with_ui_object.rb +11 -11
  170. data/spec/shared/fixture_cookbook_checksums.rb +47 -47
  171. data/spec/shared/setup_git_cookbooks.rb +53 -53
  172. data/spec/spec_helper.rb +51 -51
  173. data/spec/test_helpers.rb +84 -84
  174. data/spec/unit/chef_runner_spec.rb +7 -5
  175. data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
  176. data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
  177. data/spec/unit/command/delete_policy_group_spec.rb +207 -207
  178. data/spec/unit/command/delete_policy_spec.rb +207 -207
  179. data/spec/unit/command/diff_spec.rb +312 -312
  180. data/spec/unit/command/env_spec.rb +52 -52
  181. data/spec/unit/command/exec_spec.rb +179 -179
  182. data/spec/unit/command/export_spec.rb +200 -200
  183. data/spec/unit/command/generate_spec.rb +142 -142
  184. data/spec/unit/command/generator_commands/app_spec.rb +5 -8
  185. data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
  186. data/spec/unit/command/generator_commands/base_spec.rb +136 -136
  187. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +9 -9
  188. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -0
  189. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
  190. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
  191. data/spec/unit/command/generator_commands/cookbook_spec.rb +291 -111
  192. data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -229
  193. data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
  194. data/spec/unit/command/generator_commands/policyfile_spec.rb +225 -225
  195. data/spec/unit/command/generator_commands/recipe_spec.rb +36 -34
  196. data/spec/unit/command/generator_commands/template_spec.rb +1 -1
  197. data/spec/unit/command/install_spec.rb +179 -179
  198. data/spec/unit/command/provision_spec.rb +592 -592
  199. data/spec/unit/command/push_archive_spec.rb +153 -153
  200. data/spec/unit/command/push_spec.rb +199 -199
  201. data/spec/unit/command/shell_init_spec.rb +329 -329
  202. data/spec/unit/command/show_policy_spec.rb +235 -235
  203. data/spec/unit/command/undelete_spec.rb +246 -246
  204. data/spec/unit/command/update_spec.rb +275 -275
  205. data/spec/unit/command/verify_spec.rb +0 -1
  206. data/spec/unit/commands_map_spec.rb +57 -57
  207. data/spec/unit/configurable_spec.rb +41 -41
  208. data/spec/unit/cookbook_metadata_spec.rb +98 -98
  209. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  210. data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
  211. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  212. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  213. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  214. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  215. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  216. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  217. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  218. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  219. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  220. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  221. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  222. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  223. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  224. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  225. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  226. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  227. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  228. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  229. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  230. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  231. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  232. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  233. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  234. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  235. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  236. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  237. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  238. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
  239. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  240. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  241. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  242. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  243. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  244. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  245. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  246. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  247. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  248. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  249. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  250. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  251. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  252. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  253. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  254. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  255. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  256. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  257. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  258. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  259. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  260. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  261. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  262. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  263. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  264. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  265. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  266. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  267. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  268. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  269. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  270. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  271. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  272. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  273. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  274. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  275. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  276. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  277. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  278. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  279. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  280. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  281. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  282. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  283. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  284. data/spec/unit/helpers_spec.rb +14 -5
  285. data/spec/unit/pager_spec.rb +119 -119
  286. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  287. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
  288. data/spec/unit/policyfile/community_cookbook_source_spec.rb +84 -84
  289. data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
  290. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +277 -277
  291. data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
  292. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +130 -130
  293. data/spec/unit/policyfile/differ_spec.rb +687 -687
  294. data/spec/unit/policyfile/lister_spec.rb +272 -272
  295. data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
  296. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  297. data/spec/unit/policyfile/reports/install_spec.rb +115 -115
  298. data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
  299. data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
  300. data/spec/unit/policyfile/storage_config_spec.rb +172 -172
  301. data/spec/unit/policyfile/undo_record_spec.rb +260 -260
  302. data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
  303. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  304. data/spec/unit/policyfile_demands_spec.rb +1203 -1203
  305. data/spec/unit/policyfile_evaluation_spec.rb +642 -642
  306. data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
  307. data/spec/unit/policyfile_lock_install_spec.rb +138 -138
  308. data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
  309. data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
  310. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  311. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
  312. data/spec/unit/policyfile_services/export_repo_spec.rb +481 -481
  313. data/spec/unit/policyfile_services/install_spec.rb +211 -211
  314. data/spec/unit/policyfile_services/push_archive_spec.rb +378 -378
  315. data/spec/unit/policyfile_services/push_spec.rb +233 -233
  316. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
  317. data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
  318. data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
  319. data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
  320. data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
  321. data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
  322. data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
  323. data/spec/unit/shell_out_spec.rb +34 -34
  324. data/tasks/bin/bundle-platform +0 -0
  325. data/tasks/bin/bundle-platform.bat +0 -0
  326. data/tasks/bin/create-override-gemfile +0 -0
  327. data/version_policy.rb +4 -3
  328. data/warning.txt +9 -9
  329. metadata +23 -10
  330. data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +0 -8
  331. data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +0 -9
@@ -1,93 +1,93 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'spec_helper'
19
- require 'chef-dk/policyfile/chef_repo_cookbook_source'
20
-
21
- describe ChefDK::Policyfile::ChefRepoCookbookSource do
22
-
23
- let(:repo_path) {
24
- File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root)
25
- }
26
-
27
- let(:cookbook_source) { ChefDK::Policyfile::ChefRepoCookbookSource.new(repo_path) }
28
-
29
- let(:local_repo_universe) {
30
- {
31
- "another-local-cookbook"=>{
32
- "0.1.0"=>[],
33
- },
34
- "local-cookbook"=>{
35
- "2.3.4"=>[],
36
- },
37
- "cookbook-with-a-dep"=>{
38
- "9.9.9"=>[["another-local-cookbook", "~> 0.1"]],
39
- },
40
- "noignore"=>{
41
- "0.1.0"=>[],
42
- },
43
- }
44
- }
45
-
46
- it "gives the set of arguments to `default_source` used to create it" do
47
- expect(cookbook_source.default_source_args).to eq([:chef_repo, repo_path])
48
- end
49
-
50
- it "fetches the universe graph" do
51
- actual_universe = cookbook_source.universe_graph
52
- expect(actual_universe).to eql(local_repo_universe)
53
- end
54
-
55
- it "generates location options for a cookbook from the given graph" do
56
- expected_opts = { path: File.join(repo_path, "local-cookbook"), version: "2.3.4" }
57
- expect(cookbook_source.source_options_for("local-cookbook", "2.3.4")).to eq(expected_opts)
58
- end
59
-
60
- it "will append a cookbooks directory to the path if it finds it" do
61
- expect(Dir).to receive(:exist?).with("#{repo_path}/cookbooks").and_return(true)
62
- expect(cookbook_source.path).to eql("#{repo_path}/cookbooks")
63
- end
64
-
65
- it "the private setter will append a cookbooks directory to the path if finds it" do
66
- expect(cookbook_source.path).to eql(repo_path)
67
- expect(Dir).to receive(:exist?).with("#{repo_path}/cookbooks").and_return(true)
68
- cookbook_source.send(:path=, repo_path)
69
- expect(cookbook_source.path).to eql("#{repo_path}/cookbooks")
70
- end
71
-
72
- context "when created with a block to set source preferences" do
73
-
74
- subject(:cookbook_source) do
75
- described_class.new(repo_path) do |s|
76
- s.preferred_for "foo", "bar", "baz"
77
- end
78
- end
79
-
80
- it "sets the source preferences as given" do
81
- expect(cookbook_source.preferred_cookbooks).to eq( %w[ foo bar baz ] )
82
- end
83
-
84
- it "is the preferred source for the requested cookbooks" do
85
- expect(cookbook_source.preferred_source_for?("foo")).to be(true)
86
- expect(cookbook_source.preferred_source_for?("bar")).to be(true)
87
- expect(cookbook_source.preferred_source_for?("baz")).to be(true)
88
- expect(cookbook_source.preferred_source_for?("razzledazzle")).to be(false)
89
- end
90
-
91
- end
92
-
93
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'spec_helper'
19
+ require 'chef-dk/policyfile/chef_repo_cookbook_source'
20
+
21
+ describe ChefDK::Policyfile::ChefRepoCookbookSource do
22
+
23
+ let(:repo_path) {
24
+ File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root)
25
+ }
26
+
27
+ let(:cookbook_source) { ChefDK::Policyfile::ChefRepoCookbookSource.new(repo_path) }
28
+
29
+ let(:local_repo_universe) {
30
+ {
31
+ "another-local-cookbook"=>{
32
+ "0.1.0"=>[],
33
+ },
34
+ "local-cookbook"=>{
35
+ "2.3.4"=>[],
36
+ },
37
+ "cookbook-with-a-dep"=>{
38
+ "9.9.9"=>[["another-local-cookbook", "~> 0.1"]],
39
+ },
40
+ "noignore"=>{
41
+ "0.1.0"=>[],
42
+ },
43
+ }
44
+ }
45
+
46
+ it "gives the set of arguments to `default_source` used to create it" do
47
+ expect(cookbook_source.default_source_args).to eq([:chef_repo, repo_path])
48
+ end
49
+
50
+ it "fetches the universe graph" do
51
+ actual_universe = cookbook_source.universe_graph
52
+ expect(actual_universe).to eql(local_repo_universe)
53
+ end
54
+
55
+ it "generates location options for a cookbook from the given graph" do
56
+ expected_opts = { path: File.join(repo_path, "local-cookbook"), version: "2.3.4" }
57
+ expect(cookbook_source.source_options_for("local-cookbook", "2.3.4")).to eq(expected_opts)
58
+ end
59
+
60
+ it "will append a cookbooks directory to the path if it finds it" do
61
+ expect(Dir).to receive(:exist?).with("#{repo_path}/cookbooks").and_return(true)
62
+ expect(cookbook_source.path).to eql("#{repo_path}/cookbooks")
63
+ end
64
+
65
+ it "the private setter will append a cookbooks directory to the path if finds it" do
66
+ expect(cookbook_source.path).to eql(repo_path)
67
+ expect(Dir).to receive(:exist?).with("#{repo_path}/cookbooks").and_return(true)
68
+ cookbook_source.send(:path=, repo_path)
69
+ expect(cookbook_source.path).to eql("#{repo_path}/cookbooks")
70
+ end
71
+
72
+ context "when created with a block to set source preferences" do
73
+
74
+ subject(:cookbook_source) do
75
+ described_class.new(repo_path) do |s|
76
+ s.preferred_for "foo", "bar", "baz"
77
+ end
78
+ end
79
+
80
+ it "sets the source preferences as given" do
81
+ expect(cookbook_source.preferred_cookbooks).to eq( %w[ foo bar baz ] )
82
+ end
83
+
84
+ it "is the preferred source for the requested cookbooks" do
85
+ expect(cookbook_source.preferred_source_for?("foo")).to be(true)
86
+ expect(cookbook_source.preferred_source_for?("bar")).to be(true)
87
+ expect(cookbook_source.preferred_source_for?("baz")).to be(true)
88
+ expect(cookbook_source.preferred_source_for?("razzledazzle")).to be(false)
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -1,34 +1,34 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'spec_helper'
19
-
20
- require 'chef-dk/policyfile/chef_server_cookbook_source'
21
-
22
- describe ChefDK::Policyfile::ChefServerCookbookSource do
23
-
24
- let(:cookbook_source) { ChefDK::Policyfile::ChefServerCookbookSource.new("https://chef.example.com") }
25
-
26
- it "emits a not supported error when attempting to fetch universe" do
27
- expect { cookbook_source.universe_graph }.to raise_error(ChefDK::UnsupportedFeature)
28
- end
29
-
30
- it "emits a not supported error when attempting to get source options for a cookbook" do
31
- expect { cookbook_source.source_options_for("foo", "1.2.3") }.to raise_error(ChefDK::UnsupportedFeature)
32
- end
33
-
34
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'spec_helper'
19
+
20
+ require 'chef-dk/policyfile/chef_server_cookbook_source'
21
+
22
+ describe ChefDK::Policyfile::ChefServerCookbookSource do
23
+
24
+ let(:cookbook_source) { ChefDK::Policyfile::ChefServerCookbookSource.new("https://chef.example.com") }
25
+
26
+ it "emits a not supported error when attempting to fetch universe" do
27
+ expect { cookbook_source.universe_graph }.to raise_error(ChefDK::UnsupportedFeature)
28
+ end
29
+
30
+ it "emits a not supported error when attempting to get source options for a cookbook" do
31
+ expect { cookbook_source.source_options_for("foo", "1.2.3") }.to raise_error(ChefDK::UnsupportedFeature)
32
+ end
33
+
34
+ end
@@ -1,84 +1,84 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'spec_helper'
19
- require 'chef-dk/policyfile/community_cookbook_source'
20
-
21
- describe ChefDK::Policyfile::CommunityCookbookSource do
22
-
23
- subject(:cookbook_source) { ChefDK::Policyfile::CommunityCookbookSource.new }
24
-
25
- let(:default_community_uri) { "https://supermarket.chef.io" }
26
-
27
- let(:http_connection) { double("Chef::HTTP::Simple") }
28
-
29
- let(:universe_response_encoded) { IO.read(File.join(fixtures_path, "cookbooks_api/small_universe.json")) }
30
-
31
- let(:pruned_universe) { JSON.parse(IO.read(File.join(fixtures_path, "cookbooks_api/pruned_small_universe.json"))) }
32
-
33
- it "defaults to using the public supermarket over HTTPS" do
34
- expect(cookbook_source.uri).to eq(default_community_uri)
35
- end
36
-
37
- it "gives the set of arguments to `default_source` used to create it" do
38
- expect(cookbook_source.default_source_args).to eq([:supermarket, default_community_uri])
39
- end
40
-
41
- describe "fetching the Universe graph over HTTP" do
42
-
43
- before do
44
- expect(Chef::HTTP::Simple).to receive(:new).with(default_community_uri).and_return(http_connection)
45
- expect(http_connection).to receive(:get).with("/universe").and_return(universe_response_encoded)
46
- end
47
-
48
- it "fetches the universe graph" do
49
- actual_universe = cookbook_source.universe_graph
50
- expect(actual_universe).to have_key("apt")
51
- expect(actual_universe["apt"]).to eq(pruned_universe["apt"])
52
- expect(cookbook_source.universe_graph).to eq(pruned_universe)
53
- end
54
-
55
- it "generates location options for a cookbook from the given graph" do
56
- expected_opts = { artifactserver: "https://supermarket.chef.io/api/v1/cookbooks/apache2/versions/1.10.4/download", version: "1.10.4" }
57
- expect(cookbook_source.source_options_for("apache2", "1.10.4")).to eq(expected_opts)
58
- end
59
-
60
- end
61
-
62
- context "when created with a block to set source preferences" do
63
-
64
- subject(:cookbook_source) do
65
- ChefDK::Policyfile::CommunityCookbookSource.new do |s|
66
- s.preferred_for "foo", "bar", "baz"
67
- end
68
- end
69
-
70
- it "sets the source preferences as given" do
71
- expect(cookbook_source.preferred_cookbooks).to eq( %w[ foo bar baz ] )
72
- end
73
-
74
- it "is the preferred source for the requested cookbooks" do
75
- expect(cookbook_source.preferred_source_for?("foo")).to be(true)
76
- expect(cookbook_source.preferred_source_for?("bar")).to be(true)
77
- expect(cookbook_source.preferred_source_for?("baz")).to be(true)
78
- expect(cookbook_source.preferred_source_for?("razzledazzle")).to be(false)
79
- end
80
-
81
- end
82
-
83
- end
84
-
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'spec_helper'
19
+ require 'chef-dk/policyfile/community_cookbook_source'
20
+
21
+ describe ChefDK::Policyfile::CommunityCookbookSource do
22
+
23
+ subject(:cookbook_source) { ChefDK::Policyfile::CommunityCookbookSource.new }
24
+
25
+ let(:default_community_uri) { "https://supermarket.chef.io" }
26
+
27
+ let(:http_connection) { double("Chef::HTTP::Simple") }
28
+
29
+ let(:universe_response_encoded) { IO.read(File.join(fixtures_path, "cookbooks_api/small_universe.json")) }
30
+
31
+ let(:pruned_universe) { JSON.parse(IO.read(File.join(fixtures_path, "cookbooks_api/pruned_small_universe.json"))) }
32
+
33
+ it "defaults to using the public supermarket over HTTPS" do
34
+ expect(cookbook_source.uri).to eq(default_community_uri)
35
+ end
36
+
37
+ it "gives the set of arguments to `default_source` used to create it" do
38
+ expect(cookbook_source.default_source_args).to eq([:supermarket, default_community_uri])
39
+ end
40
+
41
+ describe "fetching the Universe graph over HTTP" do
42
+
43
+ before do
44
+ expect(Chef::HTTP::Simple).to receive(:new).with(default_community_uri).and_return(http_connection)
45
+ expect(http_connection).to receive(:get).with("/universe").and_return(universe_response_encoded)
46
+ end
47
+
48
+ it "fetches the universe graph" do
49
+ actual_universe = cookbook_source.universe_graph
50
+ expect(actual_universe).to have_key("apt")
51
+ expect(actual_universe["apt"]).to eq(pruned_universe["apt"])
52
+ expect(cookbook_source.universe_graph).to eq(pruned_universe)
53
+ end
54
+
55
+ it "generates location options for a cookbook from the given graph" do
56
+ expected_opts = { artifactserver: "https://supermarket.chef.io/api/v1/cookbooks/apache2/versions/1.10.4/download", version: "1.10.4" }
57
+ expect(cookbook_source.source_options_for("apache2", "1.10.4")).to eq(expected_opts)
58
+ end
59
+
60
+ end
61
+
62
+ context "when created with a block to set source preferences" do
63
+
64
+ subject(:cookbook_source) do
65
+ ChefDK::Policyfile::CommunityCookbookSource.new do |s|
66
+ s.preferred_for "foo", "bar", "baz"
67
+ end
68
+ end
69
+
70
+ it "sets the source preferences as given" do
71
+ expect(cookbook_source.preferred_cookbooks).to eq( %w[ foo bar baz ] )
72
+ end
73
+
74
+ it "is the preferred source for the requested cookbooks" do
75
+ expect(cookbook_source.preferred_source_for?("foo")).to be(true)
76
+ expect(cookbook_source.preferred_source_for?("bar")).to be(true)
77
+ expect(cookbook_source.preferred_source_for?("baz")).to be(true)
78
+ expect(cookbook_source.preferred_source_for?("razzledazzle")).to be(false)
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+
@@ -1,343 +1,343 @@
1
- #
2
- # Copyright:: Copyright (c) 2015 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'spec_helper'
19
- require 'chef-dk/policyfile/comparison_base'
20
-
21
- describe "Policyfile Comparison Bases" do
22
-
23
- let(:minimal_lockfile_json) do
24
- <<-E
25
- {
26
- "revision_id": "6fe753184c8946052d3231bb4212116df28d89a3a5f7ae52832ad408419dd5eb",
27
- "name": "install-example",
28
- "run_list": [
29
- "recipe[local-cookbook::default]"
30
- ],
31
- "cookbook_locks": {
32
- "local-cookbook": {
33
- "version": "2.3.4",
34
- "identifier": "fab501cfaf747901bd82c1bc706beae7dc3a350c",
35
- "dotted_decimal_identifier": "70567763561641081.489844270461035.258281553147148",
36
- "source": "cookbooks/local-cookbook",
37
- "cache_key": null,
38
- "scm_info": null,
39
- "source_options": {
40
- "path": "cookbooks/local-cookbook"
41
- }
42
- }
43
- },
44
- "default_attributes": {},
45
- "override_attributes": {},
46
- "solution_dependencies": {
47
- "Policyfile": [
48
- [
49
- "local-cookbook",
50
- ">= 0.0.0"
51
- ]
52
- ],
53
- "dependencies": {
54
- "local-cookbook (2.3.4)": [
55
-
56
- ]
57
- }
58
- }
59
- }
60
- E
61
- end
62
-
63
- let(:minimal_lockfile) { FFI_Yajl::Parser.parse(minimal_lockfile_json) }
64
-
65
- describe ChefDK::Policyfile::ComparisonBase::Local do
66
-
67
- let(:policyfile_lock_relpath) { "Policyfile.lock.json" }
68
-
69
- subject(:comparison_base) { described_class.new(policyfile_lock_relpath) }
70
-
71
- before do
72
- reset_tempdir
73
- end
74
-
75
- after do
76
- reset_tempdir
77
- end
78
-
79
- it "has the lockfile relative path" do
80
- expect(comparison_base.policyfile_lock_relpath).to eq(policyfile_lock_relpath)
81
- end
82
-
83
- it "is named local:RELATIVE_PATH" do
84
- expect(comparison_base.name).to eq("local:#{policyfile_lock_relpath}")
85
- end
86
-
87
- context "when the local lock doesn't exist" do
88
-
89
- it "raises an exception when reading the lockfile" do
90
- Dir.chdir(tempdir) do
91
- expect { comparison_base.lock }.to raise_error(ChefDK::LockfileNotFound)
92
- end
93
- end
94
-
95
- end
96
-
97
- context "when the local policyfile lock is not readable", :skip_on_windows do
98
-
99
- before do
100
- Dir.chdir(tempdir) do
101
- FileUtils.touch(policyfile_lock_relpath)
102
- allow(File).to receive(:readable?).with(policyfile_lock_relpath).and_return(false)
103
- end
104
- end
105
-
106
- it "raises an exception" do
107
- Dir.chdir(tempdir) do
108
- expect { comparison_base.lock }.to raise_error(ChefDK::LockfileNotFound)
109
- end
110
- end
111
-
112
- end
113
-
114
- context "when the local policyfile lock is malformed" do
115
-
116
- before do
117
- Dir.chdir(tempdir) do
118
- File.open(policyfile_lock_relpath, "w+") { |f| f.print("}}}}}}") }
119
- end
120
- end
121
-
122
- it "raises an exception" do
123
- Dir.chdir(tempdir) do
124
- expect { comparison_base.lock }.to raise_error(ChefDK::MalformedLockfile)
125
- end
126
- end
127
-
128
- end
129
-
130
- context "when the local lock exists and is valid JSON" do
131
-
132
- before do
133
- Dir.chdir(tempdir) do
134
- File.open(policyfile_lock_relpath, "w+") { |f| f.print(minimal_lockfile_json) }
135
- end
136
- end
137
-
138
- it "reads the local lock and parses the JSON" do
139
- Dir.chdir(tempdir) do
140
- expect(comparison_base.lock).to eq(minimal_lockfile)
141
- end
142
- end
143
-
144
- end
145
-
146
- end
147
-
148
- describe ChefDK::Policyfile::ComparisonBase::Git do
149
-
150
- let(:ref) { "master" }
151
-
152
- let(:policyfile_lock_relpath) { "policies/MyPolicy.lock.json" }
153
-
154
- subject(:comparison_base) { described_class.new(ref, policyfile_lock_relpath) }
155
-
156
- it "has the policyfile lock relative path it was created with" do
157
- expect(comparison_base.policyfile_lock_relpath).to eq(policyfile_lock_relpath)
158
- end
159
-
160
- it "has the ref it was created with" do
161
- expect(comparison_base.ref).to eq(ref)
162
- end
163
-
164
- it "is named git:REF" do
165
- expect(comparison_base.name).to eq("git:master")
166
- end
167
-
168
- it "creates a `git show` command for the policyfile lock and ref" do
169
- expect(comparison_base.git_cmd_string).to eq("git show master:./policies/MyPolicy.lock.json")
170
- expect(comparison_base.git_cmd.command).to eq("git show master:./policies/MyPolicy.lock.json")
171
- end
172
-
173
- context "when the git command fails" do
174
-
175
- before do
176
- allow(comparison_base.git_cmd).to receive(:run_command)
177
- allow(comparison_base.git_cmd).to receive(:error!).and_raise(Mixlib::ShellOut::ShellCommandFailed)
178
- allow(comparison_base.git_cmd).to receive(:stderr).and_return("fatal: Not a git repository (or any of the parent directories): .git\n")
179
- end
180
-
181
- it "raises an exception when reading the lockfile" do
182
- expect { comparison_base.lock }.to raise_error(ChefDK::GitError)
183
- end
184
-
185
- end
186
-
187
- context "when the git command succeeds" do
188
-
189
- before do
190
- allow(comparison_base.git_cmd).to receive(:run_command)
191
- allow(comparison_base.git_cmd).to receive(:error!).and_return(nil)
192
- end
193
-
194
- context "and the JSON is malformed" do
195
-
196
- before do
197
- allow(comparison_base.git_cmd).to receive(:stdout).and_return("}}}}}")
198
- end
199
-
200
- it "raises an exception" do
201
- expect { comparison_base.lock }.to raise_error(ChefDK::MalformedLockfile)
202
- end
203
-
204
- end
205
-
206
- context "and the JSON is well-formed" do
207
-
208
- before do
209
- allow(comparison_base.git_cmd).to receive(:stdout).and_return(minimal_lockfile_json)
210
- end
211
-
212
- it "reads the lockfile and parses the JSON" do
213
- expect(comparison_base.lock).to eq(minimal_lockfile)
214
- end
215
- end
216
-
217
- end
218
-
219
- end
220
-
221
- describe ChefDK::Policyfile::ComparisonBase::PolicyGroup do
222
-
223
- let(:group) { "acceptance" }
224
- let(:policy_name) { "chatserver" }
225
- let(:http_client) { instance_double("ChefDK::AuthenticatedHTTP", url: "https://chef.example/organizations/monkeynews") }
226
-
227
- subject(:comparison_base) { described_class.new(group, policy_name, http_client) }
228
-
229
- it "has the group it was created with" do
230
- expect(comparison_base.group).to eq(group)
231
- end
232
-
233
- it "has the policy_name it was created with" do
234
- expect(comparison_base.policy_name).to eq(policy_name)
235
- end
236
-
237
- it "has the HTTP client it was created with" do
238
- expect(comparison_base.http_client).to eq(http_client)
239
- end
240
-
241
- it "is named policy_group:GROUP" do
242
- expect(comparison_base.name).to eq("policy_group:#{group}")
243
- end
244
-
245
- context "when there is a non-404 HTTP error fetching the policyfile lock" do
246
-
247
- let(:response) do
248
- Net::HTTPResponse.send(:response_class, "500").new("1.0", "500", "Internal Server Error").tap do |r|
249
- r.instance_variable_set(:@body, "oops")
250
- end
251
- end
252
-
253
- let(:http_exception) do
254
- begin
255
- response.error!
256
- rescue => e
257
- e
258
- end
259
- end
260
-
261
- before do
262
- allow(http_client).to receive(:get).and_raise(http_exception)
263
- end
264
-
265
- it "raises an exception" do
266
- exception = nil
267
- begin
268
- comparison_base.lock
269
- rescue => exception
270
- expect(exception).to be_a_kind_of(ChefDK::PolicyfileDownloadError)
271
- expect(exception.message).to eq("HTTP error attempting to fetch policyfile lock from https://chef.example/organizations/monkeynews")
272
- expect(exception.cause).to eq(http_exception)
273
- end
274
- expect(exception).to_not be_nil
275
- end
276
-
277
- end
278
-
279
- context "when the server returns 404 fetching the policyfile lock" do
280
-
281
- let(:response) do
282
- Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found").tap do |r|
283
- r.instance_variable_set(:@body, "nothin' here, chief")
284
- end
285
- end
286
-
287
- let(:http_exception) do
288
- begin
289
- response.error!
290
- rescue => e
291
- e
292
- end
293
- end
294
-
295
- before do
296
- allow(http_client).to receive(:get).and_raise(http_exception)
297
- end
298
-
299
- it "raises an exception" do
300
- exception = nil
301
- begin
302
- comparison_base.lock
303
- rescue => exception
304
- expect(exception).to be_a_kind_of(ChefDK::PolicyfileDownloadError)
305
- expect(exception.message).to eq("No policyfile lock named 'chatserver' found in policy_group 'acceptance' at https://chef.example/organizations/monkeynews")
306
- expect(exception.cause).to eq(http_exception)
307
- end
308
- expect(exception).to_not be_nil
309
- end
310
-
311
-
312
- end
313
-
314
-
315
- context "when a non-HTTP error occurs fetching the policyfile lock" do
316
-
317
- before do
318
- allow(http_client).to receive(:get).and_raise(Errno::ECONNREFUSED)
319
- end
320
-
321
- it "raises an exception" do
322
- expect { comparison_base.lock }.to raise_error(ChefDK::PolicyfileDownloadError)
323
- end
324
-
325
- end
326
-
327
- context "when the policyfile lock is fetched from the server" do
328
-
329
- before do
330
- expect(http_client).to receive(:get).
331
- with("policy_groups/acceptance/policies/chatserver").
332
- and_return(minimal_lockfile)
333
- end
334
-
335
- it "returns the policyfile lock data" do
336
- expect(comparison_base.lock).to eq(minimal_lockfile)
337
- end
338
-
339
- end
340
-
341
- end
342
- end
343
-
1
+ #
2
+ # Copyright:: Copyright (c) 2015 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'spec_helper'
19
+ require 'chef-dk/policyfile/comparison_base'
20
+
21
+ describe "Policyfile Comparison Bases" do
22
+
23
+ let(:minimal_lockfile_json) do
24
+ <<-E
25
+ {
26
+ "revision_id": "6fe753184c8946052d3231bb4212116df28d89a3a5f7ae52832ad408419dd5eb",
27
+ "name": "install-example",
28
+ "run_list": [
29
+ "recipe[local-cookbook::default]"
30
+ ],
31
+ "cookbook_locks": {
32
+ "local-cookbook": {
33
+ "version": "2.3.4",
34
+ "identifier": "fab501cfaf747901bd82c1bc706beae7dc3a350c",
35
+ "dotted_decimal_identifier": "70567763561641081.489844270461035.258281553147148",
36
+ "source": "cookbooks/local-cookbook",
37
+ "cache_key": null,
38
+ "scm_info": null,
39
+ "source_options": {
40
+ "path": "cookbooks/local-cookbook"
41
+ }
42
+ }
43
+ },
44
+ "default_attributes": {},
45
+ "override_attributes": {},
46
+ "solution_dependencies": {
47
+ "Policyfile": [
48
+ [
49
+ "local-cookbook",
50
+ ">= 0.0.0"
51
+ ]
52
+ ],
53
+ "dependencies": {
54
+ "local-cookbook (2.3.4)": [
55
+
56
+ ]
57
+ }
58
+ }
59
+ }
60
+ E
61
+ end
62
+
63
+ let(:minimal_lockfile) { FFI_Yajl::Parser.parse(minimal_lockfile_json) }
64
+
65
+ describe ChefDK::Policyfile::ComparisonBase::Local do
66
+
67
+ let(:policyfile_lock_relpath) { "Policyfile.lock.json" }
68
+
69
+ subject(:comparison_base) { described_class.new(policyfile_lock_relpath) }
70
+
71
+ before do
72
+ reset_tempdir
73
+ end
74
+
75
+ after do
76
+ reset_tempdir
77
+ end
78
+
79
+ it "has the lockfile relative path" do
80
+ expect(comparison_base.policyfile_lock_relpath).to eq(policyfile_lock_relpath)
81
+ end
82
+
83
+ it "is named local:RELATIVE_PATH" do
84
+ expect(comparison_base.name).to eq("local:#{policyfile_lock_relpath}")
85
+ end
86
+
87
+ context "when the local lock doesn't exist" do
88
+
89
+ it "raises an exception when reading the lockfile" do
90
+ Dir.chdir(tempdir) do
91
+ expect { comparison_base.lock }.to raise_error(ChefDK::LockfileNotFound)
92
+ end
93
+ end
94
+
95
+ end
96
+
97
+ context "when the local policyfile lock is not readable", :skip_on_windows do
98
+
99
+ before do
100
+ Dir.chdir(tempdir) do
101
+ FileUtils.touch(policyfile_lock_relpath)
102
+ allow(File).to receive(:readable?).with(policyfile_lock_relpath).and_return(false)
103
+ end
104
+ end
105
+
106
+ it "raises an exception" do
107
+ Dir.chdir(tempdir) do
108
+ expect { comparison_base.lock }.to raise_error(ChefDK::LockfileNotFound)
109
+ end
110
+ end
111
+
112
+ end
113
+
114
+ context "when the local policyfile lock is malformed" do
115
+
116
+ before do
117
+ Dir.chdir(tempdir) do
118
+ File.open(policyfile_lock_relpath, "w+") { |f| f.print("}}}}}}") }
119
+ end
120
+ end
121
+
122
+ it "raises an exception" do
123
+ Dir.chdir(tempdir) do
124
+ expect { comparison_base.lock }.to raise_error(ChefDK::MalformedLockfile)
125
+ end
126
+ end
127
+
128
+ end
129
+
130
+ context "when the local lock exists and is valid JSON" do
131
+
132
+ before do
133
+ Dir.chdir(tempdir) do
134
+ File.open(policyfile_lock_relpath, "w+") { |f| f.print(minimal_lockfile_json) }
135
+ end
136
+ end
137
+
138
+ it "reads the local lock and parses the JSON" do
139
+ Dir.chdir(tempdir) do
140
+ expect(comparison_base.lock).to eq(minimal_lockfile)
141
+ end
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ describe ChefDK::Policyfile::ComparisonBase::Git do
149
+
150
+ let(:ref) { "master" }
151
+
152
+ let(:policyfile_lock_relpath) { "policies/MyPolicy.lock.json" }
153
+
154
+ subject(:comparison_base) { described_class.new(ref, policyfile_lock_relpath) }
155
+
156
+ it "has the policyfile lock relative path it was created with" do
157
+ expect(comparison_base.policyfile_lock_relpath).to eq(policyfile_lock_relpath)
158
+ end
159
+
160
+ it "has the ref it was created with" do
161
+ expect(comparison_base.ref).to eq(ref)
162
+ end
163
+
164
+ it "is named git:REF" do
165
+ expect(comparison_base.name).to eq("git:master")
166
+ end
167
+
168
+ it "creates a `git show` command for the policyfile lock and ref" do
169
+ expect(comparison_base.git_cmd_string).to eq("git show master:./policies/MyPolicy.lock.json")
170
+ expect(comparison_base.git_cmd.command).to eq("git show master:./policies/MyPolicy.lock.json")
171
+ end
172
+
173
+ context "when the git command fails" do
174
+
175
+ before do
176
+ allow(comparison_base.git_cmd).to receive(:run_command)
177
+ allow(comparison_base.git_cmd).to receive(:error!).and_raise(Mixlib::ShellOut::ShellCommandFailed)
178
+ allow(comparison_base.git_cmd).to receive(:stderr).and_return("fatal: Not a git repository (or any of the parent directories): .git\n")
179
+ end
180
+
181
+ it "raises an exception when reading the lockfile" do
182
+ expect { comparison_base.lock }.to raise_error(ChefDK::GitError)
183
+ end
184
+
185
+ end
186
+
187
+ context "when the git command succeeds" do
188
+
189
+ before do
190
+ allow(comparison_base.git_cmd).to receive(:run_command)
191
+ allow(comparison_base.git_cmd).to receive(:error!).and_return(nil)
192
+ end
193
+
194
+ context "and the JSON is malformed" do
195
+
196
+ before do
197
+ allow(comparison_base.git_cmd).to receive(:stdout).and_return("}}}}}")
198
+ end
199
+
200
+ it "raises an exception" do
201
+ expect { comparison_base.lock }.to raise_error(ChefDK::MalformedLockfile)
202
+ end
203
+
204
+ end
205
+
206
+ context "and the JSON is well-formed" do
207
+
208
+ before do
209
+ allow(comparison_base.git_cmd).to receive(:stdout).and_return(minimal_lockfile_json)
210
+ end
211
+
212
+ it "reads the lockfile and parses the JSON" do
213
+ expect(comparison_base.lock).to eq(minimal_lockfile)
214
+ end
215
+ end
216
+
217
+ end
218
+
219
+ end
220
+
221
+ describe ChefDK::Policyfile::ComparisonBase::PolicyGroup do
222
+
223
+ let(:group) { "acceptance" }
224
+ let(:policy_name) { "chatserver" }
225
+ let(:http_client) { instance_double("ChefDK::AuthenticatedHTTP", url: "https://chef.example/organizations/monkeynews") }
226
+
227
+ subject(:comparison_base) { described_class.new(group, policy_name, http_client) }
228
+
229
+ it "has the group it was created with" do
230
+ expect(comparison_base.group).to eq(group)
231
+ end
232
+
233
+ it "has the policy_name it was created with" do
234
+ expect(comparison_base.policy_name).to eq(policy_name)
235
+ end
236
+
237
+ it "has the HTTP client it was created with" do
238
+ expect(comparison_base.http_client).to eq(http_client)
239
+ end
240
+
241
+ it "is named policy_group:GROUP" do
242
+ expect(comparison_base.name).to eq("policy_group:#{group}")
243
+ end
244
+
245
+ context "when there is a non-404 HTTP error fetching the policyfile lock" do
246
+
247
+ let(:response) do
248
+ Net::HTTPResponse.send(:response_class, "500").new("1.0", "500", "Internal Server Error").tap do |r|
249
+ r.instance_variable_set(:@body, "oops")
250
+ end
251
+ end
252
+
253
+ let(:http_exception) do
254
+ begin
255
+ response.error!
256
+ rescue => e
257
+ e
258
+ end
259
+ end
260
+
261
+ before do
262
+ allow(http_client).to receive(:get).and_raise(http_exception)
263
+ end
264
+
265
+ it "raises an exception" do
266
+ exception = nil
267
+ begin
268
+ comparison_base.lock
269
+ rescue => exception
270
+ expect(exception).to be_a_kind_of(ChefDK::PolicyfileDownloadError)
271
+ expect(exception.message).to eq("HTTP error attempting to fetch policyfile lock from https://chef.example/organizations/monkeynews")
272
+ expect(exception.cause).to eq(http_exception)
273
+ end
274
+ expect(exception).to_not be_nil
275
+ end
276
+
277
+ end
278
+
279
+ context "when the server returns 404 fetching the policyfile lock" do
280
+
281
+ let(:response) do
282
+ Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found").tap do |r|
283
+ r.instance_variable_set(:@body, "nothin' here, chief")
284
+ end
285
+ end
286
+
287
+ let(:http_exception) do
288
+ begin
289
+ response.error!
290
+ rescue => e
291
+ e
292
+ end
293
+ end
294
+
295
+ before do
296
+ allow(http_client).to receive(:get).and_raise(http_exception)
297
+ end
298
+
299
+ it "raises an exception" do
300
+ exception = nil
301
+ begin
302
+ comparison_base.lock
303
+ rescue => exception
304
+ expect(exception).to be_a_kind_of(ChefDK::PolicyfileDownloadError)
305
+ expect(exception.message).to eq("No policyfile lock named 'chatserver' found in policy_group 'acceptance' at https://chef.example/organizations/monkeynews")
306
+ expect(exception.cause).to eq(http_exception)
307
+ end
308
+ expect(exception).to_not be_nil
309
+ end
310
+
311
+
312
+ end
313
+
314
+
315
+ context "when a non-HTTP error occurs fetching the policyfile lock" do
316
+
317
+ before do
318
+ allow(http_client).to receive(:get).and_raise(Errno::ECONNREFUSED)
319
+ end
320
+
321
+ it "raises an exception" do
322
+ expect { comparison_base.lock }.to raise_error(ChefDK::PolicyfileDownloadError)
323
+ end
324
+
325
+ end
326
+
327
+ context "when the policyfile lock is fetched from the server" do
328
+
329
+ before do
330
+ expect(http_client).to receive(:get).
331
+ with("policy_groups/acceptance/policies/chatserver").
332
+ and_return(minimal_lockfile)
333
+ end
334
+
335
+ it "returns the policyfile lock data" do
336
+ expect(comparison_base.lock).to eq(minimal_lockfile)
337
+ end
338
+
339
+ end
340
+
341
+ end
342
+ end
343
+