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,197 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "toaster/markup/markup_util"
8
+ require "toaster/state/system_state"
9
+
10
+ include Toaster
11
+
12
+ module Toaster
13
+ class Convergence
14
+
15
+ def self.convergence_for_automation(automation, prop_value_percentage_threshold=0.7)
16
+ conv_props = {}
17
+ conv_props_list = []
18
+ TimeStamp.add(nil, "conv_for_auto")
19
+ # NOTE: our assumption here is that the tasks
20
+ # are returned in sequential order..!
21
+ tasks = automation.get_globally_executed_tasks()
22
+ tasks.each_with_index do |task,task_index|
23
+ convergence_for_task(task, prop_value_percentage_threshold).each do |conv_prop|
24
+ prop_name = conv_prop[0]
25
+ if conv_props[prop_name] && conv_props[prop_name] != conv_prop
26
+ #puts "INFO: Overwriting convergent property '#{prop_name}' with new value: #{conv_props[prop_name]} => #{conv_prop}"
27
+ end
28
+ conv_props[prop_name] = conv_prop
29
+ end
30
+ #conv_props.concat(convergence_for_task(task))
31
+ conv_props_list = conv_props.values
32
+ #conflicts = get_prop_conflicts(conv_props_list)
33
+ #if !conflicts.empty?
34
+ # puts "WARN: found conflicting properties in convergence: #{conflicts.inspect}"
35
+ #end
36
+ end
37
+ TimeStamp.add_and_print("compute convergence of automation", nil, "conv_for_auto") { |duration| duration > 15 }
38
+ return conv_props_list
39
+ end
40
+
41
+ def self.convergence_for_task(task, prop_value_percentage_threshold=0.7)
42
+ ch = task.global_state_prop_changes.to_a.dup
43
+ ps = task.global_post_states.to_a.dup
44
+ # eliminate inserted map entries in post states
45
+ ps.each do |p|
46
+ MarkupUtil.eliminate_inserted_map_entries!(p)
47
+ end
48
+ # remove ignored properties from post states
49
+ ignore_props = SystemState.read_ignore_properties()
50
+ ps.each do |p|
51
+ SystemState.remove_ignore_props!(p, ignore_props)
52
+ end
53
+ # remove ignored properties from state changes
54
+ SystemState.remove_ignore_props!(ch, ignore_props)
55
+
56
+ return convergence_for_prop_changes(ch, ps, prop_value_percentage_threshold)
57
+ end
58
+
59
+ #
60
+ # Args:
61
+ # - prop_changes: Should contain an array of
62
+ # Toaster::StateChange objects.
63
+ # - post_states: Total collection of post-states
64
+ # - min_percentage: minimum occurrence percentage (over
65
+ # all post-states) required for a property to be
66
+ # considered as convergent.
67
+ #
68
+ def self.convergence_for_prop_changes(prop_changes,
69
+ post_states, min_percentage=0.5)
70
+ candidates = get_convergence_candidates(prop_changes)
71
+ result = []
72
+ candidates.each do |prop|
73
+ property_name = prop[0]
74
+ value = prop[1]
75
+ values_equal = get_states_equal(post_states, property_name, value)
76
+ percentage = values_equal.size.to_f / post_states.size.to_f
77
+ if percentage >= min_percentage
78
+ new_val = [property_name, value, percentage, values_equal.size, post_states.size]
79
+ if !result.include?(new_val)
80
+ result << new_val
81
+ end
82
+ end
83
+ end
84
+ return result
85
+ end
86
+
87
+ def self.get_convergence_candidates(prop_changes)
88
+ cands = Set.new
89
+ prop_changes.each do |pc|
90
+ value = pc.action == StateChange::ACTION_DELETE ? nil :
91
+ pc.action == StateChange::ACTION_INSERT ? pc.value :
92
+ pc.action == StateChange::ACTION_MODIFY ? pc.value : nil;
93
+ cands << [pc.property, value, pc.task_execution.start_time]
94
+ end
95
+ return cands
96
+ end
97
+
98
+ def self.get_states_equal(post_states, property_name, value)
99
+ result = []
100
+ post_states.each do |ps|
101
+ value1 = nil
102
+ error = nil
103
+ begin
104
+ value1 = MarkupUtil.get_value_by_path(ps, property_name)
105
+ rescue => ex
106
+ error = ex
107
+ end
108
+ if !value.nil? && value1.nil?
109
+ error_text = "#{error}"
110
+ #puts "Expected value on property evaluation, but got exception: #{error_text[0..200]}..."
111
+ #puts "Property change: #{property_name}"
112
+ elsif value.nil? && !value1.nil?
113
+ # raise "Expected exception on property evaluation, but got value: #{value1}"
114
+ end
115
+ if value == value1 || value.eql?(value1)
116
+ result << ps
117
+ end
118
+ end
119
+ return result
120
+ end
121
+
122
+ #
123
+ # Args:
124
+ # - prop_values: list of Toaster::StateProperty objects
125
+ #
126
+ def self.get_prop_conflicts(prop_values)
127
+ confl = []
128
+ for i in (0..(prop_values.size - 1))
129
+ for j in ((i+1)..(prop_values.size - 1))
130
+ p1_key = prop_values[i][0]
131
+ p2_key = prop_values[j][0]
132
+ p1_value = prop_values[i][1]
133
+ p2_value = prop_values[j][1]
134
+ if p1_key == p2_key
135
+ if p1_value != p2_value
136
+ confl << [p1_key,p1_value,p2_value]
137
+ end
138
+ end
139
+ end
140
+ end
141
+ return confl
142
+ end
143
+
144
+ # automation_run --> prop_key --> list of (task_execution,prop_value)
145
+ def self.execution_traces(automation, property_patterns)
146
+ tmp = {}
147
+ task_execs = automation.get_task_execs_by_run
148
+ # list of property keys
149
+ prop_keys = Set.new
150
+ # build tmp result hash
151
+ task_execs.each do |run,exes|
152
+ tmp[run] = {}
153
+ exes.unshift(TaskExecution.new(nil,nil,nil,[],"start"))
154
+ exes.each_with_index do |exe,idx|
155
+ if exe.kind_of?(TaskExecution)
156
+ pre_state = MarkupUtil.clone(exe.state_before) || {}
157
+ post_state = MarkupUtil.clone(exe.state_after) || {}
158
+ MarkupUtil.eliminate_inserted_map_entries!(pre_state)
159
+ MarkupUtil.eliminate_inserted_map_entries!(post_state)
160
+ pres = SystemState.get_flat_attributes(pre_state)
161
+ posts = SystemState.get_flat_attributes(post_state)
162
+ pres.each do |pre,pre_val|
163
+ if Util.match_any(pre, property_patterns)
164
+ prop_keys << pre
165
+ tmp[run][pre] = {} if !tmp[run][pre]
166
+ prev_exe = exes[idx - 1]
167
+ tmp[run][pre][prev_exe.uuid] = MarkupUtil.get_value_by_path(pre_state, pre)
168
+ end
169
+ end
170
+ posts.each do |post,post_val|
171
+ if Util.match_any(post, property_patterns)
172
+ prop_keys << post
173
+ tmp[run][post] = {} if !tmp[run][post]
174
+ tmp[run][post][exe.uuid] = MarkupUtil.get_value_by_path(post_state, post)
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
180
+ # build result hash
181
+ result = {}
182
+ task_execs.each do |run,exes|
183
+ result[run] = {}
184
+ prop_keys.each do |prop|
185
+ result[run][prop] = []
186
+ exes.each do |exe|
187
+ uuid = exe.uuid
188
+ exe = nil if exe.uuid == "start"
189
+ result[run][prop] << [exe, tmp[run][prop][uuid]]
190
+ end
191
+ end
192
+ end
193
+ return result
194
+ end
195
+
196
+ end
197
+ end
@@ -0,0 +1,192 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "toaster/markup/markup_util"
8
+
9
+ include Toaster
10
+
11
+ module Toaster
12
+ class Idempotence
13
+
14
+ def initialize(test_suite)
15
+ @test_suite = test_suite
16
+ @repeated_task_execs = nil
17
+ @non_idempotent_tasks_details = nil
18
+ @non_idempotent_taskseqs_details = nil
19
+ end
20
+
21
+ def non_idempotent_task_seq(consider_success_of_tasks=false)
22
+ result = []
23
+ non_idempotent_taskseqs_details(consider_success_of_tasks).each do |tsk,details|
24
+ result << tsk
25
+ end
26
+ return result
27
+ end
28
+
29
+ def non_idempotent_tasks(consider_success_of_tasks=true)
30
+ result = []
31
+ non_idempotent_tasks_details(consider_success_of_tasks).each do |tsk,details|
32
+ result << tsk
33
+ end
34
+ return result
35
+ end
36
+
37
+ # returns:
38
+ # task_seq -> test_case -> ["execs"] -> [seq_of_task_exections ...]
39
+ # task_seq -> test_case -> ["changes"] -> seq_of_task_exections -> [state_changes ...]
40
+ def non_idempotent_taskseqs_details(consider_success_of_tasks=false)
41
+ return @non_idempotent_taskseqs_details if @non_idempotent_taskseqs_details
42
+ result = {}
43
+ repeated_task_executions().each do |tc,task_array_to_execs|
44
+ task_array_to_execs.each do |task_array,execs|
45
+
46
+ task_array = task_array.collect { |t_uuid| Task.find("uuid"=>t_uuid)[0] }
47
+
48
+ execs.each_with_index do |exec_seq,idx|
49
+ pre_state = MarkupUtil.clone(exec_seq[0].state_before)
50
+ MarkupUtil.eliminate_inserted_map_entries!(pre_state)
51
+ post_state = SystemState.reconstruct_state_from_execs_seq(exec_seq)
52
+ #puts "DEBUG: comparing pre-state and reconstructed post-state:\n#{pre_state}\n#{post_state}"
53
+ state_changes = SystemState.get_state_diff(pre_state, post_state)
54
+ SystemState.remove_ignore_props!(state_changes)
55
+
56
+ if state_changes.empty? && idx == 0
57
+ # non_state_change_tasks << task_array
58
+ elsif idx > 0
59
+ # an idempotent task (sequence) should:
60
+ # - not yield a state change after first execution
61
+ # - always yield a success if the first run was successful
62
+ if !state_changes.empty? ||
63
+ (consider_success_of_tasks &&
64
+ (execs[idx-1][-1].success && !exec_seq[-1].success))
65
+ # we need to be careful here: for some reason we have seen cases where
66
+ # rel_start_time is negative (!) which is in fact impossible. Hence, we leave
67
+ # out those cases until this problem is resolved, to be on the safe side..
68
+ rel_start_time = exec_seq[0].start_time - tc.automation_run.start_time
69
+ if rel_start_time >= 0
70
+ task_array_uuids = task_array.collect{|tmp| tmp.uuid}
71
+ puts "INFO: Non-idempotence detected in repeated " +
72
+ "execution of task sequence #{task_array_uuids} in test case #{tc.uuid}:\n--> #{state_changes}"
73
+ result[task_array] = {} if !result[task_array]
74
+ result[task_array][tc] = {} if !result[task_array][tc]
75
+ result[task_array][tc]["execs"] = [] if !result[task_array][tc]["execs"]
76
+ result[task_array][tc]["changes"] = {} if !result[task_array][tc]["changes"]
77
+ # add first execution sequence, if not yet added
78
+ result[task_array][tc]["execs"] << execs[idx-1] if result[task_array][tc]["execs"].empty?
79
+ # add next execution sequence
80
+ result[task_array][tc]["execs"] << exec_seq
81
+ result[task_array][tc]["changes"][exec_seq] = state_changes
82
+ else
83
+ puts "WARN: Start time of task execution '#{exec_seq[0].uuid}' " +
84
+ "(#{exec_seq[0].start_time}) is before automation run start time " +
85
+ "(#{tc.automation_run.start_time})!"
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ @non_idempotent_taskseqs_details = result
93
+ return result
94
+ end
95
+
96
+ # returns:
97
+ # task -> test_case -> list_of_task_exections
98
+ def non_idempotent_tasks_details(consider_success_of_tasks=true)
99
+ return @non_idempotent_tasks_details if @non_idempotent_tasks_details
100
+ result = {}
101
+ non_state_change_tasks = Set.new
102
+ repeated_task_executions().each do |tc,task_array_to_execs|
103
+ task_array_to_execs.each do |task_array,execs|
104
+ execs.each_with_index do |exec_sequence,idx|
105
+ exec_sequence.each_with_index do |exec,task_idx_in_sequence|
106
+ # get "relevant" state changes (without ignored
107
+ # properties such as file modification time etc)
108
+ state_changes = exec.relevant_state_changes
109
+ if state_changes.empty? && idx == 0
110
+ non_state_change_tasks << exec.task
111
+ elsif idx > 0
112
+ # an idempotent task should:
113
+ # - not yield a state change after first execution
114
+ # - always yield a success if the first run was successful
115
+ if !state_changes.empty? ||
116
+ (consider_success_of_tasks &&
117
+ (execs[idx-1][task_idx_in_sequence].success && !exec.success))
118
+ # we need to be careful here: for some reason we have seen cases where
119
+ # rel_start_time is negative (!) which is in fact impossible. Hence, we leave
120
+ # out those cases until this problem is resolved, to be on the safe side..
121
+ rel_start_time = exec.start_time - tc.automation_run.start_time
122
+ if rel_start_time >= 0
123
+ puts "INFO: Non-idempotence: State changes detected in repeated execution of task uuid #{exec.task.uuid} in test case #{tc.uuid}"
124
+ result[exec.task] = {} if !result[exec.task]
125
+ result[exec.task][tc] = [] if !result[exec.task][tc]
126
+ # add first execution, if not yet added
127
+ result[exec.task][tc] << execs[idx-1][task_idx_in_sequence] if result[exec.task][tc].empty?
128
+ # add next execution
129
+ result[exec.task][tc] << exec
130
+ else
131
+ puts "WARN: Start time of task execution '#{exec.uuid}' (#{exec.start_time}) is before automation run start time (#{tc.automation_run.start_time})!"
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ non_state_change_task_uuids = non_state_change_tasks.collect() { |t| t.uuid }
140
+ puts "DEBUG: No state change detected in first execution of #{non_state_change_tasks.size} tasks:" if !non_state_change_tasks.empty?
141
+ non_state_change_tasks.each do |task|
142
+ puts task.name
143
+ # puts task.sourcecode
144
+ # puts "--------------"
145
+ end
146
+ puts "--------------"
147
+ @non_idempotent_tasks_details = result
148
+ return result
149
+ end
150
+
151
+ # returns:
152
+ # test_case_id --> task_combination --> [task_execution_list ...]
153
+ def repeated_task_executions()
154
+ return @repeated_task_execs if @repeated_task_execs
155
+ result = {}
156
+ tasks = {}
157
+ @test_suite.test_cases.each do |tc|
158
+ if tc.automation_run
159
+ tc.repeat_task_uuids.each do |rt|
160
+ #puts "#{rt.inspect}"
161
+ rt = [rt] if !rt.kind_of?(Array)
162
+ tc_id = tc #tc.uuid
163
+ result[tc_id] = {} if !result[tc_id]
164
+ result[tc_id][rt] = [] if !result[tc_id][rt]
165
+ rt.each do |repeated_task|
166
+ #execs = tc.task_executions(repeated_task)
167
+ #tasks[repeated_task] = Task.find("uuid"=>repeated_task)[0] if !tasks[repeated_task]
168
+ tasks[repeated_task] = @test_suite.automation.get_task(repeated_task, true)
169
+ #puts "===> #{tasks[repeated_task]}"
170
+ execs = TaskExecution.find(
171
+ {"task_id"=>tasks[repeated_task].id, "automation_run_id"=>tc.automation_run.id},
172
+ {"task" => tasks[repeated_task], "automation_run" => tc.automation_run}
173
+ )
174
+ execs.sort! { |a,b|
175
+ a.start_time <=> b.start_time
176
+ }
177
+ execs.each_with_index do |exec,idx|
178
+ if result[tc_id][rt].size <= idx
179
+ result[tc_id][rt] << []
180
+ end
181
+ result[tc_id][rt][idx] << exec
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ @repeated_task_execs = result
188
+ return result
189
+ end
190
+
191
+ end
192
+ end
@@ -0,0 +1,48 @@
1
+
2
+ #
3
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
4
+ #
5
+
6
+ require "toaster/state/transition_edge"
7
+ require "toaster/markup/markup_util"
8
+
9
+ include Toaster
10
+
11
+ module Toaster
12
+
13
+ class PtraceUtil
14
+
15
+ WORD_SIZE = 8
16
+
17
+ def self.read_string(ptrace_target, addr)
18
+ str = ""
19
+ do_continue = true
20
+ iter = 0
21
+ while do_continue
22
+ v = ptrace_target.text.peek(addr + (WORD_SIZE * iter))
23
+ (0..7).each do |shift_bytes|
24
+ shift = 8 * shift_bytes
25
+ byte = (v >> shift) & 0xFF
26
+ if byte == 0
27
+ #puts "END OF STRING!!"
28
+ do_continue = false
29
+ break
30
+ end
31
+ str += byte.chr
32
+ end
33
+ iter += 1
34
+ end
35
+ return str
36
+ end
37
+
38
+ def self.get_filename_for_fd(pid, fd)
39
+ path = "/proc/#{pid}/fd/#{fd}"
40
+ begin
41
+ return File.readlink(path)
42
+ rescue
43
+ return nil
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,105 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require "toaster/state/transition_edge"
8
+ require "toaster/markup/markup_util"
9
+
10
+ include Toaster
11
+
12
+ module Toaster
13
+
14
+ class StateNode
15
+ attr_reader :properties, :incoming, :outgoing
16
+ attr_accessor :preceding_task, :succeeding_task
17
+
18
+ def initialize(properties = {})
19
+ @properties = properties
20
+ @incoming = Set.new
21
+ @outgoing = Set.new
22
+ @preceding_task = nil
23
+ @succeeding_task = nil
24
+ @reachable_nodes = nil
25
+ end
26
+
27
+ # determine whether the state properties of this node are a
28
+ # subset of (or equal to) the properties of the given state
29
+ def subset_of?(state, ignore_properties=[])
30
+ @properties.each do |prop,val|
31
+ if !ignore_properties.include?(prop)
32
+ val1 = MarkupUtil.get_value_by_path(state, prop, true)
33
+ contained = (val1 == val || val1.eql?(val))
34
+ if !contained
35
+ #puts "property '#{prop}'='#{val}' is not contained in state hash with #{state.size} properties"
36
+ #puts "property '#{prop}'='#{val}' is not contained in #{state.inspect}"
37
+ else
38
+ #puts "'#{prop}'='#{val}' IS contained in state"
39
+ end
40
+ return false if !contained
41
+ end
42
+ end
43
+ return true
44
+ end
45
+
46
+ def conflicts_with?(node, ignore_properties=[])
47
+ return !subset_of?(node.properties, ignore_properties) &&
48
+ !node.subset_of?(properties, ignore_properties)
49
+ end
50
+
51
+ def state_merge(additional_new_state)
52
+ @properties.merge(additional_new_state)
53
+ end
54
+
55
+ def satisfies_poststate(post)
56
+ post.each do |key,value|
57
+ if @properties[key] != value
58
+ return false
59
+ end
60
+ end
61
+ return true
62
+ end
63
+
64
+ def self.state_merge(old_node, additional_new_state)
65
+ return old_node.state_merge(additional_new_state)
66
+ end
67
+
68
+ def reachable?(node, check_cycles=true)
69
+ return node_reachable?(node, check_cycles)
70
+ end
71
+
72
+ def node_reachable?(node, check_cycles=true, nodes_visited=Set.new)
73
+ return reachable_nodes().include?(node)
74
+ end
75
+
76
+ def reachable_nodes()
77
+ return @reachable_nodes if @reachable_nodes
78
+ @reachable_nodes = get_reachable_nodes()
79
+ return @reachable_nodes
80
+ end
81
+
82
+ def get_reachable_nodes(nodes_so_far=Set.new)
83
+ stack = [self]
84
+ while !stack.empty?
85
+ node = stack.delete_at(0)
86
+ if !nodes_so_far.include?(node)
87
+ nodes_so_far << node
88
+ node.outgoing.each do |edge|
89
+ next_node = edge.node_to
90
+ stack << next_node
91
+ #next_node.get_reachable_nodes(nodes_so_far)
92
+ end
93
+ end
94
+ end
95
+ return nodes_so_far
96
+ end
97
+
98
+ end
99
+
100
+ class StateNodeInitial < StateNode
101
+ end
102
+ class StateNodeFinal < StateNode
103
+ end
104
+
105
+ end
@@ -0,0 +1,38 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ include Toaster
8
+
9
+ module Toaster
10
+
11
+ class StateTransition
12
+
13
+ attr_accessor :pre_state, :parameters, :post_state
14
+
15
+ def initialize(pre_state={}, parameters={}, post_state={})
16
+ @pre_state = pre_state
17
+ @parameters = parameters
18
+ @post_state = post_state
19
+ end
20
+
21
+ def eql?(obj)
22
+ return false if !obj.kind_of?(StateTransition)
23
+ return obj.pre_state.eql?(@pre_state) &&
24
+ obj.parameters.eql?(@parameters) &&
25
+ obj.post_state.eql?(@post_state)
26
+ end
27
+
28
+ def ==(obj)
29
+ return eql?(obj)
30
+ end
31
+
32
+ def hash()
33
+ return @pre_state.hash + @parameters.hash + @post_state.hash
34
+ end
35
+
36
+ end
37
+
38
+ end