chef-cli 1.0.3

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 (372) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +32 -0
  3. data/LICENSE +201 -0
  4. data/Rakefile +70 -0
  5. data/bin/chef +25 -0
  6. data/chef-cli.gemspec +53 -0
  7. data/lib/chef-cli.rb +19 -0
  8. data/lib/chef-cli/authenticated_http.rb +22 -0
  9. data/lib/chef-cli/builtin_commands.rb +62 -0
  10. data/lib/chef-cli/chef_runner.rb +114 -0
  11. data/lib/chef-cli/chef_server_api_multi.rb +73 -0
  12. data/lib/chef-cli/cli.rb +206 -0
  13. data/lib/chef-cli/command/base.rb +89 -0
  14. data/lib/chef-cli/command/clean_policy_cookbooks.rb +115 -0
  15. data/lib/chef-cli/command/clean_policy_revisions.rb +112 -0
  16. data/lib/chef-cli/command/delete_policy.rb +121 -0
  17. data/lib/chef-cli/command/delete_policy_group.rb +121 -0
  18. data/lib/chef-cli/command/describe_cookbook.rb +98 -0
  19. data/lib/chef-cli/command/diff.rb +316 -0
  20. data/lib/chef-cli/command/env.rb +99 -0
  21. data/lib/chef-cli/command/exec.rb +45 -0
  22. data/lib/chef-cli/command/export.rb +156 -0
  23. data/lib/chef-cli/command/gem.rb +48 -0
  24. data/lib/chef-cli/command/generate.rb +123 -0
  25. data/lib/chef-cli/command/generator_commands.rb +83 -0
  26. data/lib/chef-cli/command/generator_commands/attribute.rb +37 -0
  27. data/lib/chef-cli/command/generator_commands/base.rb +157 -0
  28. data/lib/chef-cli/command/generator_commands/build_cookbook.rb +126 -0
  29. data/lib/chef-cli/command/generator_commands/chef_exts/generator_desc_resource.rb +40 -0
  30. data/lib/chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -0
  31. data/lib/chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -0
  32. data/lib/chef-cli/command/generator_commands/cookbook.rb +251 -0
  33. data/lib/chef-cli/command/generator_commands/cookbook_code_file.rb +100 -0
  34. data/lib/chef-cli/command/generator_commands/cookbook_file.rb +46 -0
  35. data/lib/chef-cli/command/generator_commands/generator_generator.rb +175 -0
  36. data/lib/chef-cli/command/generator_commands/helpers.rb +37 -0
  37. data/lib/chef-cli/command/generator_commands/policyfile.rb +125 -0
  38. data/lib/chef-cli/command/generator_commands/recipe.rb +37 -0
  39. data/lib/chef-cli/command/generator_commands/repo.rb +140 -0
  40. data/lib/chef-cli/command/generator_commands/resource.rb +37 -0
  41. data/lib/chef-cli/command/generator_commands/template.rb +47 -0
  42. data/lib/chef-cli/command/install.rb +121 -0
  43. data/lib/chef-cli/command/provision.rb +38 -0
  44. data/lib/chef-cli/command/push.rb +118 -0
  45. data/lib/chef-cli/command/push_archive.rb +126 -0
  46. data/lib/chef-cli/command/shell_init.rb +185 -0
  47. data/lib/chef-cli/command/show_policy.rb +164 -0
  48. data/lib/chef-cli/command/undelete.rb +155 -0
  49. data/lib/chef-cli/command/update.rb +140 -0
  50. data/lib/chef-cli/command/verify.rb +548 -0
  51. data/lib/chef-cli/commands_map.rb +113 -0
  52. data/lib/chef-cli/completions/bash.sh.erb +5 -0
  53. data/lib/chef-cli/completions/chef.fish.erb +10 -0
  54. data/lib/chef-cli/completions/zsh.zsh.erb +21 -0
  55. data/lib/chef-cli/component_test.rb +226 -0
  56. data/lib/chef-cli/configurable.rb +88 -0
  57. data/lib/chef-cli/cookbook_metadata.rb +45 -0
  58. data/lib/chef-cli/cookbook_omnifetch.rb +32 -0
  59. data/lib/chef-cli/cookbook_profiler/git.rb +152 -0
  60. data/lib/chef-cli/cookbook_profiler/identifiers.rb +72 -0
  61. data/lib/chef-cli/cookbook_profiler/null_scm.rb +31 -0
  62. data/lib/chef-cli/dist.rb +31 -0
  63. data/lib/chef-cli/exceptions.rb +153 -0
  64. data/lib/chef-cli/generator.rb +165 -0
  65. data/lib/chef-cli/helpers.rb +170 -0
  66. data/lib/chef-cli/pager.rb +104 -0
  67. data/lib/chef-cli/policyfile/artifactory_cookbook_source.rb +102 -0
  68. data/lib/chef-cli/policyfile/attribute_merge_checker.rb +110 -0
  69. data/lib/chef-cli/policyfile/chef_repo_cookbook_source.rb +138 -0
  70. data/lib/chef-cli/policyfile/chef_server_cookbook_source.rb +99 -0
  71. data/lib/chef-cli/policyfile/chef_server_lock_fetcher.rb +167 -0
  72. data/lib/chef-cli/policyfile/community_cookbook_source.rb +95 -0
  73. data/lib/chef-cli/policyfile/comparison_base.rb +123 -0
  74. data/lib/chef-cli/policyfile/cookbook_location_specification.rb +154 -0
  75. data/lib/chef-cli/policyfile/cookbook_locks.rb +466 -0
  76. data/lib/chef-cli/policyfile/cookbook_sources.rb +23 -0
  77. data/lib/chef-cli/policyfile/delivery_supermarket_source.rb +89 -0
  78. data/lib/chef-cli/policyfile/differ.rb +263 -0
  79. data/lib/chef-cli/policyfile/dsl.rb +288 -0
  80. data/lib/chef-cli/policyfile/git_lock_fetcher.rb +265 -0
  81. data/lib/chef-cli/policyfile/included_policies_cookbook_source.rb +156 -0
  82. data/lib/chef-cli/policyfile/lister.rb +229 -0
  83. data/lib/chef-cli/policyfile/local_lock_fetcher.rb +132 -0
  84. data/lib/chef-cli/policyfile/lock_applier.rb +80 -0
  85. data/lib/chef-cli/policyfile/lock_fetcher_mixin.rb +37 -0
  86. data/lib/chef-cli/policyfile/null_cookbook_source.rb +49 -0
  87. data/lib/chef-cli/policyfile/policyfile_location_specification.rb +128 -0
  88. data/lib/chef-cli/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -0
  89. data/lib/chef-cli/policyfile/remote_lock_fetcher.rb +108 -0
  90. data/lib/chef-cli/policyfile/reports/install.rb +69 -0
  91. data/lib/chef-cli/policyfile/reports/table_printer.rb +57 -0
  92. data/lib/chef-cli/policyfile/reports/upload.rb +70 -0
  93. data/lib/chef-cli/policyfile/solution_dependencies.rb +311 -0
  94. data/lib/chef-cli/policyfile/source_uri.rb +57 -0
  95. data/lib/chef-cli/policyfile/storage_config.rb +112 -0
  96. data/lib/chef-cli/policyfile/undo_record.rb +139 -0
  97. data/lib/chef-cli/policyfile/undo_stack.rb +128 -0
  98. data/lib/chef-cli/policyfile/uploader.rb +222 -0
  99. data/lib/chef-cli/policyfile_compiler.rb +528 -0
  100. data/lib/chef-cli/policyfile_lock.rb +581 -0
  101. data/lib/chef-cli/policyfile_services/clean_policies.rb +95 -0
  102. data/lib/chef-cli/policyfile_services/clean_policy_cookbooks.rb +123 -0
  103. data/lib/chef-cli/policyfile_services/export_repo.rb +419 -0
  104. data/lib/chef-cli/policyfile_services/install.rb +167 -0
  105. data/lib/chef-cli/policyfile_services/push.rb +112 -0
  106. data/lib/chef-cli/policyfile_services/push_archive.rb +164 -0
  107. data/lib/chef-cli/policyfile_services/rm_policy.rb +141 -0
  108. data/lib/chef-cli/policyfile_services/rm_policy_group.rb +85 -0
  109. data/lib/chef-cli/policyfile_services/show_policy.rb +234 -0
  110. data/lib/chef-cli/policyfile_services/undelete.rb +108 -0
  111. data/lib/chef-cli/policyfile_services/update_attributes.rb +110 -0
  112. data/lib/chef-cli/service_exception_inspectors.rb +24 -0
  113. data/lib/chef-cli/service_exception_inspectors/base.rb +39 -0
  114. data/lib/chef-cli/service_exception_inspectors/http.rb +119 -0
  115. data/lib/chef-cli/service_exceptions.rb +142 -0
  116. data/lib/chef-cli/shell_out.rb +36 -0
  117. data/lib/chef-cli/skeletons/code_generator/files/default/Berksfile +3 -0
  118. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
  119. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +21 -0
  120. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
  121. data/lib/chef-cli/skeletons/code_generator/files/default/chefignore +110 -0
  122. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
  123. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -0
  124. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +17 -0
  125. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-project.toml +34 -0
  126. data/lib/chef-cli/skeletons/code_generator/files/default/gitignore +22 -0
  127. data/lib/chef-cli/skeletons/code_generator/files/default/repo/README.md +20 -0
  128. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
  129. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
  130. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
  131. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
  132. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
  133. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
  134. data/lib/chef-cli/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  135. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
  136. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
  137. data/lib/chef-cli/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -0
  138. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
  139. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
  140. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper.rb +2 -0
  141. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  142. data/lib/chef-cli/skeletons/code_generator/metadata.rb +8 -0
  143. data/lib/chef-cli/skeletons/code_generator/recipes/attribute.rb +11 -0
  144. data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +175 -0
  145. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +167 -0
  146. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook_file.rb +23 -0
  147. data/lib/chef-cli/skeletons/code_generator/recipes/helpers.rb +19 -0
  148. data/lib/chef-cli/skeletons/code_generator/recipes/policyfile.rb +7 -0
  149. data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +50 -0
  150. data/lib/chef-cli/skeletons/code_generator/recipes/repo.rb +71 -0
  151. data/lib/chef-cli/skeletons/code_generator/recipes/resource.rb +12 -0
  152. data/lib/chef-cli/skeletons/code_generator/recipes/template.rb +31 -0
  153. data/lib/chef-cli/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -0
  154. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
  155. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
  156. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
  157. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
  158. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
  159. data/lib/chef-cli/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
  160. data/lib/chef-cli/skeletons/code_generator/templates/default/README.md.erb +4 -0
  161. data/lib/chef-cli/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  162. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
  163. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
  164. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +9 -0
  165. data/lib/chef-cli/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  166. data/lib/chef-cli/skeletons/code_generator/templates/default/helpers.rb.erb +39 -0
  167. data/lib/chef-cli/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -0
  168. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen.yml.erb +38 -0
  169. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +36 -0
  170. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -0
  171. data/lib/chef-cli/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
  172. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
  173. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe_spec.rb.erb +29 -0
  174. data/lib/chef-cli/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
  175. data/lib/chef-cli/skeletons/code_generator/templates/default/resource.rb.erb +1 -0
  176. data/lib/chef-cli/skeletons/code_generator/templates/default/template.erb +0 -0
  177. data/lib/chef-cli/ui.rb +57 -0
  178. data/lib/chef-cli/version.rb +20 -0
  179. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -0
  180. data/spec/shared/a_file_generator.rb +125 -0
  181. data/spec/shared/a_generated_file.rb +12 -0
  182. data/spec/shared/command_with_ui_object.rb +11 -0
  183. data/spec/shared/custom_generator_cookbook.rb +136 -0
  184. data/spec/shared/fixture_cookbook_checksums.rb +46 -0
  185. data/spec/shared/setup_git_committer_config.rb +54 -0
  186. data/spec/shared/setup_git_cookbooks.rb +53 -0
  187. data/spec/spec_helper.rb +51 -0
  188. data/spec/test_helpers.rb +84 -0
  189. data/spec/unit/chef_runner_spec.rb +139 -0
  190. data/spec/unit/chef_server_api_multi_spec.rb +120 -0
  191. data/spec/unit/cli_spec.rb +375 -0
  192. data/spec/unit/command/base_spec.rb +195 -0
  193. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -0
  194. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -0
  195. data/spec/unit/command/delete_policy_group_spec.rb +206 -0
  196. data/spec/unit/command/delete_policy_spec.rb +206 -0
  197. data/spec/unit/command/diff_spec.rb +311 -0
  198. data/spec/unit/command/env_spec.rb +86 -0
  199. data/spec/unit/command/exec_spec.rb +178 -0
  200. data/spec/unit/command/export_spec.rb +199 -0
  201. data/spec/unit/command/generate_spec.rb +142 -0
  202. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -0
  203. data/spec/unit/command/generator_commands/base_spec.rb +180 -0
  204. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -0
  205. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +77 -0
  206. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
  207. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -0
  208. data/spec/unit/command/generator_commands/cookbook_spec.rb +769 -0
  209. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -0
  210. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -0
  211. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -0
  212. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -0
  213. data/spec/unit/command/generator_commands/repo_spec.rb +374 -0
  214. data/spec/unit/command/generator_commands/resource_spec.rb +31 -0
  215. data/spec/unit/command/generator_commands/template_spec.rb +31 -0
  216. data/spec/unit/command/install_spec.rb +179 -0
  217. data/spec/unit/command/push_archive_spec.rb +153 -0
  218. data/spec/unit/command/push_spec.rb +198 -0
  219. data/spec/unit/command/shell_init_spec.rb +339 -0
  220. data/spec/unit/command/show_policy_spec.rb +234 -0
  221. data/spec/unit/command/undelete_spec.rb +244 -0
  222. data/spec/unit/command/update_spec.rb +283 -0
  223. data/spec/unit/command/verify_spec.rb +341 -0
  224. data/spec/unit/commands_map_spec.rb +57 -0
  225. data/spec/unit/component_test_spec.rb +128 -0
  226. data/spec/unit/configurable_spec.rb +68 -0
  227. data/spec/unit/cookbook_metadata_spec.rb +96 -0
  228. data/spec/unit/cookbook_profiler/git_spec.rb +176 -0
  229. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -0
  230. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
  231. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
  232. data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
  233. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
  234. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -0
  235. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -0
  236. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  237. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
  238. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  239. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  242. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
  243. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
  244. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
  245. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
  248. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
  249. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
  250. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
  251. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/kitchen.yml +16 -0
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
  254. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
  255. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
  256. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
  257. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
  258. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
  259. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -0
  260. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
  261. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  262. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  263. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  264. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  265. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  276. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  277. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
  278. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
  279. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
  280. data/spec/unit/fixtures/example_cookbook/README.md +4 -0
  281. data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
  282. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
  283. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
  284. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
  285. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
  286. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
  287. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
  291. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
  292. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
  293. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
  294. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
  297. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
  298. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
  299. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
  300. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
  301. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
  302. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
  303. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
  304. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
  306. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
  307. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
  308. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
  309. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
  313. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
  314. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  316. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  317. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  318. data/spec/unit/generator_spec.rb +119 -0
  319. data/spec/unit/pager_spec.rb +117 -0
  320. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -0
  321. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -0
  322. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -0
  323. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -0
  324. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -0
  325. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -0
  326. data/spec/unit/policyfile/comparison_base_spec.rb +340 -0
  327. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -0
  328. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -0
  329. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -0
  330. data/spec/unit/policyfile/differ_spec.rb +686 -0
  331. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -0
  332. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -0
  333. data/spec/unit/policyfile/lister_spec.rb +268 -0
  334. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -0
  335. data/spec/unit/policyfile/lock_applier_spec.rb +100 -0
  336. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  337. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -0
  338. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -0
  339. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  340. data/spec/unit/policyfile/reports/install_spec.rb +114 -0
  341. data/spec/unit/policyfile/reports/upload_spec.rb +94 -0
  342. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -0
  343. data/spec/unit/policyfile/source_uri_spec.rb +36 -0
  344. data/spec/unit/policyfile/storage_config_spec.rb +180 -0
  345. data/spec/unit/policyfile/undo_record_spec.rb +258 -0
  346. data/spec/unit/policyfile/undo_stack_spec.rb +265 -0
  347. data/spec/unit/policyfile/uploader_spec.rb +410 -0
  348. data/spec/unit/policyfile_demands_spec.rb +1197 -0
  349. data/spec/unit/policyfile_evaluation_spec.rb +628 -0
  350. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -0
  351. data/spec/unit/policyfile_includes_spec.rb +720 -0
  352. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -0
  353. data/spec/unit/policyfile_lock_build_spec.rb +1065 -0
  354. data/spec/unit/policyfile_lock_install_spec.rb +137 -0
  355. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -0
  356. data/spec/unit/policyfile_lock_validation_spec.rb +608 -0
  357. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -0
  358. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -0
  359. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -0
  360. data/spec/unit/policyfile_services/install_spec.rb +209 -0
  361. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -0
  362. data/spec/unit/policyfile_services/push_spec.rb +249 -0
  363. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -0
  364. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -0
  365. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -0
  366. data/spec/unit/policyfile_services/undelete_spec.rb +302 -0
  367. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -0
  368. data/spec/unit/policyfile_services/update_spec.rb +162 -0
  369. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -0
  370. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -0
  371. data/spec/unit/shell_out_spec.rb +34 -0
  372. metadata +796 -0
@@ -0,0 +1,628 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2018, 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-cli/policyfile_compiler"
20
+
21
+ describe ChefCLI::PolicyfileCompiler do
22
+
23
+ let(:storage_config) { ChefCLI::Policyfile::StorageConfig.new.use_policyfile("TestPolicyfile.rb") }
24
+
25
+ let(:policyfile) { ChefCLI::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(ChefCLI::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
+ expect(policyfile.errors.size).to eq(1)
56
+ expect(policyfile.errors.first).to match(/Invalid Ruby syntax in Policyfile 'TestPolicyfile.rb'/)
57
+ end
58
+
59
+ end
60
+
61
+ context "Given a policyfile with a ruby error" do
62
+
63
+ let(:policyfile_rb) { "raise 'oops'" }
64
+
65
+ it "has an error message with code context" do
66
+ expect(policyfile.errors.size).to eq(1)
67
+ expected_message = <<~E
68
+ Evaluation of policyfile 'TestPolicyfile.rb' raised an exception
69
+ Exception: RuntimeError "oops"
70
+
71
+ Relevant Code:
72
+ 1: raise 'oops'
73
+
74
+ Backtrace:
75
+ TestPolicyfile.rb:1:in `eval_policyfile'
76
+ E
77
+ expect(policyfile.errors.first).to eq(expected_message)
78
+ end
79
+ end
80
+
81
+ context "when given an invalid run list item" do
82
+
83
+ context "when there is only one colon between cookbook and recipe name" do
84
+
85
+ let(:policyfile_rb) do
86
+ <<-EOH
87
+ name "hello"
88
+
89
+ # Should be "foo::bar" (missing a colon)
90
+ run_list "foo:bar"
91
+ EOH
92
+ end
93
+
94
+ it "has an error message with the offending run list item" do
95
+ expect(policyfile.errors).to_not be_empty
96
+ expected_message = "Run List Item 'foo:bar' has invalid cookbook name 'foo:bar'.\n" +
97
+ "Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
98
+ "Did you mean 'foo::bar'?"
99
+ expect(policyfile.errors.first).to eq(expected_message)
100
+ end
101
+ end
102
+
103
+ context "when there is only one colon between cookbook and recipe name in fully qualified form" do
104
+
105
+ let(:policyfile_rb) do
106
+ <<-EOH
107
+ name "hello"
108
+
109
+ # Should be "foo::bar" (missing a colon)
110
+ run_list "recipe[foo:bar]"
111
+ EOH
112
+ end
113
+
114
+ it "has an error message with the offending run list item" do
115
+ expect(policyfile.errors).to_not be_empty
116
+ expected_message = "Run List Item 'recipe[foo:bar]' has invalid cookbook name 'foo:bar'.\n" +
117
+ "Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
118
+ "Did you mean 'recipe[foo::bar]'?"
119
+ expect(policyfile.errors.first).to eq(expected_message)
120
+ end
121
+ end
122
+
123
+ context "when the recipe name is empty" do
124
+
125
+ let(:policyfile_rb) do
126
+ <<-EOH
127
+ name "hello"
128
+
129
+ # Should be "foo::default" or just "foo"
130
+ run_list "foo::"
131
+ EOH
132
+ end
133
+
134
+ it "has an error message with the offending run list item" do
135
+ expect(policyfile.errors).to_not be_empty
136
+ expected_message = "Run List Item 'foo::' has invalid recipe name ''.\nRecipe names can only contain alphanumerics, hyphens, and underscores."
137
+ expect(policyfile.errors.first).to eq(expected_message)
138
+ end
139
+
140
+ end
141
+
142
+ context "with an invalid run list item in a named run list" do
143
+
144
+ let(:policyfile_rb) do
145
+ <<-EOH
146
+ name "hello"
147
+
148
+ # this one is valid:
149
+ run_list "foo"
150
+
151
+ named_run_list :oops, "foo:bar"
152
+ EOH
153
+ end
154
+
155
+ it "has an error message with the offending run list item" do
156
+ expect(policyfile.errors).to_not be_empty
157
+ expected_message = "Named Run List 'oops' Item 'foo:bar' has invalid cookbook name 'foo:bar'.\n" +
158
+ "Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
159
+ "Did you mean 'foo::bar'?"
160
+ expect(policyfile.errors.first).to eq(expected_message)
161
+ end
162
+
163
+ end
164
+ end
165
+
166
+ context "when policyfile evaluation is aborted by user signal" do
167
+
168
+ let(:policyfile_rb) { "raise Interrupt" }
169
+
170
+ it "allows the exception to bubble up" do
171
+ expect { policyfile }.to raise_error(Interrupt)
172
+ end
173
+ end
174
+
175
+ context "when given an invalid default source type" do
176
+
177
+ let(:policyfile_rb) do
178
+ <<-EOH
179
+ run_list "foo"
180
+ default_source :herp, "derp"
181
+ EOH
182
+ end
183
+
184
+ it "has an invalid source error" do
185
+ expect(policyfile.errors.size).to eq(1)
186
+ expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
187
+ end
188
+ end
189
+
190
+ context "when the url is omitted for chef server default source" do
191
+ let(:policyfile_rb) do
192
+ <<-EOH
193
+ run_list "foo"
194
+ default_source :chef_server
195
+ EOH
196
+ end
197
+
198
+ it "has an invalid source error" do
199
+ expect(policyfile.errors.size).to eq(1)
200
+ expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
201
+ end
202
+
203
+ end
204
+
205
+ context "when a per-cookbook source is specified with invalid options" do
206
+ let(:policyfile_rb) do
207
+ <<-EOH
208
+ run_list "foo"
209
+
210
+ cookbook "foo", herp: "derp"
211
+ EOH
212
+ end
213
+
214
+ it "has an invalid source error" do
215
+ expect(policyfile.errors.size).to eq(1)
216
+ message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
217
+ expect(policyfile.errors.first).to eq(message)
218
+ end
219
+ end
220
+ end
221
+
222
+ context "Given a minimal valid policyfile" do
223
+
224
+ let(:policyfile_rb) do
225
+ <<-EOH
226
+ name "hello"
227
+
228
+ run_list "foo", "bar"
229
+ EOH
230
+ end
231
+
232
+ it "has no errors" do
233
+ expect(policyfile.errors).to eq([])
234
+ end
235
+
236
+ it "has a name" do
237
+ expect(policyfile.name).to eq("hello")
238
+ end
239
+
240
+ it "has a run_list" do
241
+ expect(policyfile.run_list).to eq(%w{foo bar})
242
+ end
243
+
244
+ it "gives the run_list as the expanded run_list" do
245
+ expect(policyfile.expanded_run_list).to eq(%w{foo bar})
246
+ end
247
+
248
+ it "has no default cookbook source" do
249
+ expect(policyfile.default_source).to be_an(Array)
250
+ expect(policyfile.default_source.size).to eq(1)
251
+ expect(policyfile.default_source.first).to be_a(ChefCLI::Policyfile::NullCookbookSource)
252
+ end
253
+
254
+ context "with the default source set to the community site" do
255
+
256
+ let(:policyfile_rb) do
257
+ <<-EOH
258
+ run_list "foo", "bar"
259
+ default_source :community
260
+ EOH
261
+ end
262
+
263
+ it "has a default source" do
264
+ expect(policyfile.errors).to eq([])
265
+ expected = [ ChefCLI::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
266
+ expect(policyfile.default_source).to eq(expected)
267
+ end
268
+
269
+ context "with a custom URI" do
270
+
271
+ let(:policyfile_rb) do
272
+ <<-EOH
273
+ run_list "foo", "bar"
274
+ default_source :community, "https://cookbook-api.example.com"
275
+ EOH
276
+ end
277
+
278
+ it "has a default source" do
279
+ expect(policyfile.errors).to eq([])
280
+ expected = [ ChefCLI::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
281
+ expect(policyfile.default_source).to eq(expected)
282
+ end
283
+
284
+ end
285
+
286
+ context "with an added cookbook with no options" do
287
+
288
+ let(:policyfile_rb) do
289
+ <<-EOH
290
+ run_list "foo", "bar"
291
+ cookbook "baz"
292
+ EOH
293
+ end
294
+
295
+ it "adds the cookbook to the list of location specs" do
296
+ expect(policyfile.errors).to eq([])
297
+ expected_cb_spec = ChefCLI::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
298
+ expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
299
+ end
300
+ end
301
+
302
+ end
303
+
304
+ context "with the default source set to a delivery_supermarket" do
305
+
306
+ context "when no URI is given" do
307
+
308
+ let(:policyfile_rb) do
309
+ <<-EOH
310
+ run_list "foo", "bar"
311
+ default_source :delivery_supermarket
312
+ EOH
313
+ end
314
+
315
+ it "errors out with a message that the supermarket URI is required" do
316
+ expect(policyfile.errors).to eq([ "You must specify the server's URI when using a default_source :delivery_supermarket" ])
317
+ end
318
+
319
+ end
320
+
321
+ context "when the URI is given" do
322
+
323
+ let(:policyfile_rb) do
324
+ <<-EOH
325
+ run_list "foo", "bar"
326
+ default_source :delivery_supermarket, "https://supermarket.example.com"
327
+ EOH
328
+ end
329
+
330
+ it "sets the default source to the delivery_supermarket" do
331
+ expect(policyfile.errors).to eq([])
332
+ expected = [ ChefCLI::Policyfile::DeliverySupermarketSource.new("https://supermarket.example.com") ]
333
+ expect(policyfile.default_source).to eq(expected)
334
+ end
335
+
336
+ end
337
+
338
+ end
339
+
340
+ context "with the default source set to a chef server" do
341
+
342
+ let(:policyfile_rb) do
343
+ <<-EOH
344
+ run_list "foo", "bar"
345
+ default_source :chef_server, "https://mychef.example.com"
346
+ EOH
347
+ end
348
+
349
+ it "has a default source" do
350
+ expect(policyfile.errors).to eq([])
351
+ expected = [ ChefCLI::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com") ]
352
+ expect(policyfile.default_source).to eq(expected)
353
+ end
354
+
355
+ end
356
+
357
+ context "with the default source set to a chef-repo path" do
358
+
359
+ let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
360
+
361
+ let(:policyfile_rb) do
362
+ <<-EOH
363
+ run_list "foo", "bar"
364
+ default_source :chef_repo, "#{chef_repo}"
365
+ EOH
366
+ end
367
+
368
+ it "has a default source" do
369
+ expect(policyfile.errors).to eq([])
370
+ expected = [ ChefCLI::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
371
+ expect(policyfile.default_source).to eq(expected)
372
+ end
373
+
374
+ context "when the path to the chef repo is relative" do
375
+
376
+ let(:policyfile_rb) do
377
+ <<-EOH
378
+ run_list "foo", "bar"
379
+ default_source :chef_repo, "../cookbooks"
380
+ EOH
381
+ end
382
+
383
+ # storage_config is created with path to Policyfile.rb in CWD
384
+ let(:expected_path) { File.expand_path("../cookbooks") }
385
+
386
+ it "sets the repo path relative to the directory the policyfile is in" do
387
+ expect(policyfile.errors).to eq([])
388
+ expect(policyfile.default_source.size).to eq(1)
389
+ expect(policyfile.default_source.first).to be_a(ChefCLI::Policyfile::ChefRepoCookbookSource)
390
+ expect(policyfile.default_source.first.path).to eq(expected_path)
391
+ end
392
+
393
+ end
394
+
395
+ end
396
+
397
+ context "with multiple default sources" do
398
+ let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
399
+
400
+ let(:policyfile_rb) do
401
+ <<-EOH
402
+ run_list "foo", "bar"
403
+
404
+ default_source :community
405
+ default_source :chef_repo, "#{chef_repo}"
406
+ EOH
407
+ end
408
+
409
+ it "has an array of sources" do
410
+ expect(policyfile.errors).to eq([])
411
+
412
+ community_source = ChefCLI::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
413
+ repo_source = ChefCLI::Policyfile::ChefRepoCookbookSource.new(chef_repo)
414
+ expected = [ community_source, repo_source ]
415
+
416
+ expect(policyfile.default_source).to eq(expected)
417
+ end
418
+
419
+ end
420
+
421
+ context "with multiple supermarkets with source preferences set for specific cookbooks" do
422
+
423
+ context "when the preferences don't conflict" do
424
+ let(:policyfile_rb) do
425
+ <<-EOH
426
+ run_list "foo", "bar", "baz"
427
+
428
+ default_source :supermarket do |s|
429
+ s.preferred_for "foo"
430
+ end
431
+
432
+ default_source :supermarket, "https://mart.example" do |s|
433
+ s.preferred_for "bar", "baz"
434
+ end
435
+ EOH
436
+ end
437
+
438
+ it "has an array of sources, with cookbook preferences set" do
439
+ expect(policyfile.errors).to eq([])
440
+ expect(policyfile.default_source.size).to eq(2)
441
+
442
+ public_supermarket = policyfile.default_source.first
443
+ expect(public_supermarket.preferred_cookbooks).to eq(%w{ foo })
444
+
445
+ private_supermarket = policyfile.default_source.last
446
+ expect(private_supermarket.uri).to eq("https://mart.example")
447
+ expect(private_supermarket.preferred_cookbooks).to eq(%w{ bar baz })
448
+ end
449
+
450
+ end
451
+
452
+ context "when the preferences conflict" do
453
+ let(:policyfile_rb) do
454
+ # both supermarkets are the preferred source for "foo"
455
+ <<-EOH
456
+ run_list "foo", "bar"
457
+
458
+ default_source :supermarket do |s|
459
+ s.preferred_for "foo"
460
+ end
461
+
462
+ default_source :supermarket, "https://mart.example" do |s|
463
+ s.preferred_for "foo"
464
+ end
465
+ EOH
466
+ end
467
+
468
+ it "emits an error" do
469
+ err = <<~MESSAGE
470
+ Multiple sources are marked as the preferred source for some cookbooks. Only one source can be preferred for a cookbook.
471
+ supermarket(https://supermarket.chef.io) and supermarket(https://mart.example) are both set as the preferred source for cookbook(s) 'foo'
472
+ MESSAGE
473
+ expect(policyfile.errors).to eq([err])
474
+ end
475
+
476
+ end
477
+
478
+ end
479
+
480
+ end
481
+
482
+ describe "assigning cookbooks to specific sources" do
483
+
484
+ before do
485
+ expect(policyfile.errors).to eq([])
486
+ end
487
+
488
+ context "when a cookbook is assigned to a local source" do
489
+
490
+ let(:policyfile_rb) do
491
+ <<-EOH
492
+ run_list "foo"
493
+ cookbook "foo", path: "local_cookbooks/foo"
494
+ EOH
495
+ end
496
+
497
+ it "sets the source of the cookbook to the local path" do
498
+ expected_cb_spec = ChefCLI::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", { path: "local_cookbooks/foo" }, storage_config)
499
+ expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
500
+ end
501
+
502
+ end
503
+
504
+ context "when a cookbook is assigned to a git source" do
505
+ let(:policyfile_rb) do
506
+ <<-EOH
507
+ run_list "foo"
508
+ cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
509
+ EOH
510
+ end
511
+
512
+ it "sets the source of the cookbook to the git URL" do
513
+ expected_cb_spec = ChefCLI::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", { git: "git://example.com:me/foo-cookbook.git" }, storage_config)
514
+ expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
515
+ end
516
+
517
+ end
518
+
519
+ context "when a cookbook is assigned to a chef_server source" do
520
+ let(:policyfile_rb) do
521
+ <<-EOH
522
+ run_list "foo"
523
+ cookbook "foo", chef_server: "https://mychefserver.example.com"
524
+ EOH
525
+ end
526
+
527
+ it "sets the source of the cookbook to the git URL" do
528
+ expected_cb_spec = ChefCLI::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", { chef_server: "https://mychefserver.example.com" }, storage_config)
529
+ expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
530
+ end
531
+
532
+ end
533
+
534
+ end
535
+
536
+ describe "assigning a cookbook to conflicting sources" do
537
+ let(:policyfile_rb) do
538
+ <<-EOH
539
+ run_list "foo"
540
+ cookbook "foo", path: "local_cookbooks/foo"
541
+ cookbook "foo", chef_server: "https://mychefserver.example.com"
542
+ EOH
543
+ end
544
+
545
+ it "has a conflicting sources error" do
546
+ expected = <<~EOH
547
+ Cookbook 'foo' assigned to conflicting sources
548
+
549
+ Previous source: {:path=>"local_cookbooks/foo"}
550
+ Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
551
+ EOH
552
+ expect(policyfile.errors.size).to eq(1)
553
+ expect(policyfile.errors.first).to eq(expected)
554
+ end
555
+
556
+ end
557
+
558
+ describe "defining attributes" do
559
+
560
+ let(:policyfile_rb) do
561
+ <<-EOH
562
+ name "policy-with-attrs"
563
+ run_list "foo"
564
+
565
+ # basic attribute setting:
566
+ default["foo"] = "bar"
567
+
568
+ # auto-vivify
569
+ default["abc"]["def"]["ghi"] = "xyz"
570
+
571
+ # literal data structures
572
+ default["baz"] = {
573
+ "more_nested_stuff" => "yup"
574
+ }
575
+
576
+ # Array literals work and we merge rather than overwrite:
577
+ default["baz"]["an_array"] = ["a", "b", "c"]
578
+
579
+ # all the same stuff works with overrides:
580
+
581
+ override["foo"] = "bar"
582
+
583
+ override["abc"]["def"]["ghi"] = "xyz"
584
+
585
+ override["baz_override"] = {
586
+ "more_nested_stuff" => "yup"
587
+ }
588
+
589
+ override["baz_override"]["an_array"] = ["a", "b", "c"]
590
+ EOH
591
+ end
592
+
593
+ let(:expected_combined_default_attrs) do
594
+ {
595
+ "foo" => "bar",
596
+ "abc" => { "def" => { "ghi" => "xyz" } },
597
+ "baz" => {
598
+ "more_nested_stuff" => "yup",
599
+ "an_array" => %w{a b c},
600
+ },
601
+ }
602
+ end
603
+
604
+ let(:expected_combined_override_attrs) do
605
+ {
606
+ "foo" => "bar",
607
+ "abc" => { "def" => { "ghi" => "xyz" } },
608
+ "baz_override" => {
609
+ "more_nested_stuff" => "yup",
610
+ "an_array" => %w{a b c},
611
+ },
612
+ }
613
+ end
614
+
615
+ it "defines default attributes" do
616
+ expect(policyfile.errors).to eq([])
617
+ expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
618
+ end
619
+
620
+ it "defines override attributes" do
621
+ expect(policyfile.errors).to eq([])
622
+ expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
623
+ end
624
+ end
625
+
626
+ end
627
+
628
+ end