naf 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +16 -0
- data/.rspec +1 -0
- data/.travis.yml +17 -0
- data/Gemfile +17 -0
- data/LICENSE +2 -0
- data/README.rdoc +22 -0
- data/RELEASE_NOTES.rdoc +18 -0
- data/Rakefile +43 -0
- data/app/assets/images/bg-grad.png +0 -0
- data/app/assets/images/clock.png +0 -0
- data/app/assets/images/control_play_blue.png +0 -0
- data/app/assets/images/down_arrow.gif +0 -0
- data/app/assets/images/papertrail_job.png +0 -0
- data/app/assets/images/papertrail_machine.png +0 -0
- data/app/assets/images/papertrail_machine_runner.png +0 -0
- data/app/assets/images/terminate.png +0 -0
- data/app/assets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_0_ffffff_40x100.png +0 -0
- data/app/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/images/ui-bg_glass_0_f4f4f4_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_65_f4f4f4_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_75_f4f4f4_1x400.png +0 -0
- data/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/app/assets/images/ui-bg_highlight-soft_0_f4f4f4_1x100.png +0 -0
- data/app/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/app/assets/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/ui-icons_888888_256x240.png +0 -0
- data/app/assets/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/images/up_arrow.gif +0 -0
- data/app/assets/javascripts/dataTablesTemplates/applications.js +94 -0
- data/app/assets/javascripts/dataTablesTemplates/jobs.js +163 -0
- data/app/assets/javascripts/dataTablesTemplates/machine_runner_invocations.js +60 -0
- data/app/assets/javascripts/dataTablesTemplates/machine_runners.js +82 -0
- data/app/assets/javascripts/dataTablesTemplates/machines.js +93 -0
- data/app/assets/javascripts/date.js +104 -0
- data/app/assets/javascripts/iso8601.js +41 -0
- data/app/assets/javascripts/jquery.dataTables.custom.js +62 -0
- data/app/assets/javascripts/jquery.dataTables.js +6862 -0
- data/app/assets/javascripts/naf.js +30 -0
- data/app/assets/javascripts/underscore.js +713 -0
- data/app/assets/stylesheets/jquery_ui/jquery-ui-1.8.5.custom.css.erb +572 -0
- data/app/assets/stylesheets/min_naf.css +14 -0
- data/app/assets/stylesheets/min_naf/layout.css.scss +355 -0
- data/app/assets/stylesheets/naf.css +14 -0
- data/app/assets/stylesheets/naf/layout.css.scss +497 -0
- data/app/controllers/naf/affinities_controller.rb +61 -0
- data/app/controllers/naf/application_controller.rb +43 -0
- data/app/controllers/naf/application_schedule_affinity_tabs_controller.rb +75 -0
- data/app/controllers/naf/applications_controller.rb +153 -0
- data/app/controllers/naf/historical_job_affinity_tabs_controller.rb +65 -0
- data/app/controllers/naf/historical_jobs_controller.rb +159 -0
- data/app/controllers/naf/janitorial_assignments_controller.rb +77 -0
- data/app/controllers/naf/logger_names_controller.rb +58 -0
- data/app/controllers/naf/logger_styles_controller.rb +59 -0
- data/app/controllers/naf/machine_affinity_slots_controller.rb +69 -0
- data/app/controllers/naf/machine_runner_invocations_controller.rb +59 -0
- data/app/controllers/naf/machine_runners_controller.rb +26 -0
- data/app/controllers/naf/machines_controller.rb +95 -0
- data/app/helpers/naf/application_helper.rb +275 -0
- data/app/models/log4r/papertrail_outputter.rb +19 -0
- data/app/models/logical/naf/application.rb +183 -0
- data/app/models/logical/naf/construction_zone/ad_hoc_work_order.rb +22 -0
- data/app/models/logical/naf/construction_zone/application_schedule_work_order.rb +15 -0
- data/app/models/logical/naf/construction_zone/application_work_order.rb +25 -0
- data/app/models/logical/naf/construction_zone/boss.rb +123 -0
- data/app/models/logical/naf/construction_zone/foreman.rb +53 -0
- data/app/models/logical/naf/construction_zone/proletariat.rb +40 -0
- data/app/models/logical/naf/construction_zone/work_order.rb +100 -0
- data/app/models/logical/naf/create_infrastructure.rb +48 -0
- data/app/models/logical/naf/job.rb +357 -0
- data/app/models/logical/naf/job_creator.rb +155 -0
- data/app/models/logical/naf/job_fetcher.rb +167 -0
- data/app/models/logical/naf/job_statuses/errored.rb +27 -0
- data/app/models/logical/naf/job_statuses/finished.rb +26 -0
- data/app/models/logical/naf/job_statuses/finished_less_minute.rb +25 -0
- data/app/models/logical/naf/job_statuses/queued.rb +32 -0
- data/app/models/logical/naf/job_statuses/running.rb +34 -0
- data/app/models/logical/naf/job_statuses/terminated.rb +25 -0
- data/app/models/logical/naf/job_statuses/waiting.rb +43 -0
- data/app/models/logical/naf/machine.rb +85 -0
- data/app/models/logical/naf/machine_runner.rb +46 -0
- data/app/models/logical/naf/machine_runner_invocation.rb +50 -0
- data/app/models/logical/naf/pickler.rb +74 -0
- data/app/models/logical/naf/unpickler.rb +98 -0
- data/app/models/naf/affinity.rb +145 -0
- data/app/models/naf/affinity_classification.rb +44 -0
- data/app/models/naf/application.rb +100 -0
- data/app/models/naf/application_run_group_restriction.rb +39 -0
- data/app/models/naf/application_schedule.rb +181 -0
- data/app/models/naf/application_schedule_affinity_tab.rb +86 -0
- data/app/models/naf/application_schedule_prerequisite.rb +50 -0
- data/app/models/naf/application_type.rb +72 -0
- data/app/models/naf/by_historical_job_id.rb +86 -0
- data/app/models/naf/historical_job.rb +334 -0
- data/app/models/naf/historical_job_affinity_tab.rb +61 -0
- data/app/models/naf/historical_job_prerequisite.rb +19 -0
- data/app/models/naf/janitorial_archive_assignment.rb +36 -0
- data/app/models/naf/janitorial_assignment.rb +37 -0
- data/app/models/naf/janitorial_create_assignment.rb +36 -0
- data/app/models/naf/janitorial_drop_assignment.rb +36 -0
- data/app/models/naf/logger_level.rb +21 -0
- data/app/models/naf/logger_name.rb +23 -0
- data/app/models/naf/logger_style.rb +58 -0
- data/app/models/naf/logger_style_name.rb +28 -0
- data/app/models/naf/machine.rb +257 -0
- data/app/models/naf/machine_affinity_slot.rb +78 -0
- data/app/models/naf/machine_runner.rb +51 -0
- data/app/models/naf/machine_runner_invocation.rb +71 -0
- data/app/models/naf/naf_base.rb +9 -0
- data/app/models/naf/queued_job.rb +164 -0
- data/app/models/naf/running_job.rb +80 -0
- data/app/models/process/naf/application.rb +164 -0
- data/app/models/process/naf/janitor.rb +117 -0
- data/app/models/process/naf/machine_manager.rb +150 -0
- data/app/models/process/naf/machine_upgrader.rb +112 -0
- data/app/models/process/naf/runner.rb +539 -0
- data/app/views/naf/affinities/_form.html.erb +50 -0
- data/app/views/naf/affinities/edit.html.erb +11 -0
- data/app/views/naf/affinities/index.html.erb +57 -0
- data/app/views/naf/affinities/new.html.erb +15 -0
- data/app/views/naf/affinities/show.html.erb +48 -0
- data/app/views/naf/application_schedule_affinity_tabs/_form.html.erb +31 -0
- data/app/views/naf/application_schedule_affinity_tabs/edit.html.erb +12 -0
- data/app/views/naf/application_schedule_affinity_tabs/new.html.erb +11 -0
- data/app/views/naf/applications/_application_schedule.html.erb +80 -0
- data/app/views/naf/applications/_application_schedule_prerequisites.html.erb +14 -0
- data/app/views/naf/applications/_form.html.erb +109 -0
- data/app/views/naf/applications/_search_container.html.erb +94 -0
- data/app/views/naf/applications/_show.html.erb +34 -0
- data/app/views/naf/applications/edit.html.erb +11 -0
- data/app/views/naf/applications/index.html.erb +51 -0
- data/app/views/naf/applications/index.json.erb +11 -0
- data/app/views/naf/applications/new.html.erb +11 -0
- data/app/views/naf/applications/show.html.erb +203 -0
- data/app/views/naf/datatable.html.erb +49 -0
- data/app/views/naf/historical_job_affinity_tabs/_form.html.erb +36 -0
- data/app/views/naf/historical_job_affinity_tabs/edit.html.erb +11 -0
- data/app/views/naf/historical_job_affinity_tabs/new.html.erb +11 -0
- data/app/views/naf/historical_jobs/_form.html.erb +94 -0
- data/app/views/naf/historical_jobs/_runners.html.erb +22 -0
- data/app/views/naf/historical_jobs/_search_container.html.erb +140 -0
- data/app/views/naf/historical_jobs/edit.html.erb +11 -0
- data/app/views/naf/historical_jobs/index.html.erb +48 -0
- data/app/views/naf/historical_jobs/index.json.erb +26 -0
- data/app/views/naf/historical_jobs/new.html.erb +61 -0
- data/app/views/naf/historical_jobs/show.html.erb +201 -0
- data/app/views/naf/janitorial_assignments/_form.html.erb +38 -0
- data/app/views/naf/janitorial_assignments/_rows.html.erb +17 -0
- data/app/views/naf/janitorial_assignments/edit.html.erb +11 -0
- data/app/views/naf/janitorial_assignments/index.html.erb +56 -0
- data/app/views/naf/janitorial_assignments/index.js.erb +1 -0
- data/app/views/naf/janitorial_assignments/new.html.erb +11 -0
- data/app/views/naf/layouts/jquery_datatables.json.erb +6 -0
- data/app/views/naf/logger_names/_form.html.erb +18 -0
- data/app/views/naf/logger_names/edit.html.erb +11 -0
- data/app/views/naf/logger_names/new.html.erb +11 -0
- data/app/views/naf/logger_names/show.html.erb +44 -0
- data/app/views/naf/logger_styles/_form.html.erb +30 -0
- data/app/views/naf/logger_styles/_logger_style_names.html.erb +19 -0
- data/app/views/naf/logger_styles/edit.html.erb +11 -0
- data/app/views/naf/logger_styles/new.html.erb +11 -0
- data/app/views/naf/logger_styles/show.html.erb +48 -0
- data/app/views/naf/machine_affinity_slots/_form.html.erb +36 -0
- data/app/views/naf/machine_affinity_slots/edit.html.erb +11 -0
- data/app/views/naf/machine_affinity_slots/new.html.erb +11 -0
- data/app/views/naf/machine_runner_invocations/_filter.html.erb +21 -0
- data/app/views/naf/machine_runner_invocations/index.html.erb +36 -0
- data/app/views/naf/machine_runner_invocations/index.json.erb +16 -0
- data/app/views/naf/machine_runner_invocations/show.html.erb +91 -0
- data/app/views/naf/machine_runners/index.html.erb +82 -0
- data/app/views/naf/machine_runners/index.json.erb +16 -0
- data/app/views/naf/machine_runners/show.html.erb +113 -0
- data/app/views/naf/machines/_filter.html.erb +26 -0
- data/app/views/naf/machines/_form.html.erb +62 -0
- data/app/views/naf/machines/_show.html.erb +169 -0
- data/app/views/naf/machines/edit.html.erb +11 -0
- data/app/views/naf/machines/index.html.erb +51 -0
- data/app/views/naf/machines/index.json.erb +23 -0
- data/app/views/naf/machines/new.html.erb +11 -0
- data/app/views/naf/machines/show.html.erb +92 -0
- data/app/views/naf/record.html.erb +46 -0
- data/app/views/naf/shared/_application.html.erb +50 -0
- data/app/views/naf/shared/_information_container.html.erb +19 -0
- data/app/views/naf/shared/_select_per_page.html.erb +72 -0
- data/ci/test-build.sh +17 -0
- data/ci/travis.sh +26 -0
- data/config/initializers/naf.rb +3 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20120820023848_naf_schema.rb +413 -0
- data/doc/README_FOR_APP +2 -0
- data/lib/generators/naf_generator.rb +45 -0
- data/lib/generators/templates/config/logging/af.yml +26 -0
- data/lib/generators/templates/config/logging/naf.yml +22 -0
- data/lib/generators/templates/config/logging/nafjob.yml +16 -0
- data/lib/generators/templates/config/logging/nafrunner.yml +17 -0
- data/lib/generators/templates/naf.rb +11 -0
- data/lib/generators/templates/naf_layout.html.erb +15 -0
- data/lib/naf.rb +48 -0
- data/lib/naf/configuration.rb +23 -0
- data/lib/naf/engine.rb +18 -0
- data/lib/naf/version.rb +3 -0
- data/lib/tasks/naf_tasks.rake +370 -0
- data/naf.gemspec +30 -0
- data/script/rails +10 -0
- data/spec/controllers/naf/affinities_controller_spec.rb +79 -0
- data/spec/controllers/naf/application_controller_spec.rb +10 -0
- data/spec/controllers/naf/application_schedule_affinity_tabs_controller_spec.rb +106 -0
- data/spec/controllers/naf/applications_controller_spec.rb +109 -0
- data/spec/controllers/naf/historical_job_affinity_tabs_controller_spec.rb +96 -0
- data/spec/controllers/naf/historical_jobs_controller_spec.rb +19 -0
- data/spec/controllers/naf/machine_affinity_slots_controller_spec.rb +109 -0
- data/spec/controllers/naf/machines_controller_spec.rb +74 -0
- data/spec/dummy/.gitignore +12 -0
- data/spec/dummy/README +19 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +16 -0
- data/spec/dummy/app/assets/stylesheets/application.css +14 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/my_script.rb +8 -0
- data/spec/dummy/app/models/other/base.rb.sample +10 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/app/views/layouts/naf_layout.html.erb +15 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +62 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database-non_primary.yml +20 -0
- data/spec/dummy/config/database-primary.yml +16 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/naf.rb.non_primary +4 -0
- data/spec/dummy/config/initializers/naf.rb.primary +3 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/logging/af.yml +26 -0
- data/spec/dummy/config/logging/naf.yml +22 -0
- data/spec/dummy/config/logging/nafjob.yml +16 -0
- data/spec/dummy/config/logging/nafrunner.yml +17 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/db/.gitignore +2 -0
- data/spec/dummy/lib/tasks/dummy.rake +60 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/factories/naf.rb +433 -0
- data/spec/helpers/naf/application_helper_spec.rb +0 -0
- data/spec/models/logical/naf/application_spec.rb +69 -0
- data/spec/models/logical/naf/job_creator_spec.rb +32 -0
- data/spec/models/logical/naf/job_fetcher_spec.rb +140 -0
- data/spec/models/logical/naf/job_spec.rb +282 -0
- data/spec/models/logical/naf/machine_spec.rb +61 -0
- data/spec/models/naf/affinity_classification_spec.rb +56 -0
- data/spec/models/naf/affinity_spec.rb +100 -0
- data/spec/models/naf/application_run_group_restriction_spec.rb +57 -0
- data/spec/models/naf/application_schedule_affinity_tab_spec.rb +85 -0
- data/spec/models/naf/application_schedule_prerequisite_spec.rb +35 -0
- data/spec/models/naf/application_schedule_spec.rb +166 -0
- data/spec/models/naf/application_spec.rb +128 -0
- data/spec/models/naf/application_type_spec.rb +104 -0
- data/spec/models/naf/historical_job_affinity_tab_spec.rb +59 -0
- data/spec/models/naf/historical_job_prerequisite_spec.rb +25 -0
- data/spec/models/naf/historical_job_spec.rb +334 -0
- data/spec/models/naf/logger_level_spec.rb +34 -0
- data/spec/models/naf/logger_name_spec.rb +35 -0
- data/spec/models/naf/logger_style_name_spec.rb +39 -0
- data/spec/models/naf/logger_style_spec.rb +89 -0
- data/spec/models/naf/machine_affinity_slot_spec.rb +77 -0
- data/spec/models/naf/machine_runner_invocation_spec.rb +38 -0
- data/spec/models/naf/machine_runner_spec.rb +37 -0
- data/spec/models/naf/machine_spec.rb +425 -0
- data/spec/models/naf/naf_base_spec.rb +14 -0
- data/spec/models/naf/queued_job_spec.rb +171 -0
- data/spec/models/naf/running_job_spec.rb +107 -0
- data/spec/models/process/naf/application_spec.rb +8 -0
- data/spec/models/process/naf/janitor_spec.rb +10 -0
- data/spec/models/process/naf/runner_spec.rb +10 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/support/engine_routing.rb +27 -0
- data/spec/support/script_spec_helper.rb +58 -0
- metadata +590 -0
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'log4r/formatter/patternformatter'
|
2
|
+
|
3
|
+
module Process::Naf
|
4
|
+
class Application < ::Af::Application
|
5
|
+
class TerminationRequest < StandardError
|
6
|
+
attr_reader :job, :reason
|
7
|
+
def initialize(job, reason)
|
8
|
+
@job = job
|
9
|
+
@reason = reason
|
10
|
+
super("Requested to terminate: #{reason}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#----------------
|
15
|
+
# *** Options ***
|
16
|
+
#+++++++++++++++++
|
17
|
+
|
18
|
+
opt :naf_job_id,
|
19
|
+
"#{::Naf.schema_name}.historical_jobs.id for communication with scheduling system",
|
20
|
+
env: "NAF_JOB_ID",
|
21
|
+
type: :int
|
22
|
+
opt :do_not_terminate,
|
23
|
+
"refuse to terminate by job and machine IPC mechanics"
|
24
|
+
|
25
|
+
def initialize
|
26
|
+
super
|
27
|
+
opt :log_configuration_files, default: ["af.yml",
|
28
|
+
"af-#{Rails.env}.yml",
|
29
|
+
"naf.yml",
|
30
|
+
"naf-#{Rails.env}.yml",
|
31
|
+
"nafjob.yml",
|
32
|
+
"nafjob-#{Rails.env}.yml",
|
33
|
+
"#{af_name}.yml",
|
34
|
+
"#{af_name}-#{Rails.env}.yml"]
|
35
|
+
end
|
36
|
+
|
37
|
+
def database_application_name
|
38
|
+
return "//pid=#{Process.pid}/jid=#{@naf_job_id}/#{af_name}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def fetch_naf_job
|
42
|
+
if @naf_job_id.is_a?(Integer) && @naf_job_id > 0
|
43
|
+
return ::Naf::HistoricalJob.from_partition(@naf_job_id).find(@naf_job_id)
|
44
|
+
end
|
45
|
+
return nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def post_command_line_parsing
|
49
|
+
super
|
50
|
+
Af::Logging::Configurator.log_ignore_configuration = (naf_job_id.blank? && Af::Logging::Configurator.log_console != false)
|
51
|
+
end
|
52
|
+
|
53
|
+
def pre_work
|
54
|
+
set_connection_application_name(database_application_name)
|
55
|
+
|
56
|
+
Log4r::GDC.set(naf_job_id.to_s)
|
57
|
+
|
58
|
+
super
|
59
|
+
|
60
|
+
update_job_status
|
61
|
+
end
|
62
|
+
|
63
|
+
def update_job_status
|
64
|
+
periodic_application_checkpoint
|
65
|
+
|
66
|
+
job = fetch_naf_job
|
67
|
+
if job
|
68
|
+
unless @do_not_terminate
|
69
|
+
if job.request_to_terminate
|
70
|
+
logger.warn "terminating by request"
|
71
|
+
raise TerminationRequest.new(job, "job requested to terminate")
|
72
|
+
end
|
73
|
+
unless job.started_on_machine
|
74
|
+
logger.alarm "terminating: #{job.started_on_machine} is misconfigured"
|
75
|
+
raise TerminationRequest.new(job, "machine not configured correctly")
|
76
|
+
end
|
77
|
+
unless job.started_on_machine.enabled
|
78
|
+
logger.alarm "terminating: #{job.started_on_machine} is disabled"
|
79
|
+
raise TerminationRequest.new(job, "machine disabled")
|
80
|
+
end
|
81
|
+
if job.started_on_machine.marked_down
|
82
|
+
logger.alarm "terminating: #{job.started_on_machine} is marked down"
|
83
|
+
raise TerminationRequest.new(job, "machine marked down")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
if job.log_level != @last_log_level
|
87
|
+
@last_log_level = job.log_level
|
88
|
+
unless @last_log_level.blank?
|
89
|
+
logging_configurator.parse_and_set_logger_levels(@last_log_level)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def job_tag_block(*tags, &block)
|
96
|
+
job = fetch_naf_job
|
97
|
+
begin
|
98
|
+
if job
|
99
|
+
add_job_tags(*tags)
|
100
|
+
end
|
101
|
+
yield if block.present?
|
102
|
+
ensure
|
103
|
+
if job
|
104
|
+
remove_job_tags(*tags)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def update_job_tags(old_tags, new_tags)
|
110
|
+
job = fetch_naf_job
|
111
|
+
if job
|
112
|
+
job.remove_tags(old_tags.map(&:to_s))
|
113
|
+
job.add_tags(new_tags.map(&:to_s))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def add_job_tags(*new_tags)
|
118
|
+
update_job_tags([], new_tags)
|
119
|
+
end
|
120
|
+
|
121
|
+
def remove_job_tags(*old_tags)
|
122
|
+
update_job_tags(old_tags, [])
|
123
|
+
end
|
124
|
+
|
125
|
+
def work
|
126
|
+
end
|
127
|
+
|
128
|
+
module Component
|
129
|
+
def self.included(base)
|
130
|
+
base.send(:include, ::Af::Application::Component)
|
131
|
+
base.extend(ClassMethods)
|
132
|
+
end
|
133
|
+
|
134
|
+
module ClassMethods
|
135
|
+
# XXX not used yet
|
136
|
+
end
|
137
|
+
|
138
|
+
def fetch_naf_job
|
139
|
+
return af_application.try(:fetch_naf_job)
|
140
|
+
end
|
141
|
+
|
142
|
+
def update_job_status
|
143
|
+
return af_application.try(:update_job_status)
|
144
|
+
end
|
145
|
+
|
146
|
+
def job_tag_block(*tags, &block)
|
147
|
+
return af_application.try(:job_tag_block, *tags, &block)
|
148
|
+
end
|
149
|
+
|
150
|
+
def update_job_tags(old_tags, new_tags)
|
151
|
+
return af_application.try(:update_job_tags, old_tags, new_tags)
|
152
|
+
end
|
153
|
+
|
154
|
+
def add_job_tags(*new_tags)
|
155
|
+
return af_application.try(:add_job_tags, *new_tags)
|
156
|
+
end
|
157
|
+
|
158
|
+
def remove_job_tags(*old_tags)
|
159
|
+
return af_application.try(:remove_job_tags, *old_tags)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
module Process::Naf
|
2
|
+
class Janitor < ::Process::Naf::Application
|
3
|
+
ASSIGNMENTS = {
|
4
|
+
creates: ::Naf::JanitorialCreateAssignment,
|
5
|
+
archives: ::Naf::JanitorialArchiveAssignment,
|
6
|
+
drops: ::Naf::JanitorialDropAssignment
|
7
|
+
}
|
8
|
+
ASSIGNMENT_TYPES = ASSIGNMENTS.keys
|
9
|
+
|
10
|
+
#----------------
|
11
|
+
# *** Options ***
|
12
|
+
#+++++++++++++++++
|
13
|
+
|
14
|
+
opt :no_writes,
|
15
|
+
"don't modify database"
|
16
|
+
opt :list_assignments,
|
17
|
+
"list models that would be processed (and exit without processing)",
|
18
|
+
short: :L
|
19
|
+
|
20
|
+
# the following three opt are in specific order because the last sets the default
|
21
|
+
opt :all,
|
22
|
+
"process all models",
|
23
|
+
short: :a,
|
24
|
+
var: :assignments,
|
25
|
+
set: :all
|
26
|
+
opt :assignment,
|
27
|
+
"process specific assignment(s)",
|
28
|
+
short: :j,
|
29
|
+
var: :assignments,
|
30
|
+
type: :ints
|
31
|
+
opt :all_enabled,
|
32
|
+
"process all enabled models",
|
33
|
+
short: :E,
|
34
|
+
var: :assignments,
|
35
|
+
set: :all_enabled,
|
36
|
+
default: :all_enabled
|
37
|
+
|
38
|
+
# the following two opt are in specific order because the last sets the default
|
39
|
+
opt :all_types,
|
40
|
+
"process all assignment types",
|
41
|
+
short: :A,
|
42
|
+
var: :assignment_types,
|
43
|
+
set: ASSIGNMENT_TYPES
|
44
|
+
opt :assignment_type,
|
45
|
+
"process specific assignment types(s)",
|
46
|
+
short: :t,
|
47
|
+
var: :assignment_types,
|
48
|
+
type: :choices,
|
49
|
+
choices: ASSIGNMENT_TYPES,
|
50
|
+
default: ASSIGNMENT_TYPES
|
51
|
+
opt :create_infrastructure,
|
52
|
+
"create infrastructure for a given model",
|
53
|
+
type: :strings
|
54
|
+
|
55
|
+
def assignments_to_process(assignment_type = ::Naf::JanitorialAssignment)
|
56
|
+
if @assignments == :all
|
57
|
+
return assignment_type.all.order('type,assignment_order')
|
58
|
+
elsif @assignments == :all_enabled
|
59
|
+
return assignment_type.where('enabled').order('type,assignment_order')
|
60
|
+
else
|
61
|
+
return [*assignment_type.find(@assignments).order('type,assignment_order')]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def post_command_line_parsing
|
66
|
+
if @list_assignments
|
67
|
+
assignment_list = [["ID", "TYPE", "ORDER", "MODEL"]]
|
68
|
+
[:creates, :archives, :drops].each do |assignment_type_name|
|
69
|
+
unless @assignment_types.include? assignment_type_name
|
70
|
+
next
|
71
|
+
end
|
72
|
+
assignment_type_processor = ASSIGNMENTS[assignment_type_name]
|
73
|
+
assignments_to_process(assignment_type_processor).each do |a|
|
74
|
+
assignment_list << [a.id.to_s, a.type.to_s, a.assignment_order.to_s, a.model_name]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
puts self.class.columnized(assignment_list).join("\n")
|
78
|
+
exit 0
|
79
|
+
end
|
80
|
+
unless @create_infrastructure.blank?
|
81
|
+
logger.info "creating infrastructure: #{@create_infrastructure.inspect}"
|
82
|
+
::Logical::Naf::CreateInfrastructure.new(@create_infrastructure).work
|
83
|
+
exit 0
|
84
|
+
end
|
85
|
+
super
|
86
|
+
end
|
87
|
+
|
88
|
+
def work
|
89
|
+
logger.info "Janitor STARTED -- let's see what there is to do."
|
90
|
+
|
91
|
+
# assignment types are handled in this order
|
92
|
+
[:creates, :archives, :drops].each do |assignment_type_name|
|
93
|
+
unless @assignment_types.include? assignment_type_name
|
94
|
+
next
|
95
|
+
end
|
96
|
+
assignment_type_processor = ASSIGNMENTS[assignment_type_name]
|
97
|
+
assignments_to_process(assignment_type_processor).each do |assignment|
|
98
|
+
logger.info "#{assignment_type_processor}: #{assignment.model_name} START"
|
99
|
+
target_model = assignment.target_model
|
100
|
+
if target_model.nil?
|
101
|
+
logger.alarm "#{assignment_type_processor}: failed to instantiate target model: #{assignment.model_name}"
|
102
|
+
next
|
103
|
+
end
|
104
|
+
begin
|
105
|
+
assignment_type_processor.new.do_janitorial_work(target_model) unless @no_writes
|
106
|
+
rescue StandardError => e
|
107
|
+
logger.alarm "failed to use #{assignment_type_processor} for partitions model: #{assignment.model_name}"
|
108
|
+
logger.alarm e
|
109
|
+
end
|
110
|
+
logger.info "#{assignment_type_processor}: #{assignment.model_name} DONE"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
logger.info "janitor DONE"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
module Process::Naf
|
2
|
+
class MachineManager < ::Process::Naf::Application
|
3
|
+
opt :server_name, "set the machines server name (use with --update-machine)", type: :string
|
4
|
+
opt :server_note, "set the machines server note (use with --update-machine)", type: :string
|
5
|
+
opt :server_address, "set the machines server address (use with --update-machine)", default: ::Naf::Machine.machine_ip_address
|
6
|
+
opt :update_machine, "create or update an machine entry"
|
7
|
+
opt :enabled, "enable machine"
|
8
|
+
opt :disabled, "disable machine", var: :enabled, set: :false
|
9
|
+
opt :thread_pool_size, "how many scripts can run at once", type: :int
|
10
|
+
opt :list_affinities, "show all affinities"
|
11
|
+
opt :add_affinities, "add an affinity slot", type: :strings
|
12
|
+
opt :add_weight_affinities, "add afffinity weights for cpu and memory", default: true
|
13
|
+
|
14
|
+
def work
|
15
|
+
if @list_affinities
|
16
|
+
puts "Affinities:"
|
17
|
+
::Naf::Affinity.all.each do |affinity|
|
18
|
+
parts = [
|
19
|
+
affinity.affinity_classification_name,
|
20
|
+
affinity.affinity_name,
|
21
|
+
]
|
22
|
+
puts " #{parts.join('_')}"
|
23
|
+
end
|
24
|
+
exit 0
|
25
|
+
end
|
26
|
+
|
27
|
+
if @update_machine
|
28
|
+
machine = ::Naf::Machine.find_by_server_address(@server_address)
|
29
|
+
if machine.blank?
|
30
|
+
machine = ::Naf::Machine.create(server_address: @server_address)
|
31
|
+
add_default_affinities(machine)
|
32
|
+
end
|
33
|
+
|
34
|
+
machine.server_note = @server_note unless @server_note.nil?
|
35
|
+
machine.server_name = @server_name unless @server_name.nil?
|
36
|
+
machine.enabled = @enabled unless @enabled.nil?
|
37
|
+
machine.thread_pool_size = @thread_pool_size unless @thread_pool_size.nil?
|
38
|
+
machine.save!
|
39
|
+
else
|
40
|
+
machine = ::Naf::Machine.find_by_server_address(@server_address)
|
41
|
+
|
42
|
+
unless machine.present?
|
43
|
+
puts "Machine address #{@server_address} is not present -- use --update-machine"
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if @add_affinities
|
49
|
+
@add_affinities.each do |affinity_string|
|
50
|
+
#
|
51
|
+
# Parse the argument string. It should consists of 2 or 3 words separated
|
52
|
+
# by underscores.
|
53
|
+
#
|
54
|
+
# Example:
|
55
|
+
# - location_1_required
|
56
|
+
# - purpose_large
|
57
|
+
#
|
58
|
+
parts = affinity_string.split('_')
|
59
|
+
if parts.length == 2
|
60
|
+
classification_name = parts[0]
|
61
|
+
affinity_name = parts[1]
|
62
|
+
required = false
|
63
|
+
elsif parts.length == 3
|
64
|
+
classification_name = parts[0]
|
65
|
+
affinity_name = parts[1]
|
66
|
+
required = true
|
67
|
+
else
|
68
|
+
puts "no idea how to interpret affinity classification in: '#{affinity_string}'"
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
# Find the Affinity Classification in the Database
|
73
|
+
affinity_classification = ::Naf::AffinityClassification.
|
74
|
+
find_by_affinity_classification_name(classification_name)
|
75
|
+
unless affinity_classification
|
76
|
+
puts "could not find affinity classification: '#{classification_name}'"
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
# Find the Affinity in the Database
|
81
|
+
affinity = ::Naf::Affinity.
|
82
|
+
find_by_affinity_classification_id_and_affinity_name(affinity_classification.id,
|
83
|
+
affinity_name)
|
84
|
+
unless affinity
|
85
|
+
puts "could not find affinity: '#{affinity_name}' with classification: '#{classification_name}'"
|
86
|
+
exit 1
|
87
|
+
end
|
88
|
+
|
89
|
+
# Create an affinity slot for the machine
|
90
|
+
machine.machine_affinity_slots.create(affinity_id: affinity.id,
|
91
|
+
required: required)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
puts "Address: #{machine.server_address}"
|
96
|
+
puts "Name: #{machine.server_name}" unless machine.server_name.nil?
|
97
|
+
puts "Note: #{machine.server_note}" unless machine.server_note.nil?
|
98
|
+
puts "Enabled: #{machine.enabled}"
|
99
|
+
puts "Thread Pool Size: #{machine.thread_pool_size}"
|
100
|
+
|
101
|
+
if machine.affinities.empty?
|
102
|
+
puts "No machine affinity slots"
|
103
|
+
else
|
104
|
+
puts "Machine Affinity Slots:"
|
105
|
+
machine.machine_affinity_slots.each do |affinity_slot|
|
106
|
+
affinity = affinity_slot.affinity
|
107
|
+
parts = [
|
108
|
+
affinity.affinity_classification_name,
|
109
|
+
affinity.affinity_name,
|
110
|
+
]
|
111
|
+
parts << "required" if affinity_slot.required
|
112
|
+
puts " #{parts.join('_')}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def add_default_affinities(machine)
|
120
|
+
# Add Machine Affinity
|
121
|
+
classification = ::Naf::AffinityClassification.machine.id
|
122
|
+
affinity = ::Naf::Affinity.
|
123
|
+
find_or_create_by_affinity_classification_id_and_affinity_name(classification, machine.id.to_s)
|
124
|
+
machine.machine_affinity_slots.create(affinity_id: affinity.id)
|
125
|
+
|
126
|
+
if machine == ::Naf::Machine.current
|
127
|
+
# Add Purpose Affinity
|
128
|
+
instance_type = `source /var/spool/ec2/meta-data.sh && echo $EC2_INSTANCE_TYPE`
|
129
|
+
if instance_type.present?
|
130
|
+
classification = ::Naf::AffinityClassification.purpose.id
|
131
|
+
affinity = ::Naf::Affinity.
|
132
|
+
find_or_create_by_affinity_classification_id_and_affinity_name(classification, instance_type)
|
133
|
+
machine.machine_affinity_slots.create(affinity_id: affinity.id)
|
134
|
+
end
|
135
|
+
|
136
|
+
# Add Weight Affinity
|
137
|
+
classification = ::Naf::AffinityClassification.weight.id
|
138
|
+
machine_cpus = (`cat /proc/cpuinfo | grep processor | wc -l`).strip.to_i
|
139
|
+
machine_memory = (`cat /proc/meminfo | grep MemTotal`).slice(/\d+/).to_i / (1024 * 1024)
|
140
|
+
cpu_affinity = ::Naf::Affinity.
|
141
|
+
find_or_create_by_affinity_classification_id_and_affinity_name(classification, 'cpus')
|
142
|
+
memory_affinity = ::Naf::Affinity.
|
143
|
+
find_or_create_by_affinity_classification_id_and_affinity_name(classification, 'memory')
|
144
|
+
machine.machine_affinity_slots.create(affinity_id: cpu_affinity.id, affinity_parameter: machine_cpus)
|
145
|
+
machine.machine_affinity_slots.create(affinity_id: memory_affinity.id, affinity_parameter: machine_memory)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'naf/version'
|
2
|
+
|
3
|
+
module Process::Naf
|
4
|
+
class MachineUpgrader < ::Process::Naf::Application
|
5
|
+
opt :upgrade_option,
|
6
|
+
"what should we do",
|
7
|
+
default: :dump,
|
8
|
+
choices: [:dump, :restore]
|
9
|
+
opt :pretty,
|
10
|
+
"make things pretty",
|
11
|
+
default: false
|
12
|
+
opt :no_updates,
|
13
|
+
"don't update the db (via transaction rollback)",
|
14
|
+
default: false
|
15
|
+
opt :force,
|
16
|
+
"run even if system looks unclean",
|
17
|
+
default: false
|
18
|
+
|
19
|
+
PRESERVABLES = [
|
20
|
+
::Naf::ApplicationType,
|
21
|
+
::Naf::Application,
|
22
|
+
::Naf::ApplicationRunGroupRestriction,
|
23
|
+
::Naf::ApplicationSchedule,
|
24
|
+
::Naf::ApplicationSchedulePrerequisite,
|
25
|
+
::Naf::AffinityClassification,
|
26
|
+
::Naf::Affinity,
|
27
|
+
::Naf::ApplicationScheduleAffinityTab,
|
28
|
+
::Naf::LoggerLevel,
|
29
|
+
::Naf::LoggerName,
|
30
|
+
::Naf::LoggerStyle,
|
31
|
+
::Naf::LoggerStyleName,
|
32
|
+
::Naf::Machine,
|
33
|
+
::Naf::MachineAffinitySlot,
|
34
|
+
::Naf::JanitorialAssignment
|
35
|
+
]
|
36
|
+
|
37
|
+
CLEAN_SYSTEM_MODELS = [
|
38
|
+
::Naf::Machine,
|
39
|
+
::Naf::VERSION == '1.0.3' ? ::Naf::HistoricalJob : ::Naf::Job
|
40
|
+
]
|
41
|
+
|
42
|
+
|
43
|
+
def work
|
44
|
+
self.send("work_#{@upgrade_option}")
|
45
|
+
end
|
46
|
+
|
47
|
+
def work_dump
|
48
|
+
pickler = ::Logical::Naf::Pickler.new(::Naf::VERSION, PRESERVABLES)
|
49
|
+
pickler.preserve
|
50
|
+
if @pretty
|
51
|
+
puts JSON.pretty_generate(pickler.pickle_jar)
|
52
|
+
else
|
53
|
+
puts JSON.generate(pickler.pickle_jar)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def work_restore
|
58
|
+
begin
|
59
|
+
pickle_jar = JSON.parse(STDIN.read)
|
60
|
+
rescue StandardError => e
|
61
|
+
logger.fatal "this doesn't look like a naf upgrade stream to me, it is not json parserable!"
|
62
|
+
exit 1
|
63
|
+
end
|
64
|
+
|
65
|
+
unless pickle_jar.is_a?(Hash)
|
66
|
+
logger.fatal "this doesn't look like a naf upgrade stream to me, it is of type: #{pickle_jar.class.name}"
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
|
70
|
+
pickle_jar_version = pickle_jar['version']
|
71
|
+
if pickle_jar_version.blank?
|
72
|
+
logger.fatal "this doesn't look like a naf upgrade stream to me, it has no version!"
|
73
|
+
exit 1
|
74
|
+
end
|
75
|
+
|
76
|
+
preserves = pickle_jar['preserves']
|
77
|
+
if preserves.nil?
|
78
|
+
logger.fatal "this doesn't look like a naf upgrade stream to me, there are no preserves!"
|
79
|
+
exit 1
|
80
|
+
end
|
81
|
+
|
82
|
+
unless preserves.is_a?(Hash)
|
83
|
+
logger.fatal "this doesn't look like a naf upgrade stream to me, the preserves are type: #{preserves.class.name}"
|
84
|
+
exit 1
|
85
|
+
end
|
86
|
+
|
87
|
+
check_for_clean_system unless @force
|
88
|
+
|
89
|
+
preserved_at_text = pickle_jar['preserved_at']
|
90
|
+
preserved_at = Time.parse(preserved_at_text) rescue "unknown"
|
91
|
+
|
92
|
+
logger.info "restoring:"
|
93
|
+
logger.info " preserved_at: #{preserved_at}"
|
94
|
+
logger.info " version: #{pickle_jar_version}"
|
95
|
+
logger.info " models: #{preserves.length}"
|
96
|
+
|
97
|
+
unpickler = ::Logical::Naf::Unpickler.new(preserves, PRESERVABLES, pickle_jar_version)
|
98
|
+
::Naf::NafBase.transaction do
|
99
|
+
unpickler.reconstitute
|
100
|
+
raise ActiveRecord::Rollback if @no_updates
|
101
|
+
end
|
102
|
+
logger.info "restoration complete! thank you!"
|
103
|
+
end
|
104
|
+
|
105
|
+
def check_for_clean_system
|
106
|
+
CLEAN_SYSTEM_MODELS.each do |model|
|
107
|
+
raise "the system is unclean" if model.count > 0
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|