naf 1.1.0

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 (295) hide show
  1. data/.gitignore +16 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +17 -0
  4. data/Gemfile +17 -0
  5. data/LICENSE +2 -0
  6. data/README.rdoc +22 -0
  7. data/RELEASE_NOTES.rdoc +18 -0
  8. data/Rakefile +43 -0
  9. data/app/assets/images/bg-grad.png +0 -0
  10. data/app/assets/images/clock.png +0 -0
  11. data/app/assets/images/control_play_blue.png +0 -0
  12. data/app/assets/images/down_arrow.gif +0 -0
  13. data/app/assets/images/papertrail_job.png +0 -0
  14. data/app/assets/images/papertrail_machine.png +0 -0
  15. data/app/assets/images/papertrail_machine_runner.png +0 -0
  16. data/app/assets/images/terminate.png +0 -0
  17. data/app/assets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  18. data/app/assets/images/ui-bg_flat_0_ffffff_40x100.png +0 -0
  19. data/app/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  20. data/app/assets/images/ui-bg_glass_0_f4f4f4_1x400.png +0 -0
  21. data/app/assets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  22. data/app/assets/images/ui-bg_glass_65_f4f4f4_1x400.png +0 -0
  23. data/app/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  24. data/app/assets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  25. data/app/assets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  26. data/app/assets/images/ui-bg_glass_75_f4f4f4_1x400.png +0 -0
  27. data/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  28. data/app/assets/images/ui-bg_highlight-soft_0_f4f4f4_1x100.png +0 -0
  29. data/app/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  30. data/app/assets/images/ui-icons_222222_256x240.png +0 -0
  31. data/app/assets/images/ui-icons_2e83ff_256x240.png +0 -0
  32. data/app/assets/images/ui-icons_454545_256x240.png +0 -0
  33. data/app/assets/images/ui-icons_888888_256x240.png +0 -0
  34. data/app/assets/images/ui-icons_cd0a0a_256x240.png +0 -0
  35. data/app/assets/images/up_arrow.gif +0 -0
  36. data/app/assets/javascripts/dataTablesTemplates/applications.js +94 -0
  37. data/app/assets/javascripts/dataTablesTemplates/jobs.js +163 -0
  38. data/app/assets/javascripts/dataTablesTemplates/machine_runner_invocations.js +60 -0
  39. data/app/assets/javascripts/dataTablesTemplates/machine_runners.js +82 -0
  40. data/app/assets/javascripts/dataTablesTemplates/machines.js +93 -0
  41. data/app/assets/javascripts/date.js +104 -0
  42. data/app/assets/javascripts/iso8601.js +41 -0
  43. data/app/assets/javascripts/jquery.dataTables.custom.js +62 -0
  44. data/app/assets/javascripts/jquery.dataTables.js +6862 -0
  45. data/app/assets/javascripts/naf.js +30 -0
  46. data/app/assets/javascripts/underscore.js +713 -0
  47. data/app/assets/stylesheets/jquery_ui/jquery-ui-1.8.5.custom.css.erb +572 -0
  48. data/app/assets/stylesheets/min_naf.css +14 -0
  49. data/app/assets/stylesheets/min_naf/layout.css.scss +355 -0
  50. data/app/assets/stylesheets/naf.css +14 -0
  51. data/app/assets/stylesheets/naf/layout.css.scss +497 -0
  52. data/app/controllers/naf/affinities_controller.rb +61 -0
  53. data/app/controllers/naf/application_controller.rb +43 -0
  54. data/app/controllers/naf/application_schedule_affinity_tabs_controller.rb +75 -0
  55. data/app/controllers/naf/applications_controller.rb +153 -0
  56. data/app/controllers/naf/historical_job_affinity_tabs_controller.rb +65 -0
  57. data/app/controllers/naf/historical_jobs_controller.rb +159 -0
  58. data/app/controllers/naf/janitorial_assignments_controller.rb +77 -0
  59. data/app/controllers/naf/logger_names_controller.rb +58 -0
  60. data/app/controllers/naf/logger_styles_controller.rb +59 -0
  61. data/app/controllers/naf/machine_affinity_slots_controller.rb +69 -0
  62. data/app/controllers/naf/machine_runner_invocations_controller.rb +59 -0
  63. data/app/controllers/naf/machine_runners_controller.rb +26 -0
  64. data/app/controllers/naf/machines_controller.rb +95 -0
  65. data/app/helpers/naf/application_helper.rb +275 -0
  66. data/app/models/log4r/papertrail_outputter.rb +19 -0
  67. data/app/models/logical/naf/application.rb +183 -0
  68. data/app/models/logical/naf/construction_zone/ad_hoc_work_order.rb +22 -0
  69. data/app/models/logical/naf/construction_zone/application_schedule_work_order.rb +15 -0
  70. data/app/models/logical/naf/construction_zone/application_work_order.rb +25 -0
  71. data/app/models/logical/naf/construction_zone/boss.rb +123 -0
  72. data/app/models/logical/naf/construction_zone/foreman.rb +53 -0
  73. data/app/models/logical/naf/construction_zone/proletariat.rb +40 -0
  74. data/app/models/logical/naf/construction_zone/work_order.rb +100 -0
  75. data/app/models/logical/naf/create_infrastructure.rb +48 -0
  76. data/app/models/logical/naf/job.rb +357 -0
  77. data/app/models/logical/naf/job_creator.rb +155 -0
  78. data/app/models/logical/naf/job_fetcher.rb +167 -0
  79. data/app/models/logical/naf/job_statuses/errored.rb +27 -0
  80. data/app/models/logical/naf/job_statuses/finished.rb +26 -0
  81. data/app/models/logical/naf/job_statuses/finished_less_minute.rb +25 -0
  82. data/app/models/logical/naf/job_statuses/queued.rb +32 -0
  83. data/app/models/logical/naf/job_statuses/running.rb +34 -0
  84. data/app/models/logical/naf/job_statuses/terminated.rb +25 -0
  85. data/app/models/logical/naf/job_statuses/waiting.rb +43 -0
  86. data/app/models/logical/naf/machine.rb +85 -0
  87. data/app/models/logical/naf/machine_runner.rb +46 -0
  88. data/app/models/logical/naf/machine_runner_invocation.rb +50 -0
  89. data/app/models/logical/naf/pickler.rb +74 -0
  90. data/app/models/logical/naf/unpickler.rb +98 -0
  91. data/app/models/naf/affinity.rb +145 -0
  92. data/app/models/naf/affinity_classification.rb +44 -0
  93. data/app/models/naf/application.rb +100 -0
  94. data/app/models/naf/application_run_group_restriction.rb +39 -0
  95. data/app/models/naf/application_schedule.rb +181 -0
  96. data/app/models/naf/application_schedule_affinity_tab.rb +86 -0
  97. data/app/models/naf/application_schedule_prerequisite.rb +50 -0
  98. data/app/models/naf/application_type.rb +72 -0
  99. data/app/models/naf/by_historical_job_id.rb +86 -0
  100. data/app/models/naf/historical_job.rb +334 -0
  101. data/app/models/naf/historical_job_affinity_tab.rb +61 -0
  102. data/app/models/naf/historical_job_prerequisite.rb +19 -0
  103. data/app/models/naf/janitorial_archive_assignment.rb +36 -0
  104. data/app/models/naf/janitorial_assignment.rb +37 -0
  105. data/app/models/naf/janitorial_create_assignment.rb +36 -0
  106. data/app/models/naf/janitorial_drop_assignment.rb +36 -0
  107. data/app/models/naf/logger_level.rb +21 -0
  108. data/app/models/naf/logger_name.rb +23 -0
  109. data/app/models/naf/logger_style.rb +58 -0
  110. data/app/models/naf/logger_style_name.rb +28 -0
  111. data/app/models/naf/machine.rb +257 -0
  112. data/app/models/naf/machine_affinity_slot.rb +78 -0
  113. data/app/models/naf/machine_runner.rb +51 -0
  114. data/app/models/naf/machine_runner_invocation.rb +71 -0
  115. data/app/models/naf/naf_base.rb +9 -0
  116. data/app/models/naf/queued_job.rb +164 -0
  117. data/app/models/naf/running_job.rb +80 -0
  118. data/app/models/process/naf/application.rb +164 -0
  119. data/app/models/process/naf/janitor.rb +117 -0
  120. data/app/models/process/naf/machine_manager.rb +150 -0
  121. data/app/models/process/naf/machine_upgrader.rb +112 -0
  122. data/app/models/process/naf/runner.rb +539 -0
  123. data/app/views/naf/affinities/_form.html.erb +50 -0
  124. data/app/views/naf/affinities/edit.html.erb +11 -0
  125. data/app/views/naf/affinities/index.html.erb +57 -0
  126. data/app/views/naf/affinities/new.html.erb +15 -0
  127. data/app/views/naf/affinities/show.html.erb +48 -0
  128. data/app/views/naf/application_schedule_affinity_tabs/_form.html.erb +31 -0
  129. data/app/views/naf/application_schedule_affinity_tabs/edit.html.erb +12 -0
  130. data/app/views/naf/application_schedule_affinity_tabs/new.html.erb +11 -0
  131. data/app/views/naf/applications/_application_schedule.html.erb +80 -0
  132. data/app/views/naf/applications/_application_schedule_prerequisites.html.erb +14 -0
  133. data/app/views/naf/applications/_form.html.erb +109 -0
  134. data/app/views/naf/applications/_search_container.html.erb +94 -0
  135. data/app/views/naf/applications/_show.html.erb +34 -0
  136. data/app/views/naf/applications/edit.html.erb +11 -0
  137. data/app/views/naf/applications/index.html.erb +51 -0
  138. data/app/views/naf/applications/index.json.erb +11 -0
  139. data/app/views/naf/applications/new.html.erb +11 -0
  140. data/app/views/naf/applications/show.html.erb +203 -0
  141. data/app/views/naf/datatable.html.erb +49 -0
  142. data/app/views/naf/historical_job_affinity_tabs/_form.html.erb +36 -0
  143. data/app/views/naf/historical_job_affinity_tabs/edit.html.erb +11 -0
  144. data/app/views/naf/historical_job_affinity_tabs/new.html.erb +11 -0
  145. data/app/views/naf/historical_jobs/_form.html.erb +94 -0
  146. data/app/views/naf/historical_jobs/_runners.html.erb +22 -0
  147. data/app/views/naf/historical_jobs/_search_container.html.erb +140 -0
  148. data/app/views/naf/historical_jobs/edit.html.erb +11 -0
  149. data/app/views/naf/historical_jobs/index.html.erb +48 -0
  150. data/app/views/naf/historical_jobs/index.json.erb +26 -0
  151. data/app/views/naf/historical_jobs/new.html.erb +61 -0
  152. data/app/views/naf/historical_jobs/show.html.erb +201 -0
  153. data/app/views/naf/janitorial_assignments/_form.html.erb +38 -0
  154. data/app/views/naf/janitorial_assignments/_rows.html.erb +17 -0
  155. data/app/views/naf/janitorial_assignments/edit.html.erb +11 -0
  156. data/app/views/naf/janitorial_assignments/index.html.erb +56 -0
  157. data/app/views/naf/janitorial_assignments/index.js.erb +1 -0
  158. data/app/views/naf/janitorial_assignments/new.html.erb +11 -0
  159. data/app/views/naf/layouts/jquery_datatables.json.erb +6 -0
  160. data/app/views/naf/logger_names/_form.html.erb +18 -0
  161. data/app/views/naf/logger_names/edit.html.erb +11 -0
  162. data/app/views/naf/logger_names/new.html.erb +11 -0
  163. data/app/views/naf/logger_names/show.html.erb +44 -0
  164. data/app/views/naf/logger_styles/_form.html.erb +30 -0
  165. data/app/views/naf/logger_styles/_logger_style_names.html.erb +19 -0
  166. data/app/views/naf/logger_styles/edit.html.erb +11 -0
  167. data/app/views/naf/logger_styles/new.html.erb +11 -0
  168. data/app/views/naf/logger_styles/show.html.erb +48 -0
  169. data/app/views/naf/machine_affinity_slots/_form.html.erb +36 -0
  170. data/app/views/naf/machine_affinity_slots/edit.html.erb +11 -0
  171. data/app/views/naf/machine_affinity_slots/new.html.erb +11 -0
  172. data/app/views/naf/machine_runner_invocations/_filter.html.erb +21 -0
  173. data/app/views/naf/machine_runner_invocations/index.html.erb +36 -0
  174. data/app/views/naf/machine_runner_invocations/index.json.erb +16 -0
  175. data/app/views/naf/machine_runner_invocations/show.html.erb +91 -0
  176. data/app/views/naf/machine_runners/index.html.erb +82 -0
  177. data/app/views/naf/machine_runners/index.json.erb +16 -0
  178. data/app/views/naf/machine_runners/show.html.erb +113 -0
  179. data/app/views/naf/machines/_filter.html.erb +26 -0
  180. data/app/views/naf/machines/_form.html.erb +62 -0
  181. data/app/views/naf/machines/_show.html.erb +169 -0
  182. data/app/views/naf/machines/edit.html.erb +11 -0
  183. data/app/views/naf/machines/index.html.erb +51 -0
  184. data/app/views/naf/machines/index.json.erb +23 -0
  185. data/app/views/naf/machines/new.html.erb +11 -0
  186. data/app/views/naf/machines/show.html.erb +92 -0
  187. data/app/views/naf/record.html.erb +46 -0
  188. data/app/views/naf/shared/_application.html.erb +50 -0
  189. data/app/views/naf/shared/_information_container.html.erb +19 -0
  190. data/app/views/naf/shared/_select_per_page.html.erb +72 -0
  191. data/ci/test-build.sh +17 -0
  192. data/ci/travis.sh +26 -0
  193. data/config/initializers/naf.rb +3 -0
  194. data/config/routes.rb +38 -0
  195. data/db/migrate/20120820023848_naf_schema.rb +413 -0
  196. data/doc/README_FOR_APP +2 -0
  197. data/lib/generators/naf_generator.rb +45 -0
  198. data/lib/generators/templates/config/logging/af.yml +26 -0
  199. data/lib/generators/templates/config/logging/naf.yml +22 -0
  200. data/lib/generators/templates/config/logging/nafjob.yml +16 -0
  201. data/lib/generators/templates/config/logging/nafrunner.yml +17 -0
  202. data/lib/generators/templates/naf.rb +11 -0
  203. data/lib/generators/templates/naf_layout.html.erb +15 -0
  204. data/lib/naf.rb +48 -0
  205. data/lib/naf/configuration.rb +23 -0
  206. data/lib/naf/engine.rb +18 -0
  207. data/lib/naf/version.rb +3 -0
  208. data/lib/tasks/naf_tasks.rake +370 -0
  209. data/naf.gemspec +30 -0
  210. data/script/rails +10 -0
  211. data/spec/controllers/naf/affinities_controller_spec.rb +79 -0
  212. data/spec/controllers/naf/application_controller_spec.rb +10 -0
  213. data/spec/controllers/naf/application_schedule_affinity_tabs_controller_spec.rb +106 -0
  214. data/spec/controllers/naf/applications_controller_spec.rb +109 -0
  215. data/spec/controllers/naf/historical_job_affinity_tabs_controller_spec.rb +96 -0
  216. data/spec/controllers/naf/historical_jobs_controller_spec.rb +19 -0
  217. data/spec/controllers/naf/machine_affinity_slots_controller_spec.rb +109 -0
  218. data/spec/controllers/naf/machines_controller_spec.rb +74 -0
  219. data/spec/dummy/.gitignore +12 -0
  220. data/spec/dummy/README +19 -0
  221. data/spec/dummy/Rakefile +7 -0
  222. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  223. data/spec/dummy/app/assets/stylesheets/application.css +14 -0
  224. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  225. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  226. data/spec/dummy/app/models/my_script.rb +8 -0
  227. data/spec/dummy/app/models/other/base.rb.sample +10 -0
  228. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  229. data/spec/dummy/app/views/layouts/naf_layout.html.erb +15 -0
  230. data/spec/dummy/config.ru +4 -0
  231. data/spec/dummy/config/application.rb +62 -0
  232. data/spec/dummy/config/boot.rb +10 -0
  233. data/spec/dummy/config/database-non_primary.yml +20 -0
  234. data/spec/dummy/config/database-primary.yml +16 -0
  235. data/spec/dummy/config/environment.rb +5 -0
  236. data/spec/dummy/config/environments/development.rb +37 -0
  237. data/spec/dummy/config/environments/production.rb +67 -0
  238. data/spec/dummy/config/environments/test.rb +37 -0
  239. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  240. data/spec/dummy/config/initializers/inflections.rb +15 -0
  241. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  242. data/spec/dummy/config/initializers/naf.rb.non_primary +4 -0
  243. data/spec/dummy/config/initializers/naf.rb.primary +3 -0
  244. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  245. data/spec/dummy/config/initializers/session_store.rb +8 -0
  246. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  247. data/spec/dummy/config/locales/en.yml +5 -0
  248. data/spec/dummy/config/logging/af.yml +26 -0
  249. data/spec/dummy/config/logging/naf.yml +22 -0
  250. data/spec/dummy/config/logging/nafjob.yml +16 -0
  251. data/spec/dummy/config/logging/nafrunner.yml +17 -0
  252. data/spec/dummy/config/routes.rb +5 -0
  253. data/spec/dummy/db/.gitignore +2 -0
  254. data/spec/dummy/lib/tasks/dummy.rake +60 -0
  255. data/spec/dummy/public/404.html +26 -0
  256. data/spec/dummy/public/422.html +26 -0
  257. data/spec/dummy/public/500.html +25 -0
  258. data/spec/dummy/public/favicon.ico +0 -0
  259. data/spec/dummy/script/rails +6 -0
  260. data/spec/factories/naf.rb +433 -0
  261. data/spec/helpers/naf/application_helper_spec.rb +0 -0
  262. data/spec/models/logical/naf/application_spec.rb +69 -0
  263. data/spec/models/logical/naf/job_creator_spec.rb +32 -0
  264. data/spec/models/logical/naf/job_fetcher_spec.rb +140 -0
  265. data/spec/models/logical/naf/job_spec.rb +282 -0
  266. data/spec/models/logical/naf/machine_spec.rb +61 -0
  267. data/spec/models/naf/affinity_classification_spec.rb +56 -0
  268. data/spec/models/naf/affinity_spec.rb +100 -0
  269. data/spec/models/naf/application_run_group_restriction_spec.rb +57 -0
  270. data/spec/models/naf/application_schedule_affinity_tab_spec.rb +85 -0
  271. data/spec/models/naf/application_schedule_prerequisite_spec.rb +35 -0
  272. data/spec/models/naf/application_schedule_spec.rb +166 -0
  273. data/spec/models/naf/application_spec.rb +128 -0
  274. data/spec/models/naf/application_type_spec.rb +104 -0
  275. data/spec/models/naf/historical_job_affinity_tab_spec.rb +59 -0
  276. data/spec/models/naf/historical_job_prerequisite_spec.rb +25 -0
  277. data/spec/models/naf/historical_job_spec.rb +334 -0
  278. data/spec/models/naf/logger_level_spec.rb +34 -0
  279. data/spec/models/naf/logger_name_spec.rb +35 -0
  280. data/spec/models/naf/logger_style_name_spec.rb +39 -0
  281. data/spec/models/naf/logger_style_spec.rb +89 -0
  282. data/spec/models/naf/machine_affinity_slot_spec.rb +77 -0
  283. data/spec/models/naf/machine_runner_invocation_spec.rb +38 -0
  284. data/spec/models/naf/machine_runner_spec.rb +37 -0
  285. data/spec/models/naf/machine_spec.rb +425 -0
  286. data/spec/models/naf/naf_base_spec.rb +14 -0
  287. data/spec/models/naf/queued_job_spec.rb +171 -0
  288. data/spec/models/naf/running_job_spec.rb +107 -0
  289. data/spec/models/process/naf/application_spec.rb +8 -0
  290. data/spec/models/process/naf/janitor_spec.rb +10 -0
  291. data/spec/models/process/naf/runner_spec.rb +10 -0
  292. data/spec/spec_helper.rb +32 -0
  293. data/spec/support/engine_routing.rb +27 -0
  294. data/spec/support/script_spec_helper.rb +58 -0
  295. metadata +590 -0
@@ -0,0 +1,275 @@
1
+ module Naf
2
+
3
+ ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
4
+ errors = Array(instance.error_message).join('; ')
5
+ if html_tag =~ /^<label for=/
6
+ %(<span class="validation-error">#{html_tag}</span>).html_safe
7
+ else
8
+ %(#{html_tag}<span class="validation-error">&nbsp;#{errors}</span>).html_safe
9
+ end
10
+ end
11
+
12
+ module ApplicationHelper
13
+ include ActionView::Helpers::TextHelper
14
+
15
+ NAF_DESTROY_BLOCKED_RESOURCES = ["historical_jobs",
16
+ "applications",
17
+ "machines",
18
+ "historical_job_affinity_tabs",
19
+ "janitorial_assignments"]
20
+ NAF_READ_ONLY_RESOURCES = []
21
+ NAF_CREATE_BLOCKED_RESOURCES = []
22
+ NAF_ALL_VISIBLE_RESOURCES = {
23
+ "historical_jobs" => "",
24
+ "applications" => "",
25
+ "machines" => "",
26
+ "runners" => ["machine_runners",
27
+ "machine_runner_invocations"],
28
+ "affinities" => "",
29
+ "loggers" => ["logger_styles", "logger_names"],
30
+ "janitorial_assignments" => ["janitorial_archive_assignments",
31
+ "janitorial_create_assignments",
32
+ "janitorial_drop_assignments"]
33
+ }
34
+
35
+ def naf_tabs
36
+ NAF_ALL_VISIBLE_RESOURCES
37
+ end
38
+
39
+ def naf_last_queued_at_link(app)
40
+ if historical_job = app.last_queued_job
41
+ link_to "#{time_ago_in_words(historical_job.created_at, true)} ago, #{historical_job.created_at.localtime.strftime("%Y-%m-%d %r")}",
42
+ naf.historical_job_path(historical_job)
43
+ else
44
+ ""
45
+ end
46
+ end
47
+
48
+ def naf_highlight_tab?(tab)
49
+ case tab
50
+ when "machines"
51
+ [tab, "machine_affinity_slots"].include?(controller_name)
52
+ when "runners"
53
+ ["machine_runners", "machine_runner_invocations"].include?(controller_name)
54
+ when "historical_jobs"
55
+ [tab, "historical_job_affinity_tabs"].include?(controller_name)
56
+ when "applications"
57
+ [tab, "application_schedule_affinity_tabs"].include?(controller_name)
58
+ when "loggers"
59
+ ["logger_styles", "logger_names"].include?(controller_name)
60
+ when "janitorial_assignments"
61
+ ["Naf::JanitorialArchiveAssignment",
62
+ "Naf::JanitorialCreateAssignment",
63
+ "Naf::JanitorialDropAssignment"].include?(params[:type])
64
+ when "janitorial_archive_assignments"
65
+ "Naf::JanitorialArchiveAssignment" == params[:type]
66
+ when "janitorial_create_assignments"
67
+ "Naf::JanitorialCreateAssignment" == params[:type]
68
+ when "janitorial_drop_assignments"
69
+ "Naf::JanitorialDropAssignment" == params[:type]
70
+ else
71
+ tab == controller_name
72
+ end
73
+ end
74
+
75
+ def naf_parent_resource_link
76
+ case controller_name
77
+ when "historical_job_affinity_tabs"
78
+ link_to "Back to Historical Job",
79
+ controller: 'historical_jobs',
80
+ action: 'show',
81
+ id: params[:historical_job_id]
82
+ when "application_schedule_affinity_tabs"
83
+ link_to "Back to Application",
84
+ controller: 'applications',
85
+ action: 'show',
86
+ id: params[:application_id]
87
+ when "machine_affinity_slots"
88
+ link_to "Back to Machine",
89
+ controller: 'machines',
90
+ action: 'show',
91
+ id: params[:machine_id]
92
+ else
93
+ ""
94
+ end
95
+ end
96
+
97
+ def naf_nested_resource_index?
98
+ ["historical_job_affinity_tabs",
99
+ "application_schedule_affinity_tabs",
100
+ "machine_affinity_slots"].include?(controller_name) and !params[:id]
101
+ end
102
+
103
+ def naf_table_title
104
+ if current_page?(naf.janitorial_archive_assignments_path)
105
+ "Janitorial Archive Assignment"
106
+ elsif current_page?(naf.janitorial_create_assignments_path)
107
+ "Janitorial Create Assignment"
108
+ elsif current_page?(naf.janitorial_drop_assignments_path)
109
+ "Janitorial Drop Assignment"
110
+ elsif current_page?(main_app.naf_path)
111
+ "Jobs"
112
+ else
113
+ case controller_name
114
+ when "application_schedule_affinity_tabs"
115
+ Application.find(params[:application_id]).title + ", Affinity Tabs"
116
+ when "machine_affinity_slots"
117
+ machine = Machine.find(params[:machine_id])
118
+ name = machine.server_name
119
+ ((name and name.length > 0) ? name : machine.server_address) + ", Affinity Slots"
120
+ else
121
+ naf_make_header(controller_name)
122
+ end
123
+ end
124
+ end
125
+
126
+ def naf_generate_child_resources_link
127
+ case controller_name
128
+ when "historical_jobs"
129
+ link_to "Historical Job Affinity Tabs",
130
+ controller: 'historical_job_affinity_tabs',
131
+ action: 'index',
132
+ historical_job_id: params[:id]
133
+ when "applications"
134
+ if @record.application_schedule
135
+ link_to "Application Schedule Affinity Tabs",
136
+ controller: 'application_schedule_affinity_tabs',
137
+ action: 'index',
138
+ application_schedule_id: @record.application_schedule.id,
139
+ application_id: @record.id
140
+ else
141
+ ""
142
+ end
143
+ when "machines"
144
+ link_to "Machine Affinity Slots",
145
+ controller: 'machine_affinity_slots',
146
+ action: 'index',
147
+ machine_id: params[:id]
148
+ else
149
+ ""
150
+ end
151
+ end
152
+
153
+ def naf_generate_index_link(name)
154
+ case name
155
+ when "historical_jobs"
156
+ link_to "Jobs", main_app.naf_path
157
+ when "loggers"
158
+ link_to "Loggers", naf.logger_styles_path
159
+ when "runners"
160
+ link_to "Runners", naf.machine_runners_path
161
+ when "janitorial_assignments"
162
+ link_to "Janitorial Assignments", naf.janitorial_archive_assignments_path
163
+ when "janitorial_archive_assignments"
164
+ link_to "Janitorial Archive Assignments", naf.janitorial_archive_assignments_path
165
+ when "janitorial_create_assignments"
166
+ link_to "Janitorial Create Assignments", naf.janitorial_create_assignments_path
167
+ when "janitorial_drop_assignments"
168
+ link_to "Janitorial Drop Assignments", naf.janitorial_drop_assignments_path
169
+ else
170
+ link_to name.split('_').map(&:capitalize).join(' '), { controller: name, action: 'index'}
171
+ end
172
+ end
173
+
174
+ def naf_generate_create_link
175
+ return "" if NAF_READ_ONLY_RESOURCES.include?(controller_name) or NAF_CREATE_BLOCKED_RESOURCES.include?(controller_name)
176
+ return link_to "Add a Job", naf.new_historical_job_path, { class: 'add_job' } if naf_display_job_search_link?
177
+ link_to "Create new #{naf_model_name}", { controller: controller_name, action: 'new' }
178
+ end
179
+
180
+ def naf_display_job_search_link?
181
+ current_page?(naf.root_url) or current_page?(controller: 'historical_jobs', action: 'index')
182
+ end
183
+
184
+ def naf_model_name
185
+ name_pieces = controller_name.split('_')
186
+ name_pieces[name_pieces.size - 1] = name_pieces.last.singularize
187
+ name_pieces.map(&:capitalize).join(' ')
188
+ end
189
+
190
+ def naf_make_header(attribute)
191
+ attribute.to_s.split('_').map(&:capitalize).join(' ')
192
+ end
193
+
194
+ def naf_generate_edit_link
195
+ return "" if NAF_READ_ONLY_RESOURCES.include?(controller_name)
196
+ link_to "Edit", { controller: controller_name, action: 'edit', id: params[:id] }, class: 'edit'
197
+ end
198
+
199
+ def naf_generate_back_link
200
+ link_to "Back to #{naf_make_header(controller_name)}", { controller: controller_name, action: 'index' }, class: 'back'
201
+ end
202
+
203
+ def naf_generate_destroy_link
204
+ return "" if NAF_READ_ONLY_RESOURCES.include?(controller_name) or NAF_DESTROY_BLOCKED_RESOURCES.include?(controller_name)
205
+ case controller_name
206
+ when "application_schedule_affinity_tabs"
207
+ link_to "Destroy", application_application_schedule_application_schedule_affinity_tab_url(@application, @application_schedule, @record),
208
+ { confirm: "Are you sure you want to destroy this #{naf_model_name}?",
209
+ method: :delete,
210
+ class: 'destroy' }
211
+ when "machine_affinity_slots"
212
+ link_to "Destroy", machine_machine_affinity_slot_url(@machine, @record),
213
+ { confirm: "Are you sure you want to destroy this #{naf_model_name}?",
214
+ method: :delete,
215
+ class: 'destroy' }
216
+ else
217
+ link_to "Destroy", @record,
218
+ { confirm: "Are you sure you want to destroy this #{naf_model_name}?",
219
+ method: :delete,
220
+ class: 'destroy' }
221
+ end
222
+ end
223
+
224
+ def include_actions_in_table?
225
+ current_page?(naf.root_url) or
226
+ current_page?(controller: 'applications', action: 'index') or
227
+ current_page?(controller: 'historical_jobs', action: 'index')
228
+ end
229
+
230
+ def naf_papertrail_link(record, runner = false)
231
+ if group_id = Naf.papertrail_group_id
232
+ url = "http://www.papertrailapp.com/groups/#{group_id}/events"
233
+ if record.kind_of?(::Naf::HistoricalJob) || record.kind_of?(::Logical::Naf::Job)
234
+ if record.pid.present?
235
+ query = "jid(#{record.id})"
236
+ url << "?q=#{CGI.escape(query)}"
237
+ end
238
+ elsif record.kind_of?(::Naf::Machine) || record.kind_of?(::Logical::Naf::Machine)
239
+ query = record.server_name
240
+ unless query.nil?
241
+ query << " runner" if runner
242
+ url << "?q=#{CGI.escape(query)}"
243
+ end
244
+ end
245
+ else
246
+ url = "http://www.papertrailapp.com/dashboard"
247
+ end
248
+
249
+ return url
250
+ end
251
+
252
+ def naf_link_to_remove_fields(name, f)
253
+ f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
254
+ end
255
+
256
+ def naf_link_to_add_fields(name, f, association)
257
+ new_object = f.object.class.reflect_on_association(association).klass.new
258
+ fields = f.fields_for(association, new_object, child_index: "new_#{association}") do |builder|
259
+ render(association.to_s, f: builder)
260
+ end
261
+ link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")", id: 'add_prerequisite')
262
+ end
263
+
264
+ def add_color(status)
265
+ if status == 'Running'
266
+ 'running'
267
+ elsif status == 'Queued' || status == 'Waiting'
268
+ 'queued'
269
+ elsif status =~ /Terminat/ || status == 'Error' || status == 'Failed to Start'
270
+ 'dead'
271
+ end
272
+ end
273
+
274
+ end
275
+ end
@@ -0,0 +1,19 @@
1
+ require 'log4r/formatter/patternformatter'
2
+
3
+ module Log4r
4
+ class PapertrailOutputter < RemoteSyslogOutputter
5
+ def initialize(name, options)
6
+ cloned_options = options.clone
7
+ unless cloned_options.has_key?('url')
8
+ if cloned_options.has_key?('port')
9
+ cloned_options['url'] = "syslog://logs.papertrailapp.com:#{cloned_options['port']}"
10
+ end
11
+ end
12
+ if cloned_options.has_key?('program')
13
+ program_formatter = Log4r::PatternFormatter.new('pattern' => cloned_options['program'])
14
+ cloned_options['program'] = program_formatter.format("").chomp
15
+ end
16
+ super(name, cloned_options)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,183 @@
1
+ module Logical
2
+ module Naf
3
+ class Application
4
+
5
+ attr_reader :app
6
+
7
+ include ActionView::Helpers::TextHelper
8
+
9
+ COLUMNS = [:id,
10
+ :title,
11
+ :short_name,
12
+ :script_type_name,
13
+ :application_run_group_name,
14
+ :application_run_group_restriction_name,
15
+ :application_run_group_limit,
16
+ :enabled,
17
+ :enqueue_backlogs,
18
+ :run_time,
19
+ :affinities,
20
+ :prerequisites,
21
+ :deleted,
22
+ :visible]
23
+
24
+ FILTER_FIELDS = [:deleted,
25
+ :enabled,
26
+ :visible]
27
+
28
+ SEARCH_FIELDS = [:title,
29
+ :application_run_group_name,
30
+ :command,
31
+ :short_name]
32
+
33
+ def initialize(naf_app)
34
+ @app = naf_app
35
+ end
36
+
37
+ def self.search(search)
38
+ application_scope = ::Naf::Application.
39
+ joins("LEFT JOIN #{::Naf.schema_name}.application_schedules ON #{::Naf.schema_name}.application_schedules.application_id = #{::Naf.schema_name}.applications.id").
40
+ order("id desc")
41
+
42
+ FILTER_FIELDS.each do |field|
43
+ if search.present? and search[field].present?
44
+ application_scope =
45
+ if field == :enabled || field == :visible
46
+ application_scope.where(application_schedules: { field => search[field] })
47
+ else
48
+ application_scope.where(field => search[field])
49
+ end
50
+ end
51
+ end
52
+
53
+ SEARCH_FIELDS.each do |field|
54
+ if search.present? and search[field].present?
55
+ application_scope =
56
+ if field == :application_run_group_name
57
+ application_scope.where(["lower(#{::Naf.schema_name}.application_schedules.application_run_group_name) ~ ?", search[field].downcase])
58
+ else
59
+ application_scope.where(["lower(#{field}) ~ ?", search[field].downcase])
60
+ end
61
+ end
62
+ end
63
+
64
+ application_scope.map{ |physical_app| new(physical_app) }
65
+ end
66
+
67
+ def to_hash
68
+ Hash[ COLUMNS.map{ |m| [m, send(m)] } ]
69
+ end
70
+
71
+ def command
72
+ @app.command
73
+ end
74
+
75
+ def run_start_minute
76
+ output = ""
77
+ if schedule = @app.application_schedule and schedule.run_start_minute.present?
78
+ minutes = schedule.run_start_minute % 60
79
+ hours = schedule.run_start_minute / 60
80
+ output << hours.to_s + ":"
81
+ output << "%02d" % minutes
82
+ output = Time.parse(output).strftime("%I:%M %p")
83
+ end
84
+
85
+ return output
86
+ end
87
+
88
+ def run_time
89
+ run_time = run_start_minute.blank? ? run_interval : run_start_minute
90
+ run_time = "not scheduled" if run_time.blank?
91
+
92
+ run_time
93
+ end
94
+
95
+ def run_interval
96
+ output = ""
97
+ if schedule = @app.application_schedule and schedule.run_interval.present?
98
+ time = schedule.run_interval
99
+ output =
100
+ if time == 0
101
+ "run constantly"
102
+ elsif time < 60
103
+ pluralize(time, "minute")
104
+ elsif time % 60 == 0
105
+ pluralize(time / 60, "hour")
106
+ else
107
+ pluralize(time / 60, "hour") + ', ' + pluralize(time % 60, "minute")
108
+ end
109
+ end
110
+
111
+ output
112
+ end
113
+
114
+ def prerequisites
115
+ if schedule = @app.application_schedule and schedule.application_schedule_prerequisites.present?
116
+ schedule.prerequisites.map do |schedule_prerequisite|
117
+ schedule_prerequisite.application.short_name_if_it_exist
118
+ end.join(", \n")
119
+ end
120
+ end
121
+
122
+ def application_run_group_name
123
+ if schedule = @app.application_schedule
124
+ if schedule.application_run_group_name.blank?
125
+ "not set"
126
+ else
127
+ schedule.application_run_group_name
128
+ end
129
+ end
130
+ end
131
+
132
+ def method_missing(method_name, *arguments, &block)
133
+ case method_name
134
+ when :application_run_group_restriction_name,
135
+ :application_run_group_name,
136
+ :run_start_minute,
137
+ :priority,
138
+ :application_run_group_limit,
139
+ :visible,
140
+ :enabled
141
+ if schedule = @app.application_schedule
142
+ schedule.send(method_name, *arguments, &block)
143
+ else
144
+ nil
145
+ end
146
+ else
147
+ if @app.respond_to?(method_name)
148
+ @app.send(method_name, *arguments, &block)
149
+ else
150
+ super
151
+ end
152
+ end
153
+ end
154
+
155
+ def enqueue_backlogs
156
+ application_schedule.try(:enqueue_backlogs)
157
+ end
158
+
159
+ def affinities
160
+ affinity_tab_records = @app.application_schedule.try(:application_schedule_affinity_tabs)
161
+ return "" if affinity_tab_records.nil?
162
+
163
+ affinity_tabs = ""
164
+ affinity_tab_records.each do |tab|
165
+ if tab.affinity.affinity_short_name.present?
166
+ affinity_tabs << tab.affinity.affinity_short_name
167
+ else
168
+ affinity_tabs << tab.affinity.affinity_name
169
+ end
170
+
171
+ if tab.affinity_parameter.present? && tab.affinity_parameter > 0
172
+ affinity_tabs << "(#{tab.affinity_parameter}), "
173
+ else
174
+ affinity_tabs << ", "
175
+ end
176
+ end
177
+
178
+ affinity_tabs[0..-3]
179
+ end
180
+
181
+ end
182
+ end
183
+ end