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,37 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2019 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_relative "cookbook_code_file"
19
+ require_relative "../../dist"
20
+
21
+ module ChefCLI
22
+ module Command
23
+ module GeneratorCommands
24
+ # chef generate attribute [path/to/cookbook_root] NAME
25
+ class Attribute < CookbookCodeFile
26
+
27
+ banner "Usage: #{ChefCLI::Dist::EXEC} generate attribute [path/to/cookbook] NAME [options]"
28
+
29
+ options.merge!(SharedGeneratorOptions.options)
30
+
31
+ def recipe
32
+ "attribute"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,157 @@
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_relative "../../configurable"
19
+ require_relative "../generator_commands"
20
+
21
+ require_relative "chef_exts/recipe_dsl_ext"
22
+ require_relative "chef_exts/generator_desc_resource"
23
+
24
+ module ChefCLI
25
+ module Command
26
+ module GeneratorCommands
27
+ # ## Base
28
+ #
29
+ # Base class for `chef generate` subcommands. Contains basic behaviors
30
+ # for setting up the generator context, detecting git, and launching a
31
+ # chef converge.
32
+ #
33
+ # The behavior of the generators is largely delegated to a chef cookbook.
34
+ # The default implementation is the `code_generator` cookbook in
35
+ # chef-cli/skeletons/code_generator.
36
+ class Base < Command::Base
37
+
38
+ include Configurable
39
+
40
+ attr_reader :params
41
+
42
+ options.merge!(SharedGeneratorOptions.options)
43
+
44
+ def initialize(params)
45
+ super()
46
+ @params = params
47
+
48
+ @generator_cookbook_path = nil
49
+ @generator_cookbook_name = nil
50
+ end
51
+
52
+ # An instance of ChefRunner. Calling ChefRunner#converge will trigger
53
+ # convergence and generate the desired code.
54
+ def chef_runner
55
+ @chef_runner ||= ChefRunner.new(generator_cookbook_path, ["recipe[#{generator_cookbook_name}::#{recipe}]"])
56
+ end
57
+
58
+ # Path to the directory where the code_generator cookbook is located.
59
+ def generator_cookbook_path
60
+ detect_generator_cookbook_name_and_path! unless @generator_cookbook_path
61
+ @generator_cookbook_path
62
+ end
63
+
64
+ def generator_cookbook_name
65
+ detect_generator_cookbook_name_and_path! unless @generator_cookbook_name
66
+ @generator_cookbook_name
67
+ end
68
+
69
+ # Sets git related generator_context values.
70
+ def setup_context
71
+ apply_generator_values_from_config
72
+ Generator.add_attr_to_context(:have_git, have_git?)
73
+ Generator.add_attr_to_context(:skip_git_init, false)
74
+ config.each do |k, v|
75
+ Generator.add_attr_to_context(k, v)
76
+ end
77
+ # inject the arbitrary args supplied on cmdline, default = []
78
+ config[:generator_arg].each do |k, v|
79
+ Generator.add_attr_to_context(k, v)
80
+ end
81
+ end
82
+
83
+ # Checks the `PATH` for the presence of a `git` (or `git.exe`, on
84
+ # windows) executable.
85
+ def have_git?
86
+ path = ENV["PATH"] || ""
87
+ paths = path.split(File::PATH_SEPARATOR)
88
+ exts = [RbConfig::CONFIG["EXEEXT"]]
89
+ exts.concat(ENV["PATHEXT"].split(";")) unless ENV["PATHEXT"].nil?
90
+ paths.any? do |bin_path|
91
+ exts.any? do |ext|
92
+ File.exist?(File.join(bin_path, "git#{ext}"))
93
+ end
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ # Inspects the `config[:generator_cookbook]` option to determine the
100
+ # generator_cookbook_name and generator_cookbook_path. There are two
101
+ # supported ways this can work:
102
+ #
103
+ # * `config[:generator_cookbook]` is the full path to the generator
104
+ # cookbook. In this case, the last path component is the cookbook name,
105
+ # and the parent directory is the cookbook path
106
+ # * `config[:generator_cookbook]` is the path to a directory that
107
+ # contains a cookbook named "code_generator" (DEPRECATED). This is how
108
+ # the `--generator-cookbook` feature was originally written, so we
109
+ # support this for backwards compatibility. This way has poor UX and
110
+ # we'd like to get rid of it, so a warning is printed in this case.
111
+ def detect_generator_cookbook_name_and_path!
112
+ given_path = generator_cookbook_option
113
+ code_generator_subdir = File.join(given_path, "code_generator")
114
+ if File.directory?(code_generator_subdir)
115
+ @generator_cookbook_name = "code_generator"
116
+ @generator_cookbook_path = given_path
117
+ err("WARN: Please configure the generator cookbook by giving the full path to the desired cookbook (like '#{code_generator_subdir}')")
118
+ else
119
+ @generator_cookbook_name = File.basename(given_path)
120
+ @generator_cookbook_path = File.dirname(given_path)
121
+ end
122
+ end
123
+
124
+ def generator_cookbook_option
125
+ config[:generator_cookbook] || chefcli_config.generator_cookbook
126
+ end
127
+
128
+ # Load any values that were not defined via cli switches from Chef
129
+ # configuration
130
+ #
131
+ def apply_generator_values_from_config
132
+ config[:copyright_holder] ||= coerce_generator_copyright_holder
133
+ config[:email] ||= coerce_generator_email
134
+ config[:license] ||= coerce_generator_license
135
+ end
136
+
137
+ def coerce_generator_copyright_holder
138
+ generator_config.copyright_holder ||
139
+ knife_config.cookbook_copyright ||
140
+ "The Authors"
141
+ end
142
+
143
+ def coerce_generator_email
144
+ generator_config.email ||
145
+ knife_config.cookbook_email ||
146
+ "you@example.com"
147
+ end
148
+
149
+ def coerce_generator_license
150
+ generator_config.license ||
151
+ knife_config.cookbook_license ||
152
+ "all_rights"
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,126 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016-2019 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_relative "base"
19
+ require_relative "../../dist"
20
+
21
+ module ChefCLI
22
+ module Command
23
+ module GeneratorCommands
24
+
25
+ class BuildCookbook < Base
26
+
27
+ banner "Usage: #{ChefCLI::Dist::EXEC} generate build-cookbook NAME [options]"
28
+
29
+ attr_reader :errors
30
+
31
+ attr_reader :cookbook_name_or_path
32
+
33
+ option :pipeline,
34
+ long: "--pipeline PIPELINE",
35
+ description: "Use PIPELINE to set target branch to something other than master for the build_cookbook",
36
+ default: "master"
37
+
38
+ options.merge!(SharedGeneratorOptions.options)
39
+
40
+ def initialize(params)
41
+ @params_valid = true
42
+ @cookbook_name = nil
43
+ super
44
+ end
45
+
46
+ def run
47
+ read_and_validate_params
48
+ if params_valid?
49
+ setup_context
50
+ chef_runner.converge
51
+ 0
52
+ else
53
+ err(opt_parser)
54
+ 1
55
+ end
56
+ rescue ChefCLI::ChefRunnerError => e
57
+ err("ERROR: #{e}")
58
+ 1
59
+ end
60
+
61
+ def setup_context
62
+ super
63
+ Generator.add_attr_to_context(:workflow_project_dir, workflow_project_dir)
64
+
65
+ Generator.add_attr_to_context(:workflow_project_git_initialized, workflow_project_git_initialized?)
66
+ Generator.add_attr_to_context(:build_cookbook_parent_is_cookbook, build_cookbook_parent_is_cookbook?)
67
+
68
+ Generator.add_attr_to_context(:pipeline, pipeline)
69
+ end
70
+
71
+ def pipeline
72
+ config[:pipeline]
73
+ end
74
+
75
+ def recipe
76
+ "build_cookbook"
77
+ end
78
+
79
+ def build_cookbook_parent_is_cookbook?
80
+ metadata_json_path = File.join(workflow_project_dir, "metadata.json")
81
+ metadata_rb_path = File.join(workflow_project_dir, "metadata.rb")
82
+
83
+ File.exist?(metadata_json_path) || File.exist?(metadata_rb_path)
84
+ end
85
+
86
+ def workflow_project_dir
87
+ project_dir = File.expand_path(cookbook_name_or_path, Dir.pwd)
88
+ # Detect if we were invoked with arguments like
89
+ #
90
+ # chef generate build-cookbook project/.delivery/build_cookbook
91
+ #
92
+ # If so, normalize paths so we don't make a directory structure like
93
+ # `.delivery/.delivery/build_cookbook`.
94
+ #
95
+ # Note that we don't check the name of the build cookbook the user
96
+ # asked for and we hard-code to naming it "build_cookbook". We also
97
+ # don't catch the case that the user requested something like
98
+ # `project/.delivery/build_cookbook/extra-thing-that-shouldn't-be-here`
99
+ Pathname.new(project_dir).ascend do |dir|
100
+ if File.basename(dir) == ".delivery"
101
+ project_dir = File.dirname(dir)
102
+ end
103
+ end
104
+ project_dir
105
+ end
106
+
107
+ def workflow_project_git_initialized?
108
+ File.exist?(File.join(workflow_project_dir, ".git"))
109
+ end
110
+
111
+ def read_and_validate_params
112
+ arguments = parse_options(params)
113
+ @cookbook_name_or_path = arguments[0]
114
+ unless @cookbook_name_or_path
115
+ @params_valid = false
116
+ end
117
+ end
118
+
119
+ def params_valid?
120
+ @params_valid
121
+ end
122
+
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,40 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016-2019 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 "chef/resource"
19
+
20
+ module ChefCLI
21
+ module ChefResource
22
+
23
+ # GeneratorDesc is similar to Chef's built-in log resource, but instead of
24
+ # sending output through the logger, it sends output through the output
25
+ # formatter, which avoids the extra formatting that the logger would add.
26
+ #
27
+ # As the name implies, it is used to describe the steps that the generator
28
+ # takes to create a cookbook.
29
+ class GeneratorDesc < Chef::Resource
30
+ resource_name :generator_desc
31
+
32
+ property :message, String, name_property: true
33
+
34
+ # Write the log to Chef's log
35
+ action :write do
36
+ run_context.events.subscribers.first.puts_line("- #{new_resource.message}")
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016 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 "chef/formatters/doc"
19
+
20
+ module ChefCLI
21
+
22
+ # Subclass of Chef's standard 'doc' formatter that mutes messages that occur
23
+ # prior to convergence. This gives us cleaner output in general, but is
24
+ # especially noticeable when the standard formatter is disabled by the
25
+ # generator cookbook.
26
+ class QuieterDocFormatter < Chef::Formatters::Doc
27
+
28
+ cli_name(:chefcli_doc)
29
+
30
+ # Called when starting to collect gems from the cookbooks
31
+ def cookbook_gem_start(gems)
32
+ end
33
+
34
+ # Called when cookbook loading starts.
35
+ def library_load_start(file_count)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2016 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 "chef/dsl/recipe"
19
+
20
+ module ChefCLI
21
+
22
+ # Methods here are mixed in to the Chef recipe DSL to provide extra
23
+ # functionality for generator cookbooks.
24
+ module RecipeDSLExt
25
+
26
+ # Replaces the current formatter (by default this is the `doc` formatter)
27
+ # with the null formatter, thus suppressing normal Chef output.
28
+ def silence_chef_formatter
29
+ old = run_context.events.subscribers.first
30
+ out, err = old.output.out, old.output.err
31
+ run_context.events.subscribers.clear
32
+ null_formatter = Chef::Formatters.new(:null, out, err)
33
+ run_context.events.register(null_formatter)
34
+ end
35
+
36
+ end
37
+ end
38
+
39
+ Chef::DSL::Recipe.send(:include, ChefCLI::RecipeDSLExt)
@@ -0,0 +1,251 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2019 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_relative "base"
19
+ require_relative "../../dist"
20
+
21
+ module ChefCLI
22
+ module Command
23
+ module GeneratorCommands
24
+
25
+ # ## CookbookFile
26
+ # chef generate cookbook path/to/basename --generator-cookbook=path/to/generator
27
+ #
28
+ # Generates a basic cookbook directory structure. Most file types are
29
+ # omitted, the user is expected to add additional files as needed using
30
+ # the relevant generators.
31
+ class Cookbook < Base
32
+
33
+ banner "Usage: #{ChefCLI::Dist::EXEC} generate cookbook NAME [options]"
34
+
35
+ attr_reader :errors
36
+
37
+ attr_reader :cookbook_name_or_path
38
+
39
+ option :berks,
40
+ short: "-b",
41
+ long: "--berks",
42
+ description: "Generate cookbooks using Berkshelf dependency resolution.",
43
+ boolean: true,
44
+ default: nil
45
+
46
+ option :kitchen,
47
+ long: "--kitchen CONFIGURATION",
48
+ description: "Generate cookbooks with a specific Test Kitchen configuration (dokken|vagrant) - defaults to vagrant",
49
+ default: "vagrant"
50
+
51
+ option :policy,
52
+ short: "-P",
53
+ long: "--policy",
54
+ description: "Generate a cookbook using Policyfile dependency resolution (default).",
55
+ boolean: true,
56
+ default: nil
57
+
58
+ option :workflow,
59
+ short: "-w",
60
+ long: "--workflow",
61
+ description: "Generate a cookbook with a full #{ChefCLI::Dist::WORKFLOW} build cookbook.",
62
+ boolean: true,
63
+ default: false
64
+
65
+ option :verbose,
66
+ short: "-V",
67
+ long: "--verbose",
68
+ description: "Show detailed output from the generator",
69
+ boolean: true,
70
+ default: false
71
+
72
+ option :pipeline,
73
+ long: "--pipeline PIPELINE",
74
+ description: "Use PIPELINE to set target branch to something other than master for the #{ChefCLI::Dist::WORKFLOW} build_cookbook",
75
+ default: "master"
76
+
77
+ options.merge!(SharedGeneratorOptions.options)
78
+
79
+ def initialize(params)
80
+ @params_valid = true
81
+ @cookbook_name = nil
82
+ @policy_mode = true
83
+ @verbose = false
84
+ super
85
+ end
86
+
87
+ def run
88
+ read_and_validate_params
89
+ if params_valid?
90
+ setup_context
91
+ msg("Generating cookbook #{cookbook_name}")
92
+ chef_runner.converge
93
+ msg("")
94
+ emit_post_create_message
95
+ 0
96
+ else
97
+ err(opt_parser)
98
+ 1
99
+ end
100
+ rescue ChefCLI::ChefRunnerError => e
101
+ err("ERROR: #{e}")
102
+ 1
103
+ end
104
+
105
+ def emit_post_create_message
106
+ if have_delivery_config?
107
+ msg("Your cookbook is ready. To setup the pipeline, type `cd #{cookbook_name_or_path}`, then run `delivery init`")
108
+ else
109
+ msg("Your cookbook is ready. Type `cd #{cookbook_name_or_path}` to enter it.")
110
+ msg("\nThere are several commands you can run to get started locally developing and testing your cookbook.")
111
+ msg("Type `delivery local --help` to see a full list of local testing commands.")
112
+ msg("\nWhy not start by writing an InSpec test? Tests for the default recipe are stored at:\n")
113
+ msg("test/integration/default/default_test.rb")
114
+ msg("\nIf you'd prefer to dive right in, the default recipe can be found at:")
115
+ msg("\nrecipes/default.rb\n")
116
+ end
117
+ end
118
+
119
+ def setup_context
120
+ super
121
+ Generator.add_attr_to_context(:skip_git_init, cookbook_path_in_git_repo?)
122
+ Generator.add_attr_to_context(:cookbook_root, cookbook_root)
123
+ Generator.add_attr_to_context(:cookbook_name, cookbook_name)
124
+ Generator.add_attr_to_context(:recipe_name, recipe_name)
125
+ Generator.add_attr_to_context(:include_chef_repo_source, false)
126
+ Generator.add_attr_to_context(:policy_name, policy_name)
127
+ Generator.add_attr_to_context(:policy_run_list, policy_run_list)
128
+ Generator.add_attr_to_context(:policy_local_cookbook, ".")
129
+
130
+ Generator.add_attr_to_context(:enable_workflow, enable_workflow?)
131
+ Generator.add_attr_to_context(:workflow_project_dir, cookbook_full_path)
132
+ Generator.add_attr_to_context(:build_cookbook_parent_is_cookbook, true)
133
+ Generator.add_attr_to_context(:workflow_project_git_initialized, have_git? && !cookbook_path_in_git_repo?)
134
+
135
+ Generator.add_attr_to_context(:verbose, verbose?)
136
+
137
+ Generator.add_attr_to_context(:use_policyfile, policy_mode?)
138
+ Generator.add_attr_to_context(:pipeline, pipeline)
139
+ Generator.add_attr_to_context(:kitchen, kitchen)
140
+ end
141
+
142
+ def kitchen
143
+ config[:kitchen]
144
+ end
145
+
146
+ def pipeline
147
+ config[:pipeline]
148
+ end
149
+
150
+ def policy_name
151
+ cookbook_name
152
+ end
153
+
154
+ def policy_run_list
155
+ "#{cookbook_name}::#{recipe_name}"
156
+ end
157
+
158
+ def recipe
159
+ "cookbook"
160
+ end
161
+
162
+ def recipe_name
163
+ "default"
164
+ end
165
+
166
+ def cookbook_name
167
+ File.basename(cookbook_full_path)
168
+ end
169
+
170
+ def cookbook_root
171
+ File.dirname(cookbook_full_path)
172
+ end
173
+
174
+ def cookbook_full_path
175
+ File.expand_path(cookbook_name_or_path, Dir.pwd)
176
+ end
177
+
178
+ def policy_mode?
179
+ @policy_mode
180
+ end
181
+
182
+ def enable_workflow?
183
+ config[:workflow]
184
+ end
185
+
186
+ def verbose?
187
+ @verbose
188
+ end
189
+
190
+ def have_delivery_config?
191
+ # delivery-cli's logic is to look recursively upward for
192
+ # .delivery/cli.toml starting from pwd:
193
+ # https://github.com/chef/delivery-cli/blob/22cbef3987ebd0aee98405b7e161a100edc87e49/src/delivery/config/mod.rs#L225-L247
194
+
195
+ path_to_check = File.expand_path(Dir.pwd)
196
+ result = false
197
+
198
+ Pathname.new(path_to_check).ascend do |path|
199
+ if contains_delivery_cli_toml?(path)
200
+ result = true
201
+ break
202
+ end
203
+ end
204
+
205
+ result
206
+ end
207
+
208
+ def contains_delivery_cli_toml?(path)
209
+ delivery_cli_path = path.join(".delivery/cli.toml")
210
+ delivery_cli_path.exist?
211
+ end
212
+
213
+ def read_and_validate_params
214
+ arguments = parse_options(params)
215
+ @cookbook_name_or_path = arguments[0]
216
+ if !@cookbook_name_or_path
217
+ @params_valid = false
218
+ elsif /-/ =~ File.basename(@cookbook_name_or_path)
219
+ msg("Hyphens are discouraged in cookbook names as they may cause problems with custom resources. See https://docs.chef.io/ctl_chef.html#chef-generate-cookbook for more information.")
220
+ end
221
+
222
+ if config[:berks] && config[:policy]
223
+ err("Berkshelf and Policyfiles are mutually exclusive. Please specify only one.")
224
+ @params_valid = false
225
+ end
226
+
227
+ if config[:berks]
228
+ @policy_mode = false
229
+ end
230
+
231
+ if config[:verbose]
232
+ @verbose = true
233
+ end
234
+
235
+ true
236
+ end
237
+
238
+ def params_valid?
239
+ @params_valid
240
+ end
241
+
242
+ def cookbook_path_in_git_repo?
243
+ Pathname.new(cookbook_full_path).ascend do |dir|
244
+ return true if File.directory?(File.join(dir.to_s, ".git"))
245
+ end
246
+ false
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end