cloud-toaster 1.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 (515) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +202 -0
  3. data/README.md +54 -0
  4. data/Rakefile +51 -0
  5. data/VERSION +1 -0
  6. data/bin/strace-4.8_patched/strace-i686 +0 -0
  7. data/bin/strace-4.8_patched/strace-x86_64 +0 -0
  8. data/bin/toaster +74 -0
  9. data/chef/cookbooks/chef-solo-search/CHANGELOG +16 -0
  10. data/chef/cookbooks/chef-solo-search/Gemfile +8 -0
  11. data/chef/cookbooks/chef-solo-search/LICENSE +202 -0
  12. data/chef/cookbooks/chef-solo-search/NOTICE +18 -0
  13. data/chef/cookbooks/chef-solo-search/README.md +143 -0
  14. data/chef/cookbooks/chef-solo-search/Rakefile +10 -0
  15. data/chef/cookbooks/chef-solo-search/libraries/search/overrides.rb +100 -0
  16. data/chef/cookbooks/chef-solo-search/libraries/search/parser.rb +222 -0
  17. data/chef/cookbooks/chef-solo-search/libraries/search.rb +75 -0
  18. data/chef/cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene.treetop +150 -0
  19. data/chef/cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene_nodes.rb +285 -0
  20. data/chef/cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/query_transform.rb +65 -0
  21. data/chef/cookbooks/chef-solo-search/metadata.rb +11 -0
  22. data/chef/cookbooks/chef-solo-search/recipes/default.rb +3 -0
  23. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/node/alpha.json +10 -0
  24. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/node/beta.json +10 -0
  25. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/node/without_json_class.json +7 -0
  26. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/jerry.json +8 -0
  27. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/lea.json +10 -0
  28. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/mike.json +13 -0
  29. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/tom.json +10 -0
  30. data/chef/cookbooks/chef-solo-search/tests/gemfiles/Gemfile.10 +4 -0
  31. data/chef/cookbooks/chef-solo-search/tests/gemfiles/Gemfile.11 +5 -0
  32. data/chef/cookbooks/chef-solo-search/tests/test_data_bags.rb +45 -0
  33. data/chef/cookbooks/chef-solo-search/tests/test_search.rb +244 -0
  34. data/chef/cookbooks/lxc/attributes/create_lxc.rb +8 -0
  35. data/chef/cookbooks/lxc/attributes/general.rb +15 -0
  36. data/chef/cookbooks/lxc/attributes/init_bare_os.rb +15 -0
  37. data/chef/cookbooks/lxc/attributes/init_proto.rb +18 -0
  38. data/chef/cookbooks/lxc/attributes/install_ruby.rb +51 -0
  39. data/chef/cookbooks/lxc/attributes/mount_volume.rb +11 -0
  40. data/chef/cookbooks/lxc/attributes/setup_host.rb +9 -0
  41. data/chef/cookbooks/lxc/attributes/setup_proxy.rb +3 -0
  42. data/chef/cookbooks/lxc/attributes/start_lxc.rb +11 -0
  43. data/chef/cookbooks/lxc/attributes/stop_lxc.rb +3 -0
  44. data/chef/cookbooks/lxc/files/install.chef.sh +78 -0
  45. data/chef/cookbooks/lxc/metadata.json +6 -0
  46. data/chef/cookbooks/lxc/recipes/create_lxc.rb +106 -0
  47. data/chef/cookbooks/lxc/recipes/init_bare_os.rb +82 -0
  48. data/chef/cookbooks/lxc/recipes/init_proto.rb +417 -0
  49. data/chef/cookbooks/lxc/recipes/install_docker.rb +61 -0
  50. data/chef/cookbooks/lxc/recipes/install_ruby.rb +28 -0
  51. data/chef/cookbooks/lxc/recipes/mount_volume.rb +63 -0
  52. data/chef/cookbooks/lxc/recipes/setup_database.rb +22 -0
  53. data/chef/cookbooks/lxc/recipes/setup_host.rb +179 -0
  54. data/chef/cookbooks/lxc/recipes/setup_proxy.rb +157 -0
  55. data/chef/cookbooks/lxc/recipes/start_lxc.rb +180 -0
  56. data/chef/cookbooks/lxc/recipes/stop_lxc.rb +86 -0
  57. data/chef/cookbooks/mysql/CHANGELOG.md +391 -0
  58. data/chef/cookbooks/mysql/README.md +211 -0
  59. data/chef/cookbooks/mysql/attributes/default.rb +22 -0
  60. data/chef/cookbooks/mysql/libraries/helpers.rb +277 -0
  61. data/chef/cookbooks/mysql/libraries/matchers.rb +17 -0
  62. data/chef/cookbooks/mysql/libraries/provider_mysql_client.rb +10 -0
  63. data/chef/cookbooks/mysql/libraries/provider_mysql_client_debian.rb +37 -0
  64. data/chef/cookbooks/mysql/libraries/provider_mysql_client_fedora.rb +38 -0
  65. data/chef/cookbooks/mysql/libraries/provider_mysql_client_freebsd.rb +33 -0
  66. data/chef/cookbooks/mysql/libraries/provider_mysql_client_omnios.rb +41 -0
  67. data/chef/cookbooks/mysql/libraries/provider_mysql_client_rhel.rb +42 -0
  68. data/chef/cookbooks/mysql/libraries/provider_mysql_client_smartos.rb +33 -0
  69. data/chef/cookbooks/mysql/libraries/provider_mysql_client_suse.rb +37 -0
  70. data/chef/cookbooks/mysql/libraries/provider_mysql_client_ubuntu.rb +37 -0
  71. data/chef/cookbooks/mysql/libraries/provider_mysql_service.rb +10 -0
  72. data/chef/cookbooks/mysql/libraries/provider_mysql_service_debian.rb +193 -0
  73. data/chef/cookbooks/mysql/libraries/provider_mysql_service_fedora.rb +157 -0
  74. data/chef/cookbooks/mysql/libraries/provider_mysql_service_freebsd.rb +151 -0
  75. data/chef/cookbooks/mysql/libraries/provider_mysql_service_omnios.rb +232 -0
  76. data/chef/cookbooks/mysql/libraries/provider_mysql_service_rhel.rb +318 -0
  77. data/chef/cookbooks/mysql/libraries/provider_mysql_service_smartos.rb +216 -0
  78. data/chef/cookbooks/mysql/libraries/provider_mysql_service_suse.rb +170 -0
  79. data/chef/cookbooks/mysql/libraries/provider_mysql_service_ubuntu.rb +218 -0
  80. data/chef/cookbooks/mysql/libraries/resource_mysql_client.rb +11 -0
  81. data/chef/cookbooks/mysql/libraries/resource_mysql_service.rb +194 -0
  82. data/chef/cookbooks/mysql/metadata.json +40 -0
  83. data/chef/cookbooks/mysql/metadata.rb +20 -0
  84. data/chef/cookbooks/mysql/recipes/client.rb +22 -0
  85. data/chef/cookbooks/mysql/recipes/server.rb +33 -0
  86. data/chef/cookbooks/mysql/recipes/server_deprecated.rb +23 -0
  87. data/chef/cookbooks/mysql/templates/default/5.0/my.cnf.erb +38 -0
  88. data/chef/cookbooks/mysql/templates/default/5.1/my.cnf.erb +38 -0
  89. data/chef/cookbooks/mysql/templates/default/5.5/my.cnf.erb +38 -0
  90. data/chef/cookbooks/mysql/templates/default/5.6/my.cnf.erb +39 -0
  91. data/chef/cookbooks/mysql/templates/default/apparmor/usr.sbin.mysqld.erb +40 -0
  92. data/chef/cookbooks/mysql/templates/default/debian/debian.cnf.erb +12 -0
  93. data/chef/cookbooks/mysql/templates/default/debian/mysql-server.seed.erb +10 -0
  94. data/chef/cookbooks/mysql/templates/default/deprecated/my.cnf.erb +374 -0
  95. data/chef/cookbooks/mysql/templates/default/grants/grants.sql.erb +27 -0
  96. data/chef/cookbooks/mysql/templates/default/omnios/mysql.xml.erb +26 -0
  97. data/chef/cookbooks/mysql/templates/default/omnios/svc.method.mysqld.erb +29 -0
  98. data/chef/cookbooks/mysql/templates/default/smartos/mysql.xml.erb +32 -0
  99. data/chef/cookbooks/mysql/templates/default/smartos/svc.method.mysqld.erb +29 -0
  100. data/chef/cookbooks/openssl/README.md +37 -0
  101. data/chef/cookbooks/openssl/libraries/secure_password.rb +37 -0
  102. data/chef/cookbooks/openssl/metadata.json +30 -0
  103. data/chef/cookbooks/openssl/metadata.rb +8 -0
  104. data/chef/cookbooks/openssl/recipes/default.rb +19 -0
  105. data/chef/cookbooks/ssh/attributes/default.rb +8 -0
  106. data/chef/cookbooks/ssh/recipes/authorize_key.rb +20 -0
  107. data/chef/cookbooks/toaster/attributes/testing.rb +37 -0
  108. data/chef/cookbooks/toaster/libraries/default.rb +61 -0
  109. data/chef/cookbooks/toaster/recipes/post__cakephp__default.rb +27 -0
  110. data/chef/cookbooks/toaster/recipes/post__cube__default.rb +26 -0
  111. data/chef/cookbooks/toaster/recipes/post__drupal__default.rb +16 -0
  112. data/chef/cookbooks/toaster/recipes/post__icinga__default.rb +9 -0
  113. data/chef/cookbooks/toaster/recipes/post__node__default.rb +16 -0
  114. data/chef/cookbooks/toaster/recipes/post__virtualbox__default.rb +12 -0
  115. data/chef/cookbooks/toaster/recipes/post__wordpress__default.rb +12 -0
  116. data/chef/cookbooks/toaster/recipes/pre__aegir__default.rb +12 -0
  117. data/chef/cookbooks/toaster/recipes/pre__app__default.rb +3 -0
  118. data/chef/cookbooks/toaster/recipes/pre__cakephp__default.rb +24 -0
  119. data/chef/cookbooks/toaster/recipes/pre__cube__default.rb +9 -0
  120. data/chef/cookbooks/toaster/recipes/pre__disco__default.rb +21 -0
  121. data/chef/cookbooks/toaster/recipes/pre__drbd__default.rb +7 -0
  122. data/chef/cookbooks/toaster/recipes/pre__eaccelerator__default.rb +2 -0
  123. data/chef/cookbooks/toaster/recipes/pre__elasticsearch-head__default.rb +11 -0
  124. data/chef/cookbooks/toaster/recipes/pre__elasticsearch__default.rb +6 -0
  125. data/chef/cookbooks/toaster/recipes/pre__gitosis__default.rb +17 -0
  126. data/chef/cookbooks/toaster/recipes/pre__kafka__default.rb +3 -0
  127. data/chef/cookbooks/toaster/recipes/pre__munin__server.rb +6 -0
  128. data/chef/cookbooks/toaster/recipes/pre__mysql__server.rb +4 -0
  129. data/chef/cookbooks/toaster/recipes/pre__nagios__default.rb +3 -0
  130. data/chef/cookbooks/toaster/recipes/pre__netkernel__default.rb +24 -0
  131. data/chef/cookbooks/toaster/recipes/pre__php__default.rb +2 -0
  132. data/chef/cookbooks/toaster/recipes/pre__postgresql__server.rb +3 -0
  133. data/chef/cookbooks/toaster/recipes/pre__pxe_dust__default.rb +9 -0
  134. data/chef/cookbooks/toaster/recipes/pre__pxe_install_server__default.rb +6 -0
  135. data/chef/cookbooks/toaster/recipes/pre__riak__default.rb +40 -0
  136. data/chef/cookbooks/toaster/recipes/pre__sensu__default.rb +9 -0
  137. data/chef/cookbooks/toaster/recipes/pre__sol__default.rb +2 -0
  138. data/chef/cookbooks/toaster/recipes/pre__solr__default.rb +6 -0
  139. data/chef/cookbooks/toaster/recipes/pre__sonar__default.rb +2 -0
  140. data/chef/cookbooks/toaster/recipes/pre__storm__default.rb +3 -0
  141. data/chef/cookbooks/toaster/recipes/pre__vmware__tools.rb +4 -0
  142. data/chef/cookbooks/toaster/recipes/pre__wordpress__default.rb +17 -0
  143. data/chef/cookbooks/toaster/recipes/pre__xen__default.rb +7 -0
  144. data/chef/cookbooks/toaster/recipes/pre__znc__default.rb +7 -0
  145. data/chef/cookbooks/toaster/recipes/testing.rb +241 -0
  146. data/chef/cookbooks/toaster/recipes/testing_post.rb +36 -0
  147. data/chef/cookbooks/yum/CHANGELOG.md +212 -0
  148. data/chef/cookbooks/yum/README.md +268 -0
  149. data/chef/cookbooks/yum/attributes/main.rb +97 -0
  150. data/chef/cookbooks/yum/libraries/matchers.rb +27 -0
  151. data/chef/cookbooks/yum/metadata.json +34 -0
  152. data/chef/cookbooks/yum/metadata.rb +13 -0
  153. data/chef/cookbooks/yum/providers/globalconfig.rb +37 -0
  154. data/chef/cookbooks/yum/providers/repository.rb +85 -0
  155. data/chef/cookbooks/yum/recipes/default.rb +34 -0
  156. data/chef/cookbooks/yum/resources/globalconfig.rb +105 -0
  157. data/chef/cookbooks/yum/resources/repository.rb +63 -0
  158. data/chef/cookbooks/yum/templates/default/main.erb +251 -0
  159. data/chef/cookbooks/yum/templates/default/repo.erb +109 -0
  160. data/chef/cookbooks/yum-mysql-community/CHANGELOG.md +67 -0
  161. data/chef/cookbooks/yum-mysql-community/README.md +137 -0
  162. data/chef/cookbooks/yum-mysql-community/attributes/mysql-connectors-community.rb +31 -0
  163. data/chef/cookbooks/yum-mysql-community/attributes/mysql55-community.rb +29 -0
  164. data/chef/cookbooks/yum-mysql-community/attributes/mysql56-community.rb +31 -0
  165. data/chef/cookbooks/yum-mysql-community/files/default/mysql_pubkey.asc +33 -0
  166. data/chef/cookbooks/yum-mysql-community/metadata.json +30 -0
  167. data/chef/cookbooks/yum-mysql-community/metadata.rb +8 -0
  168. data/chef/cookbooks/yum-mysql-community/recipes/connectors.rb +48 -0
  169. data/chef/cookbooks/yum-mysql-community/recipes/mysql55.rb +48 -0
  170. data/chef/cookbooks/yum-mysql-community/recipes/mysql56.rb +48 -0
  171. data/config.json +34 -0
  172. data/lib/toaster/api.rb +447 -0
  173. data/lib/toaster/chef/chef_listener.rb +514 -0
  174. data/lib/toaster/chef/chef_node_inspector.rb +165 -0
  175. data/lib/toaster/chef/chef_util.rb +865 -0
  176. data/lib/toaster/chef/failsafe_resource_parser.rb +140 -0
  177. data/lib/toaster/chef/resource_inspector.rb +536 -0
  178. data/lib/toaster/db/cache.rb +98 -0
  179. data/lib/toaster/db/cached_db.rb +53 -0
  180. data/lib/toaster/db/cgi_session_cache.rb +209 -0
  181. data/lib/toaster/db/db.rb +98 -0
  182. data/lib/toaster/db/mysql.rb +18 -0
  183. data/lib/toaster/db/ram_cache.rb +203 -0
  184. data/lib/toaster/markup/jdom-1.1.jar +0 -0
  185. data/lib/toaster/markup/jdom-b7.jar +0 -0
  186. data/lib/toaster/markup/markup_util.rb +437 -0
  187. data/lib/toaster/markup/vmtools-utils-0.5.jar +0 -0
  188. data/lib/toaster/markup/xmldiff.sh +5 -0
  189. data/lib/toaster/model/additional_property.rb +11 -0
  190. data/lib/toaster/model/automation.rb +218 -0
  191. data/lib/toaster/model/automation_attribute.rb +13 -0
  192. data/lib/toaster/model/automation_run.rb +104 -0
  193. data/lib/toaster/model/ignore_property.rb +11 -0
  194. data/lib/toaster/model/key_value_pair.rb +59 -0
  195. data/lib/toaster/model/run_attribute.rb +17 -0
  196. data/lib/toaster/model/state.rb +17 -0
  197. data/lib/toaster/model/state_change.rb +79 -0
  198. data/lib/toaster/model/task.rb +292 -0
  199. data/lib/toaster/model/task_execution.rb +76 -0
  200. data/lib/toaster/model/task_parameter.rb +66 -0
  201. data/lib/toaster/model/user.rb +32 -0
  202. data/lib/toaster/ohai/_disabled_/network_ports.rb +81 -0
  203. data/lib/toaster/ohai/apache/apache.rb +48 -0
  204. data/lib/toaster/ohai/cron/cron.rb +32 -0
  205. data/lib/toaster/ohai/files/_meta.rb +30 -0
  206. data/lib/toaster/ohai/files/files.rb +20 -0
  207. data/lib/toaster/ohai/gems/gems.rb +19 -0
  208. data/lib/toaster/ohai/groups/groups.rb +20 -0
  209. data/lib/toaster/ohai/iptables/iptables.rb +48 -0
  210. data/lib/toaster/ohai/mounts/mounts.rb +26 -0
  211. data/lib/toaster/ohai/mysql/mysql.rb +31 -0
  212. data/lib/toaster/ohai/packages/_meta.rb +86 -0
  213. data/lib/toaster/ohai/packages/packages.rb +33 -0
  214. data/lib/toaster/ohai/ports/ports.rb +21 -0
  215. data/lib/toaster/ohai/routes/routes.rb +25 -0
  216. data/lib/toaster/ohai/services/services.rb +42 -0
  217. data/lib/toaster/ohai/users/users.rb +17 -0
  218. data/lib/toaster/state/convergence.rb +197 -0
  219. data/lib/toaster/state/idempotence.rb +192 -0
  220. data/lib/toaster/state/ptrace_util.rb +48 -0
  221. data/lib/toaster/state/state_node.rb +105 -0
  222. data/lib/toaster/state/state_transition.rb +38 -0
  223. data/lib/toaster/state/state_transition_graph.rb +701 -0
  224. data/lib/toaster/state/syscall_tracer.rb +317 -0
  225. data/lib/toaster/state/system_state.rb +349 -0
  226. data/lib/toaster/state/transition_edge.rb +65 -0
  227. data/lib/toaster/test/test_attribute.rb +19 -0
  228. data/lib/toaster/test/test_case.rb +175 -0
  229. data/lib/toaster/test/test_coverage.rb +147 -0
  230. data/lib/toaster/test/test_coverage_goal.rb +108 -0
  231. data/lib/toaster/test/test_generator.rb +246 -0
  232. data/lib/toaster/test/test_orchestrator.rb +165 -0
  233. data/lib/toaster/test/test_result.rb +73 -0
  234. data/lib/toaster/test/test_runner.rb +394 -0
  235. data/lib/toaster/test/test_suite.rb +151 -0
  236. data/lib/toaster/test_manager.rb +281 -0
  237. data/lib/toaster/toaster_app_service.rb +141 -0
  238. data/lib/toaster/util/blocking_map.rb +80 -0
  239. data/lib/toaster/util/combinatorial.rb +58 -0
  240. data/lib/toaster/util/config.rb +103 -0
  241. data/lib/toaster/util/docker.rb +71 -0
  242. data/lib/toaster/util/logging.rb +19 -0
  243. data/lib/toaster/util/lxc.rb +383 -0
  244. data/lib/toaster/util/mem_dump.rb +38 -0
  245. data/lib/toaster/util/proxy.rb +23 -0
  246. data/lib/toaster/util/timestamp.rb +131 -0
  247. data/lib/toaster/util/util.rb +437 -0
  248. data/lib/toaster/web_ui.rb +7 -0
  249. data/webapp/Gemfile +46 -0
  250. data/webapp/Gemfile.lock +237 -0
  251. data/webapp/Rakefile +6 -0
  252. data/webapp/app/assets/fonts/font.woff +0 -0
  253. data/webapp/app/assets/images/final_state.gif +0 -0
  254. data/webapp/app/assets/images/initial_state.gif +0 -0
  255. data/webapp/app/assets/images/loading.gif +0 -0
  256. data/webapp/app/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  257. data/webapp/app/assets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  258. data/webapp/app/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  259. data/webapp/app/assets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  260. data/webapp/app/assets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  261. data/webapp/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  262. data/webapp/app/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  263. data/webapp/app/assets/images/ui-icons_222222_256x240.png +0 -0
  264. data/webapp/app/assets/javascripts/analysis.js.coffee +3 -0
  265. data/webapp/app/assets/javascripts/application.js +16 -0
  266. data/webapp/app/assets/javascripts/execs.js.coffee +3 -0
  267. data/webapp/app/assets/javascripts/graph.js +441 -0
  268. data/webapp/app/assets/javascripts/jquery-1.7.2.js +9404 -0
  269. data/webapp/app/assets/javascripts/jquery-ui-1.8.22.js +11529 -0
  270. data/webapp/app/assets/javascripts/jquery.cookie.js +96 -0
  271. data/webapp/app/assets/javascripts/jquery.hotkeys.js +99 -0
  272. data/webapp/app/assets/javascripts/jquery.jstree.js +4551 -0
  273. data/webapp/app/assets/javascripts/jsPlumb/jquery.jsPlumb-1.3.14-all-min.js +1 -0
  274. data/webapp/app/assets/javascripts/jstree.util.js +53 -0
  275. data/webapp/app/assets/javascripts/scripts.js.coffee +3 -0
  276. data/webapp/app/assets/javascripts/settings.js.coffee +3 -0
  277. data/webapp/app/assets/javascripts/test.js.coffee +3 -0
  278. data/webapp/app/assets/javascripts/util.js.coffee +3 -0
  279. data/webapp/app/assets/stylesheets/analysis.css.scss +3 -0
  280. data/webapp/app/assets/stylesheets/application.css +49 -0
  281. data/webapp/app/assets/stylesheets/execs.css.scss +3 -0
  282. data/webapp/app/assets/stylesheets/graph.css +159 -0
  283. data/webapp/app/assets/stylesheets/jquery-ui-1.8.6.custom.css +572 -0
  284. data/webapp/app/assets/stylesheets/layout.css +151 -0
  285. data/webapp/app/assets/stylesheets/menu.css +186 -0
  286. data/webapp/app/assets/stylesheets/reset.css +41 -0
  287. data/webapp/app/assets/stylesheets/scripts.css.scss +3 -0
  288. data/webapp/app/assets/stylesheets/settings.css.scss +3 -0
  289. data/webapp/app/assets/stylesheets/test.css.scss +3 -0
  290. data/webapp/app/assets/stylesheets/util.css.scss +3 -0
  291. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.eot +0 -0
  292. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.svg +1 -0
  293. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.ttf +0 -0
  294. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.woff +0 -0
  295. data/webapp/app/controllers/analysis_controller.rb +7 -0
  296. data/webapp/app/controllers/application_controller.rb +14 -0
  297. data/webapp/app/controllers/base_controller.rb +91 -0
  298. data/webapp/app/controllers/execs_controller.rb +59 -0
  299. data/webapp/app/controllers/graph_controller.rb +17 -0
  300. data/webapp/app/controllers/scripts_controller.rb +166 -0
  301. data/webapp/app/controllers/settings_controller.rb +10 -0
  302. data/webapp/app/controllers/test_controller.rb +127 -0
  303. data/webapp/app/controllers/util_controller.rb +6 -0
  304. data/webapp/app/helpers/analysis_helper.rb +2 -0
  305. data/webapp/app/helpers/application_helper.rb +2 -0
  306. data/webapp/app/helpers/automations_helper.rb +2 -0
  307. data/webapp/app/helpers/execs_helper.rb +2 -0
  308. data/webapp/app/helpers/scripts_helper.rb +2 -0
  309. data/webapp/app/helpers/settings_helper.rb +2 -0
  310. data/webapp/app/helpers/test_helper.rb +2 -0
  311. data/webapp/app/helpers/util_helper.rb +2 -0
  312. data/webapp/app/views/analysis/convergence.html.erb +156 -0
  313. data/webapp/app/views/analysis/idempotence.html.erb +2 -0
  314. data/webapp/app/views/execs/automation_runs.html.erb +98 -0
  315. data/webapp/app/views/execs/task_executions.html.erb +154 -0
  316. data/webapp/app/views/graph/graph_frame.html +101 -0
  317. data/webapp/app/views/layouts/application.html.erb +114 -0
  318. data/webapp/app/views/scripts/edit.html.erb +58 -0
  319. data/webapp/app/views/scripts/graph.html.erb +75 -0
  320. data/webapp/app/views/scripts/import_chef.html.erb +104 -0
  321. data/webapp/app/views/scripts/scripts.html.erb +116 -0
  322. data/webapp/app/views/scripts/tasks.html.erb +139 -0
  323. data/webapp/app/views/settings/containers.html.erb +161 -0
  324. data/webapp/app/views/settings/index.html.erb +51 -0
  325. data/webapp/app/views/test/cases.html.erb +2 -0
  326. data/webapp/app/views/test/gen.html.erb +229 -0
  327. data/webapp/app/views/test/suites.html.erb +205 -0
  328. data/webapp/app/views/util/chef.html.erb +53 -0
  329. data/webapp/bin/bundle +3 -0
  330. data/webapp/bin/rails +4 -0
  331. data/webapp/bin/rake +4 -0
  332. data/webapp/config/application.rb +28 -0
  333. data/webapp/config/boot.rb +18 -0
  334. data/webapp/config/database.yml +42 -0
  335. data/webapp/config/environment.rb +5 -0
  336. data/webapp/config/environments/development.rb +35 -0
  337. data/webapp/config/environments/production.rb +80 -0
  338. data/webapp/config/environments/test.rb +36 -0
  339. data/webapp/config/initializers/backtrace_silencers.rb +7 -0
  340. data/webapp/config/initializers/devise.rb +256 -0
  341. data/webapp/config/initializers/filter_parameter_logging.rb +4 -0
  342. data/webapp/config/initializers/inflections.rb +16 -0
  343. data/webapp/config/initializers/mime_types.rb +5 -0
  344. data/webapp/config/initializers/patches.rb +13 -0
  345. data/webapp/config/initializers/secret_token.rb +12 -0
  346. data/webapp/config/initializers/session_store.rb +6 -0
  347. data/webapp/config/initializers/wrap_parameters.rb +16 -0
  348. data/webapp/config/locales/devise.en.yml +59 -0
  349. data/webapp/config/locales/en.yml +23 -0
  350. data/webapp/config/routes.rb +113 -0
  351. data/webapp/config.ru +4 -0
  352. data/webapp/db/development.sqlite3 +0 -0
  353. data/webapp/db/migrate/20140624002037_devise_create_users.rb +42 -0
  354. data/webapp/db/migrate/20140628002058_create_all_tables.rb +159 -0
  355. data/webapp/db/schema.rb +162 -0
  356. data/webapp/db/seeds.rb +7 -0
  357. data/webapp/log/development.log +167823 -0
  358. data/webapp/public/404.html +58 -0
  359. data/webapp/public/422.html +58 -0
  360. data/webapp/public/500.html +57 -0
  361. data/webapp/public/favicon.ico +0 -0
  362. data/webapp/public/robots.txt +5 -0
  363. data/webapp/test/controllers/analysis_controller_test.rb +14 -0
  364. data/webapp/test/controllers/automations_controller_test.rb +49 -0
  365. data/webapp/test/controllers/execs_controller_test.rb +9 -0
  366. data/webapp/test/controllers/executions_controller_test.rb +9 -0
  367. data/webapp/test/controllers/runs_controller_test.rb +7 -0
  368. data/webapp/test/controllers/scripts_controller_test.rb +9 -0
  369. data/webapp/test/controllers/settings_controller_test.rb +9 -0
  370. data/webapp/test/controllers/test_controller_test.rb +14 -0
  371. data/webapp/test/controllers/util_controller_test.rb +9 -0
  372. data/webapp/test/fixtures/users.yml +11 -0
  373. data/webapp/test/helpers/analysis_helper_test.rb +4 -0
  374. data/webapp/test/helpers/automations_helper_test.rb +4 -0
  375. data/webapp/test/helpers/execs_helper_test.rb +4 -0
  376. data/webapp/test/helpers/executions_helper_test.rb +4 -0
  377. data/webapp/test/helpers/runs_helper_test.rb +4 -0
  378. data/webapp/test/helpers/scripts_helper_test.rb +4 -0
  379. data/webapp/test/helpers/settings_helper_test.rb +4 -0
  380. data/webapp/test/helpers/test_helper_test.rb +4 -0
  381. data/webapp/test/helpers/util_helper_test.rb +4 -0
  382. data/webapp/test/models/user_test.rb +7 -0
  383. data/webapp/test/test_helper.rb +15 -0
  384. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/analysis.css.scssc +0 -0
  385. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/automations.css.scssc +0 -0
  386. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/execs.css.scssc +0 -0
  387. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/executions.css.scssc +0 -0
  388. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/scripts.css.scssc +0 -0
  389. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/settings.css.scssc +0 -0
  390. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/test.css.scssc +0 -0
  391. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/util.css.scssc +0 -0
  392. data/webapp/tmp/cache/assets/development/sprockets/06a1cdb3d5472dd126cffc18f548c342 +0 -0
  393. data/webapp/tmp/cache/assets/development/sprockets/0dc0562647e703ca0535da3b9fcad796 +0 -0
  394. data/webapp/tmp/cache/assets/development/sprockets/113f1c71cb0f2a786729477989122982 +0 -0
  395. data/webapp/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  396. data/webapp/tmp/cache/assets/development/sprockets/151a1c6b128721d8923ba0c380a2af17 +0 -0
  397. data/webapp/tmp/cache/assets/development/sprockets/1722fb8a6daad566c8a6d5ef31969459 +0 -0
  398. data/webapp/tmp/cache/assets/development/sprockets/1a05555c46560c6b246aa0a996679bc6 +0 -0
  399. data/webapp/tmp/cache/assets/development/sprockets/1cb7fb6aa8bd1c2b7df8f7c52442e345 +0 -0
  400. data/webapp/tmp/cache/assets/development/sprockets/1d76f803b0a83adc5ea7e7c848657967 +0 -0
  401. data/webapp/tmp/cache/assets/development/sprockets/200152f95fc464d69c425ed8fdc2fbcc +0 -0
  402. data/webapp/tmp/cache/assets/development/sprockets/2049c8927ebd046c8a3291f81041d5f1 +0 -0
  403. data/webapp/tmp/cache/assets/development/sprockets/207907100aabd08a6767e39a95b364e3 +0 -0
  404. data/webapp/tmp/cache/assets/development/sprockets/249e2d4db815922fc72419c4a1407caf +0 -0
  405. data/webapp/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  406. data/webapp/tmp/cache/assets/development/sprockets/3034e4c334b1ebed9433e33050555f18 +0 -0
  407. data/webapp/tmp/cache/assets/development/sprockets/316c88d859cc3666044e51b1dd89e872 +0 -0
  408. data/webapp/tmp/cache/assets/development/sprockets/347f43d816178c8ba11a28a771696924 +0 -0
  409. data/webapp/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  410. data/webapp/tmp/cache/assets/development/sprockets/36ab92a3b8d527ed1eff0944b5f1263d +0 -0
  411. data/webapp/tmp/cache/assets/development/sprockets/3893b852ff196f05ff6ca8e38bb2237f +0 -0
  412. data/webapp/tmp/cache/assets/development/sprockets/3c358bd5fa32d151c7aa44971dd9b96f +0 -0
  413. data/webapp/tmp/cache/assets/development/sprockets/3ce88fad85146e0bed233f5419c24d29 +0 -0
  414. data/webapp/tmp/cache/assets/development/sprockets/3dabcb7c89677292e1e019a9bac446e5 +0 -0
  415. data/webapp/tmp/cache/assets/development/sprockets/4116fac01e6d379ede37af725a592477 +0 -0
  416. data/webapp/tmp/cache/assets/development/sprockets/42628e032b8f0b16a5ba01a1fcc7b6d7 +0 -0
  417. data/webapp/tmp/cache/assets/development/sprockets/437b258a98e8fe2c87fa8e24b7ce9abf +0 -0
  418. data/webapp/tmp/cache/assets/development/sprockets/43e98ed206f05738ae305e7e1b09a840 +0 -0
  419. data/webapp/tmp/cache/assets/development/sprockets/468da8933ba442b88b2f4b0e40c2ac30 +0 -0
  420. data/webapp/tmp/cache/assets/development/sprockets/48ef3fa68e9084c7cfa84e525decc318 +0 -0
  421. data/webapp/tmp/cache/assets/development/sprockets/4b68dcc030691297629a7156361018dc +0 -0
  422. data/webapp/tmp/cache/assets/development/sprockets/50368b1bd77c9130d821cbad89ab83ac +0 -0
  423. data/webapp/tmp/cache/assets/development/sprockets/511a980807b8d16fc3fb839991041865 +0 -0
  424. data/webapp/tmp/cache/assets/development/sprockets/516a0973874a73d0d15feec9448f7466 +0 -0
  425. data/webapp/tmp/cache/assets/development/sprockets/569e21b0ca1a230c7880f8d7a8b1febf +0 -0
  426. data/webapp/tmp/cache/assets/development/sprockets/5b5543d2ed5bed100f1739fc12ebf2c5 +0 -0
  427. data/webapp/tmp/cache/assets/development/sprockets/5c10dbffb918651dc0498579ba9a6853 +0 -0
  428. data/webapp/tmp/cache/assets/development/sprockets/5c366b5370316b3e9c03d1a58cb5eb44 +0 -0
  429. data/webapp/tmp/cache/assets/development/sprockets/5fcb9466e0d5cb0e31b35957fe2d3901 +0 -0
  430. data/webapp/tmp/cache/assets/development/sprockets/61da396fb86c5ecd844a2d83ac759b4b +0 -0
  431. data/webapp/tmp/cache/assets/development/sprockets/624ba87170059068845a4651b3cd2c7c +0 -0
  432. data/webapp/tmp/cache/assets/development/sprockets/6391f61b6121feda70da6d0a22520fdd +0 -0
  433. data/webapp/tmp/cache/assets/development/sprockets/653a981829c12a52bd57b7918168a148 +0 -0
  434. data/webapp/tmp/cache/assets/development/sprockets/66479793d9e5683d9f7fa67522d1962d +0 -0
  435. data/webapp/tmp/cache/assets/development/sprockets/69c589bd224ee0df5ab02e4568e0ab39 +0 -0
  436. data/webapp/tmp/cache/assets/development/sprockets/6dd7c564897b7e66eecbb180baeef2c6 +0 -0
  437. data/webapp/tmp/cache/assets/development/sprockets/6e2b92a4e6966cb78e63207bc7888391 +0 -0
  438. data/webapp/tmp/cache/assets/development/sprockets/70adb410f59a0edc5aea8c2b2ef8a441 +0 -0
  439. data/webapp/tmp/cache/assets/development/sprockets/72cbfd5bf33945bcce154f7a4feaf04d +0 -0
  440. data/webapp/tmp/cache/assets/development/sprockets/740ee9d355ada8cf5e9beb620f2cd5cc +0 -0
  441. data/webapp/tmp/cache/assets/development/sprockets/74770a22b5d1b0b3bc3527da83706f96 +0 -0
  442. data/webapp/tmp/cache/assets/development/sprockets/759bf97655af50852816720db7b59fcb +0 -0
  443. data/webapp/tmp/cache/assets/development/sprockets/76e9c19246c684413a02af695fa2b0bc +0 -0
  444. data/webapp/tmp/cache/assets/development/sprockets/7728beeace48ca12e336d2bce0158871 +0 -0
  445. data/webapp/tmp/cache/assets/development/sprockets/77f49730c7b689f75a2e174fbd3ace2a +0 -0
  446. data/webapp/tmp/cache/assets/development/sprockets/78021a57030fd36cf82699aad9910b26 +0 -0
  447. data/webapp/tmp/cache/assets/development/sprockets/796b349b06da691fe5f069f9e3947fcb +0 -0
  448. data/webapp/tmp/cache/assets/development/sprockets/79e7505c70697cc7d34d4a8351c3b840 +0 -0
  449. data/webapp/tmp/cache/assets/development/sprockets/7b2b7d9034fc7b77daf5da1436667e6f +0 -0
  450. data/webapp/tmp/cache/assets/development/sprockets/7c2ea2ca2cdd89b062bf23f44e8f599c +0 -0
  451. data/webapp/tmp/cache/assets/development/sprockets/7ea112af55e6df12cdff377052b71420 +0 -0
  452. data/webapp/tmp/cache/assets/development/sprockets/7f27632588dd316836b009a621c0176c +0 -0
  453. data/webapp/tmp/cache/assets/development/sprockets/7fcef9f644290dea8d0e4bf13f6bb8e9 +0 -0
  454. data/webapp/tmp/cache/assets/development/sprockets/81c6bf67419a29257ed79f442c24907d +0 -0
  455. data/webapp/tmp/cache/assets/development/sprockets/83656ce9260eb473c1654420e0180167 +0 -0
  456. data/webapp/tmp/cache/assets/development/sprockets/83e8bdddefc2dce069b56e6650135397 +0 -0
  457. data/webapp/tmp/cache/assets/development/sprockets/880c796f41e5d67ae68ed239acfc91e3 +0 -0
  458. data/webapp/tmp/cache/assets/development/sprockets/8c1c39dd537d2c9990fe9c70a5646b06 +0 -0
  459. data/webapp/tmp/cache/assets/development/sprockets/8d763042da5254015767385ce324b348 +0 -0
  460. data/webapp/tmp/cache/assets/development/sprockets/91e1ccbf65ff4d9b0f42b1159796bcf2 +0 -0
  461. data/webapp/tmp/cache/assets/development/sprockets/92cdfac7698b6bb68983cf317c1cedef +0 -0
  462. data/webapp/tmp/cache/assets/development/sprockets/94cab8cbc120e152ce4c444492a3fc1d +0 -0
  463. data/webapp/tmp/cache/assets/development/sprockets/96b918c3c041b6a089c8adc870fa3aaa +0 -0
  464. data/webapp/tmp/cache/assets/development/sprockets/97cbe306627b432ab3bfb52416690d1d +0 -0
  465. data/webapp/tmp/cache/assets/development/sprockets/98da83d396c0c00eb03937ecbc2e6bfa +0 -0
  466. data/webapp/tmp/cache/assets/development/sprockets/9db04db20ec9c4a0f84ed01caa5e6e2b +0 -0
  467. data/webapp/tmp/cache/assets/development/sprockets/9dc1c251f50c828fae95d6107619c53e +0 -0
  468. data/webapp/tmp/cache/assets/development/sprockets/9e91711ab34bbf89ad1cfb4351027d36 +0 -0
  469. data/webapp/tmp/cache/assets/development/sprockets/9f587881f98b328b656e6456178418b5 +0 -0
  470. data/webapp/tmp/cache/assets/development/sprockets/9fc981560caba00621bb95d0974ad076 +0 -0
  471. data/webapp/tmp/cache/assets/development/sprockets/9fd4385f8fda99f3ddd3f133a89231d1 +0 -0
  472. data/webapp/tmp/cache/assets/development/sprockets/a32ab71649e3db15eca95bcc3a7588da +0 -0
  473. data/webapp/tmp/cache/assets/development/sprockets/a497c976969bdbb1f69875358d39d3b5 +0 -0
  474. data/webapp/tmp/cache/assets/development/sprockets/b06058d455770c1d9db6b6670bc4bf4d +0 -0
  475. data/webapp/tmp/cache/assets/development/sprockets/b3da405f1e68470ad6146a1322f2438c +0 -0
  476. data/webapp/tmp/cache/assets/development/sprockets/b4ba5853663f6721d15942ce08dd76bf +0 -0
  477. data/webapp/tmp/cache/assets/development/sprockets/b6f1534bcdbff92a16c85487f363235a +0 -0
  478. data/webapp/tmp/cache/assets/development/sprockets/b9c57b9750f8af3551b1a5d9e27f0a92 +0 -0
  479. data/webapp/tmp/cache/assets/development/sprockets/bb5be6a0ee889a15214e2442aee8c6e1 +0 -0
  480. data/webapp/tmp/cache/assets/development/sprockets/bc80a81b2d67b5ad40f3c7a2bb6e6f22 +0 -0
  481. data/webapp/tmp/cache/assets/development/sprockets/bfaba27d5ce71d292f453659b0755511 +0 -0
  482. data/webapp/tmp/cache/assets/development/sprockets/bfac6cd2984fbd5e0d762389e3c37164 +0 -0
  483. data/webapp/tmp/cache/assets/development/sprockets/c17bec9e3b5db6d8385c3d6eb362e628 +0 -0
  484. data/webapp/tmp/cache/assets/development/sprockets/c1a9eceddc0a1e41eb2992e9204f71e6 +0 -0
  485. data/webapp/tmp/cache/assets/development/sprockets/c50cd87be040044504b5c3fde1047e24 +0 -0
  486. data/webapp/tmp/cache/assets/development/sprockets/c5907cfd07b24ad19b8c80e8af618a57 +0 -0
  487. data/webapp/tmp/cache/assets/development/sprockets/c8da5594caf845a183dd1c6cd45c5433 +0 -0
  488. data/webapp/tmp/cache/assets/development/sprockets/cbc6968ed49fa14db439a64dd0a46abc +0 -0
  489. data/webapp/tmp/cache/assets/development/sprockets/cedf710ee090647b81c08675583eca62 +0 -0
  490. data/webapp/tmp/cache/assets/development/sprockets/cf1e3cebfad43293c3c470a5e437ebc9 +0 -0
  491. data/webapp/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  492. data/webapp/tmp/cache/assets/development/sprockets/d5a14f86bb4b422fdd8eb4722d966c9a +0 -0
  493. data/webapp/tmp/cache/assets/development/sprockets/d66b9cdd3230f9e5354e495e17097c49 +0 -0
  494. data/webapp/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  495. data/webapp/tmp/cache/assets/development/sprockets/dfa0ed87d851222fe58ada385e3f037d +0 -0
  496. data/webapp/tmp/cache/assets/development/sprockets/e1aa402390382db4d97b27cb094485fa +0 -0
  497. data/webapp/tmp/cache/assets/development/sprockets/e4f1db35ef9d9fbbf53252a44e381eb8 +0 -0
  498. data/webapp/tmp/cache/assets/development/sprockets/e57eb6c1ad51fd8c13afc0e719a259b5 +0 -0
  499. data/webapp/tmp/cache/assets/development/sprockets/e7c37b542e914e392ec326190cea1aa2 +0 -0
  500. data/webapp/tmp/cache/assets/development/sprockets/e923d7e19c216d4a924831f3896e007a +0 -0
  501. data/webapp/tmp/cache/assets/development/sprockets/e96a414a621483bbc89e73f11be5e7b4 +0 -0
  502. data/webapp/tmp/cache/assets/development/sprockets/eafcfc3d2561c18743c1b32f0f710c68 +0 -0
  503. data/webapp/tmp/cache/assets/development/sprockets/ecdd630f5466d45a2afa7515aaa5fc3b +0 -0
  504. data/webapp/tmp/cache/assets/development/sprockets/ee60a0a35d60cff425373970547694bd +0 -0
  505. data/webapp/tmp/cache/assets/development/sprockets/eee2c36b75709b0c3797c2a151fdd5d3 +0 -0
  506. data/webapp/tmp/cache/assets/development/sprockets/f104b66c0f89b453d0c8c73980fbab18 +0 -0
  507. data/webapp/tmp/cache/assets/development/sprockets/f26d1bc86590415685e9836ad75d1774 +0 -0
  508. data/webapp/tmp/cache/assets/development/sprockets/f4081e868eb565527099dba2c9d8c4de +0 -0
  509. data/webapp/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  510. data/webapp/tmp/cache/assets/development/sprockets/f813030b97e30415ad276bbd1f7e1fb4 +0 -0
  511. data/webapp/tmp/cache/assets/development/sprockets/f8e3e28bc9640c25da58aea46c3ac4b3 +0 -0
  512. data/webapp/tmp/cache/assets/development/sprockets/f9169d0a8b70eaf95de52b3c6ad51105 +0 -0
  513. data/webapp/tmp/cache/assets/development/sprockets/f939450f7a481e3fbeb158b81b39c624 +0 -0
  514. data/webapp/tmp/cache/assets/development/sprockets/fce73296b8298ac4c74b3e95cde4dfdb +0 -0
  515. metadata +941 -0
@@ -0,0 +1,281 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "toaster/state/system_state"
8
+ require "toaster/state/syscall_tracer"
9
+ require "toaster/markup/markup_util"
10
+ require "toaster/model/task"
11
+ require "toaster/model/state_change"
12
+ require "toaster/model/task_execution"
13
+ require "toaster/model/user"
14
+ require "toaster/test/test_runner"
15
+ require "toaster/util/config"
16
+ require "toaster/test/test_suite"
17
+ require "toaster/util/timestamp"
18
+ require "toaster/chef/resource_inspector"
19
+ require "toaster/chef/chef_util"
20
+
21
+ include Toaster
22
+
23
+ module Toaster
24
+ class TestManager
25
+
26
+ def initialize(config = {})
27
+ @states = {}
28
+ @current_executions = {}
29
+ @cookbook_paths = config["cookbook_paths"] || []
30
+ @transfer_state_config = false
31
+ host = "localhost"
32
+ TestManager.init_db(config)
33
+ user = User.find(config["user_id"])
34
+ User.set_current_user(user)
35
+ run = AutomationRun.new(
36
+ :machine_id => Util.get_machine_id(),
37
+ :user => user)
38
+ AutomationRun.set_current(run)
39
+
40
+ if config["task_execution_timeout"]
41
+ ChefListener.task_execution_timeout = config["task_execution_timeout"]
42
+ end
43
+ if config["task_exec_timeout_repeated"]
44
+ ChefListener.task_exec_timeout_repeated = config["task_exec_timeout_repeated"]
45
+ end
46
+ if config["rest_timeout"]
47
+ Chef::Config[:rest_timeout] = config["rest_timeout"]
48
+ end
49
+ if !config["transfer_state_config"].nil?
50
+ @transfer_state_config = config["transfer_state_config"]
51
+ end
52
+
53
+ # Leave this output line unchanged - it is later extracted and parsed by
54
+ # test_runner.rb, which needs to be able to determine the automation run ID.
55
+ # This is a bit hacky, but seemed to be the best/fastest way to solve this.
56
+ puts "INFO: Current automation run ID: #{AutomationRun.get_current.id}"
57
+
58
+ @automation_name = config["automation_name"] || ""
59
+ @recipes = config["recipes"] || []
60
+ @skip_tasks = config["skip_tasks"] || []
61
+ @repeat_tasks = config["repeat_tasks"] || []
62
+ @repeated_tasks = []
63
+ @state_change_config = {}
64
+
65
+ @state_observer_thread = nil
66
+ end
67
+
68
+ #
69
+ # Return the number of times a given task should be executed.
70
+ # The result is usually 1 (default), or 0 (skip task) or 2 (repeat task once)
71
+ #
72
+ def num_requested_task_executions(task)
73
+ return 0 if @skip_tasks.include?(task.uuid)
74
+ return 2 if @repeat_tasks.include?(task.uuid)
75
+ return 1
76
+ end
77
+
78
+ def tasks_to_repeat_now(last_executed_task)
79
+ uuid = last_executed_task.kind_of?(String) ? last_executed_task : last_executed_task.uuid
80
+ @repeat_tasks.each do |list|
81
+ if list.kind_of?(Array)
82
+ if !@repeated_tasks.include?(list)
83
+ if list[-1] == uuid
84
+ @repeated_tasks << list
85
+ return list
86
+ end
87
+ end
88
+ end
89
+ end
90
+ return nil
91
+ end
92
+
93
+ #
94
+ # called by chef_listener BEFORE a chef resource (task) is executed
95
+ # by Chef's Runner::run_action method.
96
+ #
97
+ def before_run_action(task, execution_uuid)
98
+ # indicate whether or not this task should be started/continued
99
+ return false if @skip_tasks.include?(task.uuid)
100
+
101
+ # clear the old state change config, if needed
102
+ if !@transfer_state_config
103
+ @state_change_config = {}
104
+ end
105
+
106
+ # get additional_state_configs from automation
107
+ automation = AutomationRun.get_current().automation
108
+ add_automation_specific_state_config(@state_change_config)
109
+
110
+ # determine which parameters the task code accesses:
111
+ task.task_parameters.concat(ResourceInspector.get_accessed_parameters(task))
112
+ task.save
113
+
114
+ if execution_uuid
115
+ @state_change_config = ResourceInspector.get_config_for_potential_state_changes(
116
+ task, @cookbook_paths, @state_change_config)
117
+ state = SystemState.get_system_state(@state_change_config)
118
+ execution = TaskExecution.new(
119
+ :task => task,
120
+ :state_before => state,
121
+ :uuid => execution_uuid)
122
+ execution.automation_run = AutomationRun.get_current()
123
+ sourcecode = ChefUtil.runtime_resource_sourcecode(task.resource_obj)
124
+ sourcecode.strip! if sourcecode
125
+ if sourcecode != task.sourcecode
126
+ execution.sourcecode = sourcecode
127
+ end
128
+ @current_executions[execution_uuid] = execution
129
+
130
+ # use the external ptrace-based program to monitor the Chef execution
131
+ # for changes in the file system (implemented via syscall hooks)
132
+ if !@state_tracer
133
+ @state_tracer = SyscallTracer.new()
134
+ end
135
+ @state_tracer.start
136
+
137
+ end
138
+
139
+ return true
140
+ end
141
+
142
+ #
143
+ # called by chef_listener AFTER a chef resource (task) has been executed
144
+ # by Chef's Runner::run_action method.
145
+ #
146
+ def after_run_action(task, execution_uuid, error = nil, script_output = nil)
147
+ s_before = nil
148
+ s_after = nil
149
+ begin
150
+ if !execution_uuid || !@current_executions[execution_uuid]
151
+ # "init_chef_listener" is part of a special resource name which
152
+ # performs the AOP based instrumentation of the Chef run
153
+ if !task.resource.to_s.include?("init_chef_listener")
154
+ puts "WARN: Unable to find previous state for task execution " +
155
+ "UUID '#{execution_uuid}' in 'after_run_action' " +
156
+ "(This may be NORMAL within the context of a Chef notification execution). " +
157
+ "Currently active executions: #{@current_executions.inspect}"
158
+ end
159
+ return
160
+ end
161
+
162
+
163
+ # pause/stop monitoring
164
+ add_prestate = @state_tracer.dump_execution_prestate
165
+ add_state_change_config = SystemState.get_statechange_config_from_state(add_prestate)
166
+ @state_tracer.stop
167
+
168
+ # get additional_state_configs from automation
169
+ add_automation_specific_state_config(@state_change_config)
170
+
171
+ @state_change_config = ResourceInspector.get_config_for_potential_state_changes(
172
+ task, @cookbook_paths, @state_change_config)
173
+
174
+ # add additional state change configs from state tracer
175
+ MarkupUtil.rmerge!(@state_change_config, add_state_change_config, true)
176
+
177
+ if @state_change_config.empty?
178
+ puts "WARN: Empty state change config for task UUID #{task.uuid}:\n#{task.sourcecode}\n------"
179
+ end
180
+ state = SystemState.get_system_state(@state_change_config)
181
+ execution = @current_executions[execution_uuid]
182
+ @current_executions.delete(execution_uuid)
183
+
184
+ # add additional pre-states from state tracer
185
+ MarkupUtil.rmerge!(execution.state_before, add_prestate, true)
186
+
187
+ execution.end_time = TimeStamp.now().to_i
188
+ execution.output = script_output
189
+ execution.reduce_and_set_state_after(state)
190
+ execution.success = error.nil?
191
+ error = "#{error}\n" + "#{error.backtrace.join("\n")}" if error.respond_to?("backtrace")
192
+ execution.error_details = error
193
+
194
+ # clone the state hashes
195
+ s_before = MarkupUtil.clone(execution.state_before)
196
+ s_after = MarkupUtil.clone(execution.state_after)
197
+
198
+ #puts "DEBUG: states before/after #{execution}: #{execution.state_before}\n/\n#{execution.state_after}"
199
+ # compute state changes
200
+ prop_changes = SystemState.get_state_diff(s_before, s_after)
201
+ execution.state_changes = prop_changes
202
+ puts "INFO: Property changes (#{prop_changes.size}): #{prop_changes.inspect}"
203
+
204
+ # remove ignored properties (e.g., file modification time etc.)
205
+ SystemState.remove_ignore_props!(execution.state_before)
206
+ SystemState.remove_ignore_props!(execution.state_after)
207
+
208
+ # mongodb does not allow special chars like "." in the JSON hash
209
+ MarkupUtil.rectify_keys(execution.state_before)
210
+ MarkupUtil.rectify_keys(execution.state_after)
211
+
212
+ execution = execution.save
213
+ rescue => ex
214
+ Util.print_backtrace(ex)
215
+ puts "INFO: pre-state (original): #{s_before}"
216
+ puts "INFO: post-state (original): #{s_after}"
217
+ puts "INFO: pre-state: #{execution.state_before}"
218
+ puts "INFO: post-state: #{execution.state_after}"
219
+ end
220
+ end
221
+
222
+ def self.init_db(config)
223
+ Config.init_db_connection(config)
224
+ end
225
+
226
+ def self.init_test(automation_name, recipes = [], test_id = nil,
227
+ prototype="default", destroy_container=true, print_output=false)
228
+ test_id = test_id || Util.generate_short_uid()
229
+ suite = TestSuite.find({"uuid" => test_id})
230
+ return suite if suite && suite.size > 0
231
+ suite = TestSuite.new(
232
+ :recipes => recipes,
233
+ :uuid => test_id,
234
+ :lxc_prototype => prototype)
235
+ suite.save
236
+ automation = TestRunner.ensure_automation_exists_in_db(
237
+ automation_name, recipes, suite, destroy_container, print_output)
238
+ if !automation
239
+ puts "WARN: Could not ensure that automation '#{automation_name}' exists in DB."
240
+ return nil
241
+ end
242
+ suite.automation = automation
243
+ suite.save
244
+ return suite
245
+ end
246
+
247
+ def self.run_tests(test_suite, blocking = true)
248
+ if !test_suite.kind_of?(TestSuite)
249
+ test_suite = TestSuite.find({"uuid" => test_suite})
250
+ end
251
+ if blocking
252
+ runner = TestRunner.new(test_suite, nil, false)
253
+ runner.start_test_suite(blocking)
254
+ runner.stop
255
+ else
256
+ runner = TestRunner.new(test_suite, nil, true)
257
+ runner.start_test_suite(blocking)
258
+ runner.start_worker_threads()
259
+ end
260
+ end
261
+
262
+ private
263
+
264
+ def add_automation_specific_state_config(state_change_config, automation=nil)
265
+ # ensure automation is set
266
+ automation = AutomationRun.get_current().automation if !automation
267
+
268
+ if automation.additional_state_configs &&
269
+ !automation.additional_state_configs.empty?
270
+ puts "INFO: Register additional state change configs for automation " +
271
+ "'#{automation.uuid}': #{automation.additional_state_configs}"
272
+ # Make sure we clone the hash, otherwise the values from
273
+ # state_change_config get propagated into automation.additional_state_configs..!
274
+ add = MarkupUtil.clone(automation.additional_state_configs)
275
+ # recursively merge state change configs
276
+ MarkupUtil.rmerge!(state_change_config, add)
277
+ end
278
+ end
279
+
280
+ end
281
+ end
@@ -0,0 +1,141 @@
1
+
2
+ $LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), "..")
3
+
4
+ require 'rubygems'
5
+ require 'toaster/util/config'
6
+ require 'toaster/util/docker'
7
+
8
+ include Toaster
9
+
10
+ $service_port = 8385 if !$service_port
11
+
12
+ puts "INFO: Configuring service."
13
+
14
+ # global initializations
15
+ require "toaster/test/test_runner"
16
+ $test_runners = {}
17
+
18
+ class MyThreadOut
19
+ def write(out)
20
+ local_out = Thread.current[:stdout]
21
+ if local_out then
22
+ local_out.write out
23
+ else
24
+ STDOUT.write out
25
+ end
26
+ end
27
+ def flush()
28
+ local_out = Thread.current[:stdout]
29
+ if local_out then
30
+ local_out.flush
31
+ else
32
+ STDOUT.flush
33
+ end
34
+ end
35
+ def method_missing(name, *args, &block)
36
+ local_out = Thread.current[:stdout]
37
+ if local_out then
38
+ local_out.send(name, *args, &block)
39
+ else
40
+ STDOUT.send(name, *args, &block)
41
+ end
42
+ end
43
+ end
44
+ $stdout = MyThreadOut.new
45
+
46
+ ## capture stdout using thread-local variable
47
+ require 'stringio'
48
+ module Kernel
49
+ def capture_stdout(&block)
50
+ out = StringIO.new
51
+ Thread.start do
52
+ begin
53
+ Thread.current[:stdout] = out
54
+ block.call
55
+ ensure
56
+ Thread.current[:stdout] = STDOUT
57
+ end
58
+ end.join
59
+ return out.string
60
+ end
61
+ end
62
+ ##
63
+
64
+ def execute(cmd, silent=false)
65
+ puts "Executing command: #{cmd}" if !silent
66
+ output = `#{cmd}`
67
+ retval = $?
68
+ puts "return code: #{retval}, output: \n#{output}" if !silent
69
+ return retval
70
+ end
71
+
72
+ # Start the actual server and create RPC bindings
73
+
74
+ require "xmlrpc/server"
75
+ require "toaster/api"
76
+ class ToasterAppService < XMLRPC::Server
77
+ def initialize(*args)
78
+ super(*args)
79
+ @app = Toaster::ToasterApp.new
80
+ @methods = ["chefsolo", "clean", "download", "exec", "lxc",
81
+ "proto", "runchef", "runtest", "runtests", "testinit", "time"
82
+ ]
83
+ @methods.each do |method|
84
+ add_handler(method) { |*args|
85
+ exception = nil
86
+ out = capture_stdout do
87
+ begin
88
+ @app.send(method, *args)
89
+ rescue Object => ex
90
+ exception = ex
91
+ end
92
+ end
93
+ if exception
94
+ puts "#{exception} - #{exception.backtrace.join("\n")}"
95
+ puts "stdout: #{out}"
96
+ puts "-----"
97
+ raise exception
98
+ end
99
+ out
100
+ }
101
+ end
102
+ end
103
+ def start()
104
+ serve()
105
+ end
106
+
107
+ def self.service_started?()
108
+ output = `ps aux | grep -v "ps aux" | grep ruby | grep toaster_app_service`
109
+ return output.strip != ""
110
+ end
111
+
112
+ def self.start_service()
113
+ if !service_started?()
114
+ dir = File.expand_path(File.dirname(__FILE__))
115
+ Util.write("/tmp/toaster.service.loop.sh",
116
+ "#!/bin/bash\n " +
117
+ "cd #{dir}\n " +
118
+ "while [ 1 ]; do\n " +
119
+ "ruby toaster_app_service.rb do_start_service -v\n " +
120
+ "done",
121
+ true)
122
+ `chmod +x /tmp/toaster.service.loop.sh`
123
+ cmd = "cd #{dir} && screen -m -d bash /tmp/toaster.service.loop.sh"
124
+ puts "INFO: Starting test service in the background (using screen), using port #{$service_port}."
125
+ `#{cmd}`
126
+ else
127
+ puts "INFO: Another test service instance is already running on this host."
128
+ end
129
+ end
130
+ end
131
+
132
+
133
+ if ARGV.include?("do_start_service")
134
+ puts "Starting service on port #{$service_port}"
135
+ Toaster::Config.init_db_connection()
136
+ server = ToasterAppService.new($service_port, "0.0.0.0")
137
+ # client = ToasterApp.new()
138
+ # client.runtest("2285f8539f6c48873")
139
+ # client.runtests("88056bebc7e384cac")
140
+ server.start
141
+ end
@@ -0,0 +1,80 @@
1
+
2
+
3
+ module Toaster
4
+
5
+ #
6
+ # Simple implementation of a map with thread-safe blocking operations:
7
+ # - put(key, value): put a value to the map
8
+ # - get(key): get a value from the map, do not remove value
9
+ # - take(key): get a value from the map, remove value afterwards
10
+ #
11
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
12
+ #
13
+ class BlockingMap
14
+
15
+ def initialize()
16
+ @hash = {}
17
+ @semaphore = Mutex.new
18
+ @signal = ConditionVariable.new
19
+ end
20
+
21
+ #
22
+ # Put a value to the map, notifying waiting threads of new value
23
+ #
24
+ def put(key, value)
25
+ @semaphore.synchronize do
26
+ @hash[key] = value
27
+ @signal.signal
28
+ end
29
+ end
30
+
31
+ #
32
+ # Get a value from the map. Blocks until a value with the given key becomes available.
33
+ #
34
+ def get(key)
35
+ return do_get(key, false)
36
+ end
37
+
38
+ #
39
+ # Get a value from the map. Blocks until a value with the given key becomes available.
40
+ # This operation emoves the value from the map.
41
+ #
42
+ def take(key)
43
+ return do_get(key, true)
44
+ end
45
+
46
+ private
47
+
48
+ def do_get(key, delete = false)
49
+ error_count = 0
50
+ while true
51
+ begin
52
+ @semaphore.synchronize do
53
+ # try to get immediately
54
+ if @hash.include?(key)
55
+ value = @hash[key]
56
+ @hash.delete(key) if delete
57
+ return value
58
+ end
59
+ # wait until new value has been added
60
+ @signal.wait(@semaphore)
61
+ # try to get again
62
+ if @hash.include?(key)
63
+ value = @hash[key]
64
+ @hash.delete(key) if delete
65
+ return value
66
+ end
67
+ end
68
+ rescue Exception => ex
69
+ puts "WARN: #{ex}\n#{ex.backtrace.join("\n")}"
70
+ error_count += 1
71
+ if error_count >= 5
72
+ raise "Tried 5 times to get value from Toaster::BlockingMap, giving up..."
73
+ end
74
+ sleep(1)
75
+ end
76
+ end
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,58 @@
1
+
2
+
3
+ include Toaster
4
+
5
+ module Toaster
6
+
7
+ #
8
+ # Utility methods for combinatorial test design.
9
+ #
10
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
11
+ #
12
+ class Combinatorial
13
+
14
+ def self.combine(list, length=nil, successive=false, results=Set.new, current=[])
15
+ length = list.size if !length
16
+ if current.size == length
17
+ results << current
18
+ return results
19
+ end
20
+ return results if list.empty?
21
+ next_item = list[0]
22
+ list_new = list[1..-1]
23
+ cur_new = current.dup
24
+ cur_new << next_item
25
+ combine(list_new, length, successive, results, cur_new)
26
+ if current.empty? || !successive
27
+ cur_new1 = current.dup
28
+ combine(list_new, length, successive, results, cur_new1)
29
+ end
30
+ return results
31
+ end
32
+
33
+ def self.skip(list, length=nil, successive=false, results=Set.new, current=[], original_size=nil, skipped_so_far=0)
34
+ length = 0 if !length
35
+ original_size = list.size if !original_size
36
+ if current.size == original_size - length
37
+ results << current
38
+ return results
39
+ end
40
+ return results if list.empty?
41
+ next_item = list[0]
42
+ list_new = list[1..-1]
43
+ cur_new = current.dup
44
+ skip(list_new, length, successive, results, cur_new, original_size, skipped_so_far+1)
45
+ if skipped_so_far == 0 || !successive || skipped_so_far >= length
46
+ cur_new1 = current.dup
47
+ cur_new1 << next_item
48
+ skip(list_new, length, successive, results, cur_new1, original_size, skipped_so_far)
49
+ end
50
+ return results
51
+ end
52
+
53
+ private
54
+
55
+ def initialize
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,103 @@
1
+
2
+ ####################################################
3
+ # (c) Waldemar Hummer (hummer@infosys.tuwien.ac.at)
4
+ ####################################################
5
+
6
+ require 'json'
7
+ require 'toaster/markup/markup_util'
8
+
9
+ module Toaster
10
+
11
+ #
12
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
13
+ #
14
+
15
+ class Config
16
+
17
+ class << self
18
+ attr_accessor :values
19
+ end
20
+
21
+ @values = {}
22
+
23
+ def self.set(key,value, v=values)
24
+ parts = key.split(".")
25
+ last_key = parts.pop # remove last key from array
26
+ parts.each do |p|
27
+ if !v[p]
28
+ v[p] = {}
29
+ end
30
+ v = v[p]
31
+ end
32
+ v[last_key] = value
33
+ end
34
+ def self.get(key, v=values)
35
+ parts = key.split(".")
36
+ last_key = parts.pop # remove last key from array
37
+ parts.each do |p|
38
+ if !v[p]
39
+ v[p] = {}
40
+ end
41
+ v = v[p]
42
+ end
43
+ v[last_key]
44
+ end
45
+
46
+ def self.init_db_connection(config=nil)
47
+ require "toaster/util/util"
48
+ if !config || !config["mysql"]
49
+ config = {
50
+ "db_type" => "mysql",
51
+ 'mysql' => Config.get('db')
52
+ }
53
+ end
54
+ if config["db_type"] == "mysql" && config["mysql"]
55
+
56
+ require "active_record"
57
+ ActiveRecord::Base.establish_connection(
58
+ :adapter => 'mysql2',
59
+ :host => "#{config["mysql"]["host"]}".empty? ? get("db.host") : config["mysql"]["host"],
60
+ :database => "#{config["mysql"]["database"]}".empty? ? get("db.database") : config["mysql"]["database"],
61
+ :username => "#{config["mysql"]["username"]}".empty? ? get("db.username") : config["mysql"]["username"],
62
+ :password => "#{config["mysql"]["password"]}".empty? ? get("db.password") : config["mysql"]["password"]
63
+ )
64
+ else
65
+ puts "WARN: Incorrect database connection configuration"
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def self.read_files()
72
+ found = false
73
+ (1..4).each do |num_dirs|
74
+ config_dir = File.join(File.dirname(__FILE__), Array.new(num_dirs, "..").join("/"))
75
+ #puts "DEBUG: Searching for config in directory #{config_dir}"
76
+ file = File.expand_path(File.join(config_dir, "config.json"))
77
+ if File.exist?(file)
78
+ found = true
79
+ if ARGV.include?("-v")
80
+ puts "DEBUG: Reading configuration values from file '#{file}'"
81
+ end
82
+ MarkupUtil.rmerge!(@values, JSON.parse(File.read(file)))
83
+ end
84
+ end
85
+ if !found
86
+ puts "WARN: No configuration file 'config.json' found."
87
+ end
88
+ file = File.expand_path(File.join(Dir.home, ".toaster"))
89
+ if File.exist?(file)
90
+ if ARGV.include?("-v")
91
+ puts "DEBUG: Reading configuration values from file '#{file}'"
92
+ end
93
+ MarkupUtil.rmerge!(@values, JSON.parse(File.read(file)))
94
+ end
95
+ if ARGV.include?("-v")
96
+ puts "DEBUG: Configuration hash: '#{@values}'"
97
+ end
98
+ end
99
+
100
+ read_files()
101
+
102
+ end
103
+ end