naf 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,46 @@
1
+ <% content_for :body do %>
2
+ <div id="record">
3
+ <%= render partial: 'naf/shared/information_container', locals: { record_name: naf_model_name } %>
4
+
5
+ <%= naf_generate_back_link %>
6
+ <% if !naf_generate_edit_link.blank? && !naf_generate_back_link.blank? %>
7
+ &nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
8
+ <% end %>
9
+ <%= naf_generate_edit_link %>
10
+
11
+ <div id="flash_message">
12
+ <% unless notice.blank? %>
13
+ <script type='text/javascript'>
14
+ jQuery("<p id='notice'><%= notice %></p>")
15
+ .appendTo('#flash_message')
16
+ .slideDown().delay(5000).slideUp();
17
+ </script>
18
+ <% end %>
19
+ </div>
20
+
21
+ <br/>
22
+ <table id="naf_table_show">
23
+ <tr>
24
+ <th>Attribute</th>
25
+ <th>Value</th>
26
+ </tr>
27
+ <tbody>
28
+ <% @attributes.each do |a| %>
29
+ <tr>
30
+ <td scope="row"><%= naf_make_header(a.to_s) %></td>
31
+ <td> <%= @record.send(a) %></td>
32
+ </tr>
33
+ <% end %>
34
+ </tbody>
35
+ </table>
36
+ <br/>
37
+
38
+ <%= naf_generate_child_resources_link %>
39
+ <% if !naf_generate_destroy_link.blank? && !naf_generate_child_resources_link.blank? %>
40
+ &nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
41
+ <% end %>
42
+ <%= naf_generate_destroy_link %>
43
+ </div>
44
+ <% end %>
45
+
46
+ <%= render partial: 'naf/shared/application' %>
@@ -0,0 +1,50 @@
1
+ <div id='naf'>
2
+ <div id="fluid">
3
+ <div id='hd'>
4
+ <div id="header">
5
+ <h3><%= link_to Naf.title.html_safe, naf.root_url %></h3>
6
+ </div>
7
+ </div>
8
+ <div id="navigation">
9
+ <ul id="tabs">
10
+ <% naf_tabs.each_key do |tab| %>
11
+ <% if naf_highlight_tab?(tab) %>
12
+ <li id="on">
13
+ <% else %>
14
+ <li>
15
+ <% end %>
16
+ <%= naf_generate_index_link(tab) %>
17
+ </li>
18
+ <% end %>
19
+ </ul>
20
+ <div class="clear"></div>
21
+ </div>
22
+ <div id='bd'>
23
+ <% naf_tabs.each do |tab, child_tabs| %>
24
+ <% if naf_highlight_tab?(tab) && !child_tabs.blank? %>
25
+ <div id="child_navigation">
26
+ <ul id="child_tabs">
27
+ <% child_tabs.each do |child_tab| %>
28
+ <% if naf_highlight_tab?(child_tab) %>
29
+ <li id="on">
30
+ <% else %>
31
+ <li>
32
+ <% end %>
33
+ <%= naf_generate_index_link(child_tab) %>
34
+ </li>
35
+ <% end %>
36
+ </ul>
37
+ <div class="clear"></div>
38
+ </div>
39
+ <div id='child_bd'>
40
+ <% @naf_render_body = true %>
41
+ <%= yield :body %>
42
+ </div>
43
+ <% end %>
44
+ <% end %>
45
+ <% unless @naf_render_body %>
46
+ <%= yield :body %>
47
+ <% end %>
48
+ </div>
49
+ </div>
50
+ </div>
@@ -0,0 +1,19 @@
1
+ <div id='page-label'>
2
+ <h3 id="record_name"><%= record_name %> </h3>
3
+ </div>
4
+
5
+ <% if current_page?(naf.root_url) or current_page?(action: 'index') %>
6
+ <% if flash[:error] -%>
7
+ <div class="error"><%= flash[:error] %></div></br>
8
+ <% end -%>
9
+
10
+ <div id='create_links'>
11
+ <span id="create"> <%= naf_generate_create_link %> </span>
12
+ </div>
13
+ <% end %>
14
+
15
+ <% if naf_nested_resource_index? %>
16
+ <div id='parent_links'>
17
+ <span id="parent"> <%= naf_parent_resource_link %> </span>
18
+ </div>
19
+ <% end %>
@@ -0,0 +1,72 @@
1
+ <% content_for :javascripts do %>
2
+ <script type='text/javascript'>
3
+
4
+ function initPageSelect() {
5
+ var pageSelect = jQuery('#page-select-container');
6
+ var refreshPage = jQuery('#refresh-page-container');
7
+ jQuery('#datatable_paginate').append(pageSelect).append(refreshPage);
8
+ pageSelect.show();
9
+ refreshPage.show();
10
+ }
11
+
12
+ function getDisplayLength() {
13
+ return parseInt(jQuery('#iDisplayLength').val());
14
+ }
15
+
16
+ // Global to store the current timeout id value.
17
+ var timeout_id = null;
18
+
19
+ // Redraw datatable.
20
+ var redrawDatatable = function() {
21
+ jQuery("#datatable").dataTable().fnDraw(false);
22
+ if ( jQuery('#auto_refresh').is(':checked') ) {
23
+ timeout_id = setTimeout(redrawDatatable, 10000);
24
+ }
25
+ };
26
+
27
+ jQuery(document).ready(function() {
28
+ jQuery('#page-select-container form select').change(function() {
29
+ var ddTable = jQuery('#datatable');
30
+ ddTable.dataTableSettings[0]._iDisplayStart = 0;
31
+ ddTable.dataTableSettings[0]._iDisplayLength = parseInt(this.value);
32
+ jQuery('#datatable').dataTable().fnDraw();
33
+ });
34
+
35
+ <% if controller_name == 'historical_jobs' %>
36
+ timeout_id = setTimeout(redrawDatatable, 10000);
37
+ jQuery('#auto_refresh').prop('checked', true);
38
+ <% end %>
39
+
40
+ jQuery('#refresh_datatable').click(function(){
41
+ jQuery('#datatable').dataTable().fnDraw();
42
+ });
43
+
44
+ // Set change event to enabled/disable auto-refresh
45
+ jQuery('#auto_refresh').change(function() {
46
+ if ( jQuery(this).is(':checked') ) {
47
+ timeout_id = setTimeout(redrawDatatable, 10000);
48
+ } else {
49
+ clearTimeout(timeout_id);
50
+ timeout_id = null;
51
+ }
52
+ });
53
+ });
54
+
55
+ </script>
56
+ <% end %>
57
+
58
+ <div id='refresh-page-container'>
59
+ <%= link_to "Refresh Table", "#", id: :refresh_datatable %>
60
+ &nbsp;&nbsp;
61
+ <%= label_tag :auto_refresh, 'Auto Refresh:' %>
62
+ <%= check_box_tag :auto_refresh, 1, false, id: :auto_refresh %>
63
+ </div>
64
+
65
+ <div id="page-select-container" class="ui-state-default ui-corner-all">
66
+ <%= form_tag({ controller: params[:controller], action: params[:action], format: 'js' }, method: :get) do %>
67
+ <%= label_tag :iDisplayLength, "Rows Per Page:", class: "label" %>
68
+ <%= select_tag :iDisplayLength,
69
+ options_for_select(::Naf.configuration.default_page_options, @rows_per_page),
70
+ class: "page-select datatable_variable ui-state-default ui-corner-all" %>
71
+ <% end %>
72
+ </div>
@@ -0,0 +1,17 @@
1
+ #!/bin/bash -e
2
+
3
+ echo 'Dropping your naf_development database if it exists'
4
+
5
+ psql -U postgres -c "drop database if exists naf_development"
6
+ psql -U postgres -c "drop database if exists primary_development"
7
+
8
+ echo 'Removing existing migration in dummy application'
9
+
10
+ rm -f spec/dummy/app/models/other/base.rb
11
+
12
+ rm -rf spec/dummy/db/naf
13
+
14
+ rm -f spec/dummy/db/migrate/*.rb
15
+
16
+ ./ci/travis.sh
17
+
@@ -0,0 +1,26 @@
1
+ #!/bin/bash -e
2
+
3
+ rake="bundle exec rake"
4
+
5
+ cd spec/dummy
6
+
7
+ # Bring in the initializer
8
+
9
+ if [ $SPEC_GROUP == 'non_primary_database' ]
10
+ then
11
+ echo 'Testing non primary database install'
12
+ cp config/database-non_primary.yml config/database.yml
13
+ cp app/models/other/base.rb.sample app/models/other/base.rb
14
+ cp config/initializers/naf.rb.non_primary config/initializers/naf.rb
15
+ $rake naf:install:migrations naf:isolate:migrations db:create:all naf:db:migrate naf:janitor:infrastructure naf:db:test:clone_structure
16
+ else
17
+ echo 'Testing primary database install'
18
+ cp config/database-primary.yml config/database.yml
19
+ cp config/initializers/naf.rb.primary config/initializers/naf.rb
20
+ $rake naf:install:migrations db:create db:migrate naf:janitor:infrastructure db:test:clone_structure
21
+ fi
22
+
23
+ cd ../..
24
+
25
+ $rake spec
26
+
@@ -0,0 +1,3 @@
1
+ module Naf
2
+ DEFAULT_PAGE_OPTIONS = [10, 20, 50, 100, 250, 500, 750, 1000, 1500, 2000]
3
+ end
@@ -0,0 +1,38 @@
1
+ Naf::Engine.routes.draw do
2
+ resources :historical_jobs do
3
+ resources :historical_job_affinity_tabs, except: [:destroy]
4
+ end
5
+
6
+ resources :applications, except: [:destroy] do
7
+ resources :application_schedules, only: [] do
8
+ resources :application_schedule_affinity_tabs
9
+ end
10
+ end
11
+
12
+ resources :machines, except: [:destroy] do
13
+ resources :machine_affinity_slots
14
+ end
15
+
16
+ resources :machine_runners, only: [:index, :show]
17
+ resources :machine_runner_invocations, only: [:index, :show, :update] do
18
+ collection do
19
+ get :wind_down_all
20
+ end
21
+ end
22
+ resources :logger_styles
23
+ resources :logger_names
24
+ resources :affinities
25
+
26
+ resources :janitorial_archive_assignments, controller: "janitorial_assignments",
27
+ type: "Naf::JanitorialArchiveAssignment",
28
+ except: [:destroy]
29
+ resources :janitorial_create_assignments, controller: "janitorial_assignments",
30
+ type: "Naf::JanitorialCreateAssignment",
31
+ except: [:destroy]
32
+ resources :janitorial_drop_assignments, controller: "janitorial_assignments",
33
+ type: "Naf::JanitorialDropAssignment",
34
+ except: [:destroy]
35
+
36
+ match "jobs" => "historical_jobs#index"
37
+ root to: "historical_jobs#index"
38
+ end
@@ -0,0 +1,413 @@
1
+ class NafSchema < ActiveRecord::Migration
2
+
3
+ def up
4
+ # Define a schema_name, the scheduling tables fall under:
5
+ schema_name = Naf.schema_name
6
+
7
+ # affinities
8
+ # names: normal, canary, perennial
9
+ # location: ip address
10
+ # application/release on machine: application-release-number
11
+ execute <<-SQL
12
+
13
+ do LANGUAGE plpgsql $$
14
+ begin
15
+ if (SELECT count(*) FROM pg_namespace WHERE nspname !~ '^pg_.*' AND nspname NOT IN ('information_schema') AND nspname = '#{schema_name}') > 0 THEN
16
+ raise notice 'Skipping creation of schema: #{schema_name}, already exists';
17
+ else
18
+ raise notice 'Creating new schema #{schema_name}';
19
+ create schema #{schema_name};
20
+ end if;
21
+ end;
22
+ $$;
23
+
24
+ create table #{schema_name}.affinity_classifications
25
+ (
26
+ id serial not null primary key,
27
+ created_at timestamp not null default now(),
28
+ updated_at timestamp,
29
+ affinity_classification_name text not null unique
30
+ );
31
+ insert into #{schema_name}.affinity_classifications (affinity_classification_name) values
32
+ ('location'), ('purpose'), ('application'), ('weight'), ('machine');
33
+ create table #{schema_name}.affinities
34
+ (
35
+ id serial not null primary key,
36
+ created_at timestamp not null default now(),
37
+ updated_at timestamp,
38
+ selectable boolean not null default true,
39
+ affinity_classification_id integer not null references #{schema_name}.affinity_classifications,
40
+ affinity_name text not null,
41
+ affinity_short_name text unique check ( affinity_short_name ~ '^[a-zA-Z_][a-zA-Z0-9_]*$' ),
42
+ affinity_note text null,
43
+ unique (affinity_classification_id, affinity_name)
44
+ );
45
+ insert into #{schema_name}.affinities (affinity_classification_id, affinity_name, affinity_short_name) values
46
+ ((select id from #{schema_name}.affinity_classifications where affinity_classification_name = 'purpose'), 'normal', 'normal'),
47
+ ((select id from #{schema_name}.affinity_classifications where affinity_classification_name = 'purpose'), 'canary', 'canary'),
48
+ ((select id from #{schema_name}.affinity_classifications where affinity_classification_name = 'purpose'), 'perennial', 'perennial'),
49
+ ((select id from #{schema_name}.affinity_classifications where affinity_classification_name = 'weight'), 'memory', 'memory'),
50
+ ((select id from #{schema_name}.affinity_classifications where affinity_classification_name = 'weight'), 'cpus', 'cpus');
51
+ create table #{schema_name}.machines
52
+ (
53
+ id serial not null primary key,
54
+ created_at timestamp not null default now(),
55
+ updated_at timestamp,
56
+ server_address inet not null unique,
57
+ server_name text,
58
+ short_name text unique check ( short_name ~ '^[a-zA-Z_][a-zA-Z0-9_]*$' ),
59
+ server_note text,
60
+ enabled boolean not null default true,
61
+ thread_pool_size integer not null default 5,
62
+ last_checked_schedules_at timestamp null,
63
+ last_seen_alive_at timestamp null,
64
+ marked_down boolean not null default false,
65
+ marked_down_by_machine_id integer null references #{schema_name}.machines,
66
+ marked_down_at timestamp null,
67
+ log_level text null,
68
+ deleted boolean not null default false check (deleted = false OR enabled = false)
69
+ );
70
+ create table #{schema_name}.machine_affinity_slots
71
+ (
72
+ id serial not null primary key,
73
+ created_at timestamp not null default now(),
74
+ machine_id integer not null references #{schema_name}.machines,
75
+ affinity_id integer not null references #{schema_name}.affinities,
76
+ affinity_parameter numeric null,
77
+ required boolean not null default false,
78
+ unique (machine_id, affinity_id)
79
+ );
80
+ create table #{schema_name}.machine_runners
81
+ (
82
+ id serial not null primary key,
83
+ created_at timestamp not null default now(),
84
+ machine_id integer not null references #{schema_name}.machines,
85
+ runner_cwd text not null,
86
+ unique (machine_id, runner_cwd)
87
+ );
88
+ create table #{schema_name}.machine_runner_invocations
89
+ (
90
+ id serial not null primary key,
91
+ created_at timestamp not null default now(),
92
+ updated_at timestamp,
93
+ machine_runner_id integer not null references #{schema_name}.machine_runners,
94
+ pid integer not null,
95
+ dead_at timestamp null,
96
+ wind_down_at timestamp null,
97
+ commit_information text null,
98
+ branch_name text null,
99
+ repository_name text null,
100
+ deployment_tag text null
101
+ );
102
+ create table #{schema_name}.application_types
103
+ (
104
+ id serial not null primary key,
105
+ created_at timestamp not null default now(),
106
+ updated_at timestamp,
107
+ enabled boolean not null default true,
108
+ script_type_name text unique not null,
109
+ description text,
110
+ invocation_method text not null
111
+ );
112
+ insert into #{schema_name}.application_types (script_type_name, description, invocation_method) values
113
+ ('rails', 'ruby on rails NAF application', 'rails_invocator'),
114
+ ('bash command', 'bash command', 'bash_command_invocator'),
115
+ ('bash script', 'bash script', 'bash_script_invocator'),
116
+ ('ruby', 'ruby script', 'ruby_script_invocator');
117
+ create table #{schema_name}.applications
118
+ (
119
+ id serial not null primary key,
120
+ created_at timestamp not null default now(),
121
+ updated_at timestamp,
122
+ deleted boolean not null default false,
123
+ application_type_id integer not null references #{schema_name}.application_types,
124
+ command text not null,
125
+ title text not null,
126
+ short_name text null unique check ( short_name ~ '^[a-zA-Z_][a-zA-Z0-9_]*$' ),
127
+ log_level text null
128
+ );
129
+ insert into #{schema_name}.applications (application_type_id, command, title) values
130
+ (
131
+ (select id from #{schema_name}.application_types where script_type_name = 'rails'),
132
+ '::Process::Naf::Janitor.run',
133
+ 'Database Janitorial Work'
134
+ );
135
+ create table #{schema_name}.application_run_group_restrictions
136
+ (
137
+ id serial not null primary key,
138
+ created_at timestamp not null default now(),
139
+ application_run_group_restriction_name text unique not null
140
+ );
141
+ insert into #{schema_name}.application_run_group_restrictions (application_run_group_restriction_name) values
142
+ ('no limit'), ('limited per machine'), ('limited per all machines');
143
+ create table #{schema_name}.application_schedules
144
+ (
145
+ id serial not null primary key,
146
+ created_at timestamp not null default now(),
147
+ updated_at timestamp,
148
+ enabled boolean not null default true,
149
+ visible boolean not null default true,
150
+ application_id integer unique not null references #{schema_name}.applications,
151
+ application_run_group_restriction_id integer not null references #{schema_name}.application_run_group_restrictions,
152
+ application_run_group_name text null,
153
+ application_run_group_limit integer null check (application_run_group_limit >= 1 or application_run_group_limit is null),
154
+ run_start_minute integer null check (run_start_minute >= 0 and run_start_minute < (24 * 60)),
155
+ run_interval integer null check (run_interval >= 0),
156
+ priority integer not null default 0,
157
+ enqueue_backlogs boolean not null default false,
158
+ check (visible = true OR enabled = false),
159
+ check (run_start_minute is null OR run_interval is null)
160
+ );
161
+ insert into #{schema_name}.application_schedules
162
+ (application_id, application_run_group_restriction_id, application_run_group_name, application_run_group_limit, run_start_minute, run_interval) values
163
+ (
164
+ (select id from #{schema_name}.applications where command = '::Process::Naf::Janitor.run'),
165
+ (select id from #{schema_name}.application_run_group_restrictions where application_run_group_restriction_name = 'limited per all machines'),
166
+ '::Process::Naf::Janitor.run',
167
+ 1,
168
+ 5,
169
+ null
170
+ );
171
+ create unique index applications_have_one_schedule_udx on #{schema_name}.application_schedules (application_id) where enabled = true;
172
+ create table #{schema_name}.application_schedule_affinity_tabs
173
+ (
174
+ id serial not null primary key,
175
+ created_at timestamp not null default now(),
176
+ application_schedule_id integer not null references #{schema_name}.application_schedules,
177
+ affinity_id integer not null references #{schema_name}.affinities,
178
+ affinity_parameter numeric null,
179
+ UNIQUE (application_schedule_id, affinity_id)
180
+ );
181
+ create table #{schema_name}.application_schedule_prerequisites
182
+ (
183
+ id serial not null primary key,
184
+ created_at timestamp not null default now(),
185
+ application_schedule_id integer not null references #{schema_name}.application_schedules,
186
+ prerequisite_application_schedule_id integer not null references #{schema_name}.application_schedules,
187
+ UNIQUE (application_schedule_id, prerequisite_application_schedule_id),
188
+ CHECK (application_schedule_id <> prerequisite_application_schedule_id)
189
+ );
190
+ create table #{schema_name}.historical_jobs
191
+ (
192
+ id bigserial not null primary key,
193
+ created_at timestamp not null default now(),
194
+ updated_at timestamp,
195
+
196
+ application_id integer null references #{schema_name}.applications,
197
+ application_type_id integer not null references #{schema_name}.application_types,
198
+ command text not null,
199
+
200
+ application_run_group_restriction_id integer not null references #{schema_name}.application_run_group_restrictions,
201
+ application_run_group_name text null,
202
+ application_run_group_limit integer null default 1,
203
+
204
+ priority integer not null default 0,
205
+
206
+ started_on_machine_id integer null references #{schema_name}.machines,
207
+
208
+ failed_to_start boolean null,
209
+ started_at timestamp null,
210
+ pid integer null,
211
+ finished_at timestamp null,
212
+ exit_status integer null,
213
+ termination_signal integer null,
214
+
215
+ state text null,
216
+
217
+ request_to_terminate boolean not null default false,
218
+
219
+ marked_dead_by_machine_id integer null references #{schema_name}.machines,
220
+ marked_dead_at timestamp null,
221
+
222
+ log_level text null,
223
+ tags text[],
224
+ machine_runner_invocation_id integer null references #{schema_name}.machine_runner_invocations
225
+ );
226
+ create table #{schema_name}.historical_job_prerequisites
227
+ (
228
+ id bigserial not null primary key,
229
+ created_at timestamp not null default now(),
230
+ historical_job_id bigint not null, -- references #{schema_name}.historical_jobs,
231
+ prerequisite_historical_job_id bigint not null, -- references #{schema_name}.historical_jobs,
232
+ UNIQUE (historical_job_id, prerequisite_historical_job_id),
233
+ CHECK (historical_job_id <> prerequisite_historical_job_id)
234
+ );
235
+ create table #{schema_name}.historical_job_affinity_tabs
236
+ (
237
+ id bigserial not null primary key,
238
+ created_at timestamp not null default now(),
239
+ historical_job_id bigint not null, -- references #{schema_name}.historical_jobs,
240
+ affinity_id bigint not null references #{schema_name}.affinities,
241
+ affinity_parameter numeric null,
242
+ UNIQUE (historical_job_id, affinity_id)
243
+ );
244
+ create table #{schema_name}.queued_jobs
245
+ (
246
+ id bigint not null primary key, -- references #{schema_name}.historical_jobs
247
+ created_at timestamp not null default now(),
248
+ updated_at timestamp,
249
+
250
+ application_id integer null references #{schema_name}.applications,
251
+ application_type_id integer not null references #{schema_name}.application_types,
252
+ command text not null,
253
+
254
+ application_run_group_restriction_id integer not null references #{schema_name}.application_run_group_restrictions,
255
+ application_run_group_name text null,
256
+ application_run_group_limit integer null default 1,
257
+
258
+ priority integer not null default 0
259
+ );
260
+ create table #{schema_name}.running_jobs
261
+ (
262
+ id bigint not null primary key, -- references #{schema_name}.historical_jobs
263
+ created_at timestamp not null default now(),
264
+ updated_at timestamp,
265
+
266
+ application_id integer null references #{schema_name}.applications,
267
+ application_type_id integer not null references #{schema_name}.application_types,
268
+ command text not null,
269
+
270
+ application_run_group_restriction_id integer not null references #{schema_name}.application_run_group_restrictions,
271
+ application_run_group_name text null,
272
+ application_run_group_limit integer null default 1,
273
+
274
+ started_on_machine_id integer not null references #{schema_name}.machines,
275
+
276
+ started_at timestamp null,
277
+ pid integer null,
278
+
279
+ request_to_terminate boolean not null default false,
280
+
281
+ marked_dead_by_machine_id integer null references #{schema_name}.machines,
282
+ marked_dead_at timestamp null,
283
+
284
+ log_level text null
285
+ );
286
+ create table #{schema_name}.janitorial_assignments
287
+ (
288
+ id serial not null primary key,
289
+ created_at timestamp not null default now(),
290
+ updated_at timestamp,
291
+ type text not null,
292
+ enabled boolean not null default true,
293
+ deleted boolean not null default false,
294
+ model_name text not null, -- ::Naf::HistoricalJob
295
+ assignment_order integer not null default 0,
296
+ check (deleted = false OR enabled = false)
297
+ );
298
+ create table #{schema_name}.logger_styles
299
+ (
300
+ id serial not null primary key,
301
+ created_at timestamp not null default now(),
302
+ updated_at timestamp,
303
+ name text not null unique,
304
+ note text null
305
+ );
306
+ create table #{schema_name}.logger_names
307
+ (
308
+ id serial not null primary key,
309
+ created_at timestamp not null default now(),
310
+ updated_at timestamp,
311
+ name text not null unique
312
+ );
313
+ create table #{schema_name}.logger_levels
314
+ (
315
+ id serial not null primary key,
316
+ created_at timestamp not null default now(),
317
+ updated_at timestamp,
318
+ level text not null unique
319
+ );
320
+ insert into #{schema_name}.logger_levels (level) values
321
+ ('ALL'),
322
+ ('DEBUG'),
323
+ ('DEBUG_FINE'),
324
+ ('DEBUG_MEDIUM'),
325
+ ('DEBUG_GROSS'),
326
+ ('DETAIL'),
327
+ ('INFO'),
328
+ ('WARN'),
329
+ ('ALARM'),
330
+ ('ERROR'),
331
+ ('FATAL'),
332
+ ('OFF');
333
+ create table #{schema_name}.logger_style_names
334
+ (
335
+ id serial not null primary key,
336
+ created_at timestamp not null default now(),
337
+ updated_at timestamp,
338
+ logger_style_id integer not null references #{schema_name}.logger_styles,
339
+ logger_name_id integer not null references #{schema_name}.logger_names,
340
+ logger_level_id integer not null references #{schema_name}.logger_levels,
341
+ UNIQUE(logger_style_id, logger_name_id)
342
+ );
343
+ insert into #{schema_name}.janitorial_assignments (type, assignment_order, model_name) values
344
+ ('Naf::JanitorialCreateAssignment', 500, '::Naf::HistoricalJob'),
345
+ ('Naf::JanitorialDropAssignment', 500, '::Naf::HistoricalJob'),
346
+ ('Naf::JanitorialCreateAssignment', 125, '::Naf::HistoricalJobPrerequisite'),
347
+ ('Naf::JanitorialDropAssignment', 125, '::Naf::HistoricalJobPrerequisite'),
348
+ ('Naf::JanitorialCreateAssignment', 250, '::Naf::HistoricalJobAffinityTab'),
349
+ ('Naf::JanitorialDropAssignment', 250, '::Naf::HistoricalJobAffinityTab');
350
+
351
+ set search_path = 'public';
352
+
353
+ SQL
354
+ end
355
+
356
+ def down
357
+ schema_name = Naf.schema_name
358
+ execute <<-SQL
359
+ drop table #{schema_name}.janitorial_assignments cascade;
360
+ drop table #{schema_name}.historical_job_affinity_tabs cascade;
361
+ drop table #{schema_name}.historical_job_prerequisites cascade;
362
+ drop table #{schema_name}.historical_jobs cascade;
363
+ drop table #{schema_name}.running_jobs cascade;
364
+ drop table #{schema_name}.queued_jobs cascade;
365
+ drop table #{schema_name}.affinities cascade;
366
+ drop table #{schema_name}.affinity_classifications cascade;
367
+ drop table #{schema_name}.machines cascade;
368
+ drop table #{schema_name}.machine_runner_invocations cascade;
369
+ drop table #{schema_name}.machine_runners cascade;
370
+ drop table #{schema_name}.machine_affinity_slots cascade;
371
+ drop table #{schema_name}.applications cascade;
372
+ drop table #{schema_name}.application_types cascade;
373
+ drop table #{schema_name}.application_run_group_restrictions cascade;
374
+ drop table #{schema_name}.application_schedule_prerequisites cascade;
375
+ drop table #{schema_name}.application_schedules cascade;
376
+ drop table #{schema_name}.application_schedule_affinity_tabs cascade;
377
+ drop table #{schema_name}.logger_levels cascade;
378
+ drop table #{schema_name}.logger_names cascade;
379
+ drop table #{schema_name}.logger_styles cascade;
380
+ drop table #{schema_name}.logger_style_names cascade;
381
+ SQL
382
+
383
+ if schema_name != "public"
384
+ execute <<-SQL
385
+ do LANGUAGE plpgsql $$
386
+ begin
387
+ if (SELECT COUNT(*) FROM pg_tables WHERE schemaname = '#{schema_name}') > 0 THEN
388
+ raise notice 'Skipping drop of schema:: #{schema_name}, there are still other tables under it!';
389
+ else
390
+ raise notice 'Dropping schema #{schema_name}';
391
+ drop schema #{schema_name} cascade;
392
+ end if;
393
+ end;
394
+ $$;
395
+ SQL
396
+ end
397
+
398
+ schemas = execute <<-SQL
399
+ SELECT 'drop schema ' || nspname ||' cascade;'
400
+ FROM pg_namespace
401
+ WHERE nspname = 'naf_historical_job_affinity_tabs_partitions' OR
402
+ nspname = 'naf_historical_job_prerequisites_partitions' OR
403
+ nspname = 'naf_historical_jobs_partitions';
404
+ SQL
405
+
406
+ schemas.values.each do |schema|
407
+ execute <<-SQL
408
+ #{schema.first}
409
+ SQL
410
+ end
411
+
412
+ end
413
+ end