cuken 0.1.1 → 0.1.2

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 (396) hide show
  1. data/Gemfile +5 -3
  2. data/Gemfile.lock +61 -18
  3. data/LICENSE +13 -0
  4. data/NOTICE +3 -0
  5. data/Rakefile +3 -3
  6. data/VERSION +1 -1
  7. data/cucumber.yml +8 -0
  8. data/cuken.gemspec +397 -13
  9. data/examples/chef/features/support/env.rb +16 -0
  10. data/features/chef/cookbooks/cookbook.feature +14 -0
  11. data/features/chef/cookbooks/metadata.feature +40 -0
  12. data/features/chef/cookbooks/repo.feature +13 -0
  13. data/features/chef/knife.feature +140 -0
  14. data/features/chef/knife_steps.feature +19 -0
  15. data/features/command_steps.feature +68 -0
  16. data/features/commands.feature +5 -5
  17. data/features/common_steps.feature +13 -0
  18. data/features/data/Rakefile +38 -0
  19. data/features/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  20. data/features/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  21. data/features/data/apt/chef-integration-test-1.0/debian/control +13 -0
  22. data/features/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  23. data/features/data/apt/chef-integration-test-1.0/debian/files +1 -0
  24. data/features/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  25. data/features/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  26. data/features/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  27. data/features/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  28. data/features/data/apt/chef-integration-test-1.1/debian/control +13 -0
  29. data/features/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  30. data/features/data/apt/chef-integration-test-1.1/debian/files +1 -0
  31. data/features/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  32. data/features/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  33. data/features/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  34. data/features/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  35. data/features/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  36. data/features/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  37. data/features/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  38. data/features/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  39. data/features/data/apt/var/www/apt/conf/distributions +7 -0
  40. data/features/data/apt/var/www/apt/conf/incoming +4 -0
  41. data/features/data/apt/var/www/apt/conf/pulls +3 -0
  42. data/features/data/apt/var/www/apt/db/checksums.db +0 -0
  43. data/features/data/apt/var/www/apt/db/contents.cache.db +0 -0
  44. data/features/data/apt/var/www/apt/db/packages.db +0 -0
  45. data/features/data/apt/var/www/apt/db/references.db +0 -0
  46. data/features/data/apt/var/www/apt/db/release.caches.db +0 -0
  47. data/features/data/apt/var/www/apt/db/version +4 -0
  48. data/features/data/apt/var/www/apt/dists/sid/Release +19 -0
  49. data/features/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  50. data/features/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  51. data/features/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  52. data/features/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  53. data/features/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  54. data/features/data/config/client.rb +23 -0
  55. data/features/data/config/client_with_checksum_caching.rb +23 -0
  56. data/features/data/config/knife-stephen.rb +12 -0
  57. data/features/data/config/knife.rb +11 -0
  58. data/features/data/config/rake.rb +57 -0
  59. data/features/data/config/server.rb +52 -0
  60. data/features/data/cookbook_tarballs/empty_tarball.tar.gz +0 -0
  61. data/features/data/cookbook_tarballs/new.tar.gz +0 -0
  62. data/features/data/cookbook_tarballs/not_a_tarball.txt +1 -0
  63. data/features/data/cookbook_tarballs/original.tar.gz +0 -0
  64. data/features/data/cookbooks/attribute_include/README.rdoc +8 -0
  65. data/features/data/cookbooks/attribute_include/attributes/a.rb +4 -0
  66. data/features/data/cookbooks/attribute_include/attributes/b.rb +2 -0
  67. data/features/data/cookbooks/attribute_include/metadata.rb +6 -0
  68. data/features/data/cookbooks/attribute_include/recipes/default.rb +23 -0
  69. data/features/data/cookbooks/attribute_include_default/README.rdoc +8 -0
  70. data/features/data/cookbooks/attribute_include_default/attributes/a.rb +5 -0
  71. data/features/data/cookbooks/attribute_include_default/attributes/default.rb +2 -0
  72. data/features/data/cookbooks/attribute_include_default/metadata.rb +6 -0
  73. data/features/data/cookbooks/attribute_include_default/recipes/default.rb +23 -0
  74. data/features/data/cookbooks/attribute_settings/README.rdoc +8 -0
  75. data/features/data/cookbooks/attribute_settings/attributes/default.rb +3 -0
  76. data/features/data/cookbooks/attribute_settings/default.rb +1 -0
  77. data/features/data/cookbooks/attribute_settings/metadata.rb +6 -0
  78. data/features/data/cookbooks/attribute_settings/recipes/default.rb +21 -0
  79. data/features/data/cookbooks/attribute_settings/recipes/default_in_recipe.rb +25 -0
  80. data/features/data/cookbooks/attribute_settings_normal/README.rdoc +8 -0
  81. data/features/data/cookbooks/attribute_settings_normal/attributes/.default.rb.swo +0 -0
  82. data/features/data/cookbooks/attribute_settings_normal/attributes/default.rb +2 -0
  83. data/features/data/cookbooks/attribute_settings_normal/default.rb +1 -0
  84. data/features/data/cookbooks/attribute_settings_normal/metadata.rb +6 -0
  85. data/features/data/cookbooks/attribute_settings_normal/recipes/.default.rb.swo +0 -0
  86. data/features/data/cookbooks/attribute_settings_normal/recipes/.default_in_recipe.rb.swo +0 -0
  87. data/features/data/cookbooks/attribute_settings_normal/recipes/default.rb +21 -0
  88. data/features/data/cookbooks/attribute_settings_normal/recipes/normal_in_recipe.rb +25 -0
  89. data/features/data/cookbooks/attribute_settings_override/README.rdoc +8 -0
  90. data/features/data/cookbooks/attribute_settings_override/attributes/default.rb +2 -0
  91. data/features/data/cookbooks/attribute_settings_override/default.rb +1 -0
  92. data/features/data/cookbooks/attribute_settings_override/metadata.rb +6 -0
  93. data/features/data/cookbooks/attribute_settings_override/recipes/default.rb +21 -0
  94. data/features/data/cookbooks/attribute_settings_override/recipes/normal_in_recipe.rb +25 -0
  95. data/features/data/cookbooks/attribute_settings_override/recipes/override_in_recipe.rb +21 -0
  96. data/features/data/cookbooks/delayed_notifications/recipes/bad_syntax_notifies.rb +14 -0
  97. data/features/data/cookbooks/delayed_notifications/recipes/default.rb +18 -0
  98. data/features/data/cookbooks/delayed_notifications/recipes/forward_references.rb +10 -0
  99. data/features/data/cookbooks/delayed_notifications/recipes/invalid_forward_reference.rb +16 -0
  100. data/features/data/cookbooks/delayed_notifications/recipes/notify_a_resource_from_a_single_source.rb +26 -0
  101. data/features/data/cookbooks/delayed_notifications/recipes/notify_a_resource_from_multiple_sources.rb +31 -0
  102. data/features/data/cookbooks/delayed_notifications/recipes/notify_different_resources_for_different_actions.rb +31 -0
  103. data/features/data/cookbooks/deploy/recipes/callbacks.rb +78 -0
  104. data/features/data/cookbooks/deploy/recipes/default.rb +51 -0
  105. data/features/data/cookbooks/deploy/recipes/deploy_commit1.rb +25 -0
  106. data/features/data/cookbooks/deploy/recipes/deploy_commit2.rb +25 -0
  107. data/features/data/cookbooks/deploy/recipes/embedded_recipe_callbacks.rb +70 -0
  108. data/features/data/cookbooks/deploy/recipes/revision_deploy.rb +51 -0
  109. data/features/data/cookbooks/deploy/recipes/rollback_commit2.rb +24 -0
  110. data/features/data/cookbooks/deploy/templates/default/app_config.yml.erb +23 -0
  111. data/features/data/cookbooks/deploy/templates/default/database.yml.erb +18 -0
  112. data/features/data/cookbooks/deploy/templates/default/embedded_recipe_before_symlink.rb.erb +4 -0
  113. data/features/data/cookbooks/deploy/templates/default/sneaky_after_restart_hook.rb.erb +4 -0
  114. data/features/data/cookbooks/deploy/templates/default/sneaky_before_migrate_hook.rb.erb +2 -0
  115. data/features/data/cookbooks/deploy/templates/default/sneaky_before_restart_hook.rb.erb +4 -0
  116. data/features/data/cookbooks/deploy/templates/default/sneaky_before_symlink_hook.rb.erb +2 -0
  117. data/features/data/cookbooks/directory_provider/recipes/create.rb +25 -0
  118. data/features/data/cookbooks/directory_provider/recipes/default.rb +18 -0
  119. data/features/data/cookbooks/directory_provider/recipes/delete.rb +29 -0
  120. data/features/data/cookbooks/directory_provider/recipes/delete_nonexistent.rb +23 -0
  121. data/features/data/cookbooks/directory_provider/recipes/owner_update.rb +31 -0
  122. data/features/data/cookbooks/directory_provider/recipes/set_the_accessibility_of_a_created_directory.rb +55 -0
  123. data/features/data/cookbooks/execute_commands/metadata.rb +5 -0
  124. data/features/data/cookbooks/execute_commands/recipes/4k.rb +25 -0
  125. data/features/data/cookbooks/execute_commands/recipes/debug.rb +22 -0
  126. data/features/data/cookbooks/execute_commands/recipes/default.rb +22 -0
  127. data/features/data/cookbooks/execute_commands/recipes/umask.rb +23 -0
  128. data/features/data/cookbooks/integration_setup/attributes/integration.rb +25 -0
  129. data/features/data/cookbooks/integration_setup/recipes/default.rb +24 -0
  130. data/features/data/cookbooks/lwrp/providers/default.rb +9 -0
  131. data/features/data/cookbooks/lwrp/providers/lwp_non_default.rb +3 -0
  132. data/features/data/cookbooks/lwrp/providers/lwp_overridden_load_current_resource.rb +8 -0
  133. data/features/data/cookbooks/lwrp/providers/provider_is_omitted.rb +3 -0
  134. data/features/data/cookbooks/lwrp/recipes/default_everything.rb +4 -0
  135. data/features/data/cookbooks/lwrp/recipes/non_default_provider.rb +6 -0
  136. data/features/data/cookbooks/lwrp/recipes/non_default_resource.rb +6 -0
  137. data/features/data/cookbooks/lwrp/recipes/overridden_provider_load_current_resource.rb +6 -0
  138. data/features/data/cookbooks/lwrp/recipes/overridden_resource_initialize.rb +6 -0
  139. data/features/data/cookbooks/lwrp/recipes/provider_invokes_resource.rb +6 -0
  140. data/features/data/cookbooks/lwrp/recipes/provider_is_a_class.rb +6 -0
  141. data/features/data/cookbooks/lwrp/recipes/provider_is_a_string.rb +6 -0
  142. data/features/data/cookbooks/lwrp/recipes/provider_is_a_symbol.rb +6 -0
  143. data/features/data/cookbooks/lwrp/recipes/provider_is_omitted.rb +3 -0
  144. data/features/data/cookbooks/lwrp/resources/default.rb +4 -0
  145. data/features/data/cookbooks/lwrp/resources/lwr_non_default.rb +3 -0
  146. data/features/data/cookbooks/lwrp/resources/lwr_overridden_initialize.rb +8 -0
  147. data/features/data/cookbooks/lwrp/resources/provider_is_omitted.rb +1 -0
  148. data/features/data/cookbooks/manage_files/recipes/create_a_file.rb +22 -0
  149. data/features/data/cookbooks/manage_files/recipes/default.rb +19 -0
  150. data/features/data/cookbooks/manage_files/recipes/delete_a_file.rb +24 -0
  151. data/features/data/cookbooks/manage_files/recipes/delete_a_file_that_does_not_already_exist.rb +22 -0
  152. data/features/data/cookbooks/manage_files/recipes/manage_file_contents.rb +23 -0
  153. data/features/data/cookbooks/manage_files/recipes/set_the_accessibility_of_a_created_file.rb +79 -0
  154. data/features/data/cookbooks/manage_files/recipes/set_the_owner_of_a_created_file.rb +23 -0
  155. data/features/data/cookbooks/manage_files/recipes/touch_a_file.rb +22 -0
  156. data/features/data/cookbooks/metadata/metadata.rb +17 -0
  157. data/features/data/cookbooks/metadata/recipes/default.rb +18 -0
  158. data/features/data/cookbooks/no_attributes/README.rdoc +8 -0
  159. data/features/data/cookbooks/no_attributes/metadata.rb +6 -0
  160. data/features/data/cookbooks/no_attributes/recipes/default.rb +21 -0
  161. data/features/data/cookbooks/node_cookbook_sync/README.rdoc +8 -0
  162. data/features/data/cookbooks/node_cookbook_sync/attributes/attr_file.rb +0 -0
  163. data/features/data/cookbooks/node_cookbook_sync/definitions/def_file.rb +0 -0
  164. data/features/data/cookbooks/node_cookbook_sync/libraries/lib_file.rb +0 -0
  165. data/features/data/cookbooks/node_cookbook_sync/metadata.rb +6 -0
  166. data/features/data/cookbooks/node_cookbook_sync/recipes/default.rb +18 -0
  167. data/features/data/cookbooks/packages/recipes/default.rb +0 -0
  168. data/features/data/cookbooks/packages/recipes/gem_package.rb +26 -0
  169. data/features/data/cookbooks/packages/recipes/install_apt_package.rb +3 -0
  170. data/features/data/cookbooks/packages/recipes/install_dpkg_package.rb +4 -0
  171. data/features/data/cookbooks/packages/recipes/install_gem_noshell.rb +26 -0
  172. data/features/data/cookbooks/packages/recipes/install_gem_package_twice.rb +26 -0
  173. data/features/data/cookbooks/packages/recipes/macports_install_bad_package.rb +3 -0
  174. data/features/data/cookbooks/packages/recipes/macports_install_yydecode.rb +3 -0
  175. data/features/data/cookbooks/packages/recipes/macports_purge_yydecode.rb +3 -0
  176. data/features/data/cookbooks/packages/recipes/macports_remove_yydecode.rb +3 -0
  177. data/features/data/cookbooks/packages/recipes/macports_upgrade_yydecode.rb +7 -0
  178. data/features/data/cookbooks/packages/recipes/manually_upgrade_gem_package.rb +32 -0
  179. data/features/data/cookbooks/packages/recipes/upgrade_gem_noshell.rb +33 -0
  180. data/features/data/cookbooks/packages/recipes/upgrade_gem_package.rb +33 -0
  181. data/features/data/cookbooks/recipe_include/README.rdoc +8 -0
  182. data/features/data/cookbooks/recipe_include/metadata.rb +6 -0
  183. data/features/data/cookbooks/recipe_include/recipes/default.rb +21 -0
  184. data/features/data/cookbooks/recipe_include/recipes/second.rb +23 -0
  185. data/features/data/cookbooks/roles/recipes/default.rb +26 -0
  186. data/features/data/cookbooks/roles/recipes/env_test.rb +25 -0
  187. data/features/data/cookbooks/run_interval/recipes/default.rb +27 -0
  188. data/features/data/cookbooks/scm/metadata.rb +8 -0
  189. data/features/data/cookbooks/scm/recipes/git.rb +25 -0
  190. data/features/data/cookbooks/search/attributes/search_attrs.rb +1 -0
  191. data/features/data/cookbooks/search/recipes/default.rb +18 -0
  192. data/features/data/cookbooks/search/recipes/search_data.rb +28 -0
  193. data/features/data/cookbooks/search/recipes/search_data_manual.rb +33 -0
  194. data/features/data/cookbooks/search/recipes/search_data_noblock.rb +32 -0
  195. data/features/data/cookbooks/show_cookbook/README.rdoc +8 -0
  196. data/features/data/cookbooks/show_cookbook/attributes/attr_file.rb +0 -0
  197. data/features/data/cookbooks/show_cookbook/definitions/def_file.rb +0 -0
  198. data/features/data/cookbooks/show_cookbook/files/default/prime_time.txt +0 -0
  199. data/features/data/cookbooks/show_cookbook/files/host-latte/prime_time.txt +0 -0
  200. data/features/data/cookbooks/show_cookbook/files/mac_os_x-10.5/prime_time.txt +0 -0
  201. data/features/data/cookbooks/show_cookbook/files/mac_os_x/prime_time.txt +0 -0
  202. data/features/data/cookbooks/show_cookbook/libraries/lib_file.rb +0 -0
  203. data/features/data/cookbooks/show_cookbook/metadata.rb +6 -0
  204. data/features/data/cookbooks/show_cookbook/recipes/default.rb +18 -0
  205. data/features/data/cookbooks/show_cookbook/templates/default/prime_time.txt.erb +0 -0
  206. data/features/data/cookbooks/show_cookbook/templates/host-latte/prime_time.txt.erb +0 -0
  207. data/features/data/cookbooks/show_cookbook/templates/mac_os_x-10.5/prime_time.txt.erb +0 -0
  208. data/features/data/cookbooks/show_cookbook/templates/mac_os_x/prime_time.txt.erb +0 -0
  209. data/features/data/cookbooks/synchronize/recipes/default.rb +18 -0
  210. data/features/data/cookbooks/synchronize_deps/metadata.json +30 -0
  211. data/features/data/cookbooks/synchronize_deps/metadata.rb +1 -0
  212. data/features/data/cookbooks/synchronize_deps/recipes/default.rb +18 -0
  213. data/features/data/cookbooks/template/README.rdoc +8 -0
  214. data/features/data/cookbooks/template/metadata.rb +6 -0
  215. data/features/data/cookbooks/template/recipes/default.rb +26 -0
  216. data/features/data/cookbooks/template/recipes/interval.rb +37 -0
  217. data/features/data/cookbooks/template/recipes/render_node_attrs.rb +26 -0
  218. data/features/data/cookbooks/template/templates/default/node.txt.erb +3 -0
  219. data/features/data/cookbooks/template/templates/default/template.txt.erb +1 -0
  220. data/features/data/cookbooks/transfer_remote_directories/files/default/transfer_directory_feature/bar.txt +1 -0
  221. data/features/data/cookbooks/transfer_remote_directories/files/default/transfer_directory_feature/baz.txt +1 -0
  222. data/features/data/cookbooks/transfer_remote_directories/files/default/transfer_directory_feature/foo.txt +1 -0
  223. data/features/data/cookbooks/transfer_remote_directories/recipes/transfer_directory.rb +29 -0
  224. data/features/data/cookbooks/transfer_remote_files/files/default/transfer_a_file_from_a_cookbook.txt +1 -0
  225. data/features/data/cookbooks/transfer_remote_files/metadata.json +30 -0
  226. data/features/data/cookbooks/transfer_remote_files/metadata.rb +1 -0
  227. data/features/data/cookbooks/transfer_remote_files/recipes/change_remote_file_perms_trickery.rb +33 -0
  228. data/features/data/cookbooks/transfer_remote_files/recipes/default.rb +18 -0
  229. data/features/data/cookbooks/transfer_remote_files/recipes/should_prefer_the_file_for_this_specific_host.rb +22 -0
  230. data/features/data/cookbooks/transfer_remote_files/recipes/transfer_a_file_from_a_cookbook.rb +22 -0
  231. data/features/data/cookbooks/transfer_remote_files/recipes/transfer_a_file_from_a_specific_cookbook.rb +20 -0
  232. data/features/data/cookbooks/transfer_remote_files/recipes/transfer_a_non-existent_file_from_a_cookbook.rb +22 -0
  233. data/features/data/cookbooks/transfer_remote_files_definition/definitions/transfer.rb +6 -0
  234. data/features/data/cookbooks/transfer_remote_files_definition/files/default/easy.txt +1 -0
  235. data/features/data/cookbooks/transfer_some_cookbook_files/files/default/should_be_transferred.txt +3 -0
  236. data/features/data/cookbooks/transfer_some_cookbook_files/files/default/should_not_be_transferred.txt +2 -0
  237. data/features/data/cookbooks/transfer_some_cookbook_files/recipes/default.rb +26 -0
  238. data/features/data/cookbooks/transfer_some_cookbook_files/templates/default/should_be_transferred.erb +2 -0
  239. data/features/data/cookbooks/transfer_some_cookbook_files/templates/default/should_not_be_transferred.erb +3 -0
  240. data/features/data/cookbooks/version_deps/metadata.rb +1 -0
  241. data/features/data/cookbooks/version_deps/recipes/default.rb +1 -0
  242. data/features/data/cookbooks/versions/metadata.rb +5 -0
  243. data/features/data/cookbooks/versions/recipes/default.rb +5 -0
  244. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_1.0.0/metadata.json +31 -0
  245. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_1.0.0/metadata.rb +8 -0
  246. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_1.0.0/recipes/default.rb +18 -0
  247. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_2.0.0/metadata.json +29 -0
  248. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_2.0.0/metadata.rb +6 -0
  249. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_2.0.0/recipes/default.rb +18 -0
  250. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_3.0.0/metadata.json +30 -0
  251. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_3.0.0/metadata.rb +7 -0
  252. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_3.0.0/recipes/default.rb +18 -0
  253. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_1.0.0/metadata.json +31 -0
  254. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_1.0.0/metadata.rb +8 -0
  255. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_1.0.0/recipes/default.rb +18 -0
  256. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_2.0.0/metadata.json +31 -0
  257. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_2.0.0/metadata.rb +8 -0
  258. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_2.0.0/recipes/default.rb +18 -0
  259. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_3.0.0/metadata.json +30 -0
  260. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_3.0.0/metadata.rb +7 -0
  261. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_3.0.0/recipes/default.rb +18 -0
  262. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_1.0.0/metadata.json +31 -0
  263. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_1.0.0/metadata.rb +8 -0
  264. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_1.0.0/recipes/default.rb +18 -0
  265. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_2.0.0/metadata.json +29 -0
  266. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_2.0.0/metadata.rb +6 -0
  267. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_2.0.0/recipes/default.rb +18 -0
  268. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_3.0.0/metadata.json +29 -0
  269. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_3.0.0/metadata.rb +6 -0
  270. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_3.0.0/recipes/default.rb +18 -0
  271. data/features/data/cookbooks_not_uploaded_at_feature_start/test_cookbook/attributes/attr1.rb +1 -0
  272. data/features/data/cookbooks_not_uploaded_at_feature_start/test_cookbook/attributes/attr2.rb +1 -0
  273. data/features/data/cookbooks_not_uploaded_at_feature_start/test_cookbook/recipes/default.rb +2 -0
  274. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_empty_except_metadata/metadata.json +38 -0
  275. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_empty_except_metadata/metadata.rb +6 -0
  276. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_nometadata/attributes/attributes.rb +1 -0
  277. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_nometadata/recipes/default.rb +2 -0
  278. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/attributes/attributes.rb +1 -0
  279. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/metadata.json +38 -0
  280. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/metadata.rb +6 -0
  281. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/recipes/default.rb +2 -0
  282. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/attributes/attributes.rb +1 -0
  283. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/metadata.json +40 -0
  284. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/metadata.rb +7 -0
  285. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/recipes/default.rb +2 -0
  286. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/attributes/attributes.rb +1 -0
  287. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/metadata.json +38 -0
  288. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/metadata.rb +6 -0
  289. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/recipes/default.rb +2 -0
  290. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_wrong_metadata/metadata.json +40 -0
  291. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_wrong_metadata/recipes/default.rb +1 -0
  292. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.0/metadata.json +39 -0
  293. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.0/metadata.rb +6 -0
  294. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.0/recipes/default.rb +18 -0
  295. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.1/metadata.json +39 -0
  296. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.1/metadata.rb +6 -0
  297. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.1/recipes/default.rb +18 -0
  298. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.10.0/metadata.json +39 -0
  299. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.10.0/metadata.rb +6 -0
  300. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.10.0/recipes/default.rb +18 -0
  301. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.2.0/metadata.json +39 -0
  302. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.2.0/metadata.rb +6 -0
  303. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.2.0/recipes/default.rb +18 -0
  304. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.0/metadata.json +39 -0
  305. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.0/metadata.rb +6 -0
  306. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.0/recipes/default.rb +18 -0
  307. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.7/metadata.json +39 -0
  308. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.7/metadata.rb +6 -0
  309. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.7/recipes/default.rb +18 -0
  310. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/attributes/attributes.rb +1 -0
  311. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/metadata.json +29 -0
  312. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/metadata.rb +6 -0
  313. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/recipes/default.rb +2 -0
  314. data/features/data/cookbooks_not_uploaded_at_feature_start/versions/metadata.json +38 -0
  315. data/features/data/cookbooks_not_uploaded_at_feature_start/versions/metadata.rb +5 -0
  316. data/features/data/cookbooks_not_uploaded_at_feature_start/versions/recipes/default.rb +5 -0
  317. data/features/data/gems/Marshal.4.8 +0 -0
  318. data/features/data/gems/Marshal.4.8.Z +0 -0
  319. data/features/data/gems/latest_specs.4.8 +0 -0
  320. data/features/data/gems/latest_specs.4.8.gz +0 -0
  321. data/features/data/gems/prerelease_specs.4.8 +0 -0
  322. data/features/data/gems/prerelease_specs.4.8.gz +0 -0
  323. data/features/data/gems/quick/Marshal.4.8/chef-integration-test-0.1.0.gemspec.rz +0 -0
  324. data/features/data/gems/quick/Marshal.4.8/chef-integration-test-0.1.1.gemspec.rz +0 -0
  325. data/features/data/gems/quick/chef-integration-test-0.1.0.gemspec.rz +0 -0
  326. data/features/data/gems/quick/chef-integration-test-0.1.1.gemspec.rz +0 -0
  327. data/features/data/gems/quick/index +2 -0
  328. data/features/data/gems/quick/index.rz +0 -0
  329. data/features/data/gems/quick/latest_index +1 -0
  330. data/features/data/gems/quick/latest_index.rz +0 -0
  331. data/features/data/gems/specs.4.8 +0 -0
  332. data/features/data/gems/specs.4.8.gz +0 -0
  333. data/features/data/gems/yaml +122 -0
  334. data/features/data/gems/yaml.Z +0 -0
  335. data/features/data/json_attribs/attribute_settings.json +3 -0
  336. data/features/data/json_attribs/json_runlist_and_attrs.json +4 -0
  337. data/features/data/myapp.bundle +0 -0
  338. data/features/data/node-load-test.rb +84 -0
  339. data/features/data/node-simple.rb +18 -0
  340. data/features/data/repositories/chef-repo/.gitignore +2 -0
  341. data/features/data/repositories/chef-repo/README.md +66 -0
  342. data/features/data/repositories/chef-repo/Rakefile +65 -0
  343. data/features/data/repositories/chef-repo/certificates/README.md +19 -0
  344. data/features/data/repositories/chef-repo/config/rake.rb +38 -0
  345. data/features/data/repositories/chef-repo/cookbooks/README.md +53 -0
  346. data/features/data/repositories/chef-repo/data_bags/README.md +23 -0
  347. data/features/data/repositories/chef-repo/roles/README.md +16 -0
  348. data/features/data/repositories/cookbooks/hosts/attributes/hosts.rb +1 -0
  349. data/features/data/repositories/cookbooks/hosts/cc.gemspec +36 -0
  350. data/features/data/repositories/cookbooks/hosts/metadata.json +41 -0
  351. data/features/data/repositories/cookbooks/hosts/metadata.rb +4 -0
  352. data/features/data/repositories/cookbooks/hosts/recipes/default.rb +6 -0
  353. data/features/data/repositories/cookbooks/hosts/templates/default/hosts.erb +27 -0
  354. data/features/data/search-tests/do_knife_search_test.rb +175 -0
  355. data/features/data/search-tests/search-test-nodes.rb +174 -0
  356. data/features/data/test_git_repo.tar.gz +0 -0
  357. data/features/file_steps.feature +70 -0
  358. data/features/files.feature +30 -16
  359. data/features/ssh.feature +2 -1
  360. data/features/ssh_steps.feature +20 -0
  361. data/features/step_definitions/cuken_steps.rb +10 -0
  362. data/features/support/env.rb +1 -0
  363. data/lib/cuken/api/chef.rb +115 -0
  364. data/lib/cuken/api/chef/common.rb +80 -0
  365. data/lib/cuken/api/file.rb +23 -3
  366. data/lib/cuken/chef.rb +3 -0
  367. data/lib/cuken/common.rb +0 -1
  368. data/lib/cuken/cucumber/chef.rb +16 -0
  369. data/lib/cuken/cucumber/chef/common.rb +68 -0
  370. data/lib/cuken/cucumber/chef/cookbook.rb +75 -0
  371. data/lib/cuken/cucumber/chef/cookbook_steps.rb +406 -0
  372. data/lib/cuken/cucumber/chef/deploy_steps.rb +84 -0
  373. data/lib/cuken/cucumber/chef/done_directory_steps.rb +41 -0
  374. data/lib/cuken/cucumber/chef/done_file_steps.rb +107 -0
  375. data/lib/cuken/cucumber/chef/done_knife_steps.rb +34 -0
  376. data/lib/cuken/cucumber/chef/fixture_steps.rb +413 -0
  377. data/lib/cuken/cucumber/chef/knife.rb +34 -0
  378. data/lib/cuken/cucumber/chef/node.rb +27 -0
  379. data/lib/cuken/cucumber/chef/node_steps.rb +88 -0
  380. data/lib/cuken/cucumber/chef/packages.rb +144 -0
  381. data/lib/cuken/cucumber/chef/pending_steps.rb +21 -0
  382. data/lib/cuken/cucumber/chef/recipe_steps.rb +23 -0
  383. data/lib/cuken/cucumber/chef/request_steps.rb +98 -0
  384. data/lib/cuken/cucumber/chef/response_steps.rb +233 -0
  385. data/lib/cuken/cucumber/chef/result_steps.rb +15 -0
  386. data/lib/cuken/cucumber/chef/run_client_steps.rb +260 -0
  387. data/lib/cuken/cucumber/chef/run_solo.rb +78 -0
  388. data/lib/cuken/cucumber/chef/sandbox_steps.rb +137 -0
  389. data/lib/cuken/cucumber/chef/search_steps.rb +70 -0
  390. data/lib/cuken/cucumber/chef/webrat_steps.rb +39 -0
  391. data/lib/cuken/cucumber/cmd.rb +18 -1
  392. data/lib/cuken/cucumber/common.rb +4 -0
  393. data/lib/cuken/cucumber/file.rb +25 -27
  394. data/lib/cuken/cucumber/ssh.rb +6 -6
  395. metadata +427 -27
  396. data/LICENSE.txt +0 -20
@@ -0,0 +1,15 @@
1
+ Then /^I should see "(.*)"$/ do |text|
2
+ response.body.to_s.should =~ /#{text}/m
3
+ end
4
+
5
+ Then /^I should not see "(.*)"$/ do |text|
6
+ response.body.to_s.should_not =~ /#{text}/m
7
+ end
8
+
9
+ Then /^I should see an? (\w+) message$/ do |message_type|
10
+ response.should have_xpath("//*[@class='#{message_type}']")
11
+ end
12
+
13
+ Then /^the (.*) ?request should fail/ do |_|
14
+ response.should_not be_successful
15
+ end
@@ -0,0 +1,260 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/shell_out'
20
+ require 'chef/mixin/shell_out'
21
+
22
+ include Chef::Mixin::ShellOut
23
+
24
+ CHEF_CLIENT = File.join(CHEF_PROJECT_ROOT, "chef", "bin", "chef-client")
25
+
26
+ def chef_client_command_string
27
+ @log_level ||= ENV["LOG_LEVEL"] ? ENV["LOG_LEVEL"] : "error"
28
+ @chef_args ||= ""
29
+ @config_file ||= File.expand_path(File.join(configdir, 'client.rb'))
30
+
31
+ "#{File.join(File.dirname(__FILE__), "..", "..", "chef", "bin", "chef-client")} -l #{@log_level} -c #{@config_file} #{@chef_args}"
32
+ end
33
+
34
+ ###
35
+ # When
36
+ ###
37
+ When /^I run the chef\-client$/ do
38
+ status = Chef::Mixin::Command.popen4(chef_client_command_string()) do |p, i, o, e|
39
+ @stdout = o.gets(nil)
40
+ @stderr = e.gets(nil)
41
+ end
42
+ @status = status
43
+ end
44
+
45
+ When "I run the chef-client for no more than '$timeout' seconds" do |timeout|
46
+ cmd = shell_out("#{CHEF_CLIENT} -l info -i 1 -s 1 -c #{File.expand_path(File.join(configdir, 'client.rb'))}", :timeout => timeout.to_i)
47
+ @status = cmd.status
48
+ end
49
+
50
+ When /^I run the chef\-client again$/ do
51
+ When "I run the chef-client"
52
+ end
53
+
54
+ When /^I run the chef\-client with '(.+)'$/ do |args|
55
+ @chef_args = args
56
+ When "I run the chef-client"
57
+ end
58
+
59
+ When "I run the chef-client with '$options' and the '$config_file' config" do |options, config_file|
60
+ @config_file = File.expand_path(File.join(configdir, "#{config_file}.rb"))
61
+ @chef_args = options
62
+ When "I run the chef-client"
63
+ end
64
+
65
+ When /^I run the chef\-client with '(.+)' for '(.+)' seconds$/ do |args, run_for|
66
+ @chef_args = args
67
+ When "I run the chef-client for '#{run_for}' seconds"
68
+ end
69
+
70
+ When /^I run the chef\-client for '(.+)' seconds$/ do |run_for|
71
+ # Normal behavior depends on the run_interval/recipes/default.rb to count down
72
+ # and exit subordinate chef-client after two runs. However, we will forcably
73
+ # kill the client if that didn't work.
74
+ begin
75
+ stdout_filename = "/tmp/chef.run_interval.stdout.#{$$}.txt"
76
+ stderr_filename = "/tmp/chef.run_interval.stderr.#{$$}.txt"
77
+ client_pid = Process.fork do
78
+ STDOUT.reopen(File.open(stdout_filename, "w"))
79
+ STDERR.reopen(File.open(stderr_filename, "w"))
80
+ exec chef_client_command_string()
81
+ exit 2
82
+ end
83
+
84
+ killer_pid = Process.fork {
85
+ sleep run_for.to_i
86
+
87
+ # Send KILL to the child chef-client. Due to OHAI-223, where ohai sometimes
88
+ # ignores/doesn't exit correctly on receipt of SIGINT, brutally kill the
89
+ # subprocess.
90
+ begin
91
+ Process.kill("KILL", client_pid)
92
+ rescue Errno::ESRCH
93
+ # Kill didn't work; the process exited while we were waiting, like
94
+ # it's supposed to.
95
+ end
96
+ }
97
+
98
+ Process.waitpid2(killer_pid)
99
+ @status = Process.waitpid2(client_pid).last
100
+
101
+ # Read these in so they can be used in later steps.
102
+ @stdout = IO.read(stdout_filename)
103
+ @stderr = IO.read(stderr_filename)
104
+ ensure
105
+ # clean up after ourselves.
106
+ File.delete(stdout_filename)
107
+ File.delete(stderr_filename)
108
+ end
109
+ end
110
+
111
+ When /^I run the chef\-client at log level '(.+)'$/ do |log_level|
112
+ @log_level = log_level.to_sym
113
+ When "I run the chef-client"
114
+ end
115
+
116
+ When 'I run the chef-client with json attributes' do
117
+ @log_level = :debug
118
+ @chef_args = "-j #{File.join(FEATURES_DATA, 'json_attribs', 'attribute_settings.json')}"
119
+ When "I run the chef-client"
120
+ end
121
+
122
+ When "I run the chef-client with json attributes '$json_file_basename'" do |json_file_basename|
123
+ @log_level = :debug
124
+ @chef_args = "-j #{File.join(FEATURES_DATA, 'json_attribs', "#{json_file_basename}.json")}"
125
+ When "I run the chef-client"
126
+ end
127
+
128
+ When /^I run the chef\-client with config file '(.+)'$/ do |config_file|
129
+ @config_file = config_file
130
+ When "I run the chef-client"
131
+ end
132
+
133
+ When /^I run the chef\-client with logging to the file '(.+)'$/ do |log_file|
134
+
135
+ config_data = <<CONFIG
136
+ supportdir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
137
+ tmpdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "tmp"))
138
+
139
+ log_level :debug
140
+ log_location File.join(tmpdir, "silly-monkey.log")
141
+ file_cache_path File.join(tmpdir, "cache")
142
+ ssl_verify_mode :verify_none
143
+ registration_url "http://127.0.0.1:4000"
144
+ template_url "http://127.0.0.1:4000"
145
+ remotefile_url "http://127.0.0.1:4000"
146
+ search_url "http://127.0.0.1:4000"
147
+ role_url "http://127.0.0.1:4000"
148
+ client_url "http://127.0.0.1:4000"
149
+ chef_server_url "http://127.0.0.1:4000"
150
+ validation_client_name "validator"
151
+ systmpdir = File.expand_path(File.join(Dir.tmpdir, "chef_integration"))
152
+ validation_key File.join(systmpdir, "validation.pem")
153
+ client_key File.join(systmpdir, "client.pem")
154
+ CONFIG
155
+
156
+ @config_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'data', 'config', 'client-with-logging.rb'))
157
+ File.open(@config_file, "w") do |file|
158
+ file.write(config_data)
159
+ end
160
+
161
+ self.cleanup_files << @config_file
162
+
163
+
164
+ @status = Chef::Mixin::Command.popen4("#{File.join(File.dirname(__FILE__), "..", "..", "chef", "bin", "chef-client")} -c #{@config_file} #{@chef_args}") do |p, i, o, e|
165
+ @stdout = o.gets(nil)
166
+ @stderr = e.gets(nil)
167
+ end
168
+ end
169
+
170
+ ###
171
+ # Then
172
+ ###
173
+ Then /^the run should exit '(.+)'$/ do |exit_code|
174
+ if ENV['LOG_LEVEL'] == 'debug'
175
+ puts @status.inspect
176
+ puts @status.exitstatus
177
+ end
178
+ begin
179
+ @status.exitstatus.should eql(exit_code.to_i)
180
+ rescue
181
+ print_output
182
+ raise
183
+ end
184
+ print_output if ENV["LOG_LEVEL"] == "debug"
185
+ end
186
+
187
+ Then "I print the debug log" do
188
+ print_output
189
+ end
190
+
191
+ Then /^the run should exit from being signaled$/ do
192
+ begin
193
+ @status.signaled?.should == true
194
+ rescue
195
+ print_output
196
+ raise
197
+ end
198
+ print_output if ENV["LOG_LEVEL"] == "debug"
199
+ end
200
+
201
+
202
+ def print_output
203
+ puts "--- run stdout:"
204
+ puts @stdout
205
+ puts "--- run stderr:"
206
+ puts @stderr
207
+ end
208
+
209
+ # Matcher for regular expression which uses normal string interpolation for
210
+ # the actual (target) value instead of expecting it, as stdout/stderr which
211
+ # get matched against may have lots of newlines, which looks ugly when
212
+ # inspected, as the newlines show up as \n
213
+ class NoInspectMatch
214
+ def initialize(expected_regex)
215
+ @expected_regex = expected_regex
216
+ end
217
+ def matches?(target)
218
+ @target = target
219
+ @target =~ @expected_regex
220
+ end
221
+ def failure_message
222
+ "expected #{@target} should match #{@expected_regex}"
223
+ end
224
+ def negative_failure_message
225
+ "expected #{@target} not to match #{@expected_regex}"
226
+ end
227
+ end
228
+ def noinspect_match(expected_regex)
229
+ NoInspectMatch.new(expected_regex)
230
+ end
231
+
232
+
233
+ Then /^'(.+)' should have '(.+)'$/ do |which, to_match|
234
+ if which == "stdout" || which == "stderr"
235
+ self.instance_variable_get("@#{which}".to_sym).should noinspect_match(/#{to_match}/m)
236
+ else
237
+ self.instance_variable_get("@#{which}".to_sym).should match(/#{to_match}/m)
238
+ end
239
+ end
240
+
241
+ Then /^'(.+)' should not have '(.+)'$/ do |which, to_match|
242
+ to_match = Regexp.escape(to_match)
243
+ if which == "stdout" || which == "stderr"
244
+ self.instance_variable_get("@#{which}".to_sym).should_not noinspect_match(/#{to_match}/m)
245
+ else
246
+ self.instance_variable_get("@#{which}".to_sym).should_not match(/#{to_match}/m)
247
+ end
248
+ end
249
+
250
+ Then /^'(.+)' should appear on '(.+)' '(.+)' times$/ do |to_match, which, count|
251
+ seen_count = 0
252
+ self.instance_variable_get("@#{which}".to_sym).split("\n").each do |line|
253
+ seen_count += 1 if line =~ /#{to_match}/
254
+ end
255
+ seen_count.should == count.to_i
256
+ end
257
+
258
+ Then "I inspect the contents of the features tmpdir" do
259
+ puts `ls -halpR #{tmpdir}`
260
+ end
@@ -0,0 +1,78 @@
1
+ # This is kind of a crazy-ass setup, but it works.
2
+ When /^I run chef-solo with the '(.+)' recipe$/ do |recipe_name|
3
+ # Set up the JSON file with the recipe we want to run.
4
+ dna_file = "#{tmpdir}/chef-solo-features-dna.json"
5
+ File.open(dna_file, "w") do |fp|
6
+ fp.write("{ \"run_list\": [\"#{recipe_name}\"] }")
7
+ end
8
+
9
+ cleanup_files << "#{tmpdir}/chef-solo-features-dna.json"
10
+
11
+ # Set up the cache dir.
12
+ cache_dir = "#{tmpdir}/chef-solo-cache-features"
13
+ system("mkdir -p #{cache_dir}")
14
+ cleanup_dirs << cache_dir
15
+
16
+ # Cookbook dir
17
+ cookbook_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '..', 'data', 'cookbooks'))
18
+ system("cp -r #{cookbook_dir} #{cache_dir}")
19
+
20
+ # Config file
21
+ config_file = "#{tmpdir}/chef-solo-config-features.rb"
22
+ File.open(config_file, "w") do |fp|
23
+ fp.write("cookbook_path \"#{cache_dir}/cookbooks\"\n")
24
+ fp.write("file_cache_path \"#{cache_dir}/cookbooks\"\n")
25
+ end
26
+ cleanup_files << config_file
27
+
28
+ binary_path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'chef', 'bin', 'chef-solo'))
29
+ command = "#{binary_path} -c #{config_file} -j #{dna_file}"
30
+ command += " -l debug" if ENV['LOG_LEVEL'] == 'debug'
31
+
32
+ # Run it
33
+ puts "Running solo: #{command}" if ENV['LOG_LEVEL'] == 'debug'
34
+
35
+ status = Chef::Mixin::Command.popen4(command) do |p, i, o, e|
36
+ @stdout = o.gets(nil)
37
+ @stderr = o.gets(nil)
38
+ end
39
+ @status = status
40
+
41
+ print_output if ENV['LOG_LEVEL'] == 'debug'
42
+ end
43
+
44
+
45
+ # This is kind of a crazy-ass setup, but it works.
46
+ When /^I run chef-solo without cookbooks$/ do
47
+
48
+ # Set up the cache dir.
49
+ cache_dir = "#{tmpdir}/chef-solo-cache-features"
50
+ system("mkdir -p #{cache_dir}")
51
+ cleanup_dirs << cache_dir
52
+
53
+ # Empty Cookbook dir
54
+ system("mkdir #{cache_dir}/cookbooks")
55
+
56
+ # Config file
57
+ config_file = "#{tmpdir}/chef-solo-config-features.rb"
58
+ File.open(config_file, "w") do |fp|
59
+ fp.write("cookbook_path \"#{cache_dir}/cookbooks\"\n")
60
+ fp.write("file_cache_path \"#{cache_dir}/cookbooks\"\n")
61
+ end
62
+ cleanup_files << config_file
63
+
64
+ binary_path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'chef', 'bin', 'chef-solo'))
65
+ command = "#{binary_path} -c #{config_file}"
66
+ command += " -l debug" if ENV['LOG_LEVEL'] == 'debug'
67
+
68
+ # Run it
69
+ puts "Running solo: #{command}" if ENV['LOG_LEVEL'] == 'debug'
70
+
71
+ status = Chef::Mixin::Command.popen4(command) do |p, i, o, e|
72
+ @stdout = o.gets(nil)
73
+ @stderr = o.gets(nil)
74
+ end
75
+ @status = status
76
+
77
+ print_output if ENV['LOG_LEVEL'] == 'debug'
78
+ end
@@ -0,0 +1,137 @@
1
+ require 'chef/sandbox'
2
+
3
+ # Upload the given file to the sandbox which was created by 'when I create a
4
+ # sandbox named'
5
+ def upload_to_sandbox(sandbox_filename, sandbox_file_checksum, url)
6
+
7
+ checksum64 = Base64.encode64([sandbox_file_checksum].pack("H*")).strip
8
+ timestamp = Time.now.utc.iso8601
9
+ file_contents = File.read(sandbox_filename)
10
+ # TODO - 5/28/2010, cw: make signing and sending the request streaming
11
+ sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(
12
+ :http_method => :put,
13
+ :path => URI.parse(url).path,
14
+ :body => file_contents,
15
+ :timestamp => timestamp,
16
+ :user_id => rest.client_name
17
+ )
18
+ headers = {
19
+ 'content-type' => 'application/x-binary',
20
+ 'content-md5' => checksum64,
21
+ :accept => 'application/json'
22
+ }
23
+ headers.merge!(sign_obj.sign(OpenSSL::PKey::RSA.new(rest.signing_key)))
24
+
25
+ # Don't set inflated_response as S3 (for the Platform) doesn't return JSON.
26
+ # Only Open Source does.
27
+ self.inflated_response = nil
28
+ self.exception = nil
29
+ self.api_response = RestClient::Request.execute(
30
+ :method => :put,
31
+ :url => url,
32
+ :headers => headers,
33
+ :payload => file_contents
34
+ )
35
+ end
36
+
37
+
38
+ When /^I create a sandbox named '([^\']+)'$/ do |sandbox_name|
39
+ begin
40
+ sandbox = get_fixture('sandbox', sandbox_name)
41
+ raise "no such sandbox in fixtures: #{sandbox_name}" unless sandbox
42
+
43
+ @stash['sandbox'] = sandbox
44
+
45
+ self.api_response = nil
46
+ self.exception = nil
47
+ self.inflated_response = rest.post_rest('/sandboxes', sandbox)
48
+ self.sandbox_url = self.inflated_response['uri']
49
+
50
+ @stash['sandbox_response'] = self.inflated_response
51
+ rescue
52
+ Chef::Log.debug("Caught exception in sandbox create (POST) request: #{$!.message}: #{$!.backtrace.join("\n")}")
53
+ self.exception = $!
54
+ end
55
+ end
56
+
57
+ When /^I commit the sandbox$/ do
58
+ begin
59
+ sandbox = @stash['sandbox']
60
+
61
+ # sandbox_url is fully qualified (with http://, sandboxes, etc.)
62
+ self.api_response = nil
63
+ self.exception = nil
64
+ self.inflated_response = rest.put_rest("#{self.sandbox_url}", {:is_completed => true})
65
+
66
+ @stash.delete('sandbox_response')
67
+ rescue
68
+ Chef::Log.debug("Caught exception in sandbox commit (PUT) request: #{$!.message}: #{$!.backtrace.join("\n")}")
69
+ self.exception = $!
70
+ end
71
+ end
72
+
73
+ Then /^I upload a file named '([^\']+)' to the sandbox$/ do |stash_sandbox_filename|
74
+ begin
75
+ sandbox = @stash['sandbox']
76
+ raise "no sandbox defined, have you called 'When I create a sandbox'" unless sandbox
77
+
78
+ sandbox_filename = get_fixture('sandbox_file', stash_sandbox_filename)
79
+ raise "no such stash_sandbox_filename in fixtures: #{stash_sandbox_filename}" unless sandbox_filename
80
+
81
+ sandbox_file_checksum = Chef::CookbookVersion.checksum_cookbook_file(sandbox_filename)
82
+ if @stash['sandbox_response']['checksums'].key?(sandbox_file_checksum)
83
+ Chef::Log.debug "uploading a file '#{stash_sandbox_filename}' with correct checksum #{sandbox_file_checksum}"
84
+ url = @stash['sandbox_response']['checksums'][sandbox_file_checksum]['url']
85
+ else
86
+ Chef::Log.debug "Sandbox doesn't have a checksum #{sandbox_file_checksum}, assuming a negative test"
87
+ Chef::Log.debug "using checksum 'F157'... just kidding, using #{sandbox_file_checksum}"
88
+ url = @stash['sandbox_response']['uri'] + "/#{sandbox_file_checksum}"
89
+ end
90
+
91
+ upload_to_sandbox(sandbox_filename, sandbox_file_checksum, url)
92
+ rescue
93
+ Chef::Log.debug("Caught exception in sandbox checksum upload (PUT) request: #{$!.message}: #{$!.backtrace.join("\n")}")
94
+ self.exception = $!
95
+ end
96
+ end
97
+
98
+ # Upload a file sandbox_filename_to_upload, but post it to the URL specified by
99
+ # sandbox_file_for_checksum, to cause the checksum check to fail.
100
+ Then /^I upload a file named '([^\']+)' using the checksum of '(.+)' to the sandbox$/ do |stash_upload_filename, stash_checksum_filename|
101
+ begin
102
+ sandbox = @stash['sandbox']
103
+
104
+ sandbox_upload_filename = get_fixture('sandbox_file', stash_upload_filename)
105
+ sandbox_checksum_filename = get_fixture('sandbox_file', stash_checksum_filename)
106
+ raise "no such stash_upload_filename in fixtures: #{stash_upload_filename}" unless sandbox_upload_filename
107
+ raise "no such stash_checksum_filename in fixtures: #{stash_checksum_filename}" unless stash_checksum_filename
108
+
109
+ use_checksum = Chef::CookbookVersion.checksum_cookbook_file(sandbox_checksum_filename)
110
+ url = @stash['sandbox_response']['checksums'][use_checksum]['url']
111
+
112
+ upload_to_sandbox(sandbox_upload_filename, use_checksum, url)
113
+ rescue
114
+ Chef::Log.debug("Caught exception in bad sandbox checksum upload (PUT) request: #{$!.message}: #{$!.backtrace.join("\n")}")
115
+ self.exception = $!
116
+ end
117
+ end
118
+
119
+ #Then the sandbox file 'sandbox2_file1' should need upload
120
+ Then /^the sandbox file '(.+)' should need upload$/ do |stash_filename|
121
+ sandbox = @stash['sandbox_response']
122
+
123
+ sandbox_filename = get_fixture('sandbox_file', stash_filename)
124
+ sandbox_checksum = Chef::CookbookVersion.checksum_cookbook_file(sandbox_filename)
125
+
126
+ sandbox['checksums'][sandbox_checksum]['needs_upload'] == true
127
+ end
128
+
129
+ Then /^the sandbox file '(.+)' should not need upload$/ do |stash_filename|
130
+ sandbox = @stash['sandbox_response']
131
+
132
+ sandbox_filename = get_fixture('sandbox_file', stash_filename)
133
+ sandbox_checksum = Chef::CookbookVersion.checksum_cookbook_file(sandbox_filename)
134
+
135
+ sandbox['checksums'][sandbox_checksum]['needs_upload'] == false
136
+ end
137
+