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,128 @@
1
+ require 'spec_helper'
2
+ module Naf
3
+ describe Application do
4
+ let!(:app) { FactoryGirl.create(:application) }
5
+
6
+ # Mass-assignment
7
+ [:title,
8
+ :command,
9
+ :application_type_id,
10
+ :log_level,
11
+ :short_name,
12
+ :deleted,
13
+ :application_schedule,
14
+ :application_schedule_attributes].each do |a|
15
+ it { should allow_mass_assignment_of(a) }
16
+ end
17
+
18
+ [:id,
19
+ :created_at,
20
+ :updated_at].each do |a|
21
+ it { should_not allow_mass_assignment_of(a) }
22
+ end
23
+
24
+ #---------------------
25
+ # *** Associations ***
26
+ #+++++++++++++++++++++
27
+
28
+ it { should belong_to(:application_type) }
29
+ it { should have_one(:application_schedule) }
30
+ it { should have_many(:historical_jobs) }
31
+
32
+ #--------------------
33
+ # *** Validations ***
34
+ #++++++++++++++++++++
35
+
36
+ it { should validate_presence_of(:application_type_id) }
37
+ it { should validate_presence_of(:command) }
38
+ it { should validate_presence_of(:title) }
39
+ it { should validate_uniqueness_of(:title) }
40
+ it { should validate_uniqueness_of(:short_name) }
41
+
42
+ ['', 'aa', 'aA', 'Aa', 'AA', '_a', 'a1', 'A1', '_9'].each do |v|
43
+ it { should allow_value(v).for(:short_name) }
44
+ end
45
+
46
+ ['1_', '3A', '9a'].each do |v|
47
+ it { should_not allow_value(v).for(:short_name) }
48
+ end
49
+
50
+ context "upon creation" do
51
+ let(:app_base) { FactoryGirl.build(:application_base, command: "::Naf::HistoricalJob.test hello_world",
52
+ title: "Test Hello World") }
53
+ let(:incomplete_app_base) { FactoryGirl.build( :application_base) }
54
+
55
+ it "should save with a command and title specified" do
56
+ app_base.save.should be_true
57
+ end
58
+
59
+ it "should not save without a command or a title" do
60
+ incomplete_app_base.save.should_not be_true
61
+ end
62
+
63
+ context "with regard to the title" do
64
+ it "should not save when another title is taken" do
65
+ app_2 = FactoryGirl.build(:application, title: app.title)
66
+ app_2.save.should_not be_true
67
+ app_2.should have(1).error_on(:title)
68
+ end
69
+ end
70
+ end
71
+
72
+ #--------------------
73
+ # *** Delegations ***
74
+ #++++++++++++++++++++
75
+
76
+ context "with regard to delegation" do
77
+ let(:application_type) { app.application_type }
78
+
79
+ it "should delegate the script_type_name" do
80
+ application_type.should_receive(:script_type_name)
81
+ app.script_type_name
82
+ end
83
+ end
84
+
85
+ #-------------------------
86
+ # *** Instance Methods ***
87
+ #+++++++++++++++++++++++++
88
+
89
+ describe "#to_s" do
90
+ before do
91
+ app.update_attributes!(title: 'App1')
92
+ end
93
+
94
+ it "return correct parsing of app" do
95
+ app.to_s.should == "::Naf::Application<id: #{app.id}, App1>"
96
+ end
97
+ end
98
+
99
+ describe "#last_queued_job" do
100
+ it "return correct queued job" do
101
+ queued_job1 = FactoryGirl.create(:queued_job, application_id: app.id)
102
+ queued_job1.historical_job.update_attributes!(application_id: app.id)
103
+ queued_job2 = FactoryGirl.create(:queued_job, application_id: app.id)
104
+ queued_job2.historical_job.update_attributes!(application_id: app.id)
105
+
106
+ app.last_queued_job.should == queued_job2.historical_job
107
+ end
108
+
109
+ it "return nil when there are no jobs" do
110
+ app.last_queued_job.should == nil
111
+ end
112
+ end
113
+
114
+ describe "#short_name_if_it_exist" do
115
+ it "return app's short_name" do
116
+ app.update_attributes!(short_name: 'App1')
117
+ app.short_name_if_it_exist.should == 'App1'
118
+ end
119
+
120
+ it "return app's title" do
121
+ app.short_name = nil
122
+ app.update_attributes!(title: 'Application 1')
123
+ app.short_name_if_it_exist.should == 'Application 1'
124
+ end
125
+ end
126
+
127
+ end
128
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ module Naf
4
+ describe ApplicationType do
5
+ let(:rails) { FactoryGirl.create(:rails_app_type) }
6
+ let(:bash_command) { FactoryGirl.create(:bash_command_app_type) }
7
+ let(:bash_script) { FactoryGirl.create(:bash_script_app_type) }
8
+ let(:ruby) { FactoryGirl.create(:ruby_script_app_type) }
9
+ let!(:job) { FactoryGirl.create(:job) }
10
+
11
+ # Mass-assignment
12
+ [:enabled,
13
+ :script_type_name,
14
+ :description,
15
+ :invocation_method].each do |a|
16
+ it { should allow_mass_assignment_of(a) }
17
+ end
18
+
19
+ [:id,
20
+ :created_at,
21
+ :updated_at].each do |a|
22
+ it { should_not allow_mass_assignment_of(a) }
23
+ end
24
+
25
+ #---------------------
26
+ # *** Associations ***
27
+ #+++++++++++++++++++++
28
+
29
+ it { should have_many(:applications) }
30
+ it { should have_many(:historical_jobs) }
31
+
32
+ #--------------------
33
+ # *** Validations ***
34
+ #++++++++++++++++++++
35
+
36
+ it { should validate_presence_of(:script_type_name) }
37
+ it { should validate_presence_of(:invocation_method) }
38
+
39
+ context "For a Rails Application" do
40
+ before do
41
+ job.application_type = rails
42
+ job.save!
43
+ end
44
+
45
+ it "has the starting id" do
46
+ rails.id.should == 1
47
+ end
48
+
49
+ it "should invoke the rails_invocator" do
50
+ rails.should_receive(:rails_invocator).and_return(nil)
51
+ job.spawn
52
+ end
53
+ end
54
+
55
+ context "For a bash command" do
56
+ before do
57
+ job.application_type = bash_command
58
+ job.save!
59
+ end
60
+
61
+ it "has the starting id" do
62
+ bash_command.id.should == 2
63
+ end
64
+
65
+ it "should invoke the bash_command_invocator" do
66
+ bash_command.should_receive(:bash_command_invocator).and_return(nil)
67
+ job.spawn
68
+ end
69
+ end
70
+
71
+ context "For a bash script" do
72
+ before do
73
+ job.application_type = bash_script
74
+ job.save!
75
+ end
76
+
77
+ it "has the starting id" do
78
+ bash_script.id.should == 3
79
+ end
80
+
81
+ it "should invoke the bash_script_invocator" do
82
+ bash_script.should_receive(:bash_script_invocator).and_return(nil)
83
+ job.spawn
84
+ end
85
+ end
86
+
87
+ context "For a ruby script" do
88
+ before do
89
+ job.application_type = ruby
90
+ job.save!
91
+ end
92
+
93
+ it "has the starting id" do
94
+ ruby.id.should == 4
95
+ end
96
+
97
+ it "should invoke the ruby_script_invocator" do
98
+ ruby.should_receive(:ruby_script_invocator).and_return(nil)
99
+ job.spawn
100
+ end
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module Naf
4
+ describe HistoricalJobAffinityTab do
5
+ let!(:historical_job_affinity_tab) { FactoryGirl.create(:normal_job_affinity_tab) }
6
+
7
+ # Mass-assignment
8
+ [:affinity_id,
9
+ :historical_job_id,
10
+ :historical_job,
11
+ :affinity_parameter].each do |a|
12
+ it { should allow_mass_assignment_of(a) }
13
+ end
14
+
15
+ [:id,
16
+ :created_at].each do |a|
17
+ it { should_not allow_mass_assignment_of(a) }
18
+ end
19
+
20
+ #---------------------
21
+ # *** Associations ***
22
+ #+++++++++++++++++++++
23
+
24
+ it { should belong_to(:affinity) }
25
+
26
+ #--------------------
27
+ # *** Validations ***
28
+ #++++++++++++++++++++
29
+
30
+ it { should validate_presence_of(:affinity_id) }
31
+
32
+ #----------------------
33
+ # *** Class Methods ***
34
+ #++++++++++++++++++++++
35
+
36
+ describe "#job" do
37
+ let(:job) { FactoryGirl.create(:job) }
38
+
39
+ it "return the correct job" do
40
+ historical_job_affinity_tab.historical_job_id = job.id
41
+ historical_job_affinity_tab.job.should == job
42
+ end
43
+ end
44
+
45
+ describe "#script_type_name" do
46
+ it "return the correct name" do
47
+ historical_job_affinity_tab.script_type_name.should == "rails"
48
+ end
49
+ end
50
+
51
+ describe "#command" do
52
+ it "return the correct command" do
53
+ historical_job_affinity_tab.command.
54
+ should == "::Naf::HistoricalJob.test hello world"
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ module Naf
4
+ describe HistoricalJobPrerequisite do
5
+
6
+ # Mass-assignment
7
+ [:historical_job_id,
8
+ :prerequisite_historical_job_id].each do |a|
9
+ it { should allow_mass_assignment_of(a) }
10
+ end
11
+
12
+ [:id,
13
+ :created_at].each do |a|
14
+ it { should_not allow_mass_assignment_of(a) }
15
+ end
16
+
17
+ #---------------------
18
+ # *** Associations ***
19
+ #+++++++++++++++++++++
20
+
21
+ it { should belong_to(:historical_job) }
22
+ it { should belong_to(:prerequisite_historical_job) }
23
+
24
+ end
25
+ end
@@ -0,0 +1,334 @@
1
+ require 'spec_helper'
2
+
3
+ module Naf
4
+ describe HistoricalJob do
5
+
6
+ before(:all) do
7
+ ::Naf::HistoricalJob.delete_all
8
+ end
9
+
10
+ let!(:historical_job) { FactoryGirl.create(:job) }
11
+
12
+ # Mass-assignment
13
+ [:application_id,
14
+ :application_type_id,
15
+ :command,
16
+ :application_run_group_restriction_id,
17
+ :application_run_group_name,
18
+ :application_run_group_limit,
19
+ :priority,
20
+ :started_on_machine_id,
21
+ :failed_to_start,
22
+ :pid,
23
+ :exit_status,
24
+ :termination_signal,
25
+ :state,
26
+ :request_to_terminate,
27
+ :marked_dead_by_machine_id,
28
+ :log_level,
29
+ :tags,
30
+ :machine_runner_invocation_id].each do |a|
31
+ it { should allow_mass_assignment_of(a) }
32
+ end
33
+
34
+ [:id,
35
+ :created_at,
36
+ :updated_at].each do |a|
37
+ it { should_not allow_mass_assignment_of(a) }
38
+ end
39
+
40
+ #---------------------
41
+ # *** Associations ***
42
+ #+++++++++++++++++++++
43
+
44
+ it { should belong_to(:application_type) }
45
+ it { should belong_to(:started_on_machine) }
46
+ it { should belong_to(:marked_dead_by_machine) }
47
+ it { should belong_to(:application) }
48
+ it { should belong_to(:application_run_group_restriction) }
49
+ it { should belong_to(:machine_runner_invocation) }
50
+ it { should have_many(:historical_job_prerequisites) }
51
+ it { should have_many(:prerequisites) }
52
+ it { should have_many(:historical_job_affinity_tabs) }
53
+ it { should have_many(:affinities) }
54
+
55
+ #--------------------
56
+ # *** Validations ***
57
+ #++++++++++++++++++++
58
+
59
+ it { should validate_presence_of(:application_type_id) }
60
+ it { should validate_presence_of(:command) }
61
+ it { should validate_presence_of(:application_run_group_restriction_id) }
62
+
63
+ [1, 100, 2147483646, ''].each do |v|
64
+ it { should allow_value(v).for(:application_run_group_limit) }
65
+ end
66
+
67
+ [0, 2147483647, 1.1].each do |v|
68
+ it { should_not allow_value(v).for(:application_run_group_limit) }
69
+ end
70
+
71
+ #----------------------
72
+ # *** Class Methods ***
73
+ #++++++++++++++++++++++
74
+
75
+ describe "#full_table_name_prefix" do
76
+ it "return the correct string" do
77
+ ::Naf::HistoricalJob.full_table_name_prefix.should == 'naf.'
78
+ end
79
+ end
80
+
81
+ describe "#queued_between" do
82
+ before do
83
+ FactoryGirl.create(:job, created_at: Time.zone.now - 5.minutes)
84
+ end
85
+
86
+ it "return the correct queued job" do
87
+ ::Naf::HistoricalJob.queued_between(Time.zone.now - 1.minutes, Time.zone.now).
88
+ should == [historical_job]
89
+ end
90
+ end
91
+
92
+ describe "#canceled" do
93
+ it "return jobs requested to terminate" do
94
+ historical_job.update_attributes!(request_to_terminate: true)
95
+ ::Naf::HistoricalJob.canceled.should == [historical_job]
96
+ end
97
+
98
+ it "return nil when no jobs have been requested to terminate" do
99
+ ::Naf::HistoricalJob.canceled.should == []
100
+ end
101
+ end
102
+
103
+ describe "#application_last_runs" do
104
+ before do
105
+ historical_job.update_attributes!(application_id: FactoryGirl.create(:application).id)
106
+ end
107
+
108
+ it "return job when it finished running" do
109
+ historical_job.finished_at = Time.zone.now
110
+ historical_job.save!
111
+ ::Naf::HistoricalJob.application_last_runs.first.application.should == historical_job.application
112
+ end
113
+
114
+ it "return nil when job has not finished running" do
115
+ ::Naf::HistoricalJob.application_last_runs.should == []
116
+ end
117
+ end
118
+
119
+ describe "#application_last_queued" do
120
+ let(:historical_job2) { FactoryGirl.create(:job) }
121
+ before do
122
+ application = FactoryGirl.create(:application)
123
+ historical_job.update_attributes!(application_id: application.id)
124
+ historical_job2.update_attributes!(application_id: application.id)
125
+ end
126
+
127
+ it "return correct application id" do
128
+ ::Naf::HistoricalJob.application_last_queued.first.should == historical_job2
129
+ end
130
+ end
131
+
132
+ describe "#finished" do
133
+ it "return jobs that have finished running" do
134
+ historical_job.finished_at = Time.zone.now
135
+ historical_job.save!
136
+ ::Naf::HistoricalJob.finished.should == [historical_job]
137
+ end
138
+
139
+ it "return jobs requested to terminate" do
140
+ historical_job.update_attributes!(request_to_terminate: true)
141
+ ::Naf::HistoricalJob.finished.should == [historical_job]
142
+ end
143
+
144
+ it "return nil when no jobs have been requested to terminate or have finished running" do
145
+ ::Naf::HistoricalJob.finished.should == []
146
+ end
147
+ end
148
+
149
+ describe "#queued_status" do
150
+ let(:historical_job2) { FactoryGirl.create(:job, finished_at: Time.zone.now) }
151
+ let(:historical_job3) { FactoryGirl.create(:job, started_at: Time.zone.now) }
152
+
153
+ it "return correct jobs" do
154
+ FactoryGirl.create(:job, request_to_terminate: true)
155
+ ::Naf::HistoricalJob.queued_status.
156
+ order(:id).should == [historical_job, historical_job2, historical_job3]
157
+ end
158
+ end
159
+
160
+ describe "#running_status" do
161
+ let(:historical_job2) { FactoryGirl.create(:job, finished_at: Time.zone.now) }
162
+
163
+ it "return correct jobs" do
164
+ historical_job.started_at = Time.zone.now
165
+ historical_job.save!
166
+ FactoryGirl.create(:job, request_to_terminate: true)
167
+
168
+ ::Naf::HistoricalJob.running_status.
169
+ order(:id).should == [historical_job, historical_job2]
170
+ end
171
+ end
172
+
173
+ describe "#queued_with_waiting" do
174
+ it "return correct jobs" do
175
+ FactoryGirl.create(:job, request_to_terminate: true)
176
+ ::Naf::HistoricalJob.queued_with_waiting.
177
+ order(:id).should == [historical_job]
178
+ end
179
+ end
180
+
181
+ describe "#errored" do
182
+ let(:historical_job2) { FactoryGirl.create(:job, request_to_terminate: true) }
183
+ let(:historical_job3) { FactoryGirl.create(:job, finished_at: Time.zone.now,
184
+ exit_status: 1) }
185
+
186
+ it "return correct jobs" do
187
+ ::Naf::HistoricalJob.errored.
188
+ order(:id).should == [historical_job2, historical_job3]
189
+ end
190
+ end
191
+
192
+ #-------------------------
193
+ # *** Instance Methods ***
194
+ #+++++++++++++++++++++++++
195
+
196
+ describe "#to_s" do
197
+ before do
198
+ historical_job.update_attributes!(command: "puts 'hi'")
199
+ end
200
+
201
+ it "return correct parsing of app" do
202
+ historical_job.to_s.should == "::Naf::HistoricalJob<QUEUED, id: #{historical_job.id}, \"puts \'hi\'\">"
203
+ end
204
+ end
205
+
206
+ describe "#title" do
207
+ it "return correct application title when present" do
208
+ historical_job.application = FactoryGirl.create(:application, title: 'App1')
209
+ historical_job.title.should == 'App1'
210
+ end
211
+
212
+ it "return nil when application not present" do
213
+ historical_job.title.should == nil
214
+ end
215
+ end
216
+
217
+ describe "#machine_started_on_server_name" do
218
+ it "return correct machine server name when present" do
219
+ historical_job.started_on_machine = FactoryGirl.create(:machine, server_name: 'Machine1')
220
+ historical_job.machine_started_on_server_name.should == 'Machine1'
221
+ end
222
+
223
+ it "return nil when machine not present" do
224
+ historical_job.machine_started_on_server_name.should == nil
225
+ end
226
+ end
227
+
228
+ describe "#machine_started_on_server_address" do
229
+ it "return correct machine server name when present" do
230
+ historical_job.started_on_machine = FactoryGirl.create(:machine)
231
+ historical_job.machine_started_on_server_address.should == '0.0.0.1'
232
+ end
233
+
234
+ it "return nil when machine not present" do
235
+ historical_job.machine_started_on_server_address.should == nil
236
+ end
237
+ end
238
+
239
+ describe "#historical_job_affinity_tabs" do
240
+ it "return affinity tabs associated with historical_job" do
241
+ affinity_tab = FactoryGirl.create(:normal_job_affinity_tab, historical_job: historical_job)
242
+ historical_job.historical_job_affinity_tabs.should == [affinity_tab]
243
+ end
244
+ end
245
+
246
+ describe "#job_affinities" do
247
+ it "return affinities associated with historical_job" do
248
+ affinity_tab = FactoryGirl.create(:normal_job_affinity_tab, historical_job: historical_job)
249
+ historical_job.job_affinities.should == [affinity_tab.affinity]
250
+ end
251
+ end
252
+
253
+ describe "#affinity_ids" do
254
+ it "return affinities associated with historical_job" do
255
+ affinity_tab = FactoryGirl.create(:normal_job_affinity_tab, historical_job: historical_job)
256
+ historical_job.affinity_ids.should == [affinity_tab.affinity.id]
257
+ end
258
+ end
259
+
260
+ describe "#historical_job_prerequisites" do
261
+ it "return historical job prerequisites associated with historical_job" do
262
+ historical_job_prerequesite = FactoryGirl.
263
+ create(:historical_job_prerequesite, historical_job: historical_job,
264
+ prerequisite_historical_job: FactoryGirl.create(:job))
265
+ historical_job.historical_job_prerequisites.should == [historical_job_prerequesite]
266
+ end
267
+ end
268
+
269
+ describe "#prerequisites" do
270
+ it "return prerequisites associated with historical_job" do
271
+ prerequisite = FactoryGirl.create(:job)
272
+ historical_job_prerequesite = FactoryGirl.
273
+ create(:historical_job_prerequesite, historical_job: historical_job,
274
+ prerequisite_historical_job: prerequisite)
275
+ historical_job.prerequisites.should == [prerequisite]
276
+ end
277
+ end
278
+
279
+ describe "#verify_prerequisites" do
280
+ it "not raise error when job is not in a prerequisite loop" do
281
+ historical_job2 = FactoryGirl.create(:job)
282
+ expect { historical_job.verify_prerequisites([historical_job2]) }.not_to raise_error
283
+ end
284
+
285
+ it "raise an error when job is in a prerequesite loop" do
286
+ expect { historical_job.verify_prerequisites([historical_job]) }.to raise_error
287
+ end
288
+ end
289
+
290
+ describe "#add_tags" do
291
+ before do
292
+ historical_job.tags = "{$pre-work}"
293
+ end
294
+
295
+ it "insert unique tag" do
296
+ historical_job.add_tags([::Naf::HistoricalJob::SYSTEM_TAGS[:work]])
297
+ historical_job.tags.should == "{$pre-work,$work}"
298
+ end
299
+
300
+ it "not insert non-unique tag" do
301
+ historical_job.add_tags([::Naf::HistoricalJob::SYSTEM_TAGS[:pre_work]])
302
+ historical_job.tags.should == "{$pre-work}"
303
+ end
304
+ end
305
+
306
+ describe "#remove_tags" do
307
+ before do
308
+ historical_job.tags = "{$pre-work}"
309
+ end
310
+
311
+ it "remove existing tag" do
312
+ historical_job.remove_tags([::Naf::HistoricalJob::SYSTEM_TAGS[:pre_work]])
313
+ historical_job.tags.should == "{}"
314
+ end
315
+
316
+ it "not update tags when removing non-existing tag" do
317
+ historical_job.remove_tags([::Naf::HistoricalJob::SYSTEM_TAGS[:work]])
318
+ historical_job.tags.should == "{$pre-work}"
319
+ end
320
+ end
321
+
322
+ describe "#remove_all_tags" do
323
+ before do
324
+ historical_job.tags = "{$pre-work}"
325
+ end
326
+
327
+ it "remove any existing tags" do
328
+ historical_job.remove_all_tags
329
+ historical_job.tags.should == "{}"
330
+ end
331
+ end
332
+
333
+ end
334
+ end