foreman-tasks 0.7.2 → 0.7.3
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.
- checksums.yaml +8 -8
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +17 -0
- data/app/controllers/foreman_tasks/tasks_controller.rb +14 -4
- data/app/lib/actions/proxy_action.rb +82 -0
- data/app/lib/proxy_api/foreman_dynflow/dynflow_proxy.rb +31 -0
- data/app/models/foreman_tasks/task/dynflow_task.rb +8 -0
- data/app/views/foreman_tasks/tasks/_details.html.erb +4 -0
- data/app/views/foreman_tasks/tasks/show.html.erb +1 -1
- data/config/routes.rb +2 -0
- data/db/seeds.d/60-dynflow_proxy_feature.rb +2 -0
- data/lib/foreman_tasks/engine.rb +7 -1
- data/lib/foreman_tasks/test_extensions.rb +14 -0
- data/lib/foreman_tasks/version.rb +1 -1
- data/test/controllers/api/tasks_controller_test.rb +33 -5
- data/test/foreman_tasks_test_helper.rb +3 -0
- data/test/support/dummy_proxy_action.rb +49 -0
- data/test/unit/actions/proxy_action_test.rb +67 -0
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
Y2I3YzI4OGYwN2U1YWZmZGQ1MmE2MmVlYTBiNTBlZmUyMDhkMDJkYQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDNlOGVkYjFjODE5ZmQ2NWNiMjYzOTFjMmI3NTQ3N2FjYmYzMmI2Mg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTA1NDM0MjUyZDIzNGNmMjA3NTgwNWNkYzVmZDhmODg4ZDk3MGY0YjMzZGIx
|
10
|
+
ZjQyMTY4N2Y5NTgwNTQzMTEwNWU4ZmZlYThmNmEzZWVmMWE1ZGVmZDFlMWUz
|
11
|
+
N2IyZjkyMzc1YjIzOWZjZjY4M2E1NDc1NmI2NTI4ZTI4Y2RhOWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDRjZmVlN2I2NDgwMDc4YjVlODA2MjE1ZjY5MzRmZGJmMDlkOGM5OTI0YWMy
|
14
|
+
ZTJkNmIzMDk0MDZiYTZmOGEzMzFiZDZmOTdmNGYwNTQzYjg2NzBkNTUwN2Ew
|
15
|
+
YzQ2N2RlNWU1ZjdiNWRhOWY5NDE0ZmVjYWMxOTA4NmJkYTcwNjI=
|
@@ -14,6 +14,9 @@ module ForemanTasks
|
|
14
14
|
module Api
|
15
15
|
class TasksController < ::Api::V2::BaseController
|
16
16
|
|
17
|
+
include ::Foreman::Controller::SmartProxyAuth
|
18
|
+
add_smart_proxy_filters :callback, :features => 'Dynflow'
|
19
|
+
|
17
20
|
resource_description do
|
18
21
|
resource_id 'foreman_tasks'
|
19
22
|
api_version 'v2'
|
@@ -158,6 +161,20 @@ module ForemanTasks
|
|
158
161
|
}
|
159
162
|
end
|
160
163
|
|
164
|
+
api :POST, '/tasks/callback', N_("Send data to the task from external executor (such as smart_proxy_dynflow)")
|
165
|
+
param :callback, Hash do
|
166
|
+
param :task_id, :identifier, :desc => N_("UUID of the task")
|
167
|
+
param :step_id, String, :desc => N_("The id of the step inside the execution plan to send the event to ")
|
168
|
+
end
|
169
|
+
param :data, Hash, :desc => N_("Data to be sent to the action")
|
170
|
+
def callback
|
171
|
+
task = ForemanTasks::Task::DynflowTask.find(params[:callback][:task_id])
|
172
|
+
ForemanTasks.dynflow.world.event(task.external_id,
|
173
|
+
params[:callback][:step_id].to_i,
|
174
|
+
::Actions::ProxyAction::CallbackData.new(params[:data]))
|
175
|
+
render :json => { :message => 'processing' }.to_json
|
176
|
+
end
|
177
|
+
|
161
178
|
private
|
162
179
|
|
163
180
|
def search_tasks(search_params)
|
@@ -26,6 +26,16 @@ module ForemanTasks
|
|
26
26
|
redirect_to foreman_tasks_task_path(task)
|
27
27
|
end
|
28
28
|
|
29
|
+
def cancel
|
30
|
+
task = find_dynflow_task
|
31
|
+
if task.cancel
|
32
|
+
flash[:notice] = _('Trying to cancel the task')
|
33
|
+
else
|
34
|
+
flash[:warning] = _('The task is not cancellable at the moment.')
|
35
|
+
end
|
36
|
+
redirect_to :back
|
37
|
+
end
|
38
|
+
|
29
39
|
def resume
|
30
40
|
task = find_dynflow_task
|
31
41
|
if task.resumable?
|
@@ -34,7 +44,7 @@ module ForemanTasks
|
|
34
44
|
else
|
35
45
|
flash[:warning] = _('The execution has to be resumable.')
|
36
46
|
end
|
37
|
-
redirect_to
|
47
|
+
redirect_to :back
|
38
48
|
end
|
39
49
|
|
40
50
|
def unlock
|
@@ -46,7 +56,7 @@ module ForemanTasks
|
|
46
56
|
else
|
47
57
|
flash[:warning] = _('The execution has to be paused.')
|
48
58
|
end
|
49
|
-
redirect_to
|
59
|
+
redirect_to :back
|
50
60
|
end
|
51
61
|
|
52
62
|
def force_unlock
|
@@ -54,7 +64,7 @@ module ForemanTasks
|
|
54
64
|
task.state = :stopped
|
55
65
|
task.save!
|
56
66
|
flash[:notice] = _('The task resources were unlocked with force.')
|
57
|
-
redirect_to
|
67
|
+
redirect_to :back
|
58
68
|
end
|
59
69
|
|
60
70
|
# we need do this to make the Foreman helpers working properly
|
@@ -76,7 +86,7 @@ module ForemanTasks
|
|
76
86
|
case params[:action]
|
77
87
|
when 'sub_tasks'
|
78
88
|
:view
|
79
|
-
when 'resume', 'unlock', 'force_unlock', 'cancel_step'
|
89
|
+
when 'resume', 'unlock', 'force_unlock', 'cancel_step', 'cancel'
|
80
90
|
:edit
|
81
91
|
else
|
82
92
|
super
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Actions
|
2
|
+
class ProxyAction < Base
|
3
|
+
|
4
|
+
include ::Dynflow::Action::Cancellable
|
5
|
+
|
6
|
+
class CallbackData
|
7
|
+
attr_reader :data
|
8
|
+
|
9
|
+
def initialize(data)
|
10
|
+
@data = data
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def plan(proxy, options)
|
15
|
+
plan_self(options.merge(:proxy_url => proxy.url))
|
16
|
+
end
|
17
|
+
|
18
|
+
def run(event = nil)
|
19
|
+
case event
|
20
|
+
when nil
|
21
|
+
if output[:proxy_task_id]
|
22
|
+
on_resume
|
23
|
+
else
|
24
|
+
trigger_proxy_task
|
25
|
+
end
|
26
|
+
suspend
|
27
|
+
when ::Dynflow::Action::Skip
|
28
|
+
# do nothing
|
29
|
+
when ::Dynflow::Action::Cancellable::Cancel
|
30
|
+
cancel_proxy_task
|
31
|
+
when CallbackData
|
32
|
+
on_data(event.data)
|
33
|
+
else
|
34
|
+
raise "Unexpected event #{event.inspect}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def trigger_proxy_task
|
39
|
+
response = proxy.trigger_task(proxy_action_name,
|
40
|
+
input.merge(:callback => { :task_id => task.id,
|
41
|
+
:step_id => run_step_id }))
|
42
|
+
output[:proxy_task_id] = response["task_id"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def cancel_proxy_task
|
46
|
+
if output[:cancel_sent]
|
47
|
+
error! _("Cancel enforced: the task might be still running on the proxy")
|
48
|
+
else
|
49
|
+
proxy.cancel_task(output[:proxy_task_id])
|
50
|
+
output[:cancel_sent] = true
|
51
|
+
suspend
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def on_resume
|
56
|
+
# TODO: add logic to load the data from the external action
|
57
|
+
suspend
|
58
|
+
end
|
59
|
+
|
60
|
+
# @override to put custom logic on event handling
|
61
|
+
def on_data(data)
|
62
|
+
output[:proxy_output] = data
|
63
|
+
end
|
64
|
+
|
65
|
+
# @override String name of an action to be triggered on server
|
66
|
+
def proxy_action_name
|
67
|
+
raise NotImplemented
|
68
|
+
end
|
69
|
+
|
70
|
+
def proxy
|
71
|
+
ProxyAPI::ForemanDynflow::DynflowProxy.new(:url => input[:proxy_url])
|
72
|
+
end
|
73
|
+
|
74
|
+
def proxy_output
|
75
|
+
output[:proxy_output]
|
76
|
+
end
|
77
|
+
|
78
|
+
def proxy_output=(output)
|
79
|
+
output[:proxy_output] = output
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ProxyAPI
|
2
|
+
module ForemanDynflow
|
3
|
+
class DynflowProxy
|
4
|
+
PREFIX = 'dynflow'
|
5
|
+
|
6
|
+
class Task < ProxyAPI::Resource
|
7
|
+
def initialize(args)
|
8
|
+
@url = "#{args[:url]}/#{PREFIX}/tasks"
|
9
|
+
super args
|
10
|
+
@connect_params[:headers] ||= {}
|
11
|
+
@connect_params[:headers]['content-type'] = 'application/json'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(args)
|
16
|
+
@args = args
|
17
|
+
end
|
18
|
+
|
19
|
+
# Initiate the command
|
20
|
+
def trigger_task(action_name, action_input)
|
21
|
+
payload = MultiJson.dump(:action_name => action_name, :action_input => action_input)
|
22
|
+
MultiJson.load(Task.new(@args).send(:post, payload))
|
23
|
+
end
|
24
|
+
|
25
|
+
# Initiate the command
|
26
|
+
def cancel_task(proxy_task_id)
|
27
|
+
MultiJson.load(Task.new(@args).send(:post, "", "#{ proxy_task_id }/cancel"))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -9,6 +9,10 @@
|
|
9
9
|
resume_foreman_tasks_task_path(@task),
|
10
10
|
class: ['btn', 'btn-sm', 'btn-primary', ('disabled' unless @task.resumable?)].compact,
|
11
11
|
method: :post) %>
|
12
|
+
<%= link_to(_('Cancel'),
|
13
|
+
cancel_foreman_tasks_task_path(@task),
|
14
|
+
class: ['btn', 'btn-sm', 'btn-primary', ('disabled' unless @task.cancellable?)].compact,
|
15
|
+
method: :post) %>
|
12
16
|
<% if Setting['dynflow_allow_dangerous_actions'] %>
|
13
17
|
<%= link_to(_('Unlock'),
|
14
18
|
'',
|
data/config/routes.rb
CHANGED
@@ -6,6 +6,7 @@ Foreman::Application.routes.draw do
|
|
6
6
|
end
|
7
7
|
member do
|
8
8
|
get :sub_tasks
|
9
|
+
post :cancel
|
9
10
|
post :resume
|
10
11
|
post :unlock
|
11
12
|
post :force_unlock
|
@@ -19,6 +20,7 @@ Foreman::Application.routes.draw do
|
|
19
20
|
post :bulk_search
|
20
21
|
post :bulk_resume
|
21
22
|
get :summary
|
23
|
+
post :callback
|
22
24
|
end
|
23
25
|
end
|
24
26
|
end
|
data/lib/foreman_tasks/engine.rb
CHANGED
@@ -18,7 +18,7 @@ module ForemanTasks
|
|
18
18
|
security_block :foreman_tasks do |map|
|
19
19
|
permission :view_foreman_tasks, {:'foreman_tasks/tasks' => [:auto_complete_search, :sub_tasks, :index, :show],
|
20
20
|
:'foreman_tasks/api/tasks' => [:bulk_search, :show, :index, :summary] }, :resource_type => ForemanTasks::Task.name
|
21
|
-
permission :edit_foreman_tasks, {:'foreman_tasks/tasks' => [:resume, :unlock, :force_unlock, :cancel_step],
|
21
|
+
permission :edit_foreman_tasks, {:'foreman_tasks/tasks' => [:resume, :unlock, :force_unlock, :cancel_step, :cancel],
|
22
22
|
:'foreman_tasks/api/tasks' => [:bulk_resume]}, :resource_type => ForemanTasks::Task.name
|
23
23
|
end
|
24
24
|
|
@@ -51,6 +51,12 @@ module ForemanTasks
|
|
51
51
|
ForemanTasks.dynflow.config.eager_load_paths.concat(%W[#{ForemanTasks::Engine.root}/app/lib/actions])
|
52
52
|
end
|
53
53
|
|
54
|
+
initializer "foreman_tasks.test_exceptions" do |app|
|
55
|
+
if defined? ActiveSupport::TestCase
|
56
|
+
require 'foreman_tasks/test_extensions'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
54
60
|
initializer "foreman_tasks.load_app_instance_data" do |app|
|
55
61
|
app.config.paths['db/migrate'] += ForemanTasks::Engine.paths['db/migrate'].existent
|
56
62
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ForemanTasks
|
2
|
+
module TestExtensions
|
3
|
+
module AccessPermissionsTestExtension
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
if defined?(AccessPermissionsTest) && self.class == AccessPermissionsTest
|
7
|
+
skip 'used by proxy only' if __name__.include?('foreman_tasks/api/tasks/callback')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
ActiveSupport::TestCase.send(:include, ForemanTasks::TestExtensions::AccessPermissionsTestExtension)
|
@@ -9,15 +9,43 @@ module ForemanTasks
|
|
9
9
|
User.current = User.where(:login => 'apiadmin').first
|
10
10
|
@request.env['HTTP_ACCEPT'] = 'application/json'
|
11
11
|
@request.env['CONTENT_TYPE'] = 'application/json'
|
12
|
-
@task = FactoryGirl.create(:dynflow_task, :user_create_task)
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
describe 'GET /api/tasks/show' do
|
15
|
+
it 'searches for task' do
|
16
|
+
task = FactoryGirl.create(:dynflow_task, :user_create_task)
|
17
|
+
get(:show, :id => task.id)
|
18
|
+
assert_response :success
|
19
|
+
assert_template 'api/tasks/show'
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
23
|
+
describe 'POST /tasks/callback' do
|
24
|
+
self.use_transactional_fixtures = false
|
25
|
+
|
26
|
+
it 'passes the data to the corresponding action' do
|
27
|
+
Support::DummyProxyAction.reset
|
28
|
+
|
29
|
+
triggered = ForemanTasks.trigger(Support::DummyProxyAction, Support::DummyProxyAction.proxy, 'foo' => 'bar')
|
30
|
+
Support::DummyProxyAction.proxy.task_triggered.wait(5)
|
31
|
+
|
32
|
+
task = ForemanTasks::Task.find_by_external_id(triggered.id)
|
33
|
+
task.state.must_equal 'running'
|
34
|
+
task.result.must_equal 'pending'
|
35
|
+
|
36
|
+
callback = Support::DummyProxyAction.proxy.log[:trigger_task].first[1][:callback]
|
37
|
+
post(:callback, 'callback' => callback, 'data' => {'result' => 'success'})
|
38
|
+
triggered.finished.wait(5)
|
39
|
+
|
40
|
+
task.reload
|
41
|
+
task.state.must_equal 'stopped'
|
42
|
+
task.result.must_equal 'success'
|
43
|
+
task.main_action.output.must_equal({ "proxy_task_id" => "123",
|
44
|
+
"proxy_output" => { "result" => "success" }})
|
45
|
+
end
|
46
|
+
end
|
21
47
|
end
|
22
48
|
end
|
23
49
|
end
|
50
|
+
|
51
|
+
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require_relative './support/dummy_dynflow_action'
|
3
|
+
require_relative './support/dummy_proxy_action'
|
4
|
+
|
5
|
+
require 'dynflow/testing'
|
3
6
|
|
4
7
|
FactoryGirl.definition_file_paths = ["#{ForemanTasks::Engine.root}/test/factories"]
|
5
8
|
FactoryGirl.find_definitions
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Support
|
2
|
+
class DummyProxyAction < Actions::ProxyAction
|
3
|
+
|
4
|
+
class DummyProxy
|
5
|
+
attr_reader :log, :task_triggered
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@log = Hash.new { |h, k| h[k] = [] }
|
9
|
+
@task_triggered = Concurrent.future
|
10
|
+
end
|
11
|
+
|
12
|
+
def trigger_task(*args)
|
13
|
+
@log[:trigger_task] << args
|
14
|
+
@task_triggered.success(true)
|
15
|
+
{"task_id" => "123"}
|
16
|
+
end
|
17
|
+
|
18
|
+
def cancel_task(*args)
|
19
|
+
@log[:cancel_task] << args
|
20
|
+
end
|
21
|
+
|
22
|
+
def url
|
23
|
+
'proxy.example.com'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def proxy
|
28
|
+
self.class.proxy
|
29
|
+
end
|
30
|
+
|
31
|
+
def proxy_action_name
|
32
|
+
'Proxy::DummyAction'
|
33
|
+
end
|
34
|
+
|
35
|
+
def task
|
36
|
+
super
|
37
|
+
rescue ActiveRecord::RecordNotFound
|
38
|
+
ForemanTasks::Task::DynflowTask.new.tap { |task| task.id = '123' }
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.proxy
|
42
|
+
@proxy
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.reset
|
46
|
+
@proxy = DummyProxy.new
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "foreman_tasks_test_helper"
|
2
|
+
|
3
|
+
module ForemanTasks
|
4
|
+
class ProxyActionTest < ActiveSupport::TestCase
|
5
|
+
|
6
|
+
describe Actions::ProxyAction do
|
7
|
+
include ::Dynflow::Testing
|
8
|
+
|
9
|
+
before do
|
10
|
+
Support::DummyProxyAction.reset
|
11
|
+
@action = create_and_plan_action(Support::DummyProxyAction, Support::DummyProxyAction.proxy, 'foo' => 'bar')
|
12
|
+
@action = run_action(@action)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'first run' do
|
16
|
+
it 'triggers the corresponding action on the proxy' do
|
17
|
+
proxy_call = Support::DummyProxyAction.proxy.log[:trigger_task].first
|
18
|
+
proxy_call.must_equal(["Proxy::DummyAction",
|
19
|
+
{ "foo" => "bar",
|
20
|
+
"proxy_url" => "proxy.example.com",
|
21
|
+
"callback" => { "task_id" => "123", "step_id" => @action.run_step_id }}])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'resumed run' do
|
26
|
+
it "doesn't trigger the corresponding action again on the proxy" do
|
27
|
+
action = run_action(@action)
|
28
|
+
|
29
|
+
action.state.must_equal :suspended
|
30
|
+
|
31
|
+
Support::DummyProxyAction.proxy.log[:trigger_task].size.must_equal 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'supports skipping' do
|
36
|
+
action = run_action(@action, ::Dynflow::Action::Skip)
|
37
|
+
action.state.must_equal :success
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'cancel' do
|
41
|
+
it 'sends the cancel event to the proxy when the cancel event is sent for the first time' do
|
42
|
+
action = run_action(@action, ::Dynflow::Action::Cancellable::Cancel)
|
43
|
+
Support::DummyProxyAction.proxy.log[:cancel_task].first.must_equal ['123']
|
44
|
+
action.state.must_equal :suspended
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'cancels the action immediatelly when cancel event is sent for the second time' do
|
48
|
+
action = run_action(@action, ::Dynflow::Action::Cancellable::Cancel)
|
49
|
+
error = begin
|
50
|
+
run_action(action, ::Dynflow::Action::Cancellable::Cancel)
|
51
|
+
rescue => e
|
52
|
+
e
|
53
|
+
end
|
54
|
+
|
55
|
+
Support::DummyProxyAction.proxy.log[:cancel_task].size.must_equal 1
|
56
|
+
error.message.must_match 'Cancel enforced'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'saves the data comming from the proxy to the output and finishes' do
|
61
|
+
action = run_action(@action, ::Actions::ProxyAction::CallbackData.new('result' => 'success'))
|
62
|
+
action.output[:proxy_output].must_equal({'result' => 'success'})
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
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.7.
|
4
|
+
version: 0.7.3
|
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: 2015-
|
11
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dynflow
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.8.
|
19
|
+
version: 0.8.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.8.
|
26
|
+
version: 0.8.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sequel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,6 +104,8 @@ files:
|
|
104
104
|
- app/lib/actions/helpers/humanizer.rb
|
105
105
|
- app/lib/actions/helpers/lock.rb
|
106
106
|
- app/lib/actions/middleware/keep_current_user.rb
|
107
|
+
- app/lib/actions/proxy_action.rb
|
108
|
+
- app/lib/proxy_api/foreman_dynflow/dynflow_proxy.rb
|
107
109
|
- app/models/foreman_tasks/concerns/action_subject.rb
|
108
110
|
- app/models/foreman_tasks/concerns/action_triggering.rb
|
109
111
|
- app/models/foreman_tasks/concerns/architecture_action_subject.rb
|
@@ -133,6 +135,7 @@ files:
|
|
133
135
|
- db/migrate/20140324104010_remove_foreman_tasks_progress.rb
|
134
136
|
- db/migrate/20140813215942_add_parent_task_id.rb
|
135
137
|
- db/seeds.d/20-foreman_tasks_permissions.rb
|
138
|
+
- db/seeds.d/60-dynflow_proxy_feature.rb
|
136
139
|
- deploy/foreman-tasks.init
|
137
140
|
- deploy/foreman-tasks.service
|
138
141
|
- deploy/foreman-tasks.sysconfig
|
@@ -150,6 +153,7 @@ files:
|
|
150
153
|
- lib/foreman_tasks/tasks/cleanup.rake
|
151
154
|
- lib/foreman_tasks/tasks/dynflow.rake
|
152
155
|
- lib/foreman_tasks/tasks/export_tasks.rake
|
156
|
+
- lib/foreman_tasks/test_extensions.rb
|
153
157
|
- lib/foreman_tasks/triggers.rb
|
154
158
|
- lib/foreman_tasks/version.rb
|
155
159
|
- lib/tasks/gettext.rake
|
@@ -158,7 +162,9 @@ files:
|
|
158
162
|
- test/foreman_tasks_test_helper.rb
|
159
163
|
- test/helpers/foreman_tasks/tasks_helper_test.rb
|
160
164
|
- test/support/dummy_dynflow_action.rb
|
165
|
+
- test/support/dummy_proxy_action.rb
|
161
166
|
- test/unit/actions/action_with_sub_plans_test.rb
|
167
|
+
- test/unit/actions/proxy_action_test.rb
|
162
168
|
- test/unit/cleaner_test.rb
|
163
169
|
- test/unit/dynflow_console_authorizer_test.rb
|
164
170
|
- test/unit/task_test.rb
|
@@ -188,11 +194,13 @@ summary: Foreman plugin for showing tasks information for resoruces and users
|
|
188
194
|
test_files:
|
189
195
|
- test/helpers/foreman_tasks/tasks_helper_test.rb
|
190
196
|
- test/support/dummy_dynflow_action.rb
|
197
|
+
- test/support/dummy_proxy_action.rb
|
191
198
|
- test/foreman_tasks_test_helper.rb
|
192
199
|
- test/controllers/api/tasks_controller_test.rb
|
193
200
|
- test/factories/task_factory.rb
|
194
201
|
- test/unit/cleaner_test.rb
|
195
202
|
- test/unit/dynflow_console_authorizer_test.rb
|
203
|
+
- test/unit/actions/proxy_action_test.rb
|
196
204
|
- test/unit/actions/action_with_sub_plans_test.rb
|
197
205
|
- test/unit/task_test.rb
|
198
206
|
has_rdoc:
|