foreman-tasks 0.12.2 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +5 -5
- data/app/lib/actions/helpers/humanizer.rb +3 -3
- data/app/lib/actions/middleware/keep_current_taxonomies.rb +3 -3
- data/app/lib/actions/middleware/recurring_logic.rb +0 -12
- data/app/lib/actions/recurring_action.rb +27 -0
- data/app/models/foreman_tasks/recurring_logic.rb +12 -3
- data/app/models/foreman_tasks/task.rb +6 -0
- data/app/models/foreman_tasks/task/dynflow_task.rb +9 -4
- data/foreman-tasks.gemspec +1 -1
- data/lib/foreman_tasks/dynflow/configuration.rb +2 -2
- data/lib/foreman_tasks/engine.rb +1 -1
- data/lib/foreman_tasks/version.rb +1 -1
- data/test/lib/actions/middleware/keep_current_taxonomies_test.rb +67 -0
- data/test/lib/actions/middleware/keep_current_user_test.rb +49 -0
- data/test/unit/actions/recurring_action_test.rb +87 -0
- data/test/unit/recurring_logic_test.rb +7 -0
- data/test/unit/task_test.rb +1 -1
- metadata +12 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0111beaab4e9971f1039c81e0ccf31ad5cbb79e4
|
4
|
+
data.tar.gz: 0077b9efb0e93957f99a37fe4d08469b6f6b62d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0aff56c13e49c3cca9802a8ae63f0f4c024ba69a4b6bb07d9453e236de2571d284895906192c8b52cc2e8ed8300b083e3643d47bf8894fab8fbde55da5bc3364
|
7
|
+
data.tar.gz: 55255ff6e02f84e834b2ea8927364985830f13a0b456c64af503af56b0a76f286e1a94e5ec2fef04b3ee4da48fe905836a242b9baae4efd90f54afe04ee03944
|
@@ -58,11 +58,11 @@ module ForemanTasks
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def recurring_logic_next_occurrence(recurring_logic)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
61
|
+
default = '-'
|
62
|
+
return default if %w[finished cancelled].include? recurring_logic.state
|
63
|
+
|
64
|
+
last_task = recurring_logic.tasks.order(:start_at).last
|
65
|
+
last_task ? last_task.start_at : default
|
66
66
|
end
|
67
67
|
|
68
68
|
def time_f(f, attr, field_options = {}, time_options = {}, html_options = {})
|
@@ -126,7 +126,7 @@ module Actions
|
|
126
126
|
product_id = fetch_data(data, :product, :id)
|
127
127
|
repo_id = fetch_data(data, :repo, :id)
|
128
128
|
if product_id && repo_id
|
129
|
-
"
|
129
|
+
"/products/#{product_id}/repositories/#{repo_id}"
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
@@ -152,7 +152,7 @@ module Actions
|
|
152
152
|
|
153
153
|
def link(data)
|
154
154
|
if (content_view_id = fetch_data(data, :content_view, :id))
|
155
|
-
"
|
155
|
+
"/content_views/#{content_view_id}/versions"
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
@@ -168,7 +168,7 @@ module Actions
|
|
168
168
|
|
169
169
|
def link(data)
|
170
170
|
if (product_id = fetch_data(data, :product, :id))
|
171
|
-
"
|
171
|
+
"/products/#{product_id}/"
|
172
172
|
end
|
173
173
|
end
|
174
174
|
end
|
@@ -22,7 +22,7 @@ module Actions
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def with_current_taxonomies
|
25
|
-
if
|
25
|
+
if current_taxonomies?
|
26
26
|
yield
|
27
27
|
else
|
28
28
|
restore_current_taxonomies { yield }
|
@@ -43,9 +43,9 @@ module Actions
|
|
43
43
|
Location.current = nil
|
44
44
|
end
|
45
45
|
|
46
|
-
def
|
46
|
+
def current_taxonomies?
|
47
47
|
(Organization.current || action.input[:current_organization_id].nil?) &&
|
48
|
-
|
48
|
+
(Location.current || action.input[:current_location_id].nil?)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -7,11 +7,6 @@ module Actions
|
|
7
7
|
# After an action is delayed, it checks whether the delay_options
|
8
8
|
# hash contains an id of a recurring logic. If so, it adds the task
|
9
9
|
# to the recurring logic's task group, otherwise does nothing.
|
10
|
-
#
|
11
|
-
# After the action's plan phase the middleware checks if the task
|
12
|
-
# is associated with a task group of any recurring logic, in which case
|
13
|
-
# it triggers another repeat using the task group's recurring logic,
|
14
|
-
# otherwise does nothing.
|
15
10
|
def delay(delay_options, *args)
|
16
11
|
pass(delay_options, *args).tap do
|
17
12
|
if delay_options[:recurring_logic_id]
|
@@ -20,13 +15,6 @@ module Actions
|
|
20
15
|
end
|
21
16
|
end
|
22
17
|
|
23
|
-
def plan(*args)
|
24
|
-
pass(*args).tap do
|
25
|
-
task_group = task.task_groups.find { |tg| tg.is_a? ::ForemanTasks::TaskGroups::RecurringLogicTaskGroup }
|
26
|
-
task_group.recurring_logic.trigger_repeat(action.class, *args) if task_group
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
18
|
private
|
31
19
|
|
32
20
|
def recurring_logic(delay_options)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Actions
|
2
|
+
module RecurringAction
|
3
|
+
# When included sets the base action to use the RecurringLogic middleware and configures
|
4
|
+
# #trigger_repeat to be called when appropriate to trigger the next repeat.
|
5
|
+
def self.included(base)
|
6
|
+
base.middleware.use Actions::Middleware::RecurringLogic
|
7
|
+
base.execution_plan_hooks.use :trigger_repeat, :on => [:planned, :failure]
|
8
|
+
end
|
9
|
+
|
10
|
+
# Hook to be called when a repetition needs to be triggered. This either happens when the plan goes into planned state
|
11
|
+
# or when it fails.
|
12
|
+
def trigger_repeat(execution_plan)
|
13
|
+
if execution_plan.delay_record && recurring_logic_task_group
|
14
|
+
args = execution_plan.delay_record.args
|
15
|
+
logic = recurring_logic_task_group.recurring_logic
|
16
|
+
logic.trigger_repeat_after(task.start_at, self.class, *args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def recurring_logic_task_group
|
23
|
+
@task_group ||= task.task_groups
|
24
|
+
.find { |tg| tg.is_a? ::ForemanTasks::TaskGroups::RecurringLogicTaskGroup }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -33,12 +33,13 @@ module ForemanTasks
|
|
33
33
|
trigger_repeat(action_class, *args)
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
37
|
-
if
|
36
|
+
def trigger_repeat_after(time, action_class, *args)
|
37
|
+
return if cancelled?
|
38
|
+
if can_continue?(time)
|
38
39
|
self.iteration += 1
|
39
40
|
save!
|
40
41
|
::ForemanTasks.delay action_class,
|
41
|
-
generate_delay_options,
|
42
|
+
generate_delay_options(time),
|
42
43
|
*args
|
43
44
|
else
|
44
45
|
self.state = 'finished'
|
@@ -47,6 +48,10 @@ module ForemanTasks
|
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
51
|
+
def trigger_repeat(action_class, *args)
|
52
|
+
trigger_repeat_after(Time.zone.now, action_class, *args)
|
53
|
+
end
|
54
|
+
|
50
55
|
def cancel
|
51
56
|
self.state = 'cancelled'
|
52
57
|
save!
|
@@ -89,6 +94,10 @@ module ForemanTasks
|
|
89
94
|
state == 'finished'
|
90
95
|
end
|
91
96
|
|
97
|
+
def cancelled?
|
98
|
+
state == 'cancelled'
|
99
|
+
end
|
100
|
+
|
92
101
|
def humanized_state
|
93
102
|
case state
|
94
103
|
when 'active'
|
@@ -109,10 +109,16 @@ module ForemanTasks
|
|
109
109
|
state == 'paused'
|
110
110
|
end
|
111
111
|
|
112
|
+
# returns true if the task is *CURRENTLY* waiting to be executed in the future
|
113
|
+
def scheduled?
|
114
|
+
state == 'scheduled'
|
115
|
+
end
|
116
|
+
|
112
117
|
def recurring?
|
113
118
|
!recurring_logic_task_group_ids.empty?
|
114
119
|
end
|
115
120
|
|
121
|
+
# returns true if the task was planned to execute in the future
|
116
122
|
def delayed?
|
117
123
|
start_at.to_i != started_at.to_i
|
118
124
|
end
|
@@ -8,12 +8,12 @@ module ForemanTasks
|
|
8
8
|
def update_from_dynflow(data)
|
9
9
|
utc_zone = ActiveSupport::TimeZone.new('UTC')
|
10
10
|
self.external_id = data[:id]
|
11
|
-
self.started_at = utc_zone.parse(data[:started_at]) unless data[:started_at].nil?
|
12
|
-
self.ended_at = utc_zone.parse(data[:ended_at]) unless data[:ended_at].nil?
|
13
11
|
self.result = map_result(data).to_s
|
14
12
|
self.state = data[:state].to_s
|
15
|
-
self.
|
16
|
-
self.
|
13
|
+
self.started_at = string_to_time(utc_zone, data[:started_at]) unless data[:started_at].nil?
|
14
|
+
self.ended_at = string_to_time(utc_zone, data[:ended_at]) unless data[:ended_at].nil?
|
15
|
+
self.start_at = string_to_time(utc_zone, data[:start_at]) if data[:start_at]
|
16
|
+
self.start_before = string_to_time(utc_zone, data[:start_before]) if data[:start_before]
|
17
17
|
self.parent_task_id ||= begin
|
18
18
|
if main_action.caller_execution_plan_id
|
19
19
|
DynflowTask.where(:external_id => main_action.caller_execution_plan_id).first!.id
|
@@ -153,6 +153,11 @@ module ForemanTasks
|
|
153
153
|
|
154
154
|
private
|
155
155
|
|
156
|
+
def string_to_time(zone, time)
|
157
|
+
return time if time.is_a?(Time)
|
158
|
+
zone.parse(time)
|
159
|
+
end
|
160
|
+
|
156
161
|
def set_action_field
|
157
162
|
self.action = to_label
|
158
163
|
end
|
data/foreman-tasks.gemspec
CHANGED
@@ -29,7 +29,7 @@ same resource. It also optionally provides Dynflow infrastructure for using it f
|
|
29
29
|
s.extra_rdoc_files = Dir['README*', 'LICENSE']
|
30
30
|
|
31
31
|
s.add_dependency "foreman-tasks-core"
|
32
|
-
s.add_dependency "dynflow", '~> 0
|
32
|
+
s.add_dependency "dynflow", '~> 1.0'
|
33
33
|
s.add_dependency "sinatra" # for Dynflow web console
|
34
34
|
s.add_dependency "parse-cron", '~> 0.1.4'
|
35
35
|
s.add_dependency "get_process_mem" # for memory polling
|
data/lib/foreman_tasks/engine.rb
CHANGED
@@ -98,7 +98,7 @@ module ForemanTasks
|
|
98
98
|
end
|
99
99
|
|
100
100
|
initializer 'foreman_tasks.register_paths' do |_app|
|
101
|
-
ForemanTasks.dynflow.config.eager_load_paths.concat(%W[#{ForemanTasks::Engine.root}/app/lib/actions])
|
101
|
+
ForemanTasks.dynflow.config.eager_load_paths.concat(%W[#{ForemanTasks::Engine.root}/app/lib/actions #{ForemanTasks::Engine.root}/app/lib/hooks])
|
102
102
|
end
|
103
103
|
|
104
104
|
initializer 'foreman_tasks.test_exceptions' do |_app|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'foreman_tasks_test_helper'
|
2
|
+
|
3
|
+
module Actions
|
4
|
+
module Middleware
|
5
|
+
class KeepCurrentTaxonomiesTest < ActiveSupport::TestCase
|
6
|
+
include ::Dynflow::Testing
|
7
|
+
|
8
|
+
class TestAction < Support::DummyDynflowAction
|
9
|
+
middleware.use KeepCurrentTaxonomies
|
10
|
+
|
11
|
+
def run; end
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@org = mock('organization')
|
16
|
+
@org.stubs(:id).returns(1)
|
17
|
+
@loc = mock('location')
|
18
|
+
@loc.stubs(:id).returns(2)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'plan' do
|
22
|
+
test 'with current taxonomies set' do
|
23
|
+
Organization.expects(:current).twice.returns(@org)
|
24
|
+
Location.expects(:current).twice.returns(@loc)
|
25
|
+
|
26
|
+
@action = create_and_plan_action(TestAction)
|
27
|
+
assert_equal(@org.id, @action.input['current_organization_id'])
|
28
|
+
assert_equal(@loc.id, @action.input['current_location_id'])
|
29
|
+
end
|
30
|
+
|
31
|
+
test 'with one current taxonomy set (organization)' do
|
32
|
+
Organization.expects(:current).twice.returns(@org)
|
33
|
+
Location.expects(:current).twice
|
34
|
+
|
35
|
+
@action = create_and_plan_action(TestAction)
|
36
|
+
assert_equal(@org.id, @action.input['current_organization_id'])
|
37
|
+
assert_nil(@action.input['current_location_id'])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'run' do
|
42
|
+
before do
|
43
|
+
Organization.stubs(:current).returns(@org)
|
44
|
+
Location.stubs(:current).returns(@loc)
|
45
|
+
|
46
|
+
@action = create_and_plan_action(TestAction)
|
47
|
+
|
48
|
+
Organization.stubs(:current)
|
49
|
+
Location.stubs(:current)
|
50
|
+
end
|
51
|
+
|
52
|
+
test 'with current taxonomies as input' do
|
53
|
+
Organization.unscoped.class.any_instance.expects(:find).with(@org.id).returns(@org)
|
54
|
+
Location.unscoped.class.any_instance.expects(:find).with(@loc.id).returns(@loc)
|
55
|
+
|
56
|
+
Organization.expects(:current=).with(@org)
|
57
|
+
Location.expects(:current=).with(@loc)
|
58
|
+
|
59
|
+
Organization.stubs(:current=).with(nil)
|
60
|
+
Location.stubs(:current=).with(nil)
|
61
|
+
|
62
|
+
@action = run_action(@action)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'foreman_tasks_test_helper'
|
2
|
+
|
3
|
+
module Actions
|
4
|
+
module Middleware
|
5
|
+
class KeepCurrentUserTest < ActiveSupport::TestCase
|
6
|
+
include ::Dynflow::Testing
|
7
|
+
|
8
|
+
class TestAction < Support::DummyDynflowAction
|
9
|
+
middleware.use KeepCurrentUser
|
10
|
+
|
11
|
+
def run; end
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@user = mock('user')
|
16
|
+
@user.stubs(:id).returns(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'plan' do
|
20
|
+
test 'with current user set' do
|
21
|
+
User.expects(:current).twice.returns(@user)
|
22
|
+
|
23
|
+
@action = create_and_plan_action(TestAction)
|
24
|
+
assert_equal(@user.id, @action.input['current_user_id'])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'run' do
|
29
|
+
before do
|
30
|
+
User.stubs(:current).returns(@user)
|
31
|
+
|
32
|
+
@action = create_and_plan_action(TestAction)
|
33
|
+
|
34
|
+
User.stubs(:current)
|
35
|
+
end
|
36
|
+
|
37
|
+
test 'with current user as input' do
|
38
|
+
User.unscoped.class.any_instance.expects(:find).with(@user.id).returns(@user)
|
39
|
+
|
40
|
+
User.expects(:current=).with(@user)
|
41
|
+
|
42
|
+
User.stubs(:current=).with(nil)
|
43
|
+
|
44
|
+
@action = run_action(@action)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'foreman_tasks_test_helper'
|
2
|
+
|
3
|
+
module ForemanTasks
|
4
|
+
class RecurringActionTest < ActiveSupport::TestCase
|
5
|
+
class HookedAction < Actions::EntryAction
|
6
|
+
include Actions::RecurringAction
|
7
|
+
|
8
|
+
def plan(should_fail, _numbers)
|
9
|
+
plan_self(:should_fail => should_fail)
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
raise "A controlled failure" if input[:should_fail]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe Actions::RecurringAction do
|
18
|
+
include ::Dynflow::Testing
|
19
|
+
|
20
|
+
let(:preset) do
|
21
|
+
{
|
22
|
+
:minutes => 0,
|
23
|
+
:hours => 12,
|
24
|
+
:days => 1,
|
25
|
+
:months => (Time.zone.now.month + 1) % 12
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:recurring_logic) do
|
30
|
+
cronline = ForemanTasks::RecurringLogic.assemble_cronline(preset)
|
31
|
+
logic = ForemanTasks::RecurringLogic.new_from_cronline(cronline)
|
32
|
+
logic.state = 'active'
|
33
|
+
logic.save!
|
34
|
+
logic
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:args) { [false, [1, 2, 3]] }
|
38
|
+
|
39
|
+
let(:recurring_task) do
|
40
|
+
recurring_logic.start(HookedAction, *args)
|
41
|
+
recurring_logic.tasks.first
|
42
|
+
end
|
43
|
+
|
44
|
+
specify 'it triggers the repeat when task is cancelled' do
|
45
|
+
recurring_task.must_be :delayed?
|
46
|
+
recurring_logic.tasks.count.must_equal 1
|
47
|
+
cancelled_events = recurring_task.execution_plan.cancel
|
48
|
+
cancelled_events.each(&:wait!)
|
49
|
+
recurring_logic.reload
|
50
|
+
recurring_logic.tasks.count.must_equal 2
|
51
|
+
new_task = recurring_logic.tasks.find { |task| task.id != recurring_task.id }
|
52
|
+
new_task.execution_plan.delay_record.args.must_equal args
|
53
|
+
new_task.start_at.must_equal(recurring_task.start_at + 1.year)
|
54
|
+
end
|
55
|
+
|
56
|
+
specify 'it triggers the repeat when the task goes into planned state' do
|
57
|
+
delay_options = recurring_logic.generate_delay_options
|
58
|
+
task = ForemanTasks.delay HookedAction, delay_options, args
|
59
|
+
recurring_logic.tasks.count.must_equal 1
|
60
|
+
|
61
|
+
# Perform planning of the delayed plan
|
62
|
+
task.execution_plan.delay_record.plan
|
63
|
+
|
64
|
+
# Check a repetition was planned
|
65
|
+
recurring_logic.tasks.count.must_equal 2
|
66
|
+
end
|
67
|
+
|
68
|
+
specify 'it does not trigger repeat when failing in run' do
|
69
|
+
delay_options = recurring_logic.generate_delay_options
|
70
|
+
task = ForemanTasks.delay HookedAction, delay_options, true, args.last
|
71
|
+
recurring_logic.tasks.count.must_equal 1
|
72
|
+
|
73
|
+
# Perform the planning (trigger repeat)
|
74
|
+
task.execution_plan.delay_record.plan
|
75
|
+
recurring_logic.tasks.count.must_equal 2
|
76
|
+
|
77
|
+
# Let it fail
|
78
|
+
task.execution_plan.delay_record.execute.finished.wait
|
79
|
+
task.reload
|
80
|
+
task.result.must_equal 'error'
|
81
|
+
|
82
|
+
# Check no new repetitions were planned
|
83
|
+
recurring_logic.tasks.count.must_equal 2
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -106,6 +106,13 @@ class RecurringLogicsTest < ActiveSupport::TestCase
|
|
106
106
|
logic.end_time.must_be_close_to(triggering.end_time, 1.second)
|
107
107
|
end
|
108
108
|
|
109
|
+
it 'cannot trigger tasks when cancelled' do
|
110
|
+
recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline('* * * * *')
|
111
|
+
recurring_logic.state = 'cancelled'
|
112
|
+
recurring_logic.expects(:can_continue?).never
|
113
|
+
recurring_logic.trigger_repeat('this is not important', 'neither is this')
|
114
|
+
end
|
115
|
+
|
109
116
|
describe 'validation' do
|
110
117
|
let(:logic) { FactoryBot.build(:recurring_logic) }
|
111
118
|
|
data/test/unit/task_test.rb
CHANGED
@@ -122,7 +122,7 @@ class TasksTest < ActiveSupport::TestCase
|
|
122
122
|
|
123
123
|
describe 'recurring task' do
|
124
124
|
let(:logic) { FactoryBot.build(:recurring_logic) }
|
125
|
-
let(:task) { FactoryBot.create(:
|
125
|
+
let(:task) { FactoryBot.create(:dynflow_task) }
|
126
126
|
|
127
127
|
it 'can indicate it is recurring' do
|
128
128
|
refute task.recurring?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman-tasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Nečas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foreman-tasks-core
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0
|
33
|
+
version: '1.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0
|
40
|
+
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sinatra
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,6 +144,7 @@ files:
|
|
144
144
|
- app/lib/actions/middleware/rails_executor_wrap.rb
|
145
145
|
- app/lib/actions/middleware/recurring_logic.rb
|
146
146
|
- app/lib/actions/proxy_action.rb
|
147
|
+
- app/lib/actions/recurring_action.rb
|
147
148
|
- app/lib/actions/serializers/active_record_serializer.rb
|
148
149
|
- app/lib/proxy_api/foreman_dynflow/dynflow_proxy.rb
|
149
150
|
- app/models/foreman_tasks/concerns/action_subject.rb
|
@@ -244,12 +245,15 @@ files:
|
|
244
245
|
- test/factories/triggering_factory.rb
|
245
246
|
- test/foreman_tasks_test_helper.rb
|
246
247
|
- test/helpers/foreman_tasks/tasks_helper_test.rb
|
248
|
+
- test/lib/actions/middleware/keep_current_taxonomies_test.rb
|
249
|
+
- test/lib/actions/middleware/keep_current_user_test.rb
|
247
250
|
- test/support/dummy_dynflow_action.rb
|
248
251
|
- test/support/dummy_proxy_action.rb
|
249
252
|
- test/support/dummy_task_group.rb
|
250
253
|
- test/tasks/generate_task_actions_test.rb
|
251
254
|
- test/unit/actions/action_with_sub_plans_test.rb
|
252
255
|
- test/unit/actions/proxy_action_test.rb
|
256
|
+
- test/unit/actions/recurring_action_test.rb
|
253
257
|
- test/unit/cleaner_test.rb
|
254
258
|
- test/unit/config/environment.rb
|
255
259
|
- test/unit/dynflow_console_authorizer_test.rb
|
@@ -279,7 +283,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
283
|
version: '0'
|
280
284
|
requirements: []
|
281
285
|
rubyforge_project:
|
282
|
-
rubygems_version: 2.6.
|
286
|
+
rubygems_version: 2.6.8
|
283
287
|
signing_key:
|
284
288
|
specification_version: 4
|
285
289
|
summary: Foreman plugin for showing tasks information for resoruces and users
|
@@ -293,12 +297,15 @@ test_files:
|
|
293
297
|
- test/factories/triggering_factory.rb
|
294
298
|
- test/foreman_tasks_test_helper.rb
|
295
299
|
- test/helpers/foreman_tasks/tasks_helper_test.rb
|
300
|
+
- test/lib/actions/middleware/keep_current_taxonomies_test.rb
|
301
|
+
- test/lib/actions/middleware/keep_current_user_test.rb
|
296
302
|
- test/support/dummy_dynflow_action.rb
|
297
303
|
- test/support/dummy_proxy_action.rb
|
298
304
|
- test/support/dummy_task_group.rb
|
299
305
|
- test/tasks/generate_task_actions_test.rb
|
300
306
|
- test/unit/actions/action_with_sub_plans_test.rb
|
301
307
|
- test/unit/actions/proxy_action_test.rb
|
308
|
+
- test/unit/actions/recurring_action_test.rb
|
302
309
|
- test/unit/cleaner_test.rb
|
303
310
|
- test/unit/config/environment.rb
|
304
311
|
- test/unit/dynflow_console_authorizer_test.rb
|