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,2 @@
1
+ Use this README file to introduce your application and point to useful places in the API for learning more.
2
+ Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries.
@@ -0,0 +1,45 @@
1
+ require 'rails/generators'
2
+
3
+ class NafGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ argument :schema_name, type: :string, default: "naf"
8
+
9
+ def add_configuration_files
10
+ filename = "naf.rb"
11
+ filepath = "config/initializers/#{filename}"
12
+ path = "#{Rails.root}/#{filepath}"
13
+ if File.exists?(path)
14
+ puts "Skipping #{filepath} creation, as file already exists!"
15
+ else
16
+ puts "Adding Naf initializer (#{filepath})..."
17
+ template filename, path
18
+ end
19
+ end
20
+
21
+ def add_log4r_configuration_files
22
+ directory "config"
23
+ end
24
+
25
+ def add_layouts_file
26
+ filename = "naf_layout.html.erb"
27
+ filepath = "app/views/layouts/#{filename}"
28
+ path = "#{Rails.root}/#{filepath}"
29
+ if File.exists?(path)
30
+ puts "Skipping #{filepath} creation, as file already exists!"
31
+ else
32
+ puts "Adding naf_layout (#{filepath})..."
33
+ template filename, path
34
+ end
35
+ end
36
+
37
+ def mount_engine
38
+ puts "Mounting Naf::Engine at \"/job_system\" in config/routes.rb..."
39
+ insert_into_file("#{Rails.root}/config/routes.rb", after: /routes.draw.do\n/) do
40
+ %Q{\n mount Naf::Engine, at: "/job_system"\n}
41
+ end
42
+ end
43
+
44
+
45
+ end
@@ -0,0 +1,26 @@
1
+ log4r_config:
2
+ pre_config:
3
+ custom_levels:
4
+ - DEBUG
5
+ - DEBUG_FINE
6
+ - DEBUG_MEDIUM
7
+ - DEBUG_GROSS
8
+ - DETAIL
9
+ - INFO
10
+ - WARN
11
+ - ALARM
12
+ - ERROR
13
+ - FATAL
14
+ global:
15
+ level: ALL
16
+ root :
17
+ level: ALL
18
+
19
+ outputters:
20
+ - type : StdoutOutputter
21
+ name : stdout
22
+ level : DEBUG
23
+ formatter:
24
+ date_pattern: '%y%m%d %H:%M:%S.%L'
25
+ pattern : '%d %p %C %l %M'
26
+ type : PatternFormatter
@@ -0,0 +1,22 @@
1
+ log4r_config:
2
+ loggers:
3
+ - name : root
4
+ level : ALL
5
+ outputters:
6
+ - stdout
7
+
8
+ outputters:
9
+ - type : StdoutOutputter
10
+ name : stdout
11
+ formatter:
12
+ date_pattern: '%y%m%d %H:%M:%S.%L'
13
+ pattern : '%d pid=%p jid=%g %C %l %M'
14
+ type : PatternFormatter
15
+
16
+ - type: PapertrailOutputter
17
+ name: papertrail
18
+ port: 0 # XXX put your papertrail port here
19
+ program: naf_application
20
+ formatter:
21
+ pattern : 'pid=%p %C %l %M'
22
+ type : PatternFormatter
@@ -0,0 +1,16 @@
1
+ log4r_config:
2
+ outputters:
3
+ - type : StdoutOutputter
4
+ name : stdout
5
+ formatter:
6
+ date_pattern: '%y%m%d %H:%M:%S.%L'
7
+ pattern : '%d pid=%p jid=%g %C %l %M'
8
+ type : PatternFormatter
9
+
10
+ - type: PapertrailOutputter
11
+ name: papertrail
12
+ port: 0 # XXX put your papertrail port here
13
+ program: jid(%g)
14
+ formatter:
15
+ pattern : '%C %l %M'
16
+ type : PatternFormatter
@@ -0,0 +1,17 @@
1
+ log4r_config:
2
+ outputters:
3
+ - type : StdoutOutputter
4
+ name : stdout
5
+ level : DEBUG
6
+ formatter:
7
+ date_pattern: '%y%m%d %H:%M:%S.%L'
8
+ pattern : '%d runner_pid=%p %C %l %M'
9
+ type : PatternFormatter
10
+
11
+ - type: PapertrailOutputter
12
+ name: papertrail
13
+ port: 0 # XXX put your papertrail port here
14
+ program: runner
15
+ formatter:
16
+ pattern : '%C %l %M'
17
+ type : PatternFormatter
@@ -0,0 +1,11 @@
1
+ Naf.configure do |config|
2
+
3
+ config.schema_name = '<%= schema_name %>'
4
+
5
+ # Setting up papertrail links
6
+ # config.papertrail_group_id =
7
+
8
+ # Please get it from your profile on Papertrail
9
+ # config.papertrail_token =
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= ::Naf.title %></title>
5
+ <%%= stylesheet_link_tag "naf", media: "all" %>
6
+ <%%= javascript_include_tag "naf" %>
7
+ <%%= yield :javascripts %>
8
+ <%%= csrf_meta_tags %>
9
+ </head>
10
+ <body>
11
+
12
+ <%%= yield %>
13
+
14
+ </body>
15
+ </html>
@@ -0,0 +1,48 @@
1
+ require "naf/engine"
2
+ require 'naf/configuration'
3
+
4
+ module Naf
5
+ class << self
6
+ attr_writer :configuration
7
+
8
+ def configure
9
+ yield(configuration)
10
+ end
11
+
12
+ def configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def schema_name
17
+ configuration.schema_name
18
+ end
19
+
20
+ def model_class
21
+ configuration.model_class.constantize
22
+ end
23
+
24
+ def controller_class
25
+ configuration.controller_class.constantize
26
+ end
27
+
28
+ def title
29
+ configuration.title
30
+ end
31
+
32
+ def papertrail_group_id
33
+ configuration.papertrail_group_id
34
+ end
35
+
36
+ def papertrail_token
37
+ configuration.papertrail_token
38
+ end
39
+
40
+ def layout
41
+ configuration.layout
42
+ end
43
+
44
+ def using_another_database?
45
+ model_class != ActiveRecord::Base
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,23 @@
1
+ module Naf
2
+ class Configuration
3
+ attr_accessor :schema_name,
4
+ :model_class,
5
+ :controller_class,
6
+ :title,
7
+ :papertrail_group_id,
8
+ :papertrail_token,
9
+ :layout,
10
+ :default_page_options
11
+
12
+ def initialize
13
+ @model_class = "::ActiveRecord::Base"
14
+ @controller_class = "::ApplicationController"
15
+ @title = "Naf - a Rails Job Scheduling Engine"
16
+ @papertrail_group_id = nil
17
+ @papertrail_token = nil
18
+ @layout = "naf_layout"
19
+ @default_page_options = [10, 20, 50, 100, 250, 500, 750, 1000, 1500, 2000]
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'will_paginate'
3
+ require 'facter'
4
+ require 'jquery-rails'
5
+ require 'log4r_remote_syslog_outputter'
6
+ require 'partitioned'
7
+
8
+ module Naf
9
+ class Engine < ::Rails::Engine
10
+ isolate_namespace Naf
11
+ engine_name "naf"
12
+
13
+ initializer "dependencies" do
14
+ require 'partitioned'
15
+ require 'log4r_remote_syslog_outputter'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Naf
2
+ VERSION = "1.1.0"
3
+ end
@@ -0,0 +1,370 @@
1
+ require 'fileutils'
2
+
3
+ # Add methods for aliasing and overriding rake tasks
4
+ # From: http://metaskills.net/2010/5/26/the-alias_method_chain-of-rake-override-rake-task
5
+
6
+ Rake::TaskManager.class_eval do
7
+ def alias_task(fq_name)
8
+ raise "Task '#{fq_name}' not found" unless @tasks.has_key?(fq_name)
9
+
10
+ new_name = "#{fq_name}:original"
11
+ @tasks[new_name] = @tasks.delete(fq_name)
12
+ end
13
+ end
14
+
15
+ def alias_task(fq_name)
16
+ Rake.application.alias_task(fq_name)
17
+ end
18
+
19
+ def override_task(*args, &block)
20
+ name, params, deps = Rake.application.resolve_args(args.dup)
21
+ fq_name = Rake.application.instance_variable_get(:@scope).to_a.reverse.push(name).join(':')
22
+ alias_task(fq_name)
23
+ Rake::Task.define_task(*args, &block)
24
+ end
25
+
26
+ # --------------------------------------------------
27
+ # ---------------Custom Rake Tasks for Naf----------
28
+ # --------------------------------------------------
29
+
30
+ namespace :naf do
31
+ namespace :isolate do
32
+ desc "Custom isolation Engine migrations to db/naf/migrate folder, for use on non-primary database"
33
+ task :migrations do
34
+
35
+ puts "Moving naf migration files to folder: #{isolated_naf_migrations_folder}"
36
+
37
+ FileUtils.mkdir(isolated_naf_folder) unless Dir.exists?(isolated_naf_folder)
38
+ FileUtils.mkdir(isolated_naf_migrations_folder) unless Dir.exists?(isolated_naf_migrations_folder)
39
+
40
+ source_folder = "#{Rails.root}/db/migrate"
41
+
42
+ Dir.entries(source_folder).grep(/\.naf\.rb/).each do |migration_file|
43
+ file_path = "#{source_folder}/#{migration_file}"
44
+ puts "#{isolated_naf_migrations_folder}/#{migration_file}"
45
+ if File.exists?("#{isolated_naf_migrations_folder}#{migration_file}")
46
+ puts "\t#{migration_file} already exists, skipping"
47
+ else
48
+ puts "\t #{file_path} => #{isolated_naf_migrations_folder}#{migration_file}"
49
+ FileUtils.mv(file_path, isolated_naf_migrations_folder)
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+
56
+ namespace :janitor do
57
+ desc "create partitioning infrastructure for naf tables"
58
+ task infrastructure: :environment do
59
+ model_names = [::Naf::HistoricalJob.name,
60
+ ::Naf::HistoricalJobPrerequisite.name,
61
+ ::Naf::HistoricalJobAffinityTab.name]
62
+ ::Logical::Naf::CreateInfrastructure.new(model_names).work
63
+ end
64
+ end
65
+
66
+ namespace :db do
67
+ desc "Custom migrate task, connects to correct database, migrations found in db/naf/migrate"
68
+ task migrate: :environment do
69
+ if using_another_database? and naf_migrations.size > 0
70
+ puts "Running naf migrations with database configuration: #{naf_environment}"
71
+ puts naf_migrations
72
+ connect_to_naf_database do
73
+ version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
74
+ ActiveRecord::Migrator.migrate(isolated_naf_migrations_folder, version )
75
+ end
76
+ else
77
+ #Invoke the standard migration task, within the Naf Engine scope
78
+ ENV['SCOPE'] = 'naf'
79
+ Rake::Task['db:migrate'].invoke
80
+ end
81
+ end
82
+
83
+ desc "Perform a rollback on the on the naf migrations"
84
+ task rollback: :environment do
85
+ if using_another_database? and naf_migrations.size > 0
86
+ connect_to_naf_database do
87
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
88
+ ActiveRecord::Migrator.rollback(isolated_naf_migrations_folder, step)
89
+ end
90
+ else
91
+ ENV['SCOPE'] = 'naf'
92
+ Rake::Task['db:rollback'].invoke
93
+ end
94
+ end
95
+
96
+ namespace :migrate do
97
+
98
+ desc 'Runs the "up" for a given migration VERSION.'
99
+ task up: [:environment] do
100
+ if using_another_database? and naf_migrations.size > 0
101
+ connect_to_naf_database do
102
+ version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
103
+ raise 'VERSION is required' unless version
104
+ ActiveRecord::Migrator.run(:up, [isolated_naf_migrations_folder], version)
105
+ end
106
+ else
107
+ puts "You are using the primary database for Naf, please run: rake db:migrate:up VERSION=x"
108
+ end
109
+ end
110
+
111
+ desc 'Runs the "down" for a given migration VERSION.'
112
+ task down: [:environment] do
113
+ if using_another_database? and naf_migrations.size > 0
114
+ connect_to_naf_database do
115
+ version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
116
+ raise 'VERSION is required' unless version
117
+ ActiveRecord::Migrator.run(:down, [isolated_naf_migrations_folder], version)
118
+ end
119
+ else
120
+ puts "You are using the primary database for Naf, please run: rake db:migrate:down VERSION=x"
121
+ end
122
+ end
123
+
124
+ desc "Show the status of migrations"
125
+ task status: :environment do
126
+ if using_another_database? and naf_migrations.size > 0
127
+ connect_to_naf_database do
128
+ config = ActiveRecord::Base.configurations[naf_environment]
129
+ unless ActiveRecord::Base.connection.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
130
+ puts 'Schema migrations table does not exist yet.'
131
+ next # means "return" for rake task
132
+ end
133
+ db_list = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name}")
134
+ file_list = []
135
+ Dir.foreach(isolated_naf_migrations_folder) do |file|
136
+ # only files matching "20091231235959_some_name.rb" pattern
137
+ if match_data = /^(\d{14})_(.+)\.rb$/.match(file)
138
+ status = db_list.delete(match_data[1]) ? 'up' : 'down'
139
+ file_list << [status, match_data[1], match_data[2].humanize]
140
+ end
141
+ end
142
+ db_list.map! do |version|
143
+ ['up', version, '********** NO FILE **********']
144
+ end
145
+ # output
146
+ puts "\ndatabase: #{config['database']}\n\n"
147
+ puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
148
+ puts "-" * 50
149
+ (db_list + file_list).sort_by {|migration| migration[1]}.each do |migration|
150
+ puts "#{migration[0].center(8)} #{migration[1].ljust(14)} #{migration[2]}"
151
+ end
152
+ end
153
+ else
154
+ puts "You are using the primary database for Naf, please run: rake db:migrate:status"
155
+ end
156
+ end
157
+ end
158
+
159
+ namespace :structure do
160
+ desc "Dump the naf_development schema"
161
+ task dump: :environment do
162
+ env = "naf_#{::Rails.env}"
163
+ config = ActiveRecord::Base.configurations[env]
164
+ ENV['PGHOST'] = config["host"] if config["host"]
165
+ ENV['PGPORT'] = config["port"].to_s if config["port"]
166
+ ENV['PGPASSWORD'] = config["password"].to_s if config["password"]
167
+ search_path = "naf*"
168
+ command = "pg_dump -i -U \"#{config["username"]}\" -s -x -O"
169
+ ( config["exclude"] || [] ).each {|e| command << " -T \"#{e}\""}
170
+ command << " -f db/#{env}_structure.sql --schema=#{search_path} #{config["database"]} > /dev/null 2>&1"
171
+ `#{command}`
172
+ raise "Error dumping database structure for #{env}" if $?.exitstatus == 1
173
+ end
174
+ end
175
+
176
+ namespace :test do
177
+ desc "Drop the Naf Test database"
178
+ task purge: :environment do
179
+ abcs = ActiveRecord::Base.configurations
180
+ config = abcs['naf_test']
181
+ ActiveRecord::Base.clear_active_connections!
182
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
183
+ ActiveRecord::Base.connection.drop_database config['database']
184
+ @encoding = config['encoding'] || ENV['CHARSET'] || 'utf8'
185
+ begin
186
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
187
+ ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
188
+ ActiveRecord::Base.establish_connection(config)
189
+ rescue Exception => e
190
+ $stderr.puts e, *(e.backtrace)
191
+ $stderr.puts "Couldn't create database for #{config.inspect}"
192
+ end
193
+ end
194
+ desc "Clone naf_development to naf_test"
195
+ task clone_structure: [ "naf:db:structure:dump", "naf:db:test:purge" ] do
196
+ abcs = ActiveRecord::Base.configurations
197
+ config = abcs['naf_test']
198
+ ENV['PGHOST'] = config["host"] if config["host"]
199
+ ENV['PGPORT'] = config["port"].to_s if config["port"]
200
+ ENV['PGPASSWORD'] = config["password"].to_s if config["password"]
201
+ `psql -U "#{config["username"]}" -f db/naf_#{::Rails.env}_structure.sql #{config["database"]}`
202
+ raise "Error loading database structure for #{env}" if $?.exitstatus == 1
203
+ end
204
+ end
205
+ end
206
+
207
+ desc "Undo all of the naf schema migrations"
208
+ task schema_rollback: :environment do
209
+ puts "Rolling back all of Naf migrations"
210
+ if using_another_database? and naf_migrations.size > 0
211
+ connect_to_naf_database do
212
+ ActiveRecord::Migrator.migrate(isolated_naf_migrations_folder, 0)
213
+ end
214
+ else
215
+ ENV['SCOPE'] = 'naf'
216
+ ENV['VERSION'] = '0'
217
+ Rake::Task['db:migrate'].invoke
218
+ end
219
+ end
220
+
221
+ desc "Delete all of the naf schema migrations files that were installed"
222
+ task remove_migration_files: [:environment, :schema_rollback] do
223
+ naf_migrations.each do |migration|
224
+ if using_another_database? and naf_migrations.size > 0
225
+ file_path = "#{isolated_naf_migrations_folder}#{migration}"
226
+ else
227
+ file_path = "#{standard_migrations_folder}#{migration}"
228
+ end
229
+ if File.exists?(file_path)
230
+ puts "Removing migration file: #{migration}"
231
+ File.delete(file_path)
232
+ end
233
+ end
234
+ if Dir.exists?(isolated_naf_migrations_folder)
235
+ puts "Removing folder #{isolated_naf_migrations_folder}"
236
+ FileUtils.rmdir(isolated_naf_migrations_folder)
237
+ end
238
+ if Dir.exists?(isolated_naf_folder)
239
+ puts "Removing folder #{isolated_naf_folder}"
240
+ FileUtils.rmdir(isolated_naf_folder)
241
+ end
242
+ end
243
+
244
+ desc "Deletes initalizers, configs that were installed, revert edit to config/routes"
245
+ task system_teardown: :environment do
246
+ # The first two files configured to be removed, if someone is using an older versions of naf
247
+ files_to_remove = [
248
+ "config/initializers/job_system_initializer.rb",
249
+ "config/job_system_config.yml",
250
+ "config/initializers/naf_initializer.rb",
251
+ "config/initializers/naf.rb",
252
+ "config/naf_log4r.yml",
253
+ "config/naf_config.yml"
254
+ ]
255
+ edit_file_line_regex_hash = {
256
+ "config/routes.rb" => %r{$ mount Naf::Engine, :at => "/job_system"\s*\n}
257
+ }
258
+ files_to_remove.each do |file|
259
+ file_path = "#{Rails.root}/#{file}"
260
+ if File.exists?(file_path)
261
+ puts "Removing file: #{file}"
262
+ File.delete(file_path)
263
+ end
264
+ end
265
+ edit_file_line_regex_hash.each do |file, regex|
266
+ puts "Reverting Naf Engine's edits to #{file}"
267
+ file_path = "#{Rails.root}/#{file}"
268
+ gsub_file(file_path, regex, '')
269
+ end
270
+ end
271
+
272
+ desc "remove partitioning infrastructure for naf tables"
273
+ task remove_partitions: :environment do
274
+ klasses = [::Naf::HistoricalJob, ::Naf::HistoricalJobPrerequisite, ::Naf::HistoricalJobAffinityTab]
275
+ existing_schemas = database_schemas
276
+ schemas = klasses.map{ |klass| klass.configurator.schema_name }
277
+ if using_another_database?
278
+ connect_to_naf_database do
279
+ schemas.each do |schema|
280
+ ActiveRecord::Base.connection.execute("DROP SCHEMA #{schema} CASCADE") if existing_schemas.include?(schema)
281
+ end
282
+ end
283
+ else
284
+ schemas.each do |schema|
285
+ ActiveRecord::Base.connection.execute("DROP SCHEMA #{schema} CASCADE") if existing_schemas.include?(schema)
286
+ end
287
+ end
288
+ end
289
+ desc "The master task for completely expunging the installation of the naf Engine"
290
+ task teardown: [:system_teardown, :remove_migration_files, :remove_partitions] do
291
+ end
292
+
293
+ end
294
+
295
+ # Helper Methods
296
+
297
+ def database_schemas
298
+ params = ["SELECT nspname FROM pg_namespace WHERE nspname !~ '^pg_.*' AND nspname NOT IN ('information_schema') ORDER by nspname; ", 'SCHEMA']
299
+ if using_another_database?
300
+ connect_to_naf_database do
301
+ return ActiveRecord::Base.connection.query(*params).flatten
302
+ end
303
+ else
304
+ return ActiveRecord::Base.connection.query(*params).flatten
305
+ end
306
+ end
307
+
308
+ # Transactions method to connect to the specific database
309
+ # you want the naf tables to live in
310
+ def connect_to_naf_database
311
+ original = ActiveRecord::Base.remove_connection
312
+ ActiveRecord::Base.establish_connection(naf_environment)
313
+ yield
314
+ ensure
315
+ ActiveRecord::Base.establish_connection original
316
+ end
317
+
318
+ # Figure out if you are using another database for naf
319
+ def using_another_database?
320
+ return naf_environment == "naf_#{Rails.env}"
321
+ end
322
+
323
+ # Specifiy the naf environment, the configuration that migrations with run under,
324
+ # If the naf_#{Rails.env} configuration exists in in database.yml, choose that,
325
+ # else choose Rails.env
326
+ def naf_environment
327
+ naf_environments = ActiveRecord::Base.configurations.keys.select{|env| env == "naf_#{Rails.env}"}
328
+ if naf_environments.any?
329
+ return naf_environments.first
330
+ else
331
+ return Rails.env.to_s
332
+ end
333
+ end
334
+
335
+ # Subsitute matches to a given regex in the given file, with the given string
336
+ # Used right now just to revert config/routes.rb
337
+ def gsub_file(path, regexp, *args, &block)
338
+ content = File.read(path).gsub(regexp, *args, &block)
339
+ File.open(path, 'wb') { |file| file.write(content) }
340
+ end
341
+
342
+ def standard_migrations_folder
343
+ "#{Rails.root}/db/migrate/"
344
+ end
345
+
346
+ def isolated_naf_folder
347
+ "#{Rails.root}/db/naf/"
348
+ end
349
+
350
+ def isolated_naf_migrations_folder
351
+ "#{isolated_naf_folder}migrate/"
352
+ end
353
+
354
+ def naf_migrations
355
+ if using_another_database?
356
+ unless Dir.exists?(isolated_naf_folder) and Dir.exists?(isolated_naf_migrations_folder)
357
+ raise NafConfigurationError
358
+ else
359
+ Dir.entries(isolated_naf_migrations_folder).grep(/\.naf\.rb$/)
360
+ end
361
+ else
362
+ Dir.entries(standard_migrations_folder).grep(/\.naf\.rb$/)
363
+ end
364
+ end
365
+
366
+ class NafUsageError < Exception
367
+ end
368
+
369
+ class NafConfigurationError < Exception
370
+ end