chef-dk 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +190 -190
  3. data/Gemfile +26 -0
  4. data/LICENSE +201 -201
  5. data/README.md +276 -276
  6. data/Rakefile +18 -18
  7. data/bin/chef +25 -25
  8. data/lib/chef-dk.rb +19 -19
  9. data/lib/chef-dk/authenticated_http.rb +40 -40
  10. data/lib/chef-dk/builtin_commands.rb +60 -60
  11. data/lib/chef-dk/chef_runner.rb +98 -98
  12. data/lib/chef-dk/cli.rb +200 -200
  13. data/lib/chef-dk/command/base.rb +79 -75
  14. data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
  15. data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
  16. data/lib/chef-dk/command/delete_policy.rb +122 -122
  17. data/lib/chef-dk/command/delete_policy_group.rb +122 -122
  18. data/lib/chef-dk/command/diff.rb +316 -316
  19. data/lib/chef-dk/command/env.rb +90 -90
  20. data/lib/chef-dk/command/exec.rb +45 -45
  21. data/lib/chef-dk/command/export.rb +151 -153
  22. data/lib/chef-dk/command/gem.rb +47 -47
  23. data/lib/chef-dk/command/generate.rb +120 -118
  24. data/lib/chef-dk/command/generator_commands.rb +80 -80
  25. data/lib/chef-dk/command/generator_commands/app.rb +107 -107
  26. data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
  27. data/lib/chef-dk/command/generator_commands/base.rb +121 -121
  28. data/lib/chef-dk/command/generator_commands/cookbook.rb +119 -108
  29. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  30. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  31. data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -0
  32. data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
  33. data/lib/chef-dk/command/generator_commands/policyfile.rb +86 -83
  34. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  35. data/lib/chef-dk/command/generator_commands/repo.rb +96 -96
  36. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  37. data/lib/chef-dk/command/install.rb +121 -121
  38. data/lib/chef-dk/command/provision.rb +438 -438
  39. data/lib/chef-dk/command/push.rb +118 -118
  40. data/lib/chef-dk/command/push_archive.rb +126 -126
  41. data/lib/chef-dk/command/shell_init.rb +180 -180
  42. data/lib/chef-dk/command/show_policy.rb +165 -165
  43. data/lib/chef-dk/command/undelete.rb +155 -155
  44. data/lib/chef-dk/command/update.rb +129 -129
  45. data/lib/chef-dk/command/verify.rb +490 -453
  46. data/lib/chef-dk/commands_map.rb +115 -115
  47. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  48. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  49. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  50. data/lib/chef-dk/component_test.rb +171 -171
  51. data/lib/chef-dk/configurable.rb +57 -52
  52. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  53. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  54. data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
  55. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  56. data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
  57. data/lib/chef-dk/exceptions.rb +113 -113
  58. data/lib/chef-dk/generator.rb +163 -162
  59. data/lib/chef-dk/helpers.rb +159 -159
  60. data/lib/chef-dk/pager.rb +106 -106
  61. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +122 -122
  62. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
  63. data/lib/chef-dk/policyfile/community_cookbook_source.rb +82 -82
  64. data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
  65. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +133 -133
  66. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  67. data/lib/chef-dk/policyfile/cookbook_sources.rb +21 -21
  68. data/lib/chef-dk/policyfile/differ.rb +266 -266
  69. data/lib/chef-dk/policyfile/dsl.rb +197 -197
  70. data/lib/chef-dk/policyfile/lister.rb +232 -232
  71. data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
  72. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  73. data/lib/chef-dk/policyfile/reports/install.rb +70 -70
  74. data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
  75. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  76. data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
  77. data/lib/chef-dk/policyfile/storage_config.rb +100 -100
  78. data/lib/chef-dk/policyfile/undo_record.rb +142 -142
  79. data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
  80. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  81. data/lib/chef-dk/policyfile_compiler.rb +322 -322
  82. data/lib/chef-dk/policyfile_lock.rb +552 -552
  83. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  84. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
  85. data/lib/chef-dk/policyfile_services/export_repo.rb +309 -281
  86. data/lib/chef-dk/policyfile_services/install.rb +125 -125
  87. data/lib/chef-dk/policyfile_services/push.rb +114 -114
  88. data/lib/chef-dk/policyfile_services/push_archive.rb +173 -173
  89. data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
  90. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
  91. data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
  92. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  93. data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
  94. data/lib/chef-dk/service_exception_inspectors.rb +25 -25
  95. data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
  96. data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
  97. data/lib/chef-dk/service_exceptions.rb +143 -143
  98. data/lib/chef-dk/shell_out.rb +36 -36
  99. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
  100. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +100 -100
  101. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  102. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
  103. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
  104. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +28 -28
  105. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
  106. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
  107. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
  108. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
  109. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +57 -57
  110. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  111. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  112. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  113. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +8 -8
  114. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  115. data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +8 -3
  116. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
  117. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  118. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +97 -97
  119. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
  120. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +104 -92
  121. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
  122. data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
  123. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
  124. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +27 -27
  125. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +48 -47
  126. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  127. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  128. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -201
  129. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  130. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  131. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  132. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +20 -16
  133. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  134. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +16 -16
  135. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +27 -0
  136. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
  137. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  138. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
  139. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
  140. data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +9 -9
  141. data/lib/chef-dk/ui.rb +58 -58
  142. data/lib/chef-dk/version.rb +20 -20
  143. data/lib/kitchen/provisioner/policyfile_zero.rb +193 -164
  144. data/spec/shared/a_file_generator.rb +125 -125
  145. data/spec/shared/a_generated_file.rb +12 -12
  146. data/spec/shared/command_with_ui_object.rb +11 -11
  147. data/spec/shared/custom_generator_cookbook.rb +117 -117
  148. data/spec/shared/fixture_cookbook_checksums.rb +47 -47
  149. data/spec/shared/setup_git_cookbooks.rb +53 -53
  150. data/spec/spec_helper.rb +49 -48
  151. data/spec/test_helpers.rb +84 -84
  152. data/spec/unit/chef_runner_spec.rb +111 -110
  153. data/spec/unit/cli_spec.rb +357 -357
  154. data/spec/unit/command/base_spec.rb +169 -136
  155. data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
  156. data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
  157. data/spec/unit/command/delete_policy_group_spec.rb +207 -207
  158. data/spec/unit/command/delete_policy_spec.rb +207 -207
  159. data/spec/unit/command/diff_spec.rb +312 -312
  160. data/spec/unit/command/env_spec.rb +52 -52
  161. data/spec/unit/command/exec_spec.rb +179 -179
  162. data/spec/unit/command/export_spec.rb +189 -189
  163. data/spec/unit/command/generate_spec.rb +142 -142
  164. data/spec/unit/command/generator_commands/app_spec.rb +169 -169
  165. data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
  166. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
  167. data/spec/unit/command/generator_commands/cookbook_spec.rb +320 -240
  168. data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -0
  169. data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
  170. data/spec/unit/command/generator_commands/policyfile_spec.rb +125 -125
  171. data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
  172. data/spec/unit/command/generator_commands/repo_spec.rb +283 -283
  173. data/spec/unit/command/generator_commands/template_spec.rb +32 -32
  174. data/spec/unit/command/install_spec.rb +179 -179
  175. data/spec/unit/command/provision_spec.rb +592 -592
  176. data/spec/unit/command/push_archive_spec.rb +153 -153
  177. data/spec/unit/command/push_spec.rb +199 -199
  178. data/spec/unit/command/shell_init_spec.rb +329 -329
  179. data/spec/unit/command/show_policy_spec.rb +235 -235
  180. data/spec/unit/command/undelete_spec.rb +246 -246
  181. data/spec/unit/command/update_spec.rb +251 -251
  182. data/spec/unit/command/verify_spec.rb +323 -322
  183. data/spec/unit/commands_map_spec.rb +57 -57
  184. data/spec/unit/component_test_spec.rb +126 -126
  185. data/spec/unit/cookbook_metadata_spec.rb +98 -98
  186. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  187. data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
  188. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  189. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  190. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  191. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  192. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  193. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  194. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  195. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  196. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  197. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  198. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  199. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  200. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  201. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  202. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  203. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  204. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  205. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  206. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  207. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  208. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  209. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  210. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  211. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  212. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  213. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
  214. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  215. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  216. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  217. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  218. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  219. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  220. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  221. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  222. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  223. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  224. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  225. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  226. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  227. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  228. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  229. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  230. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  231. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  232. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  233. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  234. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  235. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  236. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  237. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  238. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  239. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  240. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  241. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  242. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  243. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  244. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  245. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  246. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  247. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  248. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  249. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  250. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  251. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  252. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  253. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  254. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  255. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  256. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  257. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  258. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  259. data/spec/unit/generator_spec.rb +120 -120
  260. data/spec/unit/helpers_spec.rb +92 -92
  261. data/spec/unit/pager_spec.rb +119 -119
  262. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +66 -66
  263. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
  264. data/spec/unit/policyfile/community_cookbook_source_spec.rb +51 -51
  265. data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
  266. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +252 -252
  267. data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
  268. data/spec/unit/policyfile/differ_spec.rb +687 -687
  269. data/spec/unit/policyfile/lister_spec.rb +272 -272
  270. data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
  271. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  272. data/spec/unit/policyfile/reports/install_spec.rb +115 -115
  273. data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
  274. data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
  275. data/spec/unit/policyfile/storage_config_spec.rb +172 -172
  276. data/spec/unit/policyfile/undo_record_spec.rb +260 -260
  277. data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
  278. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  279. data/spec/unit/policyfile_demands_spec.rb +876 -876
  280. data/spec/unit/policyfile_evaluation_spec.rb +441 -441
  281. data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
  282. data/spec/unit/policyfile_lock_install_spec.rb +138 -138
  283. data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
  284. data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
  285. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  286. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
  287. data/spec/unit/policyfile_services/export_repo_spec.rb +439 -416
  288. data/spec/unit/policyfile_services/install_spec.rb +191 -191
  289. data/spec/unit/policyfile_services/push_archive_spec.rb +345 -345
  290. data/spec/unit/policyfile_services/push_spec.rb +233 -233
  291. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
  292. data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
  293. data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
  294. data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
  295. data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
  296. data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
  297. data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
  298. data/spec/unit/shell_out_spec.rb +34 -34
  299. metadata +9 -3
@@ -1,441 +1,441 @@
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_compiler'
20
-
21
- describe ChefDK::PolicyfileCompiler do
22
-
23
- let(:storage_config) { ChefDK::Policyfile::StorageConfig.new.use_policyfile("TestPolicyfile.rb") }
24
-
25
- let(:policyfile) { ChefDK::PolicyfileCompiler.evaluate(policyfile_rb, "TestPolicyfile.rb") }
26
-
27
- describe "Evaluate a policyfile" do
28
-
29
- describe "when the policyfile is not valid" do
30
-
31
- describe "when error! is called" do
32
-
33
- let(:policyfile_rb) { "raise 'oops'" }
34
-
35
- it "raises a PolicyfileError" do
36
- expect { policyfile.error! }.to raise_error(ChefDK::PolicyfileError)
37
- end
38
- end
39
-
40
- context "Given an empty policyfile" do
41
-
42
- let(:policyfile_rb) { "" }
43
-
44
- it "has an invalid run_list" do
45
- expect(policyfile.errors).to include("Invalid run_list. run_list cannot be empty")
46
- end
47
-
48
- end
49
-
50
- context "Given a policyfile with a syntax error" do
51
-
52
- let(:policyfile_rb) { "{{{{::::{{::" }
53
-
54
- it "has a syntax error message" do
55
- expected_error=<<-E
56
- Invalid ruby syntax in policyfile 'TestPolicyfile.rb':
57
-
58
- TestPolicyfile.rb:1: syntax error, unexpected :: at EXPR_BEG, expecting tCONSTANT
59
- {{{{::::{{::
60
- ^
61
- TestPolicyfile.rb:1: syntax error, unexpected end-of-input, expecting tCONSTANT
62
- {{{{::::{{::
63
- ^
64
- E
65
- expect(policyfile.errors.size).to eq(1)
66
- expect(policyfile.errors.first).to eq(expected_error.chomp)
67
- end
68
-
69
- end
70
-
71
- context "Given a policyfile with a ruby error" do
72
-
73
- let(:policyfile_rb) { "raise 'oops'" }
74
-
75
- it "has an error message with code context" do
76
- expect(policyfile.errors.size).to eq(1)
77
- expected_message = <<-E
78
- Evaluation of policyfile 'TestPolicyfile.rb' raised an exception
79
- Exception: RuntimeError "oops"
80
-
81
- Relevant Code:
82
- 1: raise 'oops'
83
-
84
- Backtrace:
85
- TestPolicyfile.rb:1:in `eval_policyfile'
86
- E
87
- expect(policyfile.errors.first).to eq(expected_message)
88
- end
89
- end
90
-
91
- context "when policyfile evaluation is aborted by user signal" do
92
-
93
- let(:policyfile_rb) { "raise Interrupt" }
94
-
95
- it "allows the exception to bubble up" do
96
- expect { policyfile }.to raise_error(Interrupt)
97
- end
98
- end
99
-
100
- context "when given an invalid default source type" do
101
-
102
- let(:policyfile_rb) do
103
- <<-EOH
104
- run_list "foo"
105
- default_source :herp, "derp"
106
- EOH
107
- end
108
-
109
- it "has an invalid source error" do
110
- expect(policyfile.errors.size).to eq(1)
111
- expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
112
- end
113
- end
114
-
115
- context "when the url is omitted for chef server default source" do
116
- let(:policyfile_rb) do
117
- <<-EOH
118
- run_list "foo"
119
- default_source :chef_server
120
- EOH
121
- end
122
-
123
- it "has an invalid source error" do
124
- expect(policyfile.errors.size).to eq(1)
125
- expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
126
- end
127
-
128
- end
129
-
130
- context "when a per-cookbook source is specified with invalid options" do
131
- let(:policyfile_rb) do
132
- <<-EOH
133
- run_list "foo"
134
-
135
- cookbook "foo", herp: "derp"
136
- EOH
137
- end
138
-
139
- it "has an invalid source error" do
140
- expect(policyfile.errors.size).to eq(1)
141
- message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
142
- expect(policyfile.errors.first).to eq(message)
143
- end
144
- end
145
- end
146
-
147
- context "Given a minimal valid policyfile" do
148
-
149
- let(:policyfile_rb) do
150
- <<-EOH
151
- name "hello"
152
-
153
- run_list "foo", "bar"
154
- EOH
155
- end
156
-
157
- it "has no errors" do
158
- expect(policyfile.errors).to eq([])
159
- end
160
-
161
- it "has a name" do
162
- expect(policyfile.name).to eq("hello")
163
- end
164
-
165
- it "has a run_list" do
166
- expect(policyfile.run_list).to eq(%w[foo bar])
167
- end
168
-
169
- it "gives the run_list as the expanded run_list" do
170
- expect(policyfile.expanded_run_list).to eq(%w[foo bar])
171
- end
172
-
173
- it "has no default cookbook source" do
174
- expect(policyfile.default_source).to be_an(Array)
175
- expect(policyfile.default_source.size).to eq(1)
176
- expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::NullCookbookSource)
177
- end
178
-
179
- context "with the default source set to the community site" do
180
-
181
- let(:policyfile_rb) do
182
- <<-EOH
183
- run_list "foo", "bar"
184
- default_source :community
185
- EOH
186
- end
187
-
188
- it "has a default source" do
189
- expect(policyfile.errors).to eq([])
190
- expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
191
- expect(policyfile.default_source).to eq(expected)
192
- end
193
-
194
- context "with a custom URI" do
195
-
196
- let(:policyfile_rb) do
197
- <<-EOH
198
- run_list "foo", "bar"
199
- default_source :community, "https://cookbook-api.example.com"
200
- EOH
201
- end
202
-
203
- it "has a default source" do
204
- expect(policyfile.errors).to eq([])
205
- expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
206
- expect(policyfile.default_source).to eq(expected)
207
- end
208
-
209
- end
210
-
211
- context "with an added cookbook with no options" do
212
-
213
- let(:policyfile_rb) do
214
- <<-EOH
215
- run_list "foo", "bar"
216
- cookbook "baz"
217
- EOH
218
- end
219
-
220
- it "adds the cookbook to the list of location specs" do
221
- expect(policyfile.errors).to eq([])
222
- expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
223
- expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
224
- end
225
- end
226
-
227
- end
228
-
229
- context "with the default source set to a chef server" do
230
-
231
- let(:policyfile_rb) do
232
- <<-EOH
233
- run_list "foo", "bar"
234
- default_source :chef_server, "https://mychef.example.com"
235
- EOH
236
- end
237
-
238
- it "has a default source" do
239
- skip "Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)"
240
-
241
- expect(policyfile.errors).to eq([])
242
- expected = ChefDK::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com")
243
- expect(policyfile.default_source).to eq(expected)
244
- end
245
-
246
- end
247
-
248
- context "with the default source set to a chef-repo path" do
249
-
250
- let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
251
-
252
- let(:policyfile_rb) do
253
- <<-EOH
254
- run_list "foo", "bar"
255
- default_source :chef_repo, "#{chef_repo}"
256
- EOH
257
- end
258
-
259
- it "has a default source" do
260
- expect(policyfile.errors).to eq([])
261
- expected = [ ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
262
- expect(policyfile.default_source).to eq(expected)
263
- end
264
-
265
- end
266
-
267
- context "with multiple default sources" do
268
- let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
269
-
270
- let(:policyfile_rb) do
271
- <<-EOH
272
- run_list "foo", "bar"
273
-
274
- default_source :community
275
- default_source :chef_repo, "#{chef_repo}"
276
- EOH
277
- end
278
-
279
- it "has an array of sources" do
280
- expect(policyfile.errors).to eq([])
281
-
282
- community_source = ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
283
- repo_source = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
284
- expected = [ community_source, repo_source ]
285
-
286
- expect(policyfile.default_source).to eq(expected)
287
- end
288
-
289
- end
290
-
291
- end
292
-
293
- describe "assigning cookbooks to specific sources" do
294
-
295
- before do
296
- expect(policyfile.errors).to eq([])
297
- end
298
-
299
- context "when a cookbook is assigned to a local source" do
300
-
301
- let(:policyfile_rb) do
302
- <<-EOH
303
- run_list "foo"
304
- cookbook "foo", path: "local_cookbooks/foo"
305
- EOH
306
- end
307
-
308
- it "sets the source of the cookbook to the local path" do
309
- expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {path: "local_cookbooks/foo"}, storage_config)
310
- expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
311
- end
312
-
313
- end
314
-
315
- context "when a cookbook is assigned to a git source" do
316
- let(:policyfile_rb) do
317
- <<-EOH
318
- run_list "foo"
319
- cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
320
- EOH
321
- end
322
-
323
- it "sets the source of the cookbook to the git URL" do
324
- expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {git: "git://example.com:me/foo-cookbook.git"}, storage_config)
325
- expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
326
- end
327
-
328
- end
329
-
330
- context "when a cookbook is assigned to a chef_server source" do
331
- let(:policyfile_rb) do
332
- <<-EOH
333
- run_list "foo"
334
- cookbook "foo", chef_server: "https://mychefserver.example.com"
335
- EOH
336
- end
337
-
338
- # Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)
339
- # We have to skip at the example definition level or else we fail in the before block
340
- skip "sets the source of the cookbook to the git URL" do
341
- expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {chef_server: "https://mychefserver.example.com"}, storage_config)
342
- expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
343
- end
344
-
345
- end
346
-
347
- end
348
-
349
- describe "assigning a cookbook to conflicting sources" do
350
- let(:policyfile_rb) do
351
- <<-EOH
352
- run_list "foo"
353
- cookbook "foo", path: "local_cookbooks/foo"
354
- cookbook "foo", chef_server: "https://mychefserver.example.com"
355
- EOH
356
- end
357
-
358
- it "has a conflicting sources error" do
359
- expected = <<-EOH
360
- Cookbook 'foo' assigned to conflicting sources
361
-
362
- Previous source: {:path=>"local_cookbooks/foo"}
363
- Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
364
- EOH
365
- expect(policyfile.errors.size).to eq(1)
366
- expect(policyfile.errors.first).to eq(expected)
367
- end
368
-
369
- end
370
-
371
- describe "defining attributes" do
372
-
373
- let(:policyfile_rb) do
374
- <<-EOH
375
- name "policy-with-attrs"
376
- run_list "foo"
377
-
378
- # basic attribute setting:
379
- default["foo"] = "bar"
380
-
381
- # auto-vivify
382
- default["abc"]["def"]["ghi"] = "xyz"
383
-
384
- # literal data structures
385
- default["baz"] = {
386
- "more_nested_stuff" => "yup"
387
- }
388
-
389
- # Array literals work and we merge rather than overwrite:
390
- default["baz"]["an_array"] = ["a", "b", "c"]
391
-
392
- # all the same stuff works with overrides:
393
-
394
- override["foo"] = "bar"
395
-
396
- override["abc"]["def"]["ghi"] = "xyz"
397
-
398
- override["baz_override"] = {
399
- "more_nested_stuff" => "yup"
400
- }
401
-
402
- override["baz_override"]["an_array"] = ["a", "b", "c"]
403
- EOH
404
- end
405
-
406
- let(:expected_combined_default_attrs) do
407
- {
408
- "foo" => "bar",
409
- "abc" => { "def" => { "ghi" => "xyz" } },
410
- "baz" => {
411
- "more_nested_stuff" => "yup",
412
- "an_array" => ["a", "b", "c"]
413
- }
414
- }
415
- end
416
-
417
- let(:expected_combined_override_attrs) do
418
- {
419
- "foo" => "bar",
420
- "abc" => { "def" => { "ghi" => "xyz" } },
421
- "baz_override" => {
422
- "more_nested_stuff" => "yup",
423
- "an_array" => ["a", "b", "c"]
424
- }
425
- }
426
- end
427
-
428
- it "defines default attributes" do
429
- expect(policyfile.errors).to eq([])
430
- expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
431
- end
432
-
433
- it "defines override attributes" do
434
- expect(policyfile.errors).to eq([])
435
- expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
436
- end
437
- end
438
-
439
- end
440
-
441
- 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_compiler'
20
+
21
+ describe ChefDK::PolicyfileCompiler do
22
+
23
+ let(:storage_config) { ChefDK::Policyfile::StorageConfig.new.use_policyfile("TestPolicyfile.rb") }
24
+
25
+ let(:policyfile) { ChefDK::PolicyfileCompiler.evaluate(policyfile_rb, "TestPolicyfile.rb") }
26
+
27
+ describe "Evaluate a policyfile" do
28
+
29
+ describe "when the policyfile is not valid" do
30
+
31
+ describe "when error! is called" do
32
+
33
+ let(:policyfile_rb) { "raise 'oops'" }
34
+
35
+ it "raises a PolicyfileError" do
36
+ expect { policyfile.error! }.to raise_error(ChefDK::PolicyfileError)
37
+ end
38
+ end
39
+
40
+ context "Given an empty policyfile" do
41
+
42
+ let(:policyfile_rb) { "" }
43
+
44
+ it "has an invalid run_list" do
45
+ expect(policyfile.errors).to include("Invalid run_list. run_list cannot be empty")
46
+ end
47
+
48
+ end
49
+
50
+ context "Given a policyfile with a syntax error" do
51
+
52
+ let(:policyfile_rb) { "{{{{::::{{::" }
53
+
54
+ it "has a syntax error message" do
55
+ expected_error=<<-E
56
+ Invalid ruby syntax in policyfile 'TestPolicyfile.rb':
57
+
58
+ TestPolicyfile.rb:1: syntax error, unexpected :: at EXPR_BEG, expecting tCONSTANT
59
+ {{{{::::{{::
60
+ ^
61
+ TestPolicyfile.rb:1: syntax error, unexpected end-of-input, expecting tCONSTANT
62
+ {{{{::::{{::
63
+ ^
64
+ E
65
+ expect(policyfile.errors.size).to eq(1)
66
+ expect(policyfile.errors.first).to eq(expected_error.chomp)
67
+ end
68
+
69
+ end
70
+
71
+ context "Given a policyfile with a ruby error" do
72
+
73
+ let(:policyfile_rb) { "raise 'oops'" }
74
+
75
+ it "has an error message with code context" do
76
+ expect(policyfile.errors.size).to eq(1)
77
+ expected_message = <<-E
78
+ Evaluation of policyfile 'TestPolicyfile.rb' raised an exception
79
+ Exception: RuntimeError "oops"
80
+
81
+ Relevant Code:
82
+ 1: raise 'oops'
83
+
84
+ Backtrace:
85
+ TestPolicyfile.rb:1:in `eval_policyfile'
86
+ E
87
+ expect(policyfile.errors.first).to eq(expected_message)
88
+ end
89
+ end
90
+
91
+ context "when policyfile evaluation is aborted by user signal" do
92
+
93
+ let(:policyfile_rb) { "raise Interrupt" }
94
+
95
+ it "allows the exception to bubble up" do
96
+ expect { policyfile }.to raise_error(Interrupt)
97
+ end
98
+ end
99
+
100
+ context "when given an invalid default source type" do
101
+
102
+ let(:policyfile_rb) do
103
+ <<-EOH
104
+ run_list "foo"
105
+ default_source :herp, "derp"
106
+ EOH
107
+ end
108
+
109
+ it "has an invalid source error" do
110
+ expect(policyfile.errors.size).to eq(1)
111
+ expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
112
+ end
113
+ end
114
+
115
+ context "when the url is omitted for chef server default source" do
116
+ let(:policyfile_rb) do
117
+ <<-EOH
118
+ run_list "foo"
119
+ default_source :chef_server
120
+ EOH
121
+ end
122
+
123
+ it "has an invalid source error" do
124
+ expect(policyfile.errors.size).to eq(1)
125
+ expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
126
+ end
127
+
128
+ end
129
+
130
+ context "when a per-cookbook source is specified with invalid options" do
131
+ let(:policyfile_rb) do
132
+ <<-EOH
133
+ run_list "foo"
134
+
135
+ cookbook "foo", herp: "derp"
136
+ EOH
137
+ end
138
+
139
+ it "has an invalid source error" do
140
+ expect(policyfile.errors.size).to eq(1)
141
+ message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
142
+ expect(policyfile.errors.first).to eq(message)
143
+ end
144
+ end
145
+ end
146
+
147
+ context "Given a minimal valid policyfile" do
148
+
149
+ let(:policyfile_rb) do
150
+ <<-EOH
151
+ name "hello"
152
+
153
+ run_list "foo", "bar"
154
+ EOH
155
+ end
156
+
157
+ it "has no errors" do
158
+ expect(policyfile.errors).to eq([])
159
+ end
160
+
161
+ it "has a name" do
162
+ expect(policyfile.name).to eq("hello")
163
+ end
164
+
165
+ it "has a run_list" do
166
+ expect(policyfile.run_list).to eq(%w[foo bar])
167
+ end
168
+
169
+ it "gives the run_list as the expanded run_list" do
170
+ expect(policyfile.expanded_run_list).to eq(%w[foo bar])
171
+ end
172
+
173
+ it "has no default cookbook source" do
174
+ expect(policyfile.default_source).to be_an(Array)
175
+ expect(policyfile.default_source.size).to eq(1)
176
+ expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::NullCookbookSource)
177
+ end
178
+
179
+ context "with the default source set to the community site" do
180
+
181
+ let(:policyfile_rb) do
182
+ <<-EOH
183
+ run_list "foo", "bar"
184
+ default_source :community
185
+ EOH
186
+ end
187
+
188
+ it "has a default source" do
189
+ expect(policyfile.errors).to eq([])
190
+ expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
191
+ expect(policyfile.default_source).to eq(expected)
192
+ end
193
+
194
+ context "with a custom URI" do
195
+
196
+ let(:policyfile_rb) do
197
+ <<-EOH
198
+ run_list "foo", "bar"
199
+ default_source :community, "https://cookbook-api.example.com"
200
+ EOH
201
+ end
202
+
203
+ it "has a default source" do
204
+ expect(policyfile.errors).to eq([])
205
+ expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
206
+ expect(policyfile.default_source).to eq(expected)
207
+ end
208
+
209
+ end
210
+
211
+ context "with an added cookbook with no options" do
212
+
213
+ let(:policyfile_rb) do
214
+ <<-EOH
215
+ run_list "foo", "bar"
216
+ cookbook "baz"
217
+ EOH
218
+ end
219
+
220
+ it "adds the cookbook to the list of location specs" do
221
+ expect(policyfile.errors).to eq([])
222
+ expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
223
+ expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
224
+ end
225
+ end
226
+
227
+ end
228
+
229
+ context "with the default source set to a chef server" do
230
+
231
+ let(:policyfile_rb) do
232
+ <<-EOH
233
+ run_list "foo", "bar"
234
+ default_source :chef_server, "https://mychef.example.com"
235
+ EOH
236
+ end
237
+
238
+ it "has a default source" do
239
+ skip "Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)"
240
+
241
+ expect(policyfile.errors).to eq([])
242
+ expected = ChefDK::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com")
243
+ expect(policyfile.default_source).to eq(expected)
244
+ end
245
+
246
+ end
247
+
248
+ context "with the default source set to a chef-repo path" do
249
+
250
+ let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
251
+
252
+ let(:policyfile_rb) do
253
+ <<-EOH
254
+ run_list "foo", "bar"
255
+ default_source :chef_repo, "#{chef_repo}"
256
+ EOH
257
+ end
258
+
259
+ it "has a default source" do
260
+ expect(policyfile.errors).to eq([])
261
+ expected = [ ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
262
+ expect(policyfile.default_source).to eq(expected)
263
+ end
264
+
265
+ end
266
+
267
+ context "with multiple default sources" do
268
+ let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
269
+
270
+ let(:policyfile_rb) do
271
+ <<-EOH
272
+ run_list "foo", "bar"
273
+
274
+ default_source :community
275
+ default_source :chef_repo, "#{chef_repo}"
276
+ EOH
277
+ end
278
+
279
+ it "has an array of sources" do
280
+ expect(policyfile.errors).to eq([])
281
+
282
+ community_source = ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
283
+ repo_source = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
284
+ expected = [ community_source, repo_source ]
285
+
286
+ expect(policyfile.default_source).to eq(expected)
287
+ end
288
+
289
+ end
290
+
291
+ end
292
+
293
+ describe "assigning cookbooks to specific sources" do
294
+
295
+ before do
296
+ expect(policyfile.errors).to eq([])
297
+ end
298
+
299
+ context "when a cookbook is assigned to a local source" do
300
+
301
+ let(:policyfile_rb) do
302
+ <<-EOH
303
+ run_list "foo"
304
+ cookbook "foo", path: "local_cookbooks/foo"
305
+ EOH
306
+ end
307
+
308
+ it "sets the source of the cookbook to the local path" do
309
+ expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {path: "local_cookbooks/foo"}, storage_config)
310
+ expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
311
+ end
312
+
313
+ end
314
+
315
+ context "when a cookbook is assigned to a git source" do
316
+ let(:policyfile_rb) do
317
+ <<-EOH
318
+ run_list "foo"
319
+ cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
320
+ EOH
321
+ end
322
+
323
+ it "sets the source of the cookbook to the git URL" do
324
+ expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {git: "git://example.com:me/foo-cookbook.git"}, storage_config)
325
+ expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
326
+ end
327
+
328
+ end
329
+
330
+ context "when a cookbook is assigned to a chef_server source" do
331
+ let(:policyfile_rb) do
332
+ <<-EOH
333
+ run_list "foo"
334
+ cookbook "foo", chef_server: "https://mychefserver.example.com"
335
+ EOH
336
+ end
337
+
338
+ # Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)
339
+ # We have to skip at the example definition level or else we fail in the before block
340
+ skip "sets the source of the cookbook to the git URL" do
341
+ expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {chef_server: "https://mychefserver.example.com"}, storage_config)
342
+ expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
343
+ end
344
+
345
+ end
346
+
347
+ end
348
+
349
+ describe "assigning a cookbook to conflicting sources" do
350
+ let(:policyfile_rb) do
351
+ <<-EOH
352
+ run_list "foo"
353
+ cookbook "foo", path: "local_cookbooks/foo"
354
+ cookbook "foo", chef_server: "https://mychefserver.example.com"
355
+ EOH
356
+ end
357
+
358
+ it "has a conflicting sources error" do
359
+ expected = <<-EOH
360
+ Cookbook 'foo' assigned to conflicting sources
361
+
362
+ Previous source: {:path=>"local_cookbooks/foo"}
363
+ Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
364
+ EOH
365
+ expect(policyfile.errors.size).to eq(1)
366
+ expect(policyfile.errors.first).to eq(expected)
367
+ end
368
+
369
+ end
370
+
371
+ describe "defining attributes" do
372
+
373
+ let(:policyfile_rb) do
374
+ <<-EOH
375
+ name "policy-with-attrs"
376
+ run_list "foo"
377
+
378
+ # basic attribute setting:
379
+ default["foo"] = "bar"
380
+
381
+ # auto-vivify
382
+ default["abc"]["def"]["ghi"] = "xyz"
383
+
384
+ # literal data structures
385
+ default["baz"] = {
386
+ "more_nested_stuff" => "yup"
387
+ }
388
+
389
+ # Array literals work and we merge rather than overwrite:
390
+ default["baz"]["an_array"] = ["a", "b", "c"]
391
+
392
+ # all the same stuff works with overrides:
393
+
394
+ override["foo"] = "bar"
395
+
396
+ override["abc"]["def"]["ghi"] = "xyz"
397
+
398
+ override["baz_override"] = {
399
+ "more_nested_stuff" => "yup"
400
+ }
401
+
402
+ override["baz_override"]["an_array"] = ["a", "b", "c"]
403
+ EOH
404
+ end
405
+
406
+ let(:expected_combined_default_attrs) do
407
+ {
408
+ "foo" => "bar",
409
+ "abc" => { "def" => { "ghi" => "xyz" } },
410
+ "baz" => {
411
+ "more_nested_stuff" => "yup",
412
+ "an_array" => ["a", "b", "c"]
413
+ }
414
+ }
415
+ end
416
+
417
+ let(:expected_combined_override_attrs) do
418
+ {
419
+ "foo" => "bar",
420
+ "abc" => { "def" => { "ghi" => "xyz" } },
421
+ "baz_override" => {
422
+ "more_nested_stuff" => "yup",
423
+ "an_array" => ["a", "b", "c"]
424
+ }
425
+ }
426
+ end
427
+
428
+ it "defines default attributes" do
429
+ expect(policyfile.errors).to eq([])
430
+ expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
431
+ end
432
+
433
+ it "defines override attributes" do
434
+ expect(policyfile.errors).to eq([])
435
+ expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
436
+ end
437
+ end
438
+
439
+ end
440
+
441
+ end