chef-dk 3.9.0 → 3.10.1

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 (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +139 -139
  3. data/Gemfile.lock +917 -919
  4. data/LICENSE +201 -201
  5. data/Rakefile +77 -77
  6. data/bin/chef +25 -25
  7. data/chef-dk.gemspec +60 -60
  8. data/lib/chef-dk.rb +19 -19
  9. data/lib/chef-dk/authenticated_http.rb +22 -22
  10. data/lib/chef-dk/builtin_commands.rb +62 -62
  11. data/lib/chef-dk/chef_runner.rb +114 -114
  12. data/lib/chef-dk/chef_server_api_multi.rb +73 -73
  13. data/lib/chef-dk/cli.rb +201 -201
  14. data/lib/chef-dk/command/base.rb +79 -79
  15. data/lib/chef-dk/command/clean_policy_cookbooks.rb +114 -114
  16. data/lib/chef-dk/command/clean_policy_revisions.rb +111 -111
  17. data/lib/chef-dk/command/delete_policy.rb +120 -120
  18. data/lib/chef-dk/command/delete_policy_group.rb +120 -120
  19. data/lib/chef-dk/command/describe_cookbook.rb +95 -95
  20. data/lib/chef-dk/command/diff.rb +315 -315
  21. data/lib/chef-dk/command/env.rb +89 -89
  22. data/lib/chef-dk/command/exec.rb +44 -44
  23. data/lib/chef-dk/command/export.rb +155 -155
  24. data/lib/chef-dk/command/gem.rb +47 -47
  25. data/lib/chef-dk/command/generate.rb +126 -126
  26. data/lib/chef-dk/command/generator_commands.rb +83 -83
  27. data/lib/chef-dk/command/generator_commands/app.rb +106 -106
  28. data/lib/chef-dk/command/generator_commands/attribute.rb +36 -36
  29. data/lib/chef-dk/command/generator_commands/base.rb +157 -157
  30. data/lib/chef-dk/command/generator_commands/build_cookbook.rb +125 -125
  31. data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -85
  32. data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -38
  33. data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -39
  34. data/lib/chef-dk/command/generator_commands/cookbook.rb +251 -251
  35. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  36. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  37. data/lib/chef-dk/command/generator_commands/generator_generator.rb +174 -174
  38. data/lib/chef-dk/command/generator_commands/helpers.rb +36 -36
  39. data/lib/chef-dk/command/generator_commands/policyfile.rb +124 -124
  40. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  41. data/lib/chef-dk/command/generator_commands/repo.rb +123 -123
  42. data/lib/chef-dk/command/generator_commands/resource.rb +36 -36
  43. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  44. data/lib/chef-dk/command/install.rb +120 -120
  45. data/lib/chef-dk/command/provision.rb +439 -439
  46. data/lib/chef-dk/command/push.rb +117 -117
  47. data/lib/chef-dk/command/push_archive.rb +125 -125
  48. data/lib/chef-dk/command/shell_init.rb +179 -179
  49. data/lib/chef-dk/command/show_policy.rb +163 -163
  50. data/lib/chef-dk/command/undelete.rb +154 -154
  51. data/lib/chef-dk/command/update.rb +139 -139
  52. data/lib/chef-dk/command/verify.rb +638 -638
  53. data/lib/chef-dk/commands_map.rb +113 -113
  54. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  55. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  56. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  57. data/lib/chef-dk/component_test.rb +227 -227
  58. data/lib/chef-dk/configurable.rb +88 -88
  59. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  60. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  61. data/lib/chef-dk/cookbook_profiler/git.rb +152 -152
  62. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  63. data/lib/chef-dk/cookbook_profiler/null_scm.rb +31 -31
  64. data/lib/chef-dk/exceptions.rb +151 -151
  65. data/lib/chef-dk/generator.rb +165 -165
  66. data/lib/chef-dk/helpers.rb +176 -176
  67. data/lib/chef-dk/pager.rb +104 -104
  68. data/lib/chef-dk/policyfile/artifactory_cookbook_source.rb +102 -102
  69. data/lib/chef-dk/policyfile/attribute_merge_checker.rb +110 -110
  70. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  71. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +99 -99
  72. data/lib/chef-dk/policyfile/chef_server_lock_fetcher.rb +167 -167
  73. data/lib/chef-dk/policyfile/community_cookbook_source.rb +95 -95
  74. data/lib/chef-dk/policyfile/comparison_base.rb +123 -123
  75. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  76. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  77. data/lib/chef-dk/policyfile/cookbook_sources.rb +23 -23
  78. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +89 -89
  79. data/lib/chef-dk/policyfile/differ.rb +263 -263
  80. data/lib/chef-dk/policyfile/dsl.rb +288 -288
  81. data/lib/chef-dk/policyfile/git_lock_fetcher.rb +265 -265
  82. data/lib/chef-dk/policyfile/included_policies_cookbook_source.rb +156 -156
  83. data/lib/chef-dk/policyfile/lister.rb +229 -229
  84. data/lib/chef-dk/policyfile/local_lock_fetcher.rb +132 -129
  85. data/lib/chef-dk/policyfile/lock_applier.rb +80 -80
  86. data/lib/chef-dk/policyfile/lock_fetcher_mixin.rb +37 -0
  87. data/lib/chef-dk/policyfile/null_cookbook_source.rb +49 -49
  88. data/lib/chef-dk/policyfile/policyfile_location_specification.rb +128 -125
  89. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  90. data/lib/chef-dk/policyfile/remote_lock_fetcher.rb +108 -0
  91. data/lib/chef-dk/policyfile/reports/install.rb +69 -69
  92. data/lib/chef-dk/policyfile/reports/table_printer.rb +57 -57
  93. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  94. data/lib/chef-dk/policyfile/solution_dependencies.rb +311 -311
  95. data/lib/chef-dk/policyfile/source_uri.rb +57 -57
  96. data/lib/chef-dk/policyfile/storage_config.rb +112 -112
  97. data/lib/chef-dk/policyfile/undo_record.rb +139 -139
  98. data/lib/chef-dk/policyfile/undo_stack.rb +128 -128
  99. data/lib/chef-dk/policyfile/uploader.rb +222 -222
  100. data/lib/chef-dk/policyfile_compiler.rb +528 -528
  101. data/lib/chef-dk/policyfile_lock.rb +581 -581
  102. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  103. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +123 -123
  104. data/lib/chef-dk/policyfile_services/export_repo.rb +419 -419
  105. data/lib/chef-dk/policyfile_services/install.rb +167 -167
  106. data/lib/chef-dk/policyfile_services/push.rb +112 -112
  107. data/lib/chef-dk/policyfile_services/push_archive.rb +164 -164
  108. data/lib/chef-dk/policyfile_services/rm_policy.rb +141 -141
  109. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +85 -85
  110. data/lib/chef-dk/policyfile_services/show_policy.rb +234 -234
  111. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  112. data/lib/chef-dk/policyfile_services/update_attributes.rb +110 -110
  113. data/lib/chef-dk/service_exception_inspectors.rb +24 -24
  114. data/lib/chef-dk/service_exception_inspectors/base.rb +39 -39
  115. data/lib/chef-dk/service_exception_inspectors/http.rb +119 -119
  116. data/lib/chef-dk/service_exceptions.rb +142 -142
  117. data/lib/chef-dk/shell_out.rb +36 -36
  118. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +4 -4
  119. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -21
  120. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/README.md +146 -146
  121. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +9 -9
  122. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +104 -104
  123. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  124. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -66
  125. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +17 -17
  126. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +36 -36
  127. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +22 -22
  128. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +24 -24
  129. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  130. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +8 -8
  131. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +7 -7
  132. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +9 -9
  133. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -56
  134. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  135. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  136. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  137. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  138. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -24
  139. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  140. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  141. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +3 -3
  142. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +3 -3
  143. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  144. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +89 -89
  145. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +13 -13
  146. data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +177 -177
  147. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +161 -161
  148. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +25 -25
  149. data/lib/chef-dk/skeletons/code_generator/recipes/helpers.rb +21 -21
  150. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +9 -9
  151. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +52 -52
  152. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +68 -68
  153. data/lib/chef-dk/skeletons/code_generator/recipes/resource.rb +13 -13
  154. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  155. data/lib/chef-dk/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -11
  156. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  157. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -201
  158. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  159. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  160. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  161. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  162. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  163. data/lib/chef-dk/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  164. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -7
  165. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -10
  166. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -8
  167. data/lib/chef-dk/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  168. data/lib/chef-dk/skeletons/code_generator/templates/default/helpers.rb.erb +39 -39
  169. data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -16
  170. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -26
  171. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +31 -31
  172. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -33
  173. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +20 -20
  174. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  175. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +35 -35
  176. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -128
  177. data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +1 -1
  178. data/lib/chef-dk/skeletons/code_generator/templates/default/template.erb +0 -0
  179. data/lib/chef-dk/ui.rb +57 -57
  180. data/lib/chef-dk/version.rb +20 -20
  181. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
  182. data/spec/shared/a_file_generator.rb +125 -125
  183. data/spec/shared/a_generated_file.rb +12 -12
  184. data/spec/shared/command_with_ui_object.rb +11 -11
  185. data/spec/shared/custom_generator_cookbook.rb +136 -136
  186. data/spec/shared/fixture_cookbook_checksums.rb +46 -46
  187. data/spec/shared/setup_git_committer_config.rb +54 -54
  188. data/spec/shared/setup_git_cookbooks.rb +53 -53
  189. data/spec/spec_helper.rb +51 -51
  190. data/spec/test_helpers.rb +84 -84
  191. data/spec/unit/chef_runner_spec.rb +139 -139
  192. data/spec/unit/chef_server_api_multi_spec.rb +120 -120
  193. data/spec/unit/cli_spec.rb +377 -377
  194. data/spec/unit/command/base_spec.rb +172 -172
  195. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -180
  196. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -180
  197. data/spec/unit/command/delete_policy_group_spec.rb +206 -206
  198. data/spec/unit/command/delete_policy_spec.rb +206 -206
  199. data/spec/unit/command/diff_spec.rb +311 -311
  200. data/spec/unit/command/env_spec.rb +52 -52
  201. data/spec/unit/command/exec_spec.rb +178 -178
  202. data/spec/unit/command/export_spec.rb +199 -199
  203. data/spec/unit/command/generate_spec.rb +142 -142
  204. data/spec/unit/command/generator_commands/app_spec.rb +166 -166
  205. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -31
  206. data/spec/unit/command/generator_commands/base_spec.rb +181 -181
  207. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -377
  208. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -97
  209. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -111
  210. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -31
  211. data/spec/unit/command/generator_commands/cookbook_spec.rb +765 -765
  212. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -227
  213. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -31
  214. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -223
  215. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -37
  216. data/spec/unit/command/generator_commands/repo_spec.rb +374 -374
  217. data/spec/unit/command/generator_commands/resource_spec.rb +31 -31
  218. data/spec/unit/command/generator_commands/template_spec.rb +31 -31
  219. data/spec/unit/command/install_spec.rb +179 -179
  220. data/spec/unit/command/provision_spec.rb +589 -589
  221. data/spec/unit/command/push_archive_spec.rb +153 -153
  222. data/spec/unit/command/push_spec.rb +198 -198
  223. data/spec/unit/command/shell_init_spec.rb +339 -339
  224. data/spec/unit/command/show_policy_spec.rb +234 -234
  225. data/spec/unit/command/undelete_spec.rb +244 -244
  226. data/spec/unit/command/update_spec.rb +283 -283
  227. data/spec/unit/command/verify_spec.rb +342 -342
  228. data/spec/unit/commands_map_spec.rb +57 -57
  229. data/spec/unit/component_test_spec.rb +128 -128
  230. data/spec/unit/configurable_spec.rb +68 -68
  231. data/spec/unit/cookbook_metadata_spec.rb +96 -96
  232. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  233. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -81
  234. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  235. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  236. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  237. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  238. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  239. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  242. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  243. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  244. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  245. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  248. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  249. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  250. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  251. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  254. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  255. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  256. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  257. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  258. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -56
  259. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -30
  260. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  261. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  262. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  263. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -33
  264. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  265. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  276. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  277. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  278. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  279. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  280. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  281. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  282. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  283. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  284. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  285. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  286. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  287. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  291. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  292. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  293. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  294. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  297. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  298. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  299. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  300. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  301. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  302. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  303. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  304. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  306. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  307. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  308. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  309. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  313. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  314. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  316. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  317. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  318. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  319. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  320. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  321. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  322. data/spec/unit/generator_spec.rb +119 -119
  323. data/spec/unit/pager_spec.rb +117 -117
  324. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -59
  325. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -80
  326. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  327. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -55
  328. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -161
  329. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -83
  330. data/spec/unit/policyfile/comparison_base_spec.rb +340 -340
  331. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -347
  332. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -527
  333. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -129
  334. data/spec/unit/policyfile/differ_spec.rb +686 -686
  335. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -155
  336. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -242
  337. data/spec/unit/policyfile/lister_spec.rb +268 -268
  338. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -173
  339. data/spec/unit/policyfile/lock_applier_spec.rb +100 -100
  340. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  341. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -34
  342. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  343. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  344. data/spec/unit/policyfile/reports/install_spec.rb +114 -114
  345. data/spec/unit/policyfile/reports/upload_spec.rb +94 -94
  346. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -170
  347. data/spec/unit/policyfile/source_uri_spec.rb +36 -36
  348. data/spec/unit/policyfile/storage_config_spec.rb +180 -180
  349. data/spec/unit/policyfile/undo_record_spec.rb +258 -258
  350. data/spec/unit/policyfile/undo_stack_spec.rb +265 -265
  351. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  352. data/spec/unit/policyfile_demands_spec.rb +1197 -1197
  353. data/spec/unit/policyfile_evaluation_spec.rb +628 -628
  354. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -159
  355. data/spec/unit/policyfile_includes_spec.rb +720 -720
  356. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -232
  357. data/spec/unit/policyfile_lock_build_spec.rb +1065 -1065
  358. data/spec/unit/policyfile_lock_install_spec.rb +137 -137
  359. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -424
  360. data/spec/unit/policyfile_lock_validation_spec.rb +608 -608
  361. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  362. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -272
  363. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -473
  364. data/spec/unit/policyfile_services/install_spec.rb +209 -209
  365. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -359
  366. data/spec/unit/policyfile_services/push_spec.rb +249 -249
  367. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -237
  368. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -263
  369. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -887
  370. data/spec/unit/policyfile_services/undelete_spec.rb +302 -302
  371. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -229
  372. data/spec/unit/policyfile_services/update_spec.rb +162 -162
  373. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -41
  374. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -138
  375. data/spec/unit/shell_out_spec.rb +34 -34
  376. data/warning.txt +9 -9
  377. metadata +8 -2
@@ -1,638 +1,638 @@
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 "chef-dk/command/base"
19
- require "chef-dk/exceptions"
20
- require "chef-dk/component_test"
21
-
22
- module ChefDK
23
- module Command
24
- class Verify < ChefDK::Command::Base
25
-
26
- include ChefDK::Helpers
27
-
28
- banner "Usage: chef verify [component, ...] [options]"
29
-
30
- option :omnibus_dir,
31
- long: "--omnibus-dir OMNIBUS_DIR",
32
- description: "Alternate path to omnibus install (used for testing)"
33
-
34
- option :unit,
35
- long: "--unit",
36
- description: "Run bundled app unit tests (only smoke tests run by default)"
37
-
38
- option :integration,
39
- long: "--integration",
40
- description: "Run integration tests. Possibly dangerous, for development systems only"
41
-
42
- option :verbose,
43
- long: "--verbose",
44
- description: "Display all test output, not just failing tests"
45
-
46
- class << self
47
- def add_component(name, _delete_me = nil)
48
- component = ComponentTest.new(name)
49
- yield component if block_given? # delete this conditional
50
- component_map[name] = component
51
- end
52
-
53
- def component(name)
54
- component_map[name]
55
- end
56
-
57
- def components
58
- component_map.values
59
- end
60
-
61
- def component_map
62
- @component_map ||= {}
63
- end
64
- end
65
-
66
- def components
67
- self.class.components
68
- end
69
-
70
- bundle_install_mutex = Mutex.new
71
-
72
- #
73
- # Components included in Chef Development kit:
74
- # :base_dir => Relative path of the component w.r.t. omnibus_apps_dir
75
- # :gem_base_dir => Takes a gem name instead and uses first gem found
76
- # :test_cmd => Test command to be launched for the component
77
- #
78
- add_component "berkshelf" do |c|
79
- c.gem_base_dir = "berkshelf"
80
- # For berks the real command to run is "#{embedded_bin("bundle")} exec thor spec:ci"
81
- # We can't run it right now since graphviz specs are included in the
82
- # test suite by default. We will be able to switch to that command when/if
83
- # Graphviz is added to omnibus.
84
- c.unit_test do
85
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
86
- sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} --color --format progress spec/unit --tag ~graphviz")
87
- end
88
- c.integration_test do
89
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
90
- sh("#{embedded_bin("bundle")} exec #{embedded_bin("cucumber")} --color --format progress --tags ~@no_run --tags ~@spawn --tags ~@graphviz --strict")
91
- end
92
-
93
- c.smoke_test do
94
- tmpdir do |cwd|
95
- FileUtils.touch(File.join(cwd, "Berksfile"))
96
- sh("#{bin("berks")} install", cwd: cwd)
97
- end
98
- end
99
- end
100
-
101
- add_component "test-kitchen" do |c|
102
- c.gem_base_dir = "test-kitchen"
103
- c.unit_test do
104
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
105
- sh("#{embedded_bin("bundle")} exec rake unit")
106
- end
107
- c.integration_test do
108
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
109
- sh("#{embedded_bin("bundle")} exec rake features")
110
- end
111
-
112
- # NOTE: By default, kitchen tries to be helpful and install a driver
113
- # gem for you. This causes a race condition when running the tests
114
- # concurrently, because rubygems breaks when there are partially
115
- # installed gems in the gem repository. Instructing kitchen to create a
116
- # gemfile instead avoids the gem installation.
117
- c.smoke_test { run_in_tmpdir("kitchen init --create-gemfile") }
118
- end
119
-
120
- add_component "tk-policyfile-provisioner" do |c|
121
-
122
- c.gem_base_dir = "chef-dk"
123
-
124
- c.smoke_test do
125
- tmpdir do |cwd|
126
- File.open(File.join(cwd, ".kitchen.yml"), "w+") do |f|
127
- f.print(<<~KITCHEN_YML)
128
- ---
129
- driver:
130
- name: dummy
131
- network:
132
- - ["forwarded_port", {guest: 80, host: 8080}]
133
-
134
- provisioner:
135
- name: policyfile_zero
136
- require_chef_omnibus: 12.3.0
137
-
138
- platforms:
139
- - name: ubuntu-14.04
140
-
141
- suites:
142
- - name: default
143
- run_list:
144
- - recipe[aar::default]
145
- attributes:
146
-
147
- KITCHEN_YML
148
- end
149
-
150
- sh("kitchen list", cwd: cwd)
151
-
152
- end
153
- end
154
-
155
- end
156
-
157
- add_component "chef-client" do |c|
158
- c.gem_base_dir = "chef"
159
- c.unit_test do
160
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
161
- sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} -fp -t '~volatile_from_verify' spec/unit")
162
- end
163
- c.integration_test do
164
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
165
- sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} -fp spec/integration spec/functional")
166
- end
167
-
168
- c.smoke_test do
169
- tmpdir do |cwd|
170
- FileUtils.touch(File.join(cwd, "apply.rb"))
171
- sh("#{bin("chef-apply")} apply.rb", cwd: cwd)
172
- end
173
- end
174
- end
175
-
176
- add_component "chef-dk" do |c|
177
- c.gem_base_dir = "chef-dk"
178
- c.unit_test do
179
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
180
- sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")}")
181
- end
182
- c.smoke_test do
183
- run_in_tmpdir("#{bin("chef")} generate cookbook example")
184
- end
185
- end
186
-
187
- add_component "chef-apply" do |c|
188
- c.gem_base_dir = "chef-apply"
189
- # c.unit_test do
190
- # bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
191
- # sh("#{embedded_bin("bundle")} exec rspec")
192
- # end
193
- c.smoke_test { sh("#{bin("chef-run")} -v") }
194
- end
195
-
196
- # entirely possible this needs to be driven by a utility method in chef-provisioning.
197
- add_component "chef-provisioning" do |c|
198
- c.gem_base_dir = "chef-dk"
199
-
200
- c.smoke_test do
201
- # ------------
202
- # we want to avoid hard-coding driver names, but calling Gem::Specification produces a warning;
203
- # changing $VERBOSE seems to be the best way to silence it.
204
- verbose = $VERBOSE
205
- $VERBOSE = nil
206
-
207
- # construct a hash of { driver_name => [version1, version2, ...]}
208
- driver_versions = {}
209
- Gem::Specification.all.map { |gs| [gs.name, gs.version] }
210
- .select { |n| n[0] =~ /^chef-provisioning-/ }
211
- .each { |gem, version| (driver_versions[gem] ||= []) << version }
212
-
213
- drivers = Gem::Specification.all.map { |gs| gs.name }
214
- .select { |n| n =~ /^chef-provisioning-/ }
215
- .uniq
216
-
217
- versions = Gem::Specification.find_all_by_name("chef-provisioning").map { |s| s.version }
218
- $VERBOSE = verbose
219
- # ------------
220
- failures = []
221
-
222
- # ------------
223
- # fail the verify if we have more than one version of chef-provisioning or any of its drivers.
224
- def format_gem_failure(name, versions)
225
- <<~EOS
226
- #{name} has multiple versions installed:
227
- #{versions.sort.map { |gv| " #{gv}" }.join("\n")}
228
- EOS
229
- end
230
-
231
- failures << format_gem_failure("chef-provisioning", versions) if versions.size > 1
232
-
233
- driver_versions.keys.sort.each do |driver_name|
234
- v = driver_versions[driver_name]
235
- failures << format_gem_failure(driver_name, v) if v.size > 1
236
- end
237
-
238
- if failures.size > 0
239
- failures << <<~EOS
240
-
241
- Some applications may need or prefer different versions of the chef-provisioning gem or its drivers, so
242
- this multiple-version check can fail if a user has installed new versions of those libraries.
243
- EOS
244
- end
245
-
246
- # ------------
247
- # load the core gem and all of the drivers (ignoring versions).
248
- require "chef/provisioning"
249
- drivers.map { |d| "#{d.tr('-', '/')}_driver" }.each do |driver_gem|
250
- begin
251
- begin
252
- require driver_gem
253
- rescue LoadError
254
- # anomalously, chef-provisioning-fog does not have a fog_driver.rb. (9/2015)
255
- require "#{driver_gem}/driver.rb"
256
- end
257
- rescue LoadError => ex
258
- puts ex
259
- end
260
- end
261
-
262
- # ------------
263
- # look for version dependency conflicts.
264
- tmpdir do |cwd|
265
- versions.each do |provisioning_version|
266
- gemfile = "chef-provisioning-#{provisioning_version}-chefdk-test.gemfile"
267
-
268
- # write out the gemfile for this chef-provisioning version, and see if Bundler can make it go.
269
- with_file(File.join(cwd, gemfile)) do |f|
270
- f.puts %Q{gem "chef-provisioning", "= #{provisioning_version}"}
271
- drivers.each { |d| f.puts %Q{gem "#{d}"} }
272
- end
273
-
274
- result = bundle_install_mutex.synchronize do
275
- sh("#{embedded_bin("bundle")} install --local --quiet", cwd: cwd, env: { "BUNDLE_GEMFILE" => gemfile })
276
- end
277
-
278
- if result.exitstatus != 0
279
- failures << result.stdout
280
- end
281
- end # end provisioning versions.
282
-
283
- failures.each { |fail| puts fail }
284
-
285
- # dubious on Windows.
286
- # this is weird, but we seem to require a Mixlib::ShellOut as the return value. suggestions
287
- # welcome.
288
- sh(failures.size > 0 ? "false" : "true")
289
- end
290
- end
291
- end
292
-
293
- add_component "chefspec" do |c|
294
- c.gem_base_dir = "chefspec"
295
- c.unit_test do
296
- bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
297
- sh("#{embedded_bin("bundle")} exec #{embedded_bin("rake")} unit")
298
- end
299
- c.smoke_test do
300
- tmpdir do |cwd|
301
- FileUtils.mkdir(File.join(cwd, "spec"))
302
- with_file(File.join(cwd, "spec", "spec_helper.rb")) do |f|
303
- f.write <<~EOF
304
- require 'chefspec'
305
- require 'chefspec/berkshelf'
306
- require 'chefspec/cacher'
307
-
308
- RSpec.configure do |config|
309
- config.expect_with(:rspec) { |c| c.syntax = :expect }
310
- end
311
- EOF
312
- end
313
- FileUtils.touch(File.join(cwd, "Berksfile"))
314
- with_file(File.join(cwd, "spec", "foo_spec.rb")) do |f|
315
- f.write <<~EOF
316
- require 'spec_helper'
317
- EOF
318
- end
319
- sh(embedded_bin("rspec"), cwd: cwd)
320
- end
321
- end
322
- end
323
-
324
- add_component "generated-cookbooks-pass-chefspec" do |c|
325
-
326
- c.gem_base_dir = "chef-dk"
327
- c.smoke_test do
328
- tmpdir do |cwd|
329
- sh("#{bin("chef")} generate cookbook example", cwd: cwd)
330
- cb_cwd = File.join(cwd, "example")
331
- sh(embedded_bin("rspec"), cwd: cb_cwd)
332
- end
333
- end
334
- end
335
-
336
- add_component "fauxhai" do |c|
337
- c.gem_base_dir = "fauxhai"
338
- c.smoke_test { sh("#{embedded_bin("gem")} list fauxhai") }
339
- end
340
-
341
- add_component "knife-spork" do |c|
342
- c.gem_base_dir = "knife-spork"
343
- c.smoke_test { sh("#{bin("knife")} spork info") }
344
- end
345
-
346
- add_component "kitchen-vagrant" do |c|
347
- c.gem_base_dir = "kitchen-vagrant"
348
- # The build is not passing in travis, so no tests
349
- c.smoke_test { sh("#{embedded_bin("gem")} list kitchen-vagrant") }
350
- end
351
-
352
- add_component "package installation" do |c|
353
-
354
- c.gem_base_dir = "chef-dk"
355
-
356
- c.smoke_test do
357
-
358
- if File.directory?(usr_bin_prefix)
359
- sh!("#{usr_bin_path("berks")} -v")
360
- sh!("#{usr_bin_path("chef")} -v")
361
- sh!("#{usr_bin_path("chef-client")} -v")
362
- sh!("#{usr_bin_path("chef-solo")} -v")
363
- sh!("#{usr_bin_path("delivery")} -V") unless Chef::Platform.windows?
364
-
365
- # In `knife`, `knife -v` follows a different code path that skips
366
- # command/plugin loading; `knife -h` loads commands and plugins, but
367
- # it exits with code 1, which is the same as a load error. Running
368
- # `knife exec` forces command loading to happen and this command
369
- # exits 0, which runs most of the code.
370
- #
371
- # See also: https://github.com/chef/chef-dk/issues/227
372
- sh!("#{usr_bin_path("knife")} exec -E true")
373
-
374
- tmpdir do |dir|
375
- # Kitchen tries to create a .kitchen dir even when just running
376
- # `kitchen -v`:
377
- sh!("#{usr_bin_path("kitchen")} -v", cwd: dir)
378
- end
379
-
380
- sh!("#{usr_bin_path("ohai")} -v")
381
- sh!("#{usr_bin_path("foodcritic")} -V")
382
- sh!("#{usr_bin_path("inspec")} version")
383
- end
384
-
385
- # Test blocks are expected to return a Mixlib::ShellOut compatible
386
- # object:
387
- ComponentTest::NullTestResult.new
388
- end
389
- end
390
-
391
- add_component "openssl" do |c|
392
- # https://github.com/chef/chef-dk/issues/420
393
- c.gem_base_dir = "chef"
394
-
395
- test = <<-EOF.gsub(/^\s+/, "")
396
- require "net/http"
397
-
398
- uris = %w{https://www.google.com https://chef.io/ https://ec2.amazonaws.com}
399
- uris.each do |uri|
400
- uri = URI(uri)
401
- puts "Fetching \#{uri} for SSL check"
402
- Net::HTTP.get uri
403
- end
404
- EOF
405
-
406
- c.unit_test do
407
- tmpdir do |cwd|
408
- with_file(File.join(cwd, "openssl.rb")) do |f|
409
- f.write test
410
- end
411
- sh!("#{Gem.ruby} openssl.rb", cwd: cwd)
412
- end
413
- end
414
- end
415
-
416
- add_component "inspec" do |c|
417
- c.gem_base_dir = "inspec"
418
-
419
- # Commenting out the unit and integration tests for now until we figure
420
- # out the bundler error
421
- # c.unit_test { sh("#{embedded_bin("bundle")} exec rake test:isolated") }
422
- # This runs Test Kitchen (using kitchen-inspec) with some inspec tests
423
- # c.integration_test { sh("#{embedded_bin("bundle")} exec rake test:vm") }
424
-
425
- # It would be nice to use a chef generator to create these specs, but
426
- # we dont have that yet. So we do it manually.
427
- c.smoke_test do
428
- tmpdir do |cwd|
429
- File.open(File.join(cwd, "some_spec.rb"), "w+") do |f|
430
- f.print <<-INSPEC_TEST
431
- rule '01' do
432
- impact 0.7
433
- title 'Some Test'
434
- desc 'Make sure inspec is installed and loading correct'
435
- describe 1 do
436
- it { should eq(1) }
437
- end
438
- end
439
- INSPEC_TEST
440
- end
441
- # TODO when we appbundle inspec, no longer `chef exec`
442
- sh("#{bin("chef")} exec #{embedded_bin("inspec")} exec .", cwd: cwd)
443
- end
444
- end
445
- end
446
-
447
- add_component "delivery-cli" do |c|
448
- # We'll want to come back and revisit getting unit tests added -
449
- # currently running the tests depends on cargo , which is not included
450
- # in our package.
451
- c.base_dir = "bin"
452
- c.smoke_test do
453
- tmpdir do |cwd|
454
- sh!("delivery setup --user=shipit --server=delivery.shipit.io --ent=chef --org=squirrels", cwd: cwd)
455
- end
456
- end
457
- end
458
-
459
- if Chef::Platform.windows?
460
- add_component "git" do |c|
461
- c.base_dir = "embedded/bin"
462
- c.smoke_test do
463
- tmpdir do |cwd|
464
- sh!("#{embedded_bin("git")} config -l")
465
- sh!("#{embedded_bin("git")} clone https://github.com/chef/chef-provisioning", cwd: cwd)
466
- end
467
- end
468
- end
469
- else
470
- add_component "git" do |c|
471
- c.base_dir = "gitbin"
472
- c.smoke_test do
473
- tmpdir do |cwd|
474
- sh!("#{File.join(omnibus_root, "gitbin", "git")} config -l")
475
- sh!("#{File.join(omnibus_root, "gitbin", "git")} clone https://github.com/chef/chef-provisioning", cwd: cwd)
476
-
477
- # If /usr/bin/git is a symlink, fail the test.
478
- # Note that this test cannot go last because it does not return a
479
- # Mixlib::Shellout object in the windows case, which will break the tests.
480
- failure_str = "#{nix_platform_native_bin_dir}/git contains a symlink which might mean we accidentally overwrote system git via chefdk."
481
- result = sh("readlink #{nix_platform_native_bin_dir}/git")
482
- # if a symlink was found, test to see if it is in a chefdk install
483
- if result.status.exitstatus == 0
484
- raise failure_str if result.stdout =~ /chefdk/
485
- end
486
-
487
- # <chef_dk>/bin/ should not contain a git binary.
488
- failure_str = "`<chef_dk>/bin/git --help` should fail as git should be installed in gitbin"
489
- fail_if_exit_zero("#{bin("git")} --help", failure_str)
490
- end
491
- end
492
- end
493
- end
494
-
495
- add_component "opscode-pushy-client" do |c|
496
- c.gem_base_dir = "opscode-pushy-client"
497
- # TODO the unit tests are currently failing in master
498
- # c.unit_test do
499
- # bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
500
- # sh("#{embedded_bin("bundle")} exec rake spec")
501
- # end
502
-
503
- c.smoke_test do
504
- tmpdir do |cwd|
505
- sh("#{bin("pushy-client")} -v", cwd: cwd)
506
- end
507
- end
508
- end
509
-
510
- # We try and use some chef-sugar code to make sure it loads correctly
511
- add_component "chef-sugar" do |c|
512
- c.gem_base_dir = "chef-sugar"
513
- c.smoke_test do
514
- tmpdir do |cwd|
515
- with_file(File.join(cwd, "foo.rb")) do |f|
516
- f.write <<~EOF
517
- require 'chef/sugar'
518
- log 'something' do
519
- not_if { _64_bit? }
520
- end
521
- EOF
522
- end
523
- sh("chef-apply foo.rb", cwd: cwd)
524
- end
525
- end
526
- end
527
-
528
- attr_reader :verification_threads
529
- attr_reader :verification_results
530
- attr_reader :verification_status
531
-
532
- def initialize
533
- super
534
- @verification_threads = [ ]
535
- @verification_results = [ ]
536
- @verification_status = 0
537
- end
538
-
539
- def run(params = [ ])
540
- err("[WARN] This is an internal command used by the ChefDK development team. If you are a ChefDK user, please do not run it.")
541
- @components_filter = parse_options(params)
542
-
543
- validate_components!
544
- invoke_tests
545
- wait_for_tests
546
- report_results
547
-
548
- verification_status
549
- end
550
-
551
- def omnibus_root
552
- config[:omnibus_dir] || super
553
- end
554
-
555
- def validate_components!
556
- components.each do |component|
557
- component.omnibus_root = omnibus_root
558
- component.assert_present!
559
- end
560
- end
561
-
562
- def components_to_test
563
- if @components_filter.empty?
564
- components
565
- else
566
- components.select do |component|
567
- @components_filter.include?(component.name.to_s)
568
- end
569
- end
570
- end
571
-
572
- def invoke_tests
573
- components_to_test.each do |component|
574
- # Run the component specs in parallel
575
- verification_threads << Thread.new do
576
-
577
- results = []
578
-
579
- results << component.run_smoke_test
580
-
581
- if config[:unit]
582
- results << component.run_unit_test
583
- end
584
-
585
- if config[:integration]
586
- results << component.run_integration_test
587
- end
588
-
589
- if results.any? { |r| r.exitstatus != 0 }
590
- component_status = 1
591
- @verification_status = 1
592
- else
593
- component_status = 0
594
- end
595
-
596
- {
597
- component: component,
598
- results: results,
599
- component_status: component_status,
600
- }
601
- end
602
-
603
- msg("Running verification for component '#{component.name}'")
604
- end
605
- end
606
-
607
- def wait_for_tests
608
- until verification_threads.empty?
609
- verification_threads.each do |t|
610
- if t.join(1)
611
- verification_threads.delete t
612
- verification_results << t.value
613
- t.value[:results].each do |result|
614
- if config[:verbose] || t.value[:component_status] != 0
615
- msg("")
616
- msg(result.stdout)
617
- msg(result.stderr) if result.stderr
618
- end
619
- end
620
- else
621
- $stdout.write "."
622
- end
623
- end
624
- end
625
- end
626
-
627
- def report_results
628
- msg("")
629
- msg("---------------------------------------------")
630
- verification_results.each do |result|
631
- message = result[:component_status] == 0 ? "succeeded" : "failed"
632
- msg("Verification of component '#{result[:component].name}' #{message}.")
633
- end
634
- end
635
-
636
- end
637
- end
638
- end
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 "chef-dk/command/base"
19
+ require "chef-dk/exceptions"
20
+ require "chef-dk/component_test"
21
+
22
+ module ChefDK
23
+ module Command
24
+ class Verify < ChefDK::Command::Base
25
+
26
+ include ChefDK::Helpers
27
+
28
+ banner "Usage: chef verify [component, ...] [options]"
29
+
30
+ option :omnibus_dir,
31
+ long: "--omnibus-dir OMNIBUS_DIR",
32
+ description: "Alternate path to omnibus install (used for testing)"
33
+
34
+ option :unit,
35
+ long: "--unit",
36
+ description: "Run bundled app unit tests (only smoke tests run by default)"
37
+
38
+ option :integration,
39
+ long: "--integration",
40
+ description: "Run integration tests. Possibly dangerous, for development systems only"
41
+
42
+ option :verbose,
43
+ long: "--verbose",
44
+ description: "Display all test output, not just failing tests"
45
+
46
+ class << self
47
+ def add_component(name, _delete_me = nil)
48
+ component = ComponentTest.new(name)
49
+ yield component if block_given? # delete this conditional
50
+ component_map[name] = component
51
+ end
52
+
53
+ def component(name)
54
+ component_map[name]
55
+ end
56
+
57
+ def components
58
+ component_map.values
59
+ end
60
+
61
+ def component_map
62
+ @component_map ||= {}
63
+ end
64
+ end
65
+
66
+ def components
67
+ self.class.components
68
+ end
69
+
70
+ bundle_install_mutex = Mutex.new
71
+
72
+ #
73
+ # Components included in Chef Development kit:
74
+ # :base_dir => Relative path of the component w.r.t. omnibus_apps_dir
75
+ # :gem_base_dir => Takes a gem name instead and uses first gem found
76
+ # :test_cmd => Test command to be launched for the component
77
+ #
78
+ add_component "berkshelf" do |c|
79
+ c.gem_base_dir = "berkshelf"
80
+ # For berks the real command to run is "#{embedded_bin("bundle")} exec thor spec:ci"
81
+ # We can't run it right now since graphviz specs are included in the
82
+ # test suite by default. We will be able to switch to that command when/if
83
+ # Graphviz is added to omnibus.
84
+ c.unit_test do
85
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
86
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} --color --format progress spec/unit --tag ~graphviz")
87
+ end
88
+ c.integration_test do
89
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
90
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("cucumber")} --color --format progress --tags ~@no_run --tags ~@spawn --tags ~@graphviz --strict")
91
+ end
92
+
93
+ c.smoke_test do
94
+ tmpdir do |cwd|
95
+ FileUtils.touch(File.join(cwd, "Berksfile"))
96
+ sh("#{bin("berks")} install", cwd: cwd)
97
+ end
98
+ end
99
+ end
100
+
101
+ add_component "test-kitchen" do |c|
102
+ c.gem_base_dir = "test-kitchen"
103
+ c.unit_test do
104
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
105
+ sh("#{embedded_bin("bundle")} exec rake unit")
106
+ end
107
+ c.integration_test do
108
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
109
+ sh("#{embedded_bin("bundle")} exec rake features")
110
+ end
111
+
112
+ # NOTE: By default, kitchen tries to be helpful and install a driver
113
+ # gem for you. This causes a race condition when running the tests
114
+ # concurrently, because rubygems breaks when there are partially
115
+ # installed gems in the gem repository. Instructing kitchen to create a
116
+ # gemfile instead avoids the gem installation.
117
+ c.smoke_test { run_in_tmpdir("kitchen init --create-gemfile") }
118
+ end
119
+
120
+ add_component "tk-policyfile-provisioner" do |c|
121
+
122
+ c.gem_base_dir = "chef-dk"
123
+
124
+ c.smoke_test do
125
+ tmpdir do |cwd|
126
+ File.open(File.join(cwd, ".kitchen.yml"), "w+") do |f|
127
+ f.print(<<~KITCHEN_YML)
128
+ ---
129
+ driver:
130
+ name: dummy
131
+ network:
132
+ - ["forwarded_port", {guest: 80, host: 8080}]
133
+
134
+ provisioner:
135
+ name: policyfile_zero
136
+ require_chef_omnibus: 12.3.0
137
+
138
+ platforms:
139
+ - name: ubuntu-14.04
140
+
141
+ suites:
142
+ - name: default
143
+ run_list:
144
+ - recipe[aar::default]
145
+ attributes:
146
+
147
+ KITCHEN_YML
148
+ end
149
+
150
+ sh("kitchen list", cwd: cwd)
151
+
152
+ end
153
+ end
154
+
155
+ end
156
+
157
+ add_component "chef-client" do |c|
158
+ c.gem_base_dir = "chef"
159
+ c.unit_test do
160
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
161
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} -fp -t '~volatile_from_verify' spec/unit")
162
+ end
163
+ c.integration_test do
164
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
165
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")} -fp spec/integration spec/functional")
166
+ end
167
+
168
+ c.smoke_test do
169
+ tmpdir do |cwd|
170
+ FileUtils.touch(File.join(cwd, "apply.rb"))
171
+ sh("#{bin("chef-apply")} apply.rb", cwd: cwd)
172
+ end
173
+ end
174
+ end
175
+
176
+ add_component "chef-dk" do |c|
177
+ c.gem_base_dir = "chef-dk"
178
+ c.unit_test do
179
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
180
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rspec")}")
181
+ end
182
+ c.smoke_test do
183
+ run_in_tmpdir("#{bin("chef")} generate cookbook example")
184
+ end
185
+ end
186
+
187
+ add_component "chef-apply" do |c|
188
+ c.gem_base_dir = "chef-apply"
189
+ # c.unit_test do
190
+ # bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
191
+ # sh("#{embedded_bin("bundle")} exec rspec")
192
+ # end
193
+ c.smoke_test { sh("#{bin("chef-run")} -v") }
194
+ end
195
+
196
+ # entirely possible this needs to be driven by a utility method in chef-provisioning.
197
+ add_component "chef-provisioning" do |c|
198
+ c.gem_base_dir = "chef-dk"
199
+
200
+ c.smoke_test do
201
+ # ------------
202
+ # we want to avoid hard-coding driver names, but calling Gem::Specification produces a warning;
203
+ # changing $VERBOSE seems to be the best way to silence it.
204
+ verbose = $VERBOSE
205
+ $VERBOSE = nil
206
+
207
+ # construct a hash of { driver_name => [version1, version2, ...]}
208
+ driver_versions = {}
209
+ Gem::Specification.all.map { |gs| [gs.name, gs.version] }
210
+ .select { |n| n[0] =~ /^chef-provisioning-/ }
211
+ .each { |gem, version| (driver_versions[gem] ||= []) << version }
212
+
213
+ drivers = Gem::Specification.all.map { |gs| gs.name }
214
+ .select { |n| n =~ /^chef-provisioning-/ }
215
+ .uniq
216
+
217
+ versions = Gem::Specification.find_all_by_name("chef-provisioning").map { |s| s.version }
218
+ $VERBOSE = verbose
219
+ # ------------
220
+ failures = []
221
+
222
+ # ------------
223
+ # fail the verify if we have more than one version of chef-provisioning or any of its drivers.
224
+ def format_gem_failure(name, versions)
225
+ <<~EOS
226
+ #{name} has multiple versions installed:
227
+ #{versions.sort.map { |gv| " #{gv}" }.join("\n")}
228
+ EOS
229
+ end
230
+
231
+ failures << format_gem_failure("chef-provisioning", versions) if versions.size > 1
232
+
233
+ driver_versions.keys.sort.each do |driver_name|
234
+ v = driver_versions[driver_name]
235
+ failures << format_gem_failure(driver_name, v) if v.size > 1
236
+ end
237
+
238
+ if failures.size > 0
239
+ failures << <<~EOS
240
+
241
+ Some applications may need or prefer different versions of the chef-provisioning gem or its drivers, so
242
+ this multiple-version check can fail if a user has installed new versions of those libraries.
243
+ EOS
244
+ end
245
+
246
+ # ------------
247
+ # load the core gem and all of the drivers (ignoring versions).
248
+ require "chef/provisioning"
249
+ drivers.map { |d| "#{d.tr('-', '/')}_driver" }.each do |driver_gem|
250
+ begin
251
+ begin
252
+ require driver_gem
253
+ rescue LoadError
254
+ # anomalously, chef-provisioning-fog does not have a fog_driver.rb. (9/2015)
255
+ require "#{driver_gem}/driver.rb"
256
+ end
257
+ rescue LoadError => ex
258
+ puts ex
259
+ end
260
+ end
261
+
262
+ # ------------
263
+ # look for version dependency conflicts.
264
+ tmpdir do |cwd|
265
+ versions.each do |provisioning_version|
266
+ gemfile = "chef-provisioning-#{provisioning_version}-chefdk-test.gemfile"
267
+
268
+ # write out the gemfile for this chef-provisioning version, and see if Bundler can make it go.
269
+ with_file(File.join(cwd, gemfile)) do |f|
270
+ f.puts %Q{gem "chef-provisioning", "= #{provisioning_version}"}
271
+ drivers.each { |d| f.puts %Q{gem "#{d}"} }
272
+ end
273
+
274
+ result = bundle_install_mutex.synchronize do
275
+ sh("#{embedded_bin("bundle")} install --local --quiet", cwd: cwd, env: { "BUNDLE_GEMFILE" => gemfile })
276
+ end
277
+
278
+ if result.exitstatus != 0
279
+ failures << result.stdout
280
+ end
281
+ end # end provisioning versions.
282
+
283
+ failures.each { |fail| puts fail }
284
+
285
+ # dubious on Windows.
286
+ # this is weird, but we seem to require a Mixlib::ShellOut as the return value. suggestions
287
+ # welcome.
288
+ sh(failures.size > 0 ? "false" : "true")
289
+ end
290
+ end
291
+ end
292
+
293
+ add_component "chefspec" do |c|
294
+ c.gem_base_dir = "chefspec"
295
+ c.unit_test do
296
+ bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
297
+ sh("#{embedded_bin("bundle")} exec #{embedded_bin("rake")} unit")
298
+ end
299
+ c.smoke_test do
300
+ tmpdir do |cwd|
301
+ FileUtils.mkdir(File.join(cwd, "spec"))
302
+ with_file(File.join(cwd, "spec", "spec_helper.rb")) do |f|
303
+ f.write <<~EOF
304
+ require 'chefspec'
305
+ require 'chefspec/berkshelf'
306
+ require 'chefspec/cacher'
307
+
308
+ RSpec.configure do |config|
309
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
310
+ end
311
+ EOF
312
+ end
313
+ FileUtils.touch(File.join(cwd, "Berksfile"))
314
+ with_file(File.join(cwd, "spec", "foo_spec.rb")) do |f|
315
+ f.write <<~EOF
316
+ require 'spec_helper'
317
+ EOF
318
+ end
319
+ sh(embedded_bin("rspec"), cwd: cwd)
320
+ end
321
+ end
322
+ end
323
+
324
+ add_component "generated-cookbooks-pass-chefspec" do |c|
325
+
326
+ c.gem_base_dir = "chef-dk"
327
+ c.smoke_test do
328
+ tmpdir do |cwd|
329
+ sh("#{bin("chef")} generate cookbook example", cwd: cwd)
330
+ cb_cwd = File.join(cwd, "example")
331
+ sh(embedded_bin("rspec"), cwd: cb_cwd)
332
+ end
333
+ end
334
+ end
335
+
336
+ add_component "fauxhai" do |c|
337
+ c.gem_base_dir = "fauxhai"
338
+ c.smoke_test { sh("#{embedded_bin("gem")} list fauxhai") }
339
+ end
340
+
341
+ add_component "knife-spork" do |c|
342
+ c.gem_base_dir = "knife-spork"
343
+ c.smoke_test { sh("#{bin("knife")} spork info") }
344
+ end
345
+
346
+ add_component "kitchen-vagrant" do |c|
347
+ c.gem_base_dir = "kitchen-vagrant"
348
+ # The build is not passing in travis, so no tests
349
+ c.smoke_test { sh("#{embedded_bin("gem")} list kitchen-vagrant") }
350
+ end
351
+
352
+ add_component "package installation" do |c|
353
+
354
+ c.gem_base_dir = "chef-dk"
355
+
356
+ c.smoke_test do
357
+
358
+ if File.directory?(usr_bin_prefix)
359
+ sh!("#{usr_bin_path("berks")} -v")
360
+ sh!("#{usr_bin_path("chef")} -v")
361
+ sh!("#{usr_bin_path("chef-client")} -v")
362
+ sh!("#{usr_bin_path("chef-solo")} -v")
363
+ sh!("#{usr_bin_path("delivery")} -V") unless Chef::Platform.windows?
364
+
365
+ # In `knife`, `knife -v` follows a different code path that skips
366
+ # command/plugin loading; `knife -h` loads commands and plugins, but
367
+ # it exits with code 1, which is the same as a load error. Running
368
+ # `knife exec` forces command loading to happen and this command
369
+ # exits 0, which runs most of the code.
370
+ #
371
+ # See also: https://github.com/chef/chef-dk/issues/227
372
+ sh!("#{usr_bin_path("knife")} exec -E true")
373
+
374
+ tmpdir do |dir|
375
+ # Kitchen tries to create a .kitchen dir even when just running
376
+ # `kitchen -v`:
377
+ sh!("#{usr_bin_path("kitchen")} -v", cwd: dir)
378
+ end
379
+
380
+ sh!("#{usr_bin_path("ohai")} -v")
381
+ sh!("#{usr_bin_path("foodcritic")} -V")
382
+ sh!("#{usr_bin_path("inspec")} version")
383
+ end
384
+
385
+ # Test blocks are expected to return a Mixlib::ShellOut compatible
386
+ # object:
387
+ ComponentTest::NullTestResult.new
388
+ end
389
+ end
390
+
391
+ add_component "openssl" do |c|
392
+ # https://github.com/chef/chef-dk/issues/420
393
+ c.gem_base_dir = "chef"
394
+
395
+ test = <<-EOF.gsub(/^\s+/, "")
396
+ require "net/http"
397
+
398
+ uris = %w{https://www.google.com https://chef.io/ https://ec2.amazonaws.com}
399
+ uris.each do |uri|
400
+ uri = URI(uri)
401
+ puts "Fetching \#{uri} for SSL check"
402
+ Net::HTTP.get uri
403
+ end
404
+ EOF
405
+
406
+ c.unit_test do
407
+ tmpdir do |cwd|
408
+ with_file(File.join(cwd, "openssl.rb")) do |f|
409
+ f.write test
410
+ end
411
+ sh!("#{Gem.ruby} openssl.rb", cwd: cwd)
412
+ end
413
+ end
414
+ end
415
+
416
+ add_component "inspec" do |c|
417
+ c.gem_base_dir = "inspec"
418
+
419
+ # Commenting out the unit and integration tests for now until we figure
420
+ # out the bundler error
421
+ # c.unit_test { sh("#{embedded_bin("bundle")} exec rake test:isolated") }
422
+ # This runs Test Kitchen (using kitchen-inspec) with some inspec tests
423
+ # c.integration_test { sh("#{embedded_bin("bundle")} exec rake test:vm") }
424
+
425
+ # It would be nice to use a chef generator to create these specs, but
426
+ # we dont have that yet. So we do it manually.
427
+ c.smoke_test do
428
+ tmpdir do |cwd|
429
+ File.open(File.join(cwd, "some_spec.rb"), "w+") do |f|
430
+ f.print <<-INSPEC_TEST
431
+ rule '01' do
432
+ impact 0.7
433
+ title 'Some Test'
434
+ desc 'Make sure inspec is installed and loading correct'
435
+ describe 1 do
436
+ it { should eq(1) }
437
+ end
438
+ end
439
+ INSPEC_TEST
440
+ end
441
+ # TODO when we appbundle inspec, no longer `chef exec`
442
+ sh("#{bin("chef")} exec #{embedded_bin("inspec")} exec .", cwd: cwd)
443
+ end
444
+ end
445
+ end
446
+
447
+ add_component "delivery-cli" do |c|
448
+ # We'll want to come back and revisit getting unit tests added -
449
+ # currently running the tests depends on cargo , which is not included
450
+ # in our package.
451
+ c.base_dir = "bin"
452
+ c.smoke_test do
453
+ tmpdir do |cwd|
454
+ sh!("delivery setup --user=shipit --server=delivery.shipit.io --ent=chef --org=squirrels", cwd: cwd)
455
+ end
456
+ end
457
+ end
458
+
459
+ if Chef::Platform.windows?
460
+ add_component "git" do |c|
461
+ c.base_dir = "embedded/bin"
462
+ c.smoke_test do
463
+ tmpdir do |cwd|
464
+ sh!("#{embedded_bin("git")} config -l")
465
+ sh!("#{embedded_bin("git")} clone https://github.com/chef/chef-provisioning", cwd: cwd)
466
+ end
467
+ end
468
+ end
469
+ else
470
+ add_component "git" do |c|
471
+ c.base_dir = "gitbin"
472
+ c.smoke_test do
473
+ tmpdir do |cwd|
474
+ sh!("#{File.join(omnibus_root, "gitbin", "git")} config -l")
475
+ sh!("#{File.join(omnibus_root, "gitbin", "git")} clone https://github.com/chef/chef-provisioning", cwd: cwd)
476
+
477
+ # If /usr/bin/git is a symlink, fail the test.
478
+ # Note that this test cannot go last because it does not return a
479
+ # Mixlib::Shellout object in the windows case, which will break the tests.
480
+ failure_str = "#{nix_platform_native_bin_dir}/git contains a symlink which might mean we accidentally overwrote system git via chefdk."
481
+ result = sh("readlink #{nix_platform_native_bin_dir}/git")
482
+ # if a symlink was found, test to see if it is in a chefdk install
483
+ if result.status.exitstatus == 0
484
+ raise failure_str if result.stdout =~ /chefdk/
485
+ end
486
+
487
+ # <chef_dk>/bin/ should not contain a git binary.
488
+ failure_str = "`<chef_dk>/bin/git --help` should fail as git should be installed in gitbin"
489
+ fail_if_exit_zero("#{bin("git")} --help", failure_str)
490
+ end
491
+ end
492
+ end
493
+ end
494
+
495
+ add_component "opscode-pushy-client" do |c|
496
+ c.gem_base_dir = "opscode-pushy-client"
497
+ # TODO the unit tests are currently failing in master
498
+ # c.unit_test do
499
+ # bundle_install_mutex.synchronize { sh("#{embedded_bin("bundle")} install") }
500
+ # sh("#{embedded_bin("bundle")} exec rake spec")
501
+ # end
502
+
503
+ c.smoke_test do
504
+ tmpdir do |cwd|
505
+ sh("#{bin("pushy-client")} -v", cwd: cwd)
506
+ end
507
+ end
508
+ end
509
+
510
+ # We try and use some chef-sugar code to make sure it loads correctly
511
+ add_component "chef-sugar" do |c|
512
+ c.gem_base_dir = "chef-sugar"
513
+ c.smoke_test do
514
+ tmpdir do |cwd|
515
+ with_file(File.join(cwd, "foo.rb")) do |f|
516
+ f.write <<~EOF
517
+ require 'chef/sugar'
518
+ log 'something' do
519
+ not_if { _64_bit? }
520
+ end
521
+ EOF
522
+ end
523
+ sh("chef-apply foo.rb", cwd: cwd)
524
+ end
525
+ end
526
+ end
527
+
528
+ attr_reader :verification_threads
529
+ attr_reader :verification_results
530
+ attr_reader :verification_status
531
+
532
+ def initialize
533
+ super
534
+ @verification_threads = [ ]
535
+ @verification_results = [ ]
536
+ @verification_status = 0
537
+ end
538
+
539
+ def run(params = [ ])
540
+ err("[WARN] This is an internal command used by the ChefDK development team. If you are a ChefDK user, please do not run it.")
541
+ @components_filter = parse_options(params)
542
+
543
+ validate_components!
544
+ invoke_tests
545
+ wait_for_tests
546
+ report_results
547
+
548
+ verification_status
549
+ end
550
+
551
+ def omnibus_root
552
+ config[:omnibus_dir] || super
553
+ end
554
+
555
+ def validate_components!
556
+ components.each do |component|
557
+ component.omnibus_root = omnibus_root
558
+ component.assert_present!
559
+ end
560
+ end
561
+
562
+ def components_to_test
563
+ if @components_filter.empty?
564
+ components
565
+ else
566
+ components.select do |component|
567
+ @components_filter.include?(component.name.to_s)
568
+ end
569
+ end
570
+ end
571
+
572
+ def invoke_tests
573
+ components_to_test.each do |component|
574
+ # Run the component specs in parallel
575
+ verification_threads << Thread.new do
576
+
577
+ results = []
578
+
579
+ results << component.run_smoke_test
580
+
581
+ if config[:unit]
582
+ results << component.run_unit_test
583
+ end
584
+
585
+ if config[:integration]
586
+ results << component.run_integration_test
587
+ end
588
+
589
+ if results.any? { |r| r.exitstatus != 0 }
590
+ component_status = 1
591
+ @verification_status = 1
592
+ else
593
+ component_status = 0
594
+ end
595
+
596
+ {
597
+ component: component,
598
+ results: results,
599
+ component_status: component_status,
600
+ }
601
+ end
602
+
603
+ msg("Running verification for component '#{component.name}'")
604
+ end
605
+ end
606
+
607
+ def wait_for_tests
608
+ until verification_threads.empty?
609
+ verification_threads.each do |t|
610
+ if t.join(1)
611
+ verification_threads.delete t
612
+ verification_results << t.value
613
+ t.value[:results].each do |result|
614
+ if config[:verbose] || t.value[:component_status] != 0
615
+ msg("")
616
+ msg(result.stdout)
617
+ msg(result.stderr) if result.stderr
618
+ end
619
+ end
620
+ else
621
+ $stdout.write "."
622
+ end
623
+ end
624
+ end
625
+ end
626
+
627
+ def report_results
628
+ msg("")
629
+ msg("---------------------------------------------")
630
+ verification_results.each do |result|
631
+ message = result[:component_status] == 0 ? "succeeded" : "failed"
632
+ msg("Verification of component '#{result[:component].name}' #{message}.")
633
+ end
634
+ end
635
+
636
+ end
637
+ end
638
+ end