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,61 @@
1
+ module Naf
2
+ class HistoricalJobAffinityTab < ::Naf::ByHistoricalJobId
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :affinity_id,
5
+ :historical_job_id,
6
+ :historical_job,
7
+ :affinity_parameter
8
+
9
+ #---------------------
10
+ # *** Associations ***
11
+ #+++++++++++++++++++++
12
+
13
+ belongs_to :affinity,
14
+ class_name: "::Naf::Affinity"
15
+
16
+ #--------------------
17
+ # *** Validations ***
18
+ #++++++++++++++++++++
19
+
20
+ validates :affinity_id, presence: true,
21
+ uniqueness: {
22
+ scope: :historical_job_id,
23
+ message: "has already been taken for this job"
24
+ }
25
+
26
+ #--------------------
27
+ # *** Delegations ***
28
+ #++++++++++++++++++++
29
+
30
+ delegate :affinity_name,
31
+ :affinity_classification_name,
32
+ :affinity_short_name, to: :affinity
33
+
34
+ #------------------
35
+ # *** Partition ***
36
+ #++++++++++++++++++
37
+
38
+ partitioned do |partition|
39
+ partition.foreign_key :affinity_id, ::Naf::Affinity.table_name
40
+ end
41
+
42
+ #-------------------------
43
+ # *** Instance Methods ***
44
+ #+++++++++++++++++++++++++
45
+
46
+ def job
47
+ ::Naf::HistoricalJob.
48
+ from_partition(id).
49
+ where(id: historical_job_id).first
50
+ end
51
+
52
+ def script_type_name
53
+ job.script_type_name
54
+ end
55
+
56
+ def command
57
+ job.command
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,19 @@
1
+ module Naf
2
+ class HistoricalJobPrerequisite < ::Naf::ByHistoricalJobId
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :historical_job_id,
5
+ :prerequisite_historical_job_id
6
+
7
+ #---------------------
8
+ # *** Associations ***
9
+ #+++++++++++++++++++++
10
+
11
+ belongs_to :historical_job,
12
+ class_name: "::Naf::HistoricalJob",
13
+ foreign_key: 'historical_job_id'
14
+ belongs_to :prerequisite_historical_job,
15
+ class_name: "::Naf::HistoricalJob",
16
+ foreign_key: 'prerequisite_historical_job_id'
17
+
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ module Naf
2
+ class JanitorialArchiveAssignment < JanitorialAssignment
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :model_name,
5
+ :assignment_order,
6
+ :enabled,
7
+ :deleted
8
+
9
+ #--------------------
10
+ # *** Validations ***
11
+ #++++++++++++++++++++
12
+
13
+ validate :deleted_enabled_check
14
+ validates :assignment_order, numericality: {
15
+ only_integer: true,
16
+ greater_than_or_equal_to: 0,
17
+ less_than: 2147483647
18
+ }
19
+ validates :model_name, presence: true
20
+
21
+ #-------------------------
22
+ # *** Instance Methods ***
23
+ #+++++++++++++++++++++++++
24
+
25
+ def do_janitorial_work(target_model)
26
+ target_model.archive_old_partitions
27
+ end
28
+
29
+ def deleted_enabled_check
30
+ if deleted && enabled
31
+ errors.add(:deleted, "or Enabled must be false")
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ module Naf
2
+ class JanitorialAssignment < ::Naf::NafBase
3
+
4
+ #----------------------
5
+ # *** Class Methods ***
6
+ #++++++++++++++++++++++
7
+
8
+ def self.enabled
9
+ return where("enabled")
10
+ end
11
+
12
+ def self.pickleables(pickler)
13
+ old_model_names = ['::Naf::Job',
14
+ '::Naf::JobCreatedAt',
15
+ '::Naf::JobPrerequisite',
16
+ '::Naf::JobAffinityTab']
17
+ return where('model_name NOT IN (?)', old_model_names)
18
+ end
19
+
20
+ #-------------------------
21
+ # *** Instance Methods ***
22
+ #+++++++++++++++++++++++++
23
+
24
+ def target_model
25
+ return model_name.constantize rescue nil
26
+ end
27
+
28
+ def self.pickleables(pickler)
29
+ old_model_names = ['::Naf::Job',
30
+ '::Naf::JobCreatedAt',
31
+ '::Naf::JobPrerequisite',
32
+ '::Naf::JobAffinityTab']
33
+ return where('model_name NOT IN (?)', old_model_names)
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ module Naf
2
+ class JanitorialCreateAssignment < JanitorialAssignment
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :model_name,
5
+ :assignment_order,
6
+ :enabled,
7
+ :deleted
8
+
9
+ #--------------------
10
+ # *** Validations ***
11
+ #++++++++++++++++++++
12
+
13
+ validate :deleted_enabled_check
14
+ validates :assignment_order, numericality: {
15
+ only_integer: true,
16
+ greater_than_or_equal_to: 0,
17
+ less_than: 2147483647
18
+ }
19
+ validates :model_name, presence: true
20
+
21
+ #-------------------------
22
+ # *** Instance Methods ***
23
+ #+++++++++++++++++++++++++
24
+
25
+ def do_janitorial_work(target_model)
26
+ target_model.create_new_partitions
27
+ end
28
+
29
+ def deleted_enabled_check
30
+ if deleted && enabled
31
+ errors.add(:deleted, "or Enabled must be false")
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ module Naf
2
+ class JanitorialDropAssignment < JanitorialAssignment
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :model_name,
5
+ :assignment_order,
6
+ :enabled,
7
+ :deleted
8
+
9
+ #--------------------
10
+ # *** Validations ***
11
+ #++++++++++++++++++++
12
+
13
+ validate :deleted_enabled_check
14
+ validates :assignment_order, numericality: {
15
+ only_integer: true,
16
+ greater_than_or_equal_to: 0,
17
+ less_than: 2147483647
18
+ }
19
+ validates :model_name, presence: true
20
+
21
+ #-------------------------
22
+ # *** Instance Methods ***
23
+ #+++++++++++++++++++++++++
24
+
25
+ def do_janitorial_work(target_model)
26
+ target_model.drop_old_partitions
27
+ end
28
+
29
+ def deleted_enabled_check
30
+ if deleted && enabled
31
+ errors.add(:deleted, "or Enabled must be false")
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ module Naf
2
+ class LoggerLevel < NafBase
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :level
5
+
6
+ #---------------------
7
+ # *** Associations ***
8
+ #+++++++++++++++++++++
9
+
10
+ has_many :logger_style_names,
11
+ class_name: '::Naf::LoggerStyleName'
12
+
13
+ #--------------------
14
+ # *** Validations ***
15
+ #++++++++++++++++++++
16
+
17
+ validates :level, uniqueness: true,
18
+ presence: true
19
+
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ module Naf
2
+ class LoggerName < NafBase
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :name
5
+
6
+ #---------------------
7
+ # *** Associations ***
8
+ #+++++++++++++++++++++
9
+
10
+ has_many :logger_style_names,
11
+ class_name: '::Naf::LoggerStyleName'
12
+ has_many :logger_styles,
13
+ through: :logger_style_names
14
+
15
+ #--------------------
16
+ # *** Validations ***
17
+ #++++++++++++++++++++
18
+
19
+ validates :name, uniqueness: true,
20
+ presence: true
21
+
22
+ end
23
+ end
@@ -0,0 +1,58 @@
1
+ module Naf
2
+ class LoggerStyle < NafBase
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :name,
5
+ :note,
6
+ :logger_style_names_attributes
7
+
8
+ #---------------------
9
+ # *** Associations ***
10
+ #+++++++++++++++++++++
11
+
12
+ has_many :logger_style_names,
13
+ class_name: '::Naf::LoggerStyleName'
14
+ has_many :logger_names,
15
+ through: :logger_style_names
16
+
17
+ accepts_nested_attributes_for :logger_style_names
18
+
19
+ #--------------------
20
+ # *** Validations ***
21
+ #++++++++++++++++++++
22
+
23
+ validates :name, uniqueness: true,
24
+ presence: true
25
+ validate :check_logger_style_names_attributes
26
+
27
+ before_save :check_blank_values
28
+
29
+ #-------------------------
30
+ # *** Instance Methods ***
31
+ #+++++++++++++++++++++++++
32
+
33
+ def _logger_names
34
+ logger_style_names.map do |lsn|
35
+ lsn.logger_name.name
36
+ end.join(', ')
37
+ end
38
+
39
+ def logger_levels
40
+ logger_style_names.map do |lsn|
41
+ lsn.logger_level.level
42
+ end.join(', ')
43
+ end
44
+
45
+ def check_logger_style_names_attributes
46
+ if logger_style_names.map{ |ln| ln.logger_name_id }.uniq!
47
+ errors.add(:logger_name_id, "should be an uniqueness")
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def check_blank_values
54
+ self.note = nil if self.note.blank?
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,28 @@
1
+ module Naf
2
+ class LoggerStyleName < NafBase
3
+ # Protect from mass-assignment issue
4
+ attr_accessible :logger_style_id,
5
+ :logger_name_id,
6
+ :logger_level_id
7
+
8
+ #---------------------
9
+ # *** Associations ***
10
+ #+++++++++++++++++++++
11
+
12
+ belongs_to :logger_name,
13
+ class_name: '::Naf::LoggerName'
14
+ belongs_to :logger_style,
15
+ class_name: '::Naf::LoggerStyle'
16
+ belongs_to :logger_level,
17
+ class_name: '::Naf::LoggerLevel'
18
+
19
+ #--------------------
20
+ # *** Validations ***
21
+ #++++++++++++++++++++
22
+
23
+ validates :logger_name_id,
24
+ :logger_style_id, presence: true
25
+ validates :logger_style_id, uniqueness: { scope: :logger_name_id }
26
+
27
+ end
28
+ end
@@ -0,0 +1,257 @@
1
+ require 'socket'
2
+
3
+ module Naf
4
+ class Machine < NafBase
5
+ include ::Af::Application::SafeProxy
6
+ include PgAdvisoryLocker
7
+
8
+ # Protect from mass-assignment issue
9
+ attr_accessible :server_address,
10
+ :server_name,
11
+ :server_note,
12
+ :enabled,
13
+ :thread_pool_size,
14
+ :log_level,
15
+ :marked_down,
16
+ :short_name,
17
+ :deleted
18
+
19
+ IP_REGEX = /^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$/
20
+
21
+ #--------------------
22
+ # *** Validations ***
23
+ #++++++++++++++++++++
24
+
25
+ validates :server_address,
26
+ :thread_pool_size, presence: true
27
+ validates :short_name, uniqueness: true,
28
+ allow_blank: true,
29
+ allow_nil: true,
30
+ format: {
31
+ with: /^[a-zA-Z_][a-zA-Z0-9_]*$/,
32
+ message: "letters should be first (use only letters and numbers)"
33
+ }
34
+ validates :server_address, format: {
35
+ with: IP_REGEX,
36
+ message: "is not a valid IP address"
37
+ },
38
+ if: :server_address
39
+ validates :server_address, uniqueness: true,
40
+ if: :correct_server_address?
41
+ validates :thread_pool_size, numericality: {
42
+ only_integer: true,
43
+ greater_than: -2147483648,
44
+ less_than: 2147483647
45
+ }
46
+ before_save :check_blank_values
47
+
48
+ #---------------------
49
+ # *** Associations ***
50
+ #+++++++++++++++++++++
51
+
52
+ has_many :machine_affinity_slots,
53
+ class_name: '::Naf::MachineAffinitySlot',
54
+ dependent: :destroy
55
+ has_many :affinities,
56
+ through: :machine_affinity_slots
57
+ has_many :machine_runners,
58
+ class_name: '::Naf::MachineRunner'
59
+
60
+ #----------------------
61
+ # *** Class Methods ***
62
+ #++++++++++++++++++++++
63
+
64
+ def self.enabled
65
+ where(enabled: true)
66
+ end
67
+
68
+ def self.up
69
+ where(marked_down: false)
70
+ end
71
+
72
+ def self.down
73
+ where(marked_down: true)
74
+ end
75
+
76
+ def self.with_affinity(affinity_short_name)
77
+ sql = <<-SQL
78
+ exists (select
79
+ 1
80
+ from
81
+ #{::Naf::MachineAffinitySlot.table_name} as mas
82
+ inner join #{::Naf::Affinity.table_name} as a on
83
+ a.id = mas.affinity_id and
84
+ a.affinity_short_name = ?
85
+ where
86
+ mas.machine_id = #{::Naf::Machine.table_name}.id)
87
+ SQL
88
+ return where([sql, affinity_short_name])
89
+ end
90
+
91
+ def self.machine_ip_address
92
+ begin
93
+ Socket::getaddrinfo(hostname, "echo", Socket::AF_INET)[0][3]
94
+ rescue StandardError
95
+ "127.0.0.1"
96
+ end
97
+ end
98
+
99
+ def self.hostname
100
+ begin
101
+ Socket.gethostname
102
+ rescue StandardError
103
+ "local"
104
+ end
105
+ end
106
+
107
+ def self.local_machine
108
+ where(server_address: machine_ip_address).first
109
+ end
110
+
111
+ def self.current
112
+ local_machine
113
+ end
114
+
115
+ def self.last_time_schedules_were_checked
116
+ self.maximum(:last_checked_schedules_at)
117
+ end
118
+
119
+ def self.is_it_time_to_check_schedules?(check_period)
120
+ time = Naf::Machine.last_time_schedules_were_checked
121
+
122
+ time.nil? || time < (Time.zone.now - check_period)
123
+ end
124
+
125
+ def self.include_deleted(filter)
126
+ if !filter
127
+ where(deleted: false)
128
+ else
129
+ where({})
130
+ end
131
+ end
132
+
133
+ #-------------------------
134
+ # *** Instance Methods ***
135
+ #+++++++++++++++++++++++++
136
+
137
+ def lock_for_runner_use(&block)
138
+ advisory_lock(&block)
139
+ end
140
+
141
+ def unlock_for_runner_use
142
+ advisory_unlock
143
+ end
144
+
145
+ def machine_logger
146
+ af_logger(self.class.name)
147
+ end
148
+
149
+ def to_s
150
+ components = []
151
+ if enabled
152
+ components << "ENABLED"
153
+ else
154
+ components << "DISABLED"
155
+ end
156
+ components << "DOWN!" if marked_down
157
+ components << "id: #{id}"
158
+ components << "address: #{server_address}"
159
+ components << "name: \"#{server_name}\"" unless server_name.blank?
160
+ components << "pool size: #{thread_pool_size}"
161
+ components << "last checked schedules: #{last_checked_schedules_at}"
162
+ components << "last seen: #{last_seen_alive_at}"
163
+
164
+ return "::Naf::Machine<#{components.join(', ')}>"
165
+ end
166
+
167
+ def correct_server_address?
168
+ server_address.present? and IP_REGEX =~ server_address
169
+ end
170
+
171
+ def mark_checked_schedule
172
+ self.last_checked_schedules_at = Time.zone.now
173
+ save!
174
+ end
175
+
176
+ def mark_alive
177
+ self.last_seen_alive_at = Time.zone.now
178
+ save!
179
+ end
180
+
181
+ def mark_up
182
+ self.marked_down = false
183
+ save!
184
+ end
185
+
186
+ def mark_down(by_machine)
187
+ self.marked_down = true
188
+ self.marked_down_by_machine_id = by_machine.id
189
+ self.marked_down_at = Time.zone.now
190
+ save!
191
+ end
192
+
193
+ def is_stale?(period)
194
+ # if last_seen_alive_at is nil then the runner has not been started yet -- hold off
195
+ # claiming it is stale until the runner is run at least once.
196
+ self.last_seen_alive_at.present? && self.last_seen_alive_at < (Time.zone.now - period)
197
+ end
198
+
199
+ def mark_processes_as_dead(by_machine)
200
+ ::Naf::RunningJob.where(created_at: (Time.zone.now - Naf::HistoricalJob::JOB_STALE_TIME)..Time.zone.now).
201
+ where("request_to_terminate = false").
202
+ started_on(self).each do |job|
203
+
204
+ marking_at = Time.zone.now
205
+ machine_logger.alarm "#{by_machine.id} marking #{job} as dead at #{marking_at}"
206
+ job.request_to_terminate = job.historical_job.request_to_terminate = true
207
+ job.marked_dead_by_machine_id = job.historical_job.marked_dead_by_machine_id = by_machine.id
208
+ job.marked_dead_at = job.historical_job.marked_dead_at = marking_at
209
+ job.historical_job.finished_at = marking_at
210
+ job.save!
211
+ job.historical_job.save!
212
+ end
213
+ end
214
+
215
+ def mark_machine_down(by_machine)
216
+ marking_at = Time.zone.now
217
+ machine_logger.alarm "#{by_machine.id} marking #{self} as down at #{marking_at}"
218
+ self.marked_down = true
219
+ self.marked_down_by_machine_id = by_machine.id
220
+ self.marked_down_at = marking_at
221
+ save!
222
+ mark_processes_as_dead(by_machine)
223
+ end
224
+
225
+ def affinity
226
+ return ::Naf::Affinity.
227
+ where(affinity_classification_id: ::Naf::AffinityClassification.location.id,
228
+ affinity_name: self.id.to_s).first
229
+ end
230
+
231
+ def short_name_if_it_exist
232
+ short_name || server_name
233
+ end
234
+
235
+ def pickle(pickler)
236
+ pickler.generic_pickle(self, nil, [
237
+ :created_at,
238
+ :updated_at,
239
+ :last_checked_schedules_at,
240
+ :last_seen_alive_at,
241
+ :marked_down,
242
+ :marked_down_by_machine_id,
243
+ :marked_down_at
244
+ ])
245
+ end
246
+
247
+ private
248
+
249
+ def check_blank_values
250
+ self.short_name = nil if self.short_name.blank?
251
+ self.server_name = nil if self.server_name.blank?
252
+ self.server_note = nil if self.server_note.blank?
253
+ self.log_level = nil if self.log_level.blank?
254
+ end
255
+
256
+ end
257
+ end