foreman-tasks 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abb4a2ffa0ff0ef6082c2ebe1a8a90d89b5b3b27
4
- data.tar.gz: 35f084894f1692002cc5a76458b28f34763d9778
3
+ metadata.gz: 4b2dd645da0ebd3edca99e961dc24554fa56f679
4
+ data.tar.gz: 0e013856f470f68c6b5e0ed7f11feee290f0e4d4
5
5
  SHA512:
6
- metadata.gz: da1b67abb754259dddb59013b176c38cfcb4c2f69d09640bf89a862f784b08d53ee30ca228723ab24aabb1db2770249e57b07cce9bb756df214feac2becd3393
7
- data.tar.gz: 02be42c80788f710e700f8c502177c584a421517e76678299859258a08b2c1267c9134afd088b0801bce3390f9e19feafc3afb3affa0cd5c65df31c23cb0698e
6
+ metadata.gz: 9d8ca3871234b226b1e2d2843e6cdc59c4cbf712f8a8c942e478b304b7e07330aa5407bc55b159f90023970a55bfe0ffe9817473613dc3dc223847487eb4ba97
7
+ data.tar.gz: 50362b2a751157e3f8132ce4759f3262a389fa7c154bef924eecbfe9d2bf362809eb05c54c111da9188cc725b8a096f35d0b392cf4d4b66e43397a776792fbac
data/.rubocop.yml CHANGED
@@ -43,10 +43,6 @@ Rails/SkipsModelValidations:
43
43
  Style/SymbolArray:
44
44
  Enabled: false
45
45
 
46
- # for compatibility with Foreman 1.15
47
- Rails/ApplicationRecord:
48
- Enabled: false
49
-
50
46
  Style/FormatString:
51
47
  Enabled: false
52
48
 
@@ -62,6 +58,9 @@ Rails/ReversibleMigration:
62
58
 
63
59
  Metrics/BlockLength:
64
60
  Exclude:
61
+ - config/routes.rb
62
+ - lib/foreman_remote_execution/engine.rb
63
+ - test/**/*
65
64
  - lib/foreman_tasks/tasks/**/*
66
65
 
67
66
  Naming/FileName:
data/.rubocop_todo.yml CHANGED
@@ -58,9 +58,6 @@ Rails/Exit:
58
58
  Exclude:
59
59
  - 'lib/**/*.rake'
60
60
 
61
- Rails/HttpPositionalArguments:
62
- Enabled: false
63
-
64
61
  # Configuration parameters: Include.
65
62
  # Include: app/**/*.rb, config/**/*.rb, db/**/*.rb, lib/**/*.rb
66
63
  Rails/Output:
@@ -3,22 +3,28 @@ module ForemanTasks
3
3
  module Parameters
4
4
  module Triggering
5
5
  extend ActiveSupport::Concern
6
- include Foreman::Controller::Parameters::KeepParam
7
6
 
8
7
  class_methods do
9
8
  def triggering_params_filter
10
9
  Foreman::ParameterFilter.new(::ForemanTasks::Triggering).tap do |filter|
11
- filter.permit_by_context(:mode, :start_at, :start_before,
12
- *::ForemanTasks::Triggering::PARAMS,
13
- :nested => true)
10
+ filter.permit_by_context(
11
+ [
12
+ :mode,
13
+ :start_at,
14
+ :start_before,
15
+ *::ForemanTasks::Triggering::PARAMS,
16
+ :days_of_week => {},
17
+ :time => {},
18
+ :end_time => {}
19
+ ],
20
+ :nested => true
21
+ )
14
22
  end
15
23
  end
16
24
  end
17
25
 
18
26
  def triggering_params
19
- keep_param(params, :triggering, :days_of_week, :time, :end_time) do
20
- self.class.triggering_params_filter.filter_params(params, parameter_filter_context, :triggering)
21
- end
27
+ self.class.triggering_params_filter.filter_params(params, parameter_filter_context, :triggering)
22
28
  end
23
29
  end
24
30
  end
@@ -42,7 +42,7 @@ module ForemanTasks
42
42
  else
43
43
  flash[:warning] = _('The task cannot be cancelled at the moment.')
44
44
  end
45
- redirect_to :back
45
+ redirect_back(:fallback_location => foreman_tasks_task_path(task))
46
46
  end
47
47
 
48
48
  def abort
@@ -52,7 +52,7 @@ module ForemanTasks
52
52
  else
53
53
  flash[:warning] = _('The task cannot be aborted at the moment.')
54
54
  end
55
- redirect_to :back
55
+ redirect_back(:fallback_location => foreman_tasks_task_path(task))
56
56
  end
57
57
 
58
58
  def resume
@@ -63,7 +63,7 @@ module ForemanTasks
63
63
  else
64
64
  flash[:warning] = _('The execution has to be resumable.')
65
65
  end
66
- redirect_to :back
66
+ redirect_back(:fallback_location => foreman_tasks_task_path(task))
67
67
  end
68
68
 
69
69
  def unlock
@@ -75,7 +75,7 @@ module ForemanTasks
75
75
  else
76
76
  flash[:warning] = _('The execution has to be paused.')
77
77
  end
78
- redirect_to :back
78
+ redirect_back(:fallback_location => foreman_tasks_task_path(task))
79
79
  end
80
80
 
81
81
  def force_unlock
@@ -83,7 +83,7 @@ module ForemanTasks
83
83
  task.state = :stopped
84
84
  task.save!
85
85
  flash[:notice] = _('The task resources were unlocked with force.')
86
- redirect_to :back
86
+ redirect_back(:fallback_location => foreman_tasks_task_path(task))
87
87
  end
88
88
 
89
89
  # we need do this to make the Foreman helpers working properly
@@ -0,0 +1,11 @@
1
+ module Actions
2
+ module Middleware
3
+ class HideSecrets < ::Dynflow::Middleware
4
+ def present
5
+ action.input[:secrets] = 'Secrets hidden' if action.input.key?(:secrets)
6
+ action.output[:secrets] = 'Secrets hidden' if action.output.key?(:secrets)
7
+ pass
8
+ end
9
+ end
10
+ end
11
+ end
@@ -47,7 +47,7 @@ module Actions
47
47
  end
48
48
 
49
49
  def restore_curent_user
50
- User.current = User.unscoped.find(action.input[:current_user_id])
50
+ User.current = User.unscoped.find(action.input[:current_user_id]) if action.input[:current_user_id].present?
51
51
  yield
52
52
  ensure
53
53
  User.current = nil
@@ -3,6 +3,8 @@ module Actions
3
3
  include ::Dynflow::Action::Cancellable
4
4
  include ::Dynflow::Action::Timeouts
5
5
 
6
+ middleware.use ::Actions::Middleware::HideSecrets
7
+
6
8
  class CallbackData
7
9
  attr_reader :data
8
10
 
@@ -93,6 +95,12 @@ module Actions
93
95
  # @override to put custom logic on event handling
94
96
  def on_data(data)
95
97
  output[:proxy_output] = data
98
+ wipe_secrets!
99
+ end
100
+
101
+ def wipe_secrets!
102
+ input.delete(:secrets)
103
+ output.delete(:secrets)
96
104
  end
97
105
 
98
106
  # @override String name of an action to be triggered on server
@@ -1,5 +1,5 @@
1
1
  module ForemanTasks
2
- class Lock < ActiveRecord::Base
2
+ class Lock < ApplicationRecord
3
3
  LINK_LOCK_NAME = :link_resource
4
4
  OWNER_LOCK_NAME = :task_owner
5
5
 
@@ -1,7 +1,7 @@
1
1
  module ForemanTasks
2
2
  require 'parse-cron'
3
3
 
4
- class RecurringLogic < ActiveRecord::Base
4
+ class RecurringLogic < ApplicationRecord
5
5
  include Authorizable
6
6
 
7
7
  belongs_to :task_group
@@ -11,7 +11,7 @@ module ForemanTasks
11
11
  if Rails::VERSION::MAJOR < 4
12
12
  has_many :task_groups, :through => :tasks, :uniq => true
13
13
  else
14
- has_many :task_groups, -> { uniq }, :through => :tasks
14
+ has_many :task_groups, -> { distinct }, :through => :tasks
15
15
  end
16
16
 
17
17
  scoped_search :on => :id, :complete_value => false, :validator => ScopedSearch::Validators::INTEGER
@@ -1,7 +1,7 @@
1
1
  require 'securerandom'
2
2
 
3
3
  module ForemanTasks
4
- class Task < ActiveRecord::Base
4
+ class Task < ApplicationRecord
5
5
  include Authorizable
6
6
 
7
7
  def check_permissions_after_save
@@ -1,5 +1,5 @@
1
1
  module ForemanTasks
2
- class TaskGroup < ActiveRecord::Base
2
+ class TaskGroup < ApplicationRecord
3
3
  has_many :task_group_members, :dependent => :destroy
4
4
  has_many :tasks, :through => :task_group_members, :dependent => :nullify
5
5
 
@@ -1,5 +1,5 @@
1
1
  module ForemanTasks
2
- class TaskGroupMember < ActiveRecord::Base
2
+ class TaskGroupMember < ApplicationRecord
3
3
  belongs_to :task_group
4
4
  belongs_to :task
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module ForemanTasks
2
- class Triggering < ActiveRecord::Base
2
+ class Triggering < ApplicationRecord
3
3
  PARAMS = [:start_at_raw, :start_before_raw, :max_iteration, :input_type,
4
4
  :cronline, :days, :days_of_week, :time, :end_time_limited,
5
5
  :end_time].freeze
@@ -1,6 +1,5 @@
1
1
  FOREMAN_USER=foreman
2
2
  BUNDLER_EXT_HOME=/usr/share/foreman
3
- RAILS_RELATIVE_URL_ROOT=$FOREMAN_PREFIX
4
3
  RAILS_ENV=production
5
4
  FOREMAN_LOGGING=warn
6
5
  FOREMAN_LOGGING_SQL=warn
@@ -116,6 +116,7 @@ module ForemanTasks
116
116
  initializer 'foreman_tasks.require_dynflow', :before => 'foreman_tasks.initialize_dynflow' do |_app|
117
117
  ForemanTasks.dynflow.require!
118
118
  ::ForemanTasks.dynflow.config.on_init do |world|
119
+ world.middleware.use Actions::Middleware::KeepCurrentUser
119
120
  ForemanTasksCore.dynflow_setup(world)
120
121
  end
121
122
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanTasks
2
- VERSION = '0.11.0'.freeze
2
+ VERSION = '0.11.1'.freeze
3
3
  end
@@ -22,7 +22,7 @@ module ForemanRecurringLogic
22
22
 
23
23
  describe 'GET /api/recurring_logics/:id' do
24
24
  it 'searches for recurring logic' do
25
- get :show, :id => @recurring_logic.id
25
+ get :show, params: { :id => @recurring_logic.id }
26
26
  assert_response :success
27
27
  assert_template 'api/recurring_logics/show'
28
28
  end
@@ -30,7 +30,7 @@ module ForemanRecurringLogic
30
30
 
31
31
  describe 'POST /api/recurring_logics/:id/cancel' do
32
32
  it 'cancels recurring logic' do
33
- post :cancel, :id => @recurring_logic.id
33
+ post :cancel, params: { :id => @recurring_logic.id }
34
34
  assert_response :success
35
35
  @recurring_logic.reload
36
36
  assert @recurring_logic.state == 'cancelled'
@@ -14,15 +14,13 @@ module ForemanTasks
14
14
  describe 'GET /api/tasks/show' do
15
15
  it 'searches for task' do
16
16
  task = FactoryBot.create(:dynflow_task, :user_create_task)
17
- get :show, :id => task.id
17
+ get :show, params: { :id => task.id }
18
18
  assert_response :success
19
19
  assert_template 'api/tasks/show'
20
20
  end
21
21
  end
22
22
 
23
23
  describe 'POST /tasks/callback' do
24
- self.use_transactional_fixtures = false
25
-
26
24
  it 'passes the data to the corresponding action' do
27
25
  Support::DummyProxyAction.reset
28
26
 
@@ -37,7 +35,7 @@ module ForemanTasks
37
35
  task.result.must_equal 'pending'
38
36
 
39
37
  callback = Support::DummyProxyAction.proxy.log[:trigger_task].first[1][:callback]
40
- post :callback, 'callback' => callback, 'data' => { 'result' => 'success' }
38
+ post :callback, params: { 'callback' => callback, 'data' => { 'result' => 'success' } }
41
39
  triggered.finished.wait(5)
42
40
 
43
41
  task.reload
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
  require_relative './support/dummy_dynflow_action'
3
3
  require_relative './support/dummy_proxy_action'
4
+ require_relative './support/dummy_task_group'
4
5
 
5
6
  require 'dynflow/testing'
6
7
 
@@ -0,0 +1,4 @@
1
+ module Support
2
+ class DummyTaskGroup < ForemanTasks::TaskGroup
3
+ end
4
+ end
@@ -2,8 +2,6 @@ require 'foreman_tasks_test_helper'
2
2
 
3
3
  module ForemanTasks
4
4
  class ActionWithSubPlansTest < ActiveSupport::TestCase
5
- self.use_transactional_fixtures = false
6
-
7
5
  before do
8
6
  User.current = User.where(:login => 'apiadmin').first
9
7
  end
@@ -5,12 +5,17 @@ module ForemanTasks
5
5
  describe Actions::ProxyAction do
6
6
  include ::Dynflow::Testing
7
7
 
8
+ let(:secrets) do
9
+ { 'logins' => { 'admin' => 'changeme', 'root' => 'toor' } }
10
+ end
11
+
8
12
  before do
9
13
  Support::DummyProxyAction.reset
10
14
  @action = create_and_plan_action(Support::DummyProxyAction,
11
15
  Support::DummyProxyAction.proxy,
12
16
  'Proxy::DummyAction',
13
- 'foo' => 'bar')
17
+ 'foo' => 'bar',
18
+ 'secrets' => secrets)
14
19
  @action = run_action(@action)
15
20
  end
16
21
 
@@ -19,6 +24,7 @@ module ForemanTasks
19
24
  proxy_call = Support::DummyProxyAction.proxy.log[:trigger_task].first
20
25
  expected_call = ['Proxy::DummyAction',
21
26
  { 'foo' => 'bar',
27
+ 'secrets' => secrets,
22
28
  'connection_options' =>
23
29
  { 'retry_interval' => 15, 'retry_count' => 4, 'timeout' => 60 },
24
30
  'proxy_url' => 'proxy.example.com',
@@ -86,6 +92,23 @@ module ForemanTasks
86
92
  proc { action = run_stubbed_action.call action }.must_raise(Errno::ECONNREFUSED)
87
93
  action.state.must_equal :error
88
94
  end
95
+
96
+ it 'hides secrets' do
97
+ triggered = ForemanTasks.dynflow.world.trigger(Support::DummyProxyAction,
98
+ Support::DummyProxyAction.proxy,
99
+ 'Proxy::DummyAction',
100
+ 'foo' => 'bar',
101
+ 'secrets' => secrets)
102
+ task = ForemanTasks::Task.where(:external_id => triggered.id).first
103
+ task.input[:secrets].must_equal 'Secrets hidden'
104
+ triggered.future.wait # Wait for the task to get triggered before leaving the test
105
+ end
106
+
107
+ it 'wipes secrets' do
108
+ @action.input[:secrets].must_equal secrets
109
+ action = run_action(@action, ::Actions::ProxyAction::CallbackData.new('result' => 'success'))
110
+ refute action.input.key?(:secrets)
111
+ end
89
112
  end
90
113
  end
91
114
  end
@@ -88,6 +88,17 @@ class RecurringLogicsTest < ActiveSupport::TestCase
88
88
  recurring_logic.start(::Support::DummyDynflowAction)
89
89
  end
90
90
 
91
+ it 'has a task group associated to all tasks that were created as part of the recurring logic' do
92
+ recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline('* * * * *')
93
+ recurring_logic.save
94
+ recurring_logic.task_group.must_be_kind_of ForemanTasks::TaskGroups::RecurringLogicTaskGroup
95
+ task = FactoryBot.build(:dynflow_task, :user_create_task)
96
+ task.task_groups << Support::DummyTaskGroup.new
97
+ task.save!
98
+ recurring_logic.task_group.tasks << task
99
+ recurring_logic.task_groups.must_include(*task.task_groups)
100
+ end
101
+
91
102
  it 'can be created from triggering' do
92
103
  triggering = FactoryBot.build(:triggering, :recurring, :end_time_limited)
93
104
  logic = ForemanTasks::RecurringLogic.new_from_triggering(triggering)
@@ -2,7 +2,6 @@ require 'foreman_tasks_test_helper'
2
2
 
3
3
  module ForemanTasks
4
4
  class TaskGroupsTest < ActiveSupport::TestCase
5
- self.use_transactional_fixtures = false
6
5
  include ::Dynflow::Testing
7
6
 
8
7
  before do
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.11.0
4
+ version: 0.11.1
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: 2017-12-20 00:00:00.000000000 Z
11
+ date: 2018-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: foreman-tasks-core
@@ -137,6 +137,7 @@ files:
137
137
  - app/lib/actions/helpers/lock.rb
138
138
  - app/lib/actions/helpers/with_continuous_output.rb
139
139
  - app/lib/actions/helpers/with_delegated_action.rb
140
+ - app/lib/actions/middleware/hide_secrets.rb
140
141
  - app/lib/actions/middleware/inherit_task_groups.rb
141
142
  - app/lib/actions/middleware/keep_current_user.rb
142
143
  - app/lib/actions/middleware/rails_executor_wrap.rb
@@ -241,6 +242,7 @@ files:
241
242
  - test/helpers/foreman_tasks/tasks_helper_test.rb
242
243
  - test/support/dummy_dynflow_action.rb
243
244
  - test/support/dummy_proxy_action.rb
245
+ - test/support/dummy_task_group.rb
244
246
  - test/unit/actions/action_with_sub_plans_test.rb
245
247
  - test/unit/actions/proxy_action_test.rb
246
248
  - test/unit/cleaner_test.rb
@@ -288,6 +290,7 @@ test_files:
288
290
  - test/helpers/foreman_tasks/tasks_helper_test.rb
289
291
  - test/support/dummy_dynflow_action.rb
290
292
  - test/support/dummy_proxy_action.rb
293
+ - test/support/dummy_task_group.rb
291
294
  - test/unit/actions/action_with_sub_plans_test.rb
292
295
  - test/unit/actions/proxy_action_test.rb
293
296
  - test/unit/cleaner_test.rb