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,104 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "active_record"
8
+ require "toaster/model/automation"
9
+ require "toaster/model/task_execution"
10
+ require "toaster/model/run_attribute"
11
+ require "toaster/state/system_state"
12
+ require "toaster/util/timestamp"
13
+ require "toaster/util/util"
14
+
15
+ module Toaster
16
+ class AutomationRun < ActiveRecord::Base
17
+
18
+ @@current_run = nil
19
+
20
+ belongs_to :user
21
+ belongs_to :automation
22
+ has_many :task_executions, nil, {:autosave => true, :dependent => :delete_all}
23
+ has_many :run_attributes, nil, {:autosave => true, :dependent => :delete_all}
24
+
25
+ # FIELDS:
26
+ # :uuid, :machine_id, :automation, :start_time,
27
+ # :end_time, :success, :error_details, :attributes
28
+
29
+ def initialize(attr_hash)
30
+ if !attr_hash[:uuid]
31
+ attr_hash[:uuid] = Util.generate_short_uid()
32
+ end
33
+ if !attr_hash[:start_time]
34
+ attr_hash[:start_time] = TimeStamp.now.to_i
35
+ end
36
+ if !attr_hash[:machine_id]
37
+ attr_hash[:machine_id] = Util.get_machine_id()
38
+ end
39
+ super(attr_hash)
40
+ end
41
+
42
+ # used in the context of a currently active run
43
+ def self.get_current
44
+ return @@current_run
45
+ end
46
+ # used in the context of a currently active run
47
+ def self.set_current(run)
48
+ run.save
49
+ @@current_run = run
50
+ end
51
+
52
+ def get_flat_attributes()
53
+ KeyValuePair.get_as_hash(run_attributes)
54
+ end
55
+
56
+ def get_executed_tasks()
57
+ result = []
58
+ task_executions.each do |exec|
59
+ result << exec.task
60
+ end
61
+ return result
62
+ end
63
+
64
+ def get_num_task_executions()
65
+ return task_executions.size
66
+ end
67
+
68
+ def get_task_execution(task)
69
+ task_executions().each do |e|
70
+ if e.task.uuid == task.uuid
71
+ return e
72
+ end
73
+ end
74
+ end
75
+
76
+ def task_execution_index(task_exec)
77
+ task_executions().each_with_index do |e,idx|
78
+ if e.uuid == task_exec.uuid
79
+ return idx
80
+ end
81
+ end
82
+ return nil
83
+ end
84
+
85
+ def duration
86
+ return nil if !end_time || !start_time
87
+ return end_time - start_time
88
+ end
89
+
90
+ def self.load(id, automation = nil)
91
+ id = DB.instance.wrap_db_id(id)
92
+ preset_fields = {}
93
+ preset_fields["automation"] = automation if automation
94
+ runs = find({"_id" => id}, preset_fields)
95
+ return nil if !runs || runs.empty?
96
+ return runs[0]
97
+ end
98
+
99
+ def self.find(criteria={})
100
+ DB.find_activerecord(AutomationRun, criteria)
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,11 @@
1
+ #
2
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
3
+ #
4
+
5
+ require "toaster/model/key_value_pair"
6
+
7
+ module Toaster
8
+ class IgnoreProperty < KeyValuePair
9
+
10
+ end
11
+ end
@@ -0,0 +1,59 @@
1
+ #
2
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
3
+ #
4
+
5
+ require "active_record"
6
+
7
+ module Toaster
8
+ class KeyValuePair < ActiveRecord::Base
9
+ self.inheritance_column = :type
10
+
11
+ serialize :value, JSON
12
+
13
+ def initialize(hash)
14
+ if !hash[:type]
15
+ type = IgnoreProperty.to_s
16
+ end
17
+ super(hash)
18
+ @attributes_cache = {} if !@attributes_cache # fixes bug in active_record v4.1
19
+ end
20
+
21
+ def self.get_as_hash(list)
22
+ attrs = {}
23
+ list.each do |a|
24
+ attrs[a.key] = a.value
25
+ end
26
+ return attrs
27
+ end
28
+
29
+ def self.from_hash(hash, clazz=KeyValuePair)
30
+ result = []
31
+ return result if !hash
32
+ hash.each { |key,value|
33
+ result << clazz.new(
34
+ :key => key,
35
+ :value => value
36
+ )
37
+ }
38
+ return result
39
+ end
40
+
41
+ def to_s
42
+ return "#{self.class}(#{key}=#{value})"
43
+ end
44
+
45
+ def hash
46
+ begin
47
+ return id if id
48
+ rescue
49
+ end
50
+ h = 0
51
+ h += key.hash rescue 0
52
+ h += value.hash rescue 0
53
+ h += type.hash rescue 0
54
+ h += data_type.hash rescue 0
55
+ return h
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,17 @@
1
+ #
2
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
3
+ #
4
+
5
+ require "toaster/model/key_value_pair"
6
+
7
+ module Toaster
8
+ class RunAttribute < KeyValuePair
9
+
10
+ belongs_to :automation_run
11
+
12
+ def self.from_hash(hash)
13
+ super(hash, RunAttribute)
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ module Toaster
8
+
9
+ class State
10
+ attr_accessor :properties
11
+ end
12
+
13
+ class StateProperty
14
+ attr_accessor :key, :value
15
+ end
16
+
17
+ end
@@ -0,0 +1,79 @@
1
+
2
+ #
3
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
4
+ #
5
+
6
+ require "active_record"
7
+
8
+ module Toaster
9
+
10
+ class StateChange < ActiveRecord::Base
11
+ # attr_accessor :property, :action, :value, :old_value, :task_execution
12
+
13
+ ACTION_INSERT = "insert"
14
+ ACTION_MODIFY = "modify"
15
+ ACTION_DELETE = "delete"
16
+ ACTION_UNKNOWN = "unknown"
17
+ VALUE_UNKNOWN = nil
18
+
19
+ belongs_to :task_execution
20
+
21
+ def initialize1(property=nil, action=nil, value=nil, old_value=nil)
22
+ @property = property
23
+ @action = action
24
+ @value = value
25
+ @old_value = old_value
26
+ @task_execution = nil
27
+ end
28
+
29
+ def to_s
30
+ if action == ACTION_MODIFY
31
+ return "Modification of property '#{property}': '#{old_value}' --> '#{value}'"
32
+ elsif action == ACTION_DELETE
33
+ return "Deletion of property '#{property}'"
34
+ elsif action == ACTION_INSERT
35
+ return "Insertion of property '#{property}': '#{value}'"
36
+ end
37
+ return "Action '#{@action}' on property '#{property}', value='#{value}', old_value='#{old_value}'"
38
+ end
39
+
40
+ def is_delete?()
41
+ return action == ACTION_DELETE
42
+ end
43
+ def is_modify?()
44
+ return action == ACTION_MODIFY
45
+ end
46
+ def is_insert?()
47
+ return action == ACTION_INSERT
48
+ end
49
+
50
+ def self.from_hash_array(prop_change_array)
51
+ prop_changes = []
52
+ prop_change_array.each do |pc|
53
+ prop_changes << from_hash(pc)
54
+ end
55
+ return prop_changes
56
+ end
57
+
58
+ def ==(obj)
59
+ return eql?(obj)
60
+ end
61
+
62
+ def eql?(obj)
63
+ return obj.kind_of?(StateChange) &&
64
+ obj.property == @property && obj.action == @action &&
65
+ obj.value == @value && obj.old_value == @old_value
66
+ end
67
+
68
+ def hash
69
+ h = 0
70
+ h += @property.hash if @property
71
+ h += @value.hash if @value
72
+ h += @action.hash if @action
73
+ h += @old_value.hash if @old_value
74
+ return h
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,292 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "active_record"
8
+ require "toaster/util/util"
9
+ require "toaster/model/task_execution"
10
+ require "toaster/model/task_parameter"
11
+ require "toaster/state/state_transition"
12
+ require "toaster/state/system_state"
13
+ require "toaster/chef/resource_inspector"
14
+
15
+ module Toaster
16
+ class Task < ActiveRecord::Base
17
+
18
+ has_many :task_parameters
19
+ has_many :task_executions
20
+ belongs_to :automation
21
+
22
+ attr_accessor :resource_obj
23
+
24
+ def initialize(attr_hash)
25
+ if !attr_hash[:uuid]
26
+ attr_hash[:uuid] = Util.generate_short_uid()
27
+ end
28
+ super(attr_hash)
29
+ end
30
+
31
+ def initialize1(resource, action, sourcecode, uuid = nil)
32
+ @db_type = "automation_task"
33
+ @resource = resource ? resource.to_s : nil
34
+ @resource_obj = resource
35
+ @action = action ? action.to_s : nil
36
+ @uuid = uuid ? uuid : Util.generate_short_uid()
37
+ @sourcecode = sourcecode
38
+ @sourcehash = sourcecode ? Util.md5(sourcecode) : nil
39
+ @sourcefile = nil
40
+ @sourceline = 0
41
+ @parameters = []
42
+ @executions_cache = []
43
+ end
44
+
45
+ #
46
+ # Return an array of TaskExecution instances for this task.
47
+ #
48
+ def global_executions(criteria={})
49
+ criteria[:task] = self
50
+ return TaskExecution.find(criteria)
51
+ end
52
+
53
+ def global_num_executions()
54
+ return global_executions().size
55
+ end
56
+ def global_successful_executions()
57
+ return global_executions(:success => true)
58
+ end
59
+ def global_num_successful_executions()
60
+ return global_successful_executions().size
61
+ end
62
+ def global_success_rate()
63
+ return global_num_successful_executions().to_f / global_num_executions().to_f
64
+ end
65
+ def global_success_percentage()
66
+ return global_num_successful_executions().to_f / global_num_executions().to_f * 100.0
67
+ end
68
+
69
+ def set_executions(execs)
70
+ @executions_cache = execs
71
+ end
72
+
73
+ #
74
+ # Return an array of lists of StateChange.
75
+ # Length of the array is the number of global executions of this task.
76
+ # For each task execution, the array contains a list with all state
77
+ # changes caused by this execution.
78
+ #
79
+ def global_state_prop_changes(global_execs = nil)
80
+ return StateChange.joins(:task_execution => :task).where(
81
+ "task_executions.task_id" => self.id)
82
+ end
83
+ def global_num_state_prop_changes(global_executions = nil)
84
+ return global_state_prop_changes(global_executions).size
85
+ end
86
+
87
+ #
88
+ # Return a map StateChange -> Integer .
89
+ # This method maps each state property change to the number
90
+ # of occurrences, summed up for all executions of this task.
91
+ #
92
+ def global_state_prop_changes_map(global_execs = nil)
93
+ result = {}
94
+ global_state_prop_changes(global_execs).each do |c|
95
+ result[c] = 0 if !result[c]
96
+ result[c] += 1
97
+ end
98
+ return result
99
+ end
100
+
101
+ #
102
+ # Return a set of StateTransition objects for this task.
103
+ # A StateTransition basically represents a triple (pre-state, parameters, post-state).
104
+ # * pre-state and post-state are maps of state property values {prop_key=>value}.
105
+ # * parameters is a map of input parameter values {param_name=>value}.
106
+ #
107
+ # The result set contains all state transitions that were recorded in
108
+ # any of the executions of this task.
109
+ #
110
+ # This method is the basis for construction of the state transition graph.
111
+ #
112
+ def global_state_transitions(global_execs=nil, insert_nil_prestate_prop_for_insertions=false)
113
+ result = Set.new
114
+ global_execs = global_executions() if !global_execs
115
+ global_execs.each do |exe|
116
+ changes = exe.state_changes
117
+ prestate = {}
118
+ changes.each { |c|
119
+ if c.is_delete?
120
+ prestate[c.property] = c.value
121
+ elsif c.is_modify?
122
+ prestate[c.property] = c.old_value
123
+ elsif c.is_insert?
124
+ if insert_nil_prestate_prop_for_insertions
125
+ prestate[c.property] = nil
126
+ end
127
+ end
128
+ }
129
+ poststate = {}
130
+ changes.each { |c|
131
+ if c.is_delete?
132
+ poststate[c.property] = nil
133
+ elsif c.is_modify? || c.is_insert?
134
+ poststate[c.property] = c.value
135
+ end
136
+ }
137
+ params = exe.get_used_parameters()
138
+ trans = StateTransition.new(prestate, params, poststate)
139
+ result << trans
140
+ end
141
+ return result
142
+ end
143
+
144
+ #
145
+ # Return a set of state property mappings {prop_key => value} .
146
+ #
147
+ # The result set contains all states which were observed either as pre-state
148
+ # or as post-state of any of the executions of this task. The states are
149
+ # reduced to their "relevant" parts, i.e., only those state properties are
150
+ # included which are inserted/deleted/modified by the task, AND only those
151
+ # state properties which are not in the list of ignored properties of this
152
+ # task's automation.
153
+ #
154
+ def global_states_reduced(state_transitions = nil, include_empty_states = true,
155
+ add_prestates = true, add_poststates = true)
156
+ ignore_props = automation ? automation.ignore_properties.to_a.dup : []
157
+ # add global ignore properties
158
+ ignore_props.concat(SystemState.read_ignore_properties())
159
+ puts "WARN: No automation found for task UUID #{@uuid}!" if !automation
160
+ result = Set.new
161
+ state_transitions = global_state_transitions() if !state_transitions
162
+ state_transitions.each do |t|
163
+ if add_prestates
164
+ SystemState.remove_ignore_props!(t.pre_state, ignore_props)
165
+ if (include_empty_states || !t.pre_state.empty?)
166
+ result << t.pre_state
167
+ end
168
+ end
169
+ if add_poststates
170
+ SystemState.remove_ignore_props!(t.post_state, ignore_props)
171
+ if (include_empty_states || !t.post_state.empty?)
172
+ result << t.post_state
173
+ end
174
+ end
175
+ end
176
+ return result
177
+ end
178
+ def global_pre_states_reduced(state_transitions = nil, include_empty_states = true)
179
+ return global_states_reduced(state_transitions, include_empty_states, true, false)
180
+ end
181
+ def global_post_states_reduced(state_transitions = nil, include_empty_states = true)
182
+ return global_states_reduced(state_transitions, include_empty_states, false, true)
183
+ end
184
+
185
+ def global_pre_states(global_execs = nil)
186
+ result = []
187
+ global_execs = global_executions() if !global_execs
188
+ # set list of ignored properties
189
+ ignore_props = automation ? automation.ignore_properties.to_a.dup : []
190
+ ignore_props.concat(SystemState.read_ignore_properties())
191
+ global_execs.each do |exe|
192
+ state = exe.state_before
193
+ # elimination of map entries is required for removing ignore props!
194
+ MarkupUtil.eliminate_inserted_map_entries!(state)
195
+ SystemState.remove_ignore_props!(state, ignore_props)
196
+ result << state
197
+ end
198
+ return result
199
+ end
200
+
201
+ def global_post_states(global_execs = nil)
202
+ result = []
203
+ global_execs = global_executions() if !global_execs
204
+ # set list of ignored properties
205
+ ignore_props = automation ? automation.ignore_properties.to_a.dup : []
206
+ ignore_props.concat(SystemState.read_ignore_properties())
207
+ global_execs.each do |exe|
208
+ state = exe.state_after
209
+ # elimination of map entries is required for removing ignore props!
210
+ MarkupUtil.eliminate_inserted_map_entries!(state)
211
+ SystemState.remove_ignore_props!(state, ignore_props)
212
+ result << state
213
+ end
214
+ return result
215
+ end
216
+
217
+ def global_pre_states_flat(global_execs = nil)
218
+ return Task.properties_flat(global_pre_states(global_execs))
219
+ end
220
+
221
+ def global_post_states_flat(global_execs = nil)
222
+ return Task.properties_flat(global_post_states(global_execs))
223
+ end
224
+
225
+ def self.properties_flat(states_array)
226
+ result = []
227
+ states_array.each do |s|
228
+ MarkupUtil.eliminate_inserted_map_entries!(s)
229
+ s = SystemState.get_flat_attributes(s)
230
+ s.each do |k,v|
231
+ entry = [k,v]
232
+ if !result.include?(entry)
233
+ result << entry
234
+ end
235
+ end
236
+ end
237
+ return result
238
+ end
239
+
240
+ def toaster_testing_task?()
241
+ return sourcefile == "toaster/recipes/testing.rb"
242
+ end
243
+
244
+ #
245
+ # Returns a hash which maps identifier=>configurations, indicating which types
246
+ # of state changes this task, upon execution, is *potentially* going to
247
+ # perform. For instance, if the task starts/stops a system service,
248
+ # the identifier "ports" will be in the hash keys. If the task modifies
249
+ # some files, the key will contain the identifier "files", and possibly a list of
250
+ # potential files that may be edited.
251
+ # This helps us to develop tailor-made state capturing tools (e.g., implemented
252
+ # as ohai plugins) for different types of tasks.
253
+ #
254
+ def get_config_for_potential_state_changes()
255
+ return ResourceInspector.get_config_for_potential_state_changes(self)
256
+ end
257
+
258
+ def guess_potential_state_changes()
259
+ return ResourceInspector.guess_potential_state_changes(self)
260
+ end
261
+
262
+ def name
263
+ return "#{resource}::#{action}"
264
+ end
265
+
266
+ def self.find(criteria={})
267
+ DB.find_activerecord(Task, criteria)
268
+ end
269
+
270
+ def self.load_from_chef_source(resource, action, sourcecode, sourcefile, sourceline)
271
+ sourcecode.strip! if sourcecode.kind_of?(String)
272
+ params = {
273
+ :resource => resource.to_s,
274
+ :action => action,
275
+ :sourcecode => sourcecode,
276
+ :sourcefile => sourcefile,
277
+ :sourceline => sourceline
278
+ }
279
+ task = find_by(params)
280
+ if !task
281
+ task = Task.new(params)
282
+ end
283
+ task.resource_obj = resource
284
+ return task
285
+ end
286
+
287
+ def eql?(other)
288
+ return other.kind_of?(Task) && !uuid.nil? && uuid == other.uuid
289
+ end
290
+
291
+ end
292
+ end
@@ -0,0 +1,76 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "active_record"
8
+ require "toaster/model/task"
9
+ require "toaster/model/state"
10
+ require "toaster/model/state_change"
11
+ require "toaster/model/automation_run"
12
+ require "toaster/util/timestamp"
13
+
14
+ module Toaster
15
+ class TaskExecution < ActiveRecord::Base
16
+
17
+ belongs_to :task
18
+ belongs_to :automation_run
19
+ has_many :state_changes
20
+ serialize :state_before, JSON
21
+ serialize :state_after, JSON
22
+
23
+ def initialize(attr_hash)
24
+ if !attr_hash[:uuid]
25
+ attr_hash[:uuid] = Util.generate_short_uid()
26
+ end
27
+ if !attr_hash[:start_time]
28
+ attr_hash[:start_time] = TimeStamp.now.to_i
29
+ end
30
+ super(attr_hash)
31
+ end
32
+
33
+ #
34
+ # Return a map {param_name => value} of parameter values that
35
+ # were used for this task execution.
36
+ #
37
+ def get_used_parameters()
38
+ result = {}
39
+ run_attributes = automation_run.get_flat_attributes()
40
+ task.task_parameters.each do |p|
41
+ if p
42
+ value = run_attributes[p.key]
43
+ result[p.key] = value
44
+ end
45
+ end
46
+ return result
47
+ end
48
+
49
+ def relevant_state_changes()
50
+ result = state_changes.to_a.dup
51
+ ignore_props = SystemState.read_ignore_properties()
52
+ # remove ignored properties from state changes
53
+ SystemState.remove_ignore_props!(result, ignore_props)
54
+ return result
55
+ end
56
+
57
+ def reduce_and_set_state_after(state)
58
+ self.state_after = state
59
+ # limit the number of state properties which are
60
+ # saved for the pre-state and the post-state.
61
+ states_new = SystemState.reduce_state_size(state_before, state_after)
62
+ #puts "states before/after #{self}: #{state_after} #{states_new[1]}"
63
+ self.state_before = states_new[0]
64
+ self.state_after = states_new[1]
65
+ end
66
+
67
+ def self.find(criteria={})
68
+ DB.find_activerecord(TaskExecution, criteria)
69
+ end
70
+
71
+ def self.load_all_for_automation(auto)
72
+ return joins(:automation_run).where(:automation_run => {:automation_id => auto.id})
73
+ end
74
+
75
+ end
76
+ end