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,71 @@
1
+
2
+ ################################################################################
3
+ # (c) Waldemar Hummer
4
+ ################################################################################
5
+
6
+ #
7
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
8
+ #
9
+
10
+ module Toaster
11
+
12
+ class Docker
13
+
14
+ def self.save_container_changes(lxc_name, repository="prototypes")
15
+ oldImgID=`cat /lxc/#{lxc_name}/docker.image.id 2> /dev/null`
16
+ oldImgID = oldImgID.strip
17
+ if oldImgID != ""
18
+ # get existing container ID
19
+ instID=`cat /lxc/#{lxc_name}/docker.container.id`
20
+ instID = instID.strip
21
+ # save container with the new changes
22
+ puts "DEBUG: Committing container changes using command: docker commit #{instID} #{repository} #{lxc_name}"
23
+ newImgID=`docker commit #{instID} #{repository} #{lxc_name}`
24
+ newImgID = newImgID.strip
25
+ images = `docker images | grep -v REPOSITORY | grep #{repository} | grep "#{lxc_name}"`
26
+ images = images.strip.split("\n")
27
+ puts "DEBUG: existing docker images for name '#{lxc_name}' (old image ID '#{oldImgID}'): #{images}"
28
+ if images.size > 1
29
+ # remove old docker image
30
+ `docker rmi #{oldImgID}`
31
+ # update new image id
32
+ `echo #{newImgID} > /lxc/#{lxc_name}/docker.image.id`
33
+ end
34
+ else
35
+ puts "WARN: Could not save container changes. Container image file empty: /lxc/#{lxc_name}/docker.image.id"
36
+ end
37
+ end
38
+
39
+ def self.get_container_names()
40
+ result = []
41
+ docker_containers = `docker ps | grep prototypes: | awk '{print $1}'`.strip.split("\n")
42
+ all_cont_id_files = `find /lxc/ -maxdepth 2 -name "docker.container.id"`.strip.gsub(/\n/, " ")
43
+ docker_containers.each do |docker_cont|
44
+ cont_id_files = `grep -l -R "#{docker_cont}" #{all_cont_id_files}`.strip.split("\n")
45
+ cont_id_files.each do |cont_id_file|
46
+ cont_id_file = cont_id_file.gsub(/\/lxc\/([^\/]+)\/.*/, '\1')
47
+ result << cont_id_file
48
+ end
49
+ end
50
+ return result
51
+ end
52
+
53
+ def self.kill_container(lxc_name)
54
+ container_id = `cat /lxc/#{lxc_name}/docker.container.id 2> /dev/null`
55
+ container_id = container_id.strip
56
+ puts "DEBUG: Killing docker container ID '#{container_id}'"
57
+ if container_id != ""
58
+ `docker kill #{container_id} 2> /dev/null`
59
+ `docker rm #{container_id} 2> /dev/null`
60
+ else
61
+ puts "WARN: Could not find valid docker container ID in file /lxc/#{lxc_name}/docker.container.id"
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def initialize
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,19 @@
1
+
2
+ require 'logger'
3
+
4
+ module Toaster
5
+ @@logger = Logger.new(STDOUT)
6
+ @@logger.level = Logger::DEBUG
7
+
8
+ module Logging
9
+
10
+ def self.level(log_level)
11
+ @@logger.level = log_level
12
+ end
13
+
14
+ def self.get_level
15
+ @@logger.level
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,383 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require 'tempfile'
8
+ require 'toaster/chef/chef_util'
9
+ require 'toaster/util/docker'
10
+ require 'toaster/util/util'
11
+ require 'toaster/util/config'
12
+ require 'toaster/util/timestamp'
13
+
14
+ module Toaster
15
+
16
+ class LXC
17
+
18
+ @semaphore = Mutex.new
19
+ @lxc_init_delay = 10
20
+ @last_init_time = 0
21
+
22
+ LXC_ROOT_DIR = "/lxc/"
23
+
24
+ class << self
25
+ attr_accessor :lxc_init_delay, :last_init_time, :semaphore, :initialized
26
+ end
27
+
28
+ def self.new_container(prototype_name = "default", num_retries = 1)
29
+ file = nil
30
+ name = nil
31
+ num = nil
32
+ # check if the prototype with the given name exists
33
+ existing_protos = get_prototypes_local().keys
34
+ if !existing_protos.include?(prototype_name) &&
35
+ !existing_protos.include?("prototype_#{prototype_name}")
36
+ puts "WARN: Prototype with name #{prototype_name} does not exist. Existing: #{existing_protos}"
37
+ new_proto = existing_protos[0]
38
+ if new_proto
39
+ new_proto = get_prototype_name(new_proto)
40
+ puts "INFO: Using randomly chosen prototype '#{new_proto}' instead of '#{prototype_name}'."
41
+ prototype_name = new_proto
42
+ end
43
+ end
44
+ #puts "DEBUG: Thread #{Thread.current.object_id} synchronizing on semaphore #{semaphore}"
45
+ semaphore.synchronize do
46
+
47
+ name = get_next_container_name()
48
+ num = get_next_container_num()
49
+ #puts "DEBUG: Next LXC container number: #{num}. (locked on semaphore #{semaphore})"
50
+
51
+ #
52
+ # make sure the LXC directory and lock file is created, otherwise
53
+ # a parallel thread might take the same container ID.
54
+ #
55
+ lxc_dir = "#{LXC_ROOT_DIR}/#{name}"
56
+ lxc_lockfile = "#{LXC_ROOT_DIR}/#{name}.lock"
57
+ puts "INFO: Creating LXC directory #{lxc_dir}"
58
+ `mkdir -p #{lxc_dir}`
59
+ `touch #{lxc_lockfile}`
60
+ #puts "DEBUG: LXC directory #{lxc_dir} exists: #{File.exist?(lxc_dir)}."
61
+
62
+ # sleep a while, if necessary...
63
+ now = TimeStamp.now.to_i
64
+ if (now - last_init_time) < lxc_init_delay
65
+ time_passed = now - last_init_time
66
+ sleep(lxc_init_delay - time_passed)
67
+ end
68
+
69
+ last_init_time = TimeStamp.now.to_i
70
+ end
71
+ #puts "DEBUG: Thread #{Thread.current.object_id} releasing semaphore #{semaphore}"
72
+
73
+ puts "INFO: Creating new LXC container '#{name}' from prototype '#{prototype_name}'."
74
+ key = "initLXC " + Util.generate_short_uid()
75
+ TimeStamp.add(nil, key)
76
+ output = `#{Util.toaster_executable} spawn "#{name}" "#{prototype_name}" 2>&1`
77
+ TimeStamp.add(nil, key)
78
+
79
+ ip = output.gsub("\n", " ").gsub(/.*root@(([0-9]{1,3}\.){3}[0-9]{1,3}).*/, '\1')
80
+ if Util.is_ip_address(ip)
81
+ puts "INFO: IP address of new LXC container '#{name}' is '#{ip}'."
82
+ else
83
+ puts "WARN: Cleaning up container, because output after creation was: #{output}"
84
+ destroy_container({
85
+ "num" => num,
86
+ "rootdir" => "#{LXC_ROOT_DIR}/#{name}/rootfs/",
87
+ "lxc_id" => name
88
+ })
89
+ if num_retries > 0
90
+ puts "INFO: re-trying to create new LXC container after failed attempt."
91
+ return new_container(prototype_name, num_retries - 1)
92
+ end
93
+ end
94
+
95
+ return {
96
+ "num" => num,
97
+ "rootdir" => "#{LXC_ROOT_DIR}/#{name}/rootfs/",
98
+ "ip" => ip,
99
+ "lxc_id" => name,
100
+ "creation_stdout" => output
101
+ }
102
+ end
103
+
104
+ def self.copy_on_write?()
105
+ return File.exist?("/mnt/btrfs/")
106
+ end
107
+
108
+ def self.prototype_container(prototype_name)
109
+ return {
110
+ "rootdir" => "#{LXC_ROOT_DIR}/prototype_#{prototype_name}/rootfs/",
111
+ "lxc_id" => "prototype_#{prototype_name}"
112
+ }
113
+ end
114
+
115
+ def self.exec(lxc, cmd, print_output=false, append_time_to_output=false)
116
+ ip = lxc["ip"]
117
+ cmd = "ssh \"#{ip}\" #{cmd}"
118
+ output = ""
119
+ if append_time_to_output
120
+ output = Util.exec_with_output_timestamps(cmd)
121
+ else
122
+ output = `#{cmd} 2>&1`
123
+ end
124
+ if print_output
125
+ puts "INFO: output of command '#{cmd}' (return code #{$?}): #{output}"
126
+ end
127
+ return output
128
+ end
129
+
130
+ def self.run_chef_node(lxc, chef_node, run_list_hash, chef_node_attrs = {})
131
+
132
+ chef_node_name = ChefUtil.extract_node_name(chef_node)
133
+ run_list = ChefUtil.prepare_run_list(chef_node_name, run_list_hash)
134
+
135
+ node_attributes = { "run_list" => run_list, "toaster" => {} }
136
+ node_attributes.merge!(chef_node_attrs)
137
+ Config.values.each do |key,value|
138
+ if key != "chef"
139
+ node_attributes["toaster"][key] = value
140
+ end
141
+ end
142
+ puts "DEBUG: Chef node attributes: #{node_attributes.inspect}"
143
+
144
+ run_chef(lxc, chef_node, node_attributes)
145
+ end
146
+
147
+ def self.run_chef(lxc, chef_node, node_attributes)
148
+
149
+ # prepare variables
150
+ output = ""
151
+ lxc_dir = lxc["rootdir"]
152
+ node_file_local = Util.mktmpfile("/tmp/chef_node_")
153
+ node_file = "#{lxc_dir}/#{node_file_local}"
154
+
155
+ # write config files
156
+ Util.write(node_file, node_attributes.to_json(), true)
157
+ #puts "DEBUG: node file #{node_file} : #{File.read(node_file)}"
158
+
159
+
160
+
161
+ # IMPORTANT: redirect streams from/to a stream (" < /dev/null >& /some/file"),
162
+ # because otherwise we might end up in a situation where the ssh command
163
+ # hangs and never returns, as described here:
164
+ # http://www.snailbook.com/faq/background-jobs.auto.html
165
+ # UPDATE: for docker.io containers under Ubuntu 13.04 this seems to
166
+ # be unnecessary. In fact, the workaround with piping does not work.
167
+ out_file = "/tmp/toaster_out_#{Util.generate_short_uid()}"
168
+ last_out_file = "/tmp/toaster_out_latest"
169
+ cmd = "\"" +
170
+ "toaster chefsolo #{node_file_local} " +
171
+ # "grep -v 'FATAL: No cookbook found in' " +
172
+ ">& #{last_out_file}; " +
173
+ "cat #{last_out_file}; " +
174
+ "\""
175
+ puts "INFO: Executing command in LXC #{lxc["ip"]}: #{cmd}"
176
+ output = exec(lxc, cmd, false, true)
177
+
178
+ return output
179
+ end
180
+
181
+ def self.clean()
182
+ if ARGV.include?("-v")
183
+ puts "DEBUG: existing containers: #{get_container_names()}"
184
+ end
185
+ get_container_names().each do |lxc_name|
186
+ puts "DEBUG: destroying LXC container #{lxc_name}"
187
+ destroy_container(lxc_name)
188
+ end
189
+ Dir["#{LXC_ROOT_DIR}/lxc*"].each do |lxc_path|
190
+ if lxc_path.match(/\.lock$/)
191
+ # delete *.lock file
192
+ `rm -f #{lxc_path}`
193
+ else
194
+ # delete LXC container directory
195
+ if copy_on_write?()
196
+ `/sbin/btrfs subvolume delete #{lxc_path}`
197
+ end
198
+ `rm -rf #{lxc_path}`
199
+ end
200
+ end
201
+ end
202
+
203
+ def self.destroy_container(lxc)
204
+ lxc_name = lxc.kind_of?(Hash) ? lxc["lxc_id"] : lxc.to_s
205
+ if !lxc_name.match(/[a-zA-Z0-9]+/).to_s == lxc_name
206
+ puts "WARN: Unexpected LXC container name '#{lxc_name}'. Canceling destroy operation."
207
+ return
208
+ end
209
+ `lxc-stop -n #{lxc_name} 2> /dev/null`
210
+ `lxc-destroy -n #{lxc_name} 2> /dev/null`
211
+ # if we are using docker, kill the container using docker...
212
+ Toaster::Docker.kill_container(lxc_name)
213
+
214
+ # check if copy-on-write (btrfs) is enabled
215
+ if copy_on_write?()
216
+ puts "DEBUG: removing previously created copy-on-write directory using btrfs: #{LXC_ROOT_DIR}/#{lxc_name}"
217
+ `/sbin/btrfs subvolume delete #{LXC_ROOT_DIR}/#{lxc_name}`
218
+ else
219
+ puts "DEBUG: removing LXC directory: #{LXC_ROOT_DIR}/#{lxc_name}"
220
+ `rm -r #{LXC_ROOT_DIR}/#{lxc_name}`
221
+ end
222
+ # remove lock file
223
+ `rm -f #{LXC_ROOT_DIR}/#{lxc_name}.lock`
224
+ end
225
+
226
+ def self.get_next_container_name()
227
+ return "lxc#{get_next_container_num()}"
228
+ end
229
+ def self.get_next_container_num()
230
+ #next_num = get_max_container_num() + 1
231
+ next_num = 1
232
+ while File.exist?("#{LXC_ROOT_DIR}/lxc#{next_num}") ||
233
+ File.exist?("#{LXC_ROOT_DIR}/lxc#{next_num}.lock")
234
+ next_num += 1
235
+ end
236
+ return next_num
237
+ end
238
+ def self.get_container_names()
239
+ result = []
240
+ containers = []
241
+ containers.concat(Toaster::Docker.get_container_names())
242
+ containers.each do |c|
243
+ if !is_prototype?(c)
244
+ result << c
245
+ end
246
+ end
247
+ return result
248
+ end
249
+
250
+ def self.get_containers_for_hosts(host_machine_ips = [], include_prototypes=false)
251
+ host_machine_ips = host_machine_ips.split(/, ;:/) if !host_machine_ips.kind_of?(Array)
252
+ result = {}
253
+ host_machine_ips.each do |ip|
254
+ if ip.strip != ""
255
+ result[ip] = get_containers_for_host(ip, include_prototypes)
256
+ end
257
+ end
258
+ return result
259
+ end
260
+
261
+ def self.get_prototypes_for_host(host_machine_ip)
262
+ lxcs = get_containers_for_host(host_machine_ip, true)
263
+ lxcs.keys.dup.each do |name|
264
+ if !get_prototype_name(name)
265
+ lxcs.delete(name)
266
+ end
267
+ end
268
+ return lxcs
269
+ end
270
+ def self.get_prototypes_local()
271
+ service_port = Config.get("service.port")
272
+ return get_prototypes_for_host("localhost:#{service_port}")
273
+ end
274
+
275
+ def self.new_prototype(host_machine_ip, name, os_distribution)
276
+ require "toaster/api"
277
+ client = ToasterAppClient.new(host_machine_ip)
278
+ out = client.proto(name, os_distribution)
279
+ return out
280
+ end
281
+
282
+ def self.get_containers_for_host(host_machine_ip, include_prototypes=false)
283
+ out = ""
284
+ begin
285
+ # try connection using test service
286
+ puts "DEBUG: Trying to connect to test service at #{host_machine_ip}"
287
+ require "toaster/api"
288
+ client = ToasterAppClient.new(host_machine_ip)
289
+ out = client.lxc()
290
+ rescue => ex
291
+ # try connection using ssh
292
+ puts "Unable to obtain LXC information from remote host using test service: #{ex}"
293
+
294
+ cmd = 'sh -c \'cat #{LXC_ROOT_DIR}/*/config\''
295
+ cmd = "ssh -o BatchMode=yes #{host_machine_ip} \" lxc-ls -l; echo \\\"__--__ \\\"; #{cmd} \""
296
+ out = `#{cmd}`
297
+ if !out || out.strip == "" || out.match(/Permission denied/) ||
298
+ out.match(/No route/) || out.match(/connect/)
299
+ raise "Connection to host #{host_machine_ip} failed: #{out}"
300
+ end
301
+ end
302
+
303
+ out = out.strip
304
+ return get_containers_from_output(out, include_prototypes)
305
+ end
306
+
307
+ def self.is_prototype?(name)
308
+ return !get_prototype_name(name).nil?
309
+ end
310
+
311
+ def self.get_prototype_name(name)
312
+ name = "prototype_default" if name == "prototype"
313
+ return nil if !name.match(/^prototype_.*/)
314
+ return name.gsub(/^prototype_([a-zA-Z0-9_]+).*/, '\1')
315
+ end
316
+
317
+ private
318
+
319
+ def self.get_containers_from_output(out, include_prototypes=false)
320
+ result = {}
321
+
322
+ return result if !out
323
+
324
+ installed = []
325
+ active = []
326
+ lxc_out = out.split(/^__\-\-__/)[0]
327
+ config_out = out.split(/^__\-\-__/)[1]
328
+
329
+ return result if !out || !lxc_out || !config_out
330
+
331
+ # output of 'lxc-ls' looks like this (installed containers in the first block,
332
+ # active containers in the second block):
333
+ #
334
+ # total 28
335
+ # drwxr-xr-x 2 root root 4096 Aug 14 13:53 lxc1
336
+ # drwxr-xr-x 2 root root 4096 Aug 14 18:48 lxc2
337
+ # ...
338
+ # drwxr-xr-x 2 root root 0 Aug 14 13:53 lxc1
339
+ # drwxr-xr-x 2 root root 0 Aug 14 18:48 lxc2
340
+ # ...
341
+ lxc_out.split(/\n/).each do |line|
342
+ parts = line.strip.split(/\s+/)
343
+ if parts.size == 9 && line[0] == "d"
344
+ size = parts[4]
345
+ name = parts[8]
346
+ if name
347
+ if size == "0"
348
+ active << name
349
+ else
350
+ installed << name
351
+ end
352
+ end
353
+ end
354
+ end
355
+
356
+ ips = {}
357
+ config_out.gsub(/\n/, " ").split(/utsname\s*=\s*/).each do |cfg|
358
+ if cfg.strip != ""
359
+ name = cfg.gsub(/^([^\s]+)\s.*/, '\1')
360
+ ip = cfg.gsub(/.*network\.ipv4\s*=\s*([0-9\.]+).*/, '\1')
361
+ ips[name] = ip
362
+ if include_prototypes && get_prototype_name(name)
363
+ if !installed.include?(name)
364
+ installed << name
365
+ ips[name] = nil
366
+ end
367
+ end
368
+ end
369
+ end
370
+ installed.each do |lxc|
371
+ result[lxc] = {
372
+ "state" => active.include?(lxc) ? "running" : "suspended",
373
+ "ip" => ips[lxc]
374
+ }
375
+ end
376
+ return result
377
+ end
378
+
379
+ def initialize
380
+ end
381
+
382
+ end
383
+ end
@@ -0,0 +1,38 @@
1
+
2
+ #
3
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
4
+ #
5
+
6
+ module Toaster
7
+ class MemDump
8
+ def self.print_dump(pattern=".*")
9
+ Util.write("/tmp/foo.dump.out", "lala", true)
10
+ res = {}
11
+ count = 0
12
+ ObjectSpace.each_object do |obj|
13
+ cls = obj.class
14
+ res[cls] = res[cls] ? res[cls] + 1 : 1
15
+ count += 1
16
+ print "Counted #{count} objects" if (count % 100000 == 0)
17
+ end
18
+ array = []
19
+ res.each do |clazz,count|
20
+ name = clazz.name
21
+ if name.match(/#{pattern}/)
22
+ array << [clazz,count]
23
+ end
24
+ end
25
+ # sort by decreasing number of instances
26
+ array.sort! { |o1,o2| o2[1] <=> o1[1] }
27
+ array = array[0..50]
28
+ out = ""
29
+ array.each do |i|
30
+ tmp = "#{i[0]} \t- Class #{i[0]}"
31
+ out += tmp
32
+ puts tmp
33
+ end
34
+ Util.write("/tmp/foo.dump.out", out, true)
35
+ return array
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+
2
+ # Generic proxy implementation, based on:
3
+ # http://www.binarylogic.com/2009/08/07/how-to-create-a-proxy-class-in-ruby/
4
+
5
+ module Toaster
6
+ class Proxy
7
+
8
+ attr_accessor :target
9
+
10
+ def initialize(target)
11
+ @target = target
12
+ end
13
+
14
+ instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$|^target)/ }
15
+
16
+ protected
17
+
18
+ def method_missing(name, *args, &block)
19
+ @target.send(name, *args, &block)
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,131 @@
1
+
2
+
3
+ #
4
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
5
+ #
6
+
7
+ require 'toaster/util/config'
8
+
9
+ include Toaster
10
+
11
+ module Toaster
12
+
13
+ #
14
+ # Class that keeps track of timestamps, computes durations, etc.
15
+ # The implementation is *not* thread-safe.
16
+ #
17
+ class TimeStamp
18
+
19
+ @@timestamps = {}
20
+ @@output = true
21
+ @@listeners = []
22
+ @@mutex = Mutex.new
23
+
24
+ class << self;
25
+ attr_accessor :TIME_SERVICE_URL
26
+ end
27
+ @TIME_SERVICE_URL = ::Toaster::Config.get("testing.timeservice_url")
28
+
29
+ def self.add(time=nil, key="__default__")
30
+ previous = nil
31
+ @@mutex.synchronize do
32
+ time = TimeStamp.now() if !time
33
+ time = time.to_f
34
+ @@timestamps[key] = [] if !@@timestamps[key]
35
+ previous = @@timestamps[key].empty? ? nil : @@timestamps[key][-1]
36
+ @@timestamps[key] << time
37
+ #puts "INFO: Adding timestamp #{time} for key '#{key}'"
38
+ end
39
+ notify(key, time, previous)
40
+ end
41
+
42
+ #
43
+ # Returns the current time in seconds since the Epoch, with float precision.
44
+ #
45
+ # This method accesses a small "time service" on another host.
46
+ # The reason why we need this is that we have experienced some of
47
+ # the LXC containers (which get spawned on the testing host) actually
48
+ # change the host's system time..(!) So, if we are simply measuring
49
+ # the local system time on the test host, our time measurements
50
+ # result in bogus data.
51
+ #
52
+ def self.now(retries = 2)
53
+ (0..retries).each do |i|
54
+ out = `curl -s "#{TimeStamp.TIME_SERVICE_URL}" 2> /dev/null`
55
+ out = out.strip
56
+ if out.match(/^[0-9\.]+$/)
57
+ return out.to_i
58
+ else
59
+ sleep 0.5
60
+ # run next attempt in next iteration
61
+ end
62
+ end
63
+ # fallback, if the time service is unavailable...
64
+ puts "WARN: Time service not available (#{retries + 1} attempts), URL: '#{TimeStamp.TIME_SERVICE_URL}'"
65
+ return Time.new.to_f
66
+ end
67
+
68
+ def self.do_output(output)
69
+ @@output = output
70
+ end
71
+
72
+ def self.print(action="n/a", format=nil, key="__default__", &block)
73
+ format = "Duration for '%s': %d seconds (%.3f ms)\n" if !format
74
+ diff = 0
75
+ t1 = 0
76
+ t2 = 0
77
+ @@mutex.synchronize do
78
+ t1 = @@timestamps[key][-2]
79
+ t2 = @@timestamps[key][-1]
80
+ diff = t2 - t1
81
+ end
82
+ if @@output
83
+ do_print = true
84
+ if block
85
+ do_print = block.call(diff, t1, t2)
86
+ end
87
+ if do_print
88
+ printf(format, action, diff.to_f.round, diff)
89
+ end
90
+ end
91
+ end
92
+
93
+ def self.add_and_print(action="n/a", format=nil, key="__default__", &block)
94
+ add(nil, key)
95
+ print(action, format, key, &block)
96
+ end
97
+
98
+ def self.add_listener(l)
99
+ @@mutex.synchronize do
100
+ @@listeners << l
101
+ end
102
+ end
103
+
104
+ def self.clear_listeners()
105
+ @@mutex.synchronize do
106
+ @@listeners.clear()
107
+ end
108
+ end
109
+
110
+ def self.notify(key, stamp, previous_stamp)
111
+ keys_to_remove = Set.new
112
+ l_copy = []
113
+ @@mutex.synchronize do
114
+ l_copy = @@listeners.dup
115
+ end
116
+ l_copy.each do |l|
117
+ removes = l.notify(key, stamp, previous_stamp)
118
+ removes = Set.new if !removes || !removes.respond_to?("each")
119
+ removes.each do |r|
120
+ keys_to_remove << r
121
+ end
122
+ end
123
+ @@mutex.synchronize do
124
+ keys_to_remove.each do |k|
125
+ @@timestamps.delete(k)
126
+ end
127
+ end
128
+ end
129
+
130
+ end
131
+ end