naf 2.1.5 → 2.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/RELEASE_NOTES.rdoc +30 -1
- data/app/controllers/naf/application_schedules_controller.rb +4 -0
- data/app/models/logical/naf/application_schedule.rb +2 -12
- data/app/models/logical/naf/construction_zone/proletariat.rb +1 -0
- data/app/models/logical/naf/construction_zone/work_order.rb +5 -5
- data/app/views/naf/application_schedules/_form.html.erb +5 -0
- data/app/views/naf/application_schedules/show.html.erb +1 -1
- data/app/views/naf/applications/show.html.erb +3 -1
- data/lib/naf/version.rb +1 -1
- data/naf.gemspec +1 -1
- data/spec/dummy/config/environments/test.rb +4 -0
- data/spec/models/logical/naf/construction_zone/work_order_spec.rb +105 -0
- metadata +4 -2
data/RELEASE_NOTES.rdoc
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
= Release Notes
|
2
2
|
|
3
|
+
=== Version 2.1.6
|
4
|
+
Bug fixes:
|
5
|
+
* Historical jobs application_schedule_id was not getting set, causing the runner to constantly queue applications.
|
6
|
+
* Pagination of application schedules on the index page was not properly working.
|
7
|
+
* When mouse hovered over the application schedule on the applicaiton show page, it did not show a detailed information about the schedule.
|
8
|
+
|
9
|
+
Changes:
|
10
|
+
* Included application name when editing an application schedule
|
11
|
+
|
12
|
+
=== Version 2.1.5
|
13
|
+
Bug fix:
|
14
|
+
* The code to manually add jobs/applications/schedules to the queue (::Logical::Naf::ConstructionZone::Boss) had an unecessary parameter that got passed into a call to create a job, thus raising an exception.
|
15
|
+
|
16
|
+
=== Version 2.1.4
|
17
|
+
Bug fix:
|
18
|
+
* The Runner was using ruby Threads to write the logs of each running script. There was a specific script that caused write blocks and raised an EPIPE exception. The code is no longer using ruby Threads.
|
19
|
+
|
20
|
+
=== Version 2.1.3
|
21
|
+
Bug fix:
|
22
|
+
* Migrations would fail if run all at once, because it did not consider the existence of the Janitor's Application Schedule. It would then fail, because run_interval is null, run_start_minute is dropped, and a not null constraint is set on run_interval.
|
23
|
+
|
24
|
+
=== Version 2.1.2
|
25
|
+
Bug fix:
|
26
|
+
* Rescue EAGAIN and EWOULDBLOCK exceptions and log them.
|
27
|
+
|
28
|
+
=== Version 2.1.1
|
29
|
+
Bug fix:
|
30
|
+
* When marking a machine down, it logs the id of the machine doing the action. But if this machine does not have an associated row in naf.machines, it raises an exception.
|
31
|
+
|
3
32
|
=== Version 2.1.0
|
4
33
|
|
5
34
|
Featurs/Changes:
|
@@ -11,7 +40,7 @@ Featurs/Changes:
|
|
11
40
|
|
12
41
|
=== Version 2.0.0
|
13
42
|
|
14
|
-
|
43
|
+
Features/Changes:
|
15
44
|
* New logging system
|
16
45
|
* Removed compatibility with Papertrail
|
17
46
|
* UI changes
|
@@ -1,10 +1,14 @@
|
|
1
1
|
module Naf
|
2
2
|
class ApplicationSchedulesController < Naf::ApplicationController
|
3
3
|
|
4
|
+
before_filter :set_rows_per_page
|
5
|
+
|
4
6
|
def index
|
5
7
|
respond_to do |format|
|
6
8
|
format.html
|
7
9
|
format.json do
|
10
|
+
set_page
|
11
|
+
|
8
12
|
application_schedules = []
|
9
13
|
application_schedule = []
|
10
14
|
@total_records = Naf::ApplicationSchedule.count(:all)
|
@@ -130,7 +130,7 @@ module Logical
|
|
130
130
|
if schedule.run_interval_style.name == 'at beginning of day'
|
131
131
|
output = exact_time_of_day(time)
|
132
132
|
else
|
133
|
-
output =
|
133
|
+
output = interval_time(time)
|
134
134
|
end
|
135
135
|
|
136
136
|
output
|
@@ -147,7 +147,7 @@ module Logical
|
|
147
147
|
return output
|
148
148
|
end
|
149
149
|
|
150
|
-
def
|
150
|
+
def interval_time(time)
|
151
151
|
if time < 9
|
152
152
|
":0#{time}"
|
153
153
|
else
|
@@ -155,16 +155,6 @@ module Logical
|
|
155
155
|
end
|
156
156
|
end
|
157
157
|
|
158
|
-
def interval_time(time)
|
159
|
-
if time < 60
|
160
|
-
pluralize(time, 'minute')
|
161
|
-
elsif time % 60 == 0
|
162
|
-
pluralize(time / 60, 'hour')
|
163
|
-
else
|
164
|
-
pluralize(time / 60, 'hour') + ', ' + pluralize(time % 60, 'minute')
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
158
|
def application_run_group_name
|
169
159
|
if schedule.application_run_group_name.present?
|
170
160
|
schedule.application_run_group_name
|
@@ -27,6 +27,7 @@ module Logical::Naf::ConstructionZone
|
|
27
27
|
|
28
28
|
def create_queued_job(historical_job)
|
29
29
|
queued_job = ::Naf::QueuedJob.new(application_id: historical_job.application_id,
|
30
|
+
application_schedule_id: historical_job.application_schedule_id,
|
30
31
|
application_type_id: historical_job.application_type_id,
|
31
32
|
command: historical_job.command,
|
32
33
|
application_run_group_restriction_id: historical_job.application_run_group_restriction_id,
|
@@ -49,6 +49,7 @@ module Logical::Naf::ConstructionZone
|
|
49
49
|
application_run_group_limit: application_run_group_limit,
|
50
50
|
priority: priority,
|
51
51
|
application_id: application.try(:id),
|
52
|
+
application_schedule_id: application_schedule.try(:id)
|
52
53
|
}
|
53
54
|
end
|
54
55
|
|
@@ -57,26 +58,25 @@ module Logical::Naf::ConstructionZone
|
|
57
58
|
if affinity.is_a? Symbol
|
58
59
|
# short_name of affinity
|
59
60
|
affinity_object = {
|
60
|
-
:
|
61
|
+
affinity_id: ::Naf::Affinity.find_by_affinity_short_name(affinity).try(:id)
|
61
62
|
}
|
62
63
|
raise "no affinity provided" if affinity_object[:affinity_id].nil?
|
63
64
|
affinity_object
|
64
65
|
elsif affinity.is_a? ::Naf::Affinity
|
65
66
|
{
|
66
|
-
:
|
67
|
+
affinity_id: affinity.id
|
67
68
|
}
|
68
69
|
elsif affinity.is_a? ::Naf::Machine
|
69
70
|
# affinity_for machine
|
70
71
|
{
|
71
|
-
:
|
72
|
+
affinity_id: affinity.affinity.id
|
72
73
|
}
|
73
74
|
elsif affinity.is_a? ::Naf::ApplicationScheduleAffinityTab
|
74
75
|
# affinity_for application_schedule_affinity_tab
|
75
76
|
elsif affinity.is_a? Hash
|
76
77
|
# should have key: :affinity_id or :affinity_short_name or :affinity_name
|
77
78
|
# may have key: :affinity_parameter
|
78
|
-
affinity_object = {
|
79
|
-
}
|
79
|
+
affinity_object = {}
|
80
80
|
if affinity.has_key?(:affinity_id)
|
81
81
|
affinity_object[:affinity_id] = affinity[:affinity_id]
|
82
82
|
elsif affinity.has_key?(:affinity_name)
|
@@ -7,6 +7,11 @@
|
|
7
7
|
|
8
8
|
<%= f.hidden_field :application_id, value: @application_schedule.application_id %>
|
9
9
|
|
10
|
+
<div class="field">
|
11
|
+
<%= f.label "Application" %>
|
12
|
+
<p><%= @application_schedule.application.title %></p>
|
13
|
+
</div>
|
14
|
+
|
10
15
|
<div class="field">
|
11
16
|
<%= f.label :application_run_group_restriction_id, "Application run group restriction*" %>
|
12
17
|
<%= f.select(:application_run_group_restriction_id,
|
@@ -10,7 +10,7 @@
|
|
10
10
|
</div>
|
11
11
|
|
12
12
|
<div id="record">
|
13
|
-
<h2>Application</h2>
|
13
|
+
<h2>Application Schedule</h2>
|
14
14
|
<%= link_to 'Back to Application Schedules', application_schedules_path %>
|
15
15
|
|
|
16
16
|
<%= link_to 'Edit', controller: 'application_schedules',
|
@@ -102,7 +102,9 @@
|
|
102
102
|
<% output = '' %>
|
103
103
|
<% @logical_application.application_schedules.each do |schedule|
|
104
104
|
logical_schedule = ::Logical::Naf::ApplicationSchedule.new(schedule)
|
105
|
-
output << (link_to logical_schedule.display,
|
105
|
+
output << (link_to logical_schedule.display,
|
106
|
+
naf.application_schedule_path(schedule.id),
|
107
|
+
title: logical_schedule.help_title)
|
106
108
|
output << ', '
|
107
109
|
end
|
108
110
|
output = output[0..-3] %>
|
data/lib/naf/version.rb
CHANGED
data/naf.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.name = "naf"
|
9
9
|
s.version = Naf::VERSION
|
10
10
|
s.license = 'New BSD License'
|
11
|
-
s.date = '2014-
|
11
|
+
s.date = '2014-03-05'
|
12
12
|
s.summary = "Creates infrastructure for a customizable and robust Postgres-backed script scheduling/running"
|
13
13
|
s.description = "A cloud based distributed cron, application framework and operations console. Naf works as a distributed script running " +
|
14
14
|
"system that provides scheduling, logging, alarming, machine redundancy, and the ability to set constraint during script execution"
|
@@ -34,4 +34,8 @@ Dummy::Application.configure do
|
|
34
34
|
|
35
35
|
# Print deprecation notices to the stderr
|
36
36
|
config.active_support.deprecation = :stderr
|
37
|
+
|
38
|
+
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
39
|
+
# the I18n.default_locale when a translation can not be found)
|
40
|
+
config.i18n.enforce_available_locales = false
|
37
41
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Logical::Naf::ConstructionZone
|
4
|
+
|
5
|
+
describe WorkOrder do
|
6
|
+
let(:command) { '::Process::Naf::Janitor.run' }
|
7
|
+
let!(:work_order) {
|
8
|
+
::Logical::Naf::ConstructionZone::WorkOrder.new(command)
|
9
|
+
}
|
10
|
+
|
11
|
+
describe '#historical_job_parameters' do
|
12
|
+
let(:params) {
|
13
|
+
{
|
14
|
+
command: command,
|
15
|
+
application_type_id: ::Naf::ApplicationType.rails.id,
|
16
|
+
application_run_group_restriction_id: ::Naf::ApplicationRunGroupRestriction.limited_per_all_machines.id,
|
17
|
+
application_run_group_name: command,
|
18
|
+
application_run_group_limit: 1,
|
19
|
+
priority: 0,
|
20
|
+
application_id: nil,
|
21
|
+
application_schedule_id: nil
|
22
|
+
}
|
23
|
+
}
|
24
|
+
it 'return correct values' do
|
25
|
+
work_order.historical_job_parameters.should == params
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#historical_job_affinity_tab_parameters' do
|
30
|
+
it 'return hash with the affinity_id when a symbol is provided' do
|
31
|
+
affinity = FactoryGirl.create(:affinity, id: 4, affinity_short_name: :small)
|
32
|
+
work_order.instance_variable_set(:@affinities, [:small])
|
33
|
+
work_order.historical_job_affinity_tab_parameters.
|
34
|
+
should == [{ affinity_id: affinity.id }]
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'raise an exception when there is not an object associated with the symbol' do
|
38
|
+
work_order.instance_variable_set(:@affinities, [:small])
|
39
|
+
expect { work_order.historical_job_affinity_tab_parameters }.
|
40
|
+
to raise_error 'no affinity provided'
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'return hash with the affinity_id when an Affinity object is provided' do
|
44
|
+
affinity = ::Naf::Affinity.first
|
45
|
+
work_order.instance_variable_set(:@affinities, [affinity])
|
46
|
+
work_order.historical_job_affinity_tab_parameters.
|
47
|
+
should == [{ affinity_id: affinity.id }]
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'return hash with the affinity_id when a Machine object is provided' do
|
51
|
+
machine = FactoryGirl.create(:machine)
|
52
|
+
classification = FactoryGirl.create(:location_affinity_classification)
|
53
|
+
affinity = FactoryGirl.create(:affinity, id: 4,
|
54
|
+
affinity_name: machine.id.to_s,
|
55
|
+
affinity_classification: classification)
|
56
|
+
work_order.instance_variable_set(:@affinities, [machine])
|
57
|
+
work_order.historical_job_affinity_tab_parameters.
|
58
|
+
should == [{ affinity_id: affinity.id }]
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'return nil when an ApplicationScheduleAffintyTab object is provided' do
|
62
|
+
tab = FactoryGirl.build(:app_schedule_affinity_tab_base)
|
63
|
+
work_order.instance_variable_set(:@affinities, [tab])
|
64
|
+
work_order.historical_job_affinity_tab_parameters.should == [nil]
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'return hash with the affinity_id when a Hash object is provided' do
|
68
|
+
affinity = { affinity_id: 1 }
|
69
|
+
work_order.instance_variable_set(:@affinities, [affinity])
|
70
|
+
work_order.historical_job_affinity_tab_parameters.should == [affinity]
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'raise an exception when a empty Hash object is provided' do
|
74
|
+
work_order.instance_variable_set(:@affinities, [{}])
|
75
|
+
expect { work_order.historical_job_affinity_tab_parameters }.
|
76
|
+
to raise_error 'no affinity provided'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'raise an exception when a unknown object is provided' do
|
80
|
+
work_order.instance_variable_set(:@affinities, [[]])
|
81
|
+
expect { work_order.historical_job_affinity_tab_parameters }.
|
82
|
+
to raise_error 'unknown affinity kind: []'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '#historical_job_parameters' do
|
87
|
+
it 'raise an exception when a non historical job is in prerequisites' do
|
88
|
+
work_order.instance_variable_set(:@prerequisites, [1])
|
89
|
+
expect { work_order.historical_job_prerequisite_historical_jobs }.
|
90
|
+
to raise_error "found a non Naf::HistoricalJob in prerequisites: 1"
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'not raise an exception when a historical job is in prerequisites' do
|
94
|
+
historical_job = FactoryGirl.build(:job_base)
|
95
|
+
work_order.instance_variable_set(:@prerequisites, [historical_job])
|
96
|
+
work_order.historical_job_prerequisite_historical_jobs.should == [historical_job]
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'not raise an exception when prerequisites is empty' do
|
100
|
+
work_order.historical_job_prerequisite_historical_jobs.should == []
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: naf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-
|
15
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rails
|
@@ -485,6 +485,7 @@ files:
|
|
485
485
|
- spec/factories/naf.rb
|
486
486
|
- spec/helpers/naf/application_helper_spec.rb
|
487
487
|
- spec/models/logical/naf/application_spec.rb
|
488
|
+
- spec/models/logical/naf/construction_zone/work_order_spec.rb
|
488
489
|
- spec/models/logical/naf/job_fetcher_spec.rb
|
489
490
|
- spec/models/logical/naf/job_spec.rb
|
490
491
|
- spec/models/logical/naf/log_file_spec.rb
|
@@ -599,6 +600,7 @@ test_files:
|
|
599
600
|
- spec/factories/naf.rb
|
600
601
|
- spec/helpers/naf/application_helper_spec.rb
|
601
602
|
- spec/models/logical/naf/application_spec.rb
|
603
|
+
- spec/models/logical/naf/construction_zone/work_order_spec.rb
|
602
604
|
- spec/models/logical/naf/job_fetcher_spec.rb
|
603
605
|
- spec/models/logical/naf/job_spec.rb
|
604
606
|
- spec/models/logical/naf/log_file_spec.rb
|