foreman-tasks 0.8.6 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +35 -0
- data/.rubocop_todo.yml +138 -0
- data/app/controllers/foreman_tasks/api/recurring_logics_controller.rb +3 -4
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +56 -72
- data/app/controllers/foreman_tasks/concerns/hosts_controller_extension.rb +2 -4
- data/app/controllers/foreman_tasks/recurring_logics_controller.rb +2 -5
- data/app/controllers/foreman_tasks/tasks_controller.rb +7 -8
- data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +44 -46
- data/app/helpers/foreman_tasks/tasks_helper.rb +1 -1
- data/app/lib/actions/action_with_sub_plans.rb +6 -8
- data/app/lib/actions/base.rb +6 -7
- data/app/lib/actions/bulk_action.rb +13 -9
- data/app/lib/actions/entry_action.rb +1 -3
- data/app/lib/actions/foreman/host/import_facts.rb +2 -5
- data/app/lib/actions/foreman/puppetclass/import.rb +1 -1
- data/app/lib/actions/helpers/args_serialization.rb +0 -1
- data/app/lib/actions/helpers/humanizer.rb +16 -21
- data/app/lib/actions/helpers/with_continuous_output.rb +0 -1
- data/app/lib/actions/helpers/with_delegated_action.rb +2 -2
- data/app/lib/actions/middleware/inherit_task_groups.rb +3 -5
- data/app/lib/actions/middleware/keep_current_user.rb +0 -3
- data/app/lib/actions/middleware/recurring_logic.rb +0 -1
- data/app/lib/actions/proxy_action.rb +8 -8
- data/app/lib/actions/serializers/active_record_serializer.rb +0 -3
- data/app/lib/proxy_api/foreman_dynflow/dynflow_proxy.rb +3 -3
- data/app/models/foreman_tasks/concerns/action_subject.rb +4 -6
- data/app/models/foreman_tasks/concerns/action_triggering.rb +20 -33
- data/app/models/foreman_tasks/concerns/host_action_subject.rb +5 -5
- data/app/models/foreman_tasks/lock.rb +29 -37
- data/app/models/foreman_tasks/recurring_logic.rb +23 -24
- data/app/models/foreman_tasks/task.rb +65 -39
- data/app/models/foreman_tasks/task/dynflow_task.rb +23 -24
- data/app/models/foreman_tasks/task/status_explicator.rb +3 -3
- data/app/models/foreman_tasks/task/summarizer.rb +3 -3
- data/app/models/foreman_tasks/task_group.rb +0 -2
- data/app/models/foreman_tasks/task_group_member.rb +0 -2
- data/app/models/foreman_tasks/task_groups/recurring_logic_task_group.rb +1 -4
- data/app/models/foreman_tasks/triggering.rb +19 -19
- data/app/models/setting/foreman_tasks.rb +8 -11
- data/app/services/foreman_tasks/proxy_selector.rb +4 -5
- data/app/views/foreman_tasks/tasks/_details.html.erb +1 -1
- data/bin/dynflow-executor +1 -1
- data/bin/foreman-tasks +1 -1
- data/config/routes.rb +1 -1
- data/db/migrate/20150814204140_add_task_type_value_index.rb +1 -1
- data/db/migrate/20160924213030_change_tasks_widget_names.rb +8 -8
- data/db/seeds.d/61-foreman_tasks_bookmarks.rb +3 -3
- data/deploy/foreman-tasks.sysconfig +6 -0
- data/extra/dynflow-debug.sh +12 -0
- data/foreman-tasks.gemspec +1 -1
- data/lib/foreman_tasks.rb +3 -3
- data/lib/foreman_tasks/authorizer_ext.rb +1 -1
- data/lib/foreman_tasks/cleaner.rb +14 -16
- data/lib/foreman_tasks/dynflow.rb +11 -9
- data/lib/foreman_tasks/dynflow/configuration.rb +8 -10
- data/lib/foreman_tasks/dynflow/console_authorizer.rb +4 -5
- data/lib/foreman_tasks/dynflow/daemon.rb +17 -19
- data/lib/foreman_tasks/dynflow/persistence.rb +5 -8
- data/lib/foreman_tasks/engine.rb +30 -31
- data/lib/foreman_tasks/task_error.rb +1 -3
- data/lib/foreman_tasks/tasks/cleanup.rake +7 -19
- data/lib/foreman_tasks/tasks/dynflow.rake +1 -1
- data/lib/foreman_tasks/tasks/export_tasks.rake +51 -59
- data/lib/foreman_tasks/test_extensions.rb +1 -1
- data/lib/foreman_tasks/version.rb +1 -1
- data/lib/tasks/gettext.rake +10 -7
- data/locale/action_names.rb +3 -6
- data/locale/en/foreman_tasks.po +189 -177
- data/locale/foreman_tasks.pot +177 -137
- data/test/controllers/api/recurring_logics_controller_test.rb +3 -5
- data/test/controllers/api/tasks_controller_test.rb +5 -7
- data/test/factories/task_factory.rb +8 -8
- data/test/factories/triggering_factory.rb +2 -3
- data/test/helpers/foreman_tasks/tasks_helper_test.rb +11 -11
- data/test/support/dummy_proxy_action.rb +3 -4
- data/test/unit/actions/action_with_sub_plans_test.rb +5 -6
- data/test/unit/actions/proxy_action_test.rb +5 -8
- data/test/unit/cleaner_test.rb +11 -12
- data/test/unit/dynflow_console_authorizer_test.rb +4 -4
- data/test/unit/proxy_selector_test.rb +3 -3
- data/test/unit/recurring_logic_test.rb +19 -17
- data/test/unit/task_groups_test.rb +3 -4
- data/test/unit/task_test.rb +72 -5
- data/test/unit/triggering_test.rb +0 -1
- metadata +7 -6
- data/app/controllers/foreman_tasks/concerns/environments_extension.rb +0 -24
data/lib/foreman_tasks.rb
CHANGED
@@ -22,10 +22,10 @@ module ForemanTasks
|
|
22
22
|
Match! async, true, false
|
23
23
|
|
24
24
|
match trigger(action, *args, &block),
|
25
|
-
(on ::Dynflow::World::PlaningFailed.(error: ~any) do |error|
|
25
|
+
(on ::Dynflow::World::PlaningFailed.call(error: ~any) do |error|
|
26
26
|
raise error
|
27
27
|
end),
|
28
|
-
(on ::Dynflow::World::Triggered.(execution_plan_id: ~any, future: ~any) do |id, finished|
|
28
|
+
(on ::Dynflow::World::Triggered.call(execution_plan_id: ~any, future: ~any) do |id, finished|
|
29
29
|
finished.wait if async == false
|
30
30
|
ForemanTasks::Task::DynflowTask.where(:external_id => id).first!
|
31
31
|
end)
|
@@ -37,7 +37,7 @@ module ForemanTasks
|
|
37
37
|
|
38
38
|
def self.sync_task(action, *args, &block)
|
39
39
|
trigger_task(false, action, *args, &block).tap do |task|
|
40
|
-
raise TaskError
|
40
|
+
raise TaskError, task if task.execution_plan.error? || task.execution_plan.result == :warning
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -10,7 +10,7 @@ module ForemanTasks
|
|
10
10
|
|
11
11
|
def resource_name_with_authorized_resource_name(klass)
|
12
12
|
if klass.respond_to?(:authorized_resource_name)
|
13
|
-
|
13
|
+
klass.authorized_resource_name
|
14
14
|
else
|
15
15
|
resource_name_without_authorized_resource_name(klass)
|
16
16
|
end
|
@@ -1,10 +1,9 @@
|
|
1
1
|
module ForemanTasks
|
2
2
|
# Represents the cleanup mechanism for tasks
|
3
3
|
class Cleaner
|
4
|
-
|
5
4
|
def self.run(options)
|
6
5
|
if options.key?(:filter)
|
7
|
-
|
6
|
+
new(options).delete
|
8
7
|
else
|
9
8
|
[:after, :states].each do |invalid_option|
|
10
9
|
if options.key?(invalid_option)
|
@@ -12,10 +11,10 @@ module ForemanTasks
|
|
12
11
|
end
|
13
12
|
end
|
14
13
|
if cleanup_settings[:after]
|
15
|
-
|
14
|
+
new(options.merge(:filter => '', :after => cleanup_settings[:after])).delete
|
16
15
|
end
|
17
16
|
actions_with_default_cleanup.each do |action_class, period|
|
18
|
-
|
17
|
+
new(options.merge(:filter => "label = #{action_class.name}", :after => period)).delete
|
19
18
|
end
|
20
19
|
end
|
21
20
|
end
|
@@ -37,7 +36,7 @@ module ForemanTasks
|
|
37
36
|
actions_with_periods[action_class] = action_class.cleanup_after
|
38
37
|
end
|
39
38
|
end
|
40
|
-
|
39
|
+
actions_with_periods
|
41
40
|
end
|
42
41
|
|
43
42
|
def self.cleanup_settings
|
@@ -45,7 +44,7 @@ module ForemanTasks
|
|
45
44
|
@cleanup_settings = SETTINGS[:'foreman-tasks'] && SETTINGS[:'foreman-tasks'][:cleanup] || {}
|
46
45
|
end
|
47
46
|
|
48
|
-
attr_reader :filter, :after
|
47
|
+
attr_reader :filter, :after, :states, :verbose, :batch_size, :noop, :full_filter
|
49
48
|
|
50
49
|
# @param filter [String] scoped search matching the tasks to be deleted
|
51
50
|
# @param after [String|nil] delete the tasks after they are older
|
@@ -57,7 +56,7 @@ module ForemanTasks
|
|
57
56
|
:verbose => false,
|
58
57
|
:batch_size => 1000,
|
59
58
|
:noop => false,
|
60
|
-
:states => [
|
59
|
+
:states => ['stopped'] }
|
61
60
|
options = default_options.merge(options)
|
62
61
|
|
63
62
|
@filter = options[:filter]
|
@@ -69,7 +68,7 @@ module ForemanTasks
|
|
69
68
|
|
70
69
|
raise ArgumentError, 'filter not speficied' if @filter.nil?
|
71
70
|
|
72
|
-
@full_filter
|
71
|
+
@full_filter = prepare_filter
|
73
72
|
end
|
74
73
|
|
75
74
|
# Delete the filtered tasks, including the dynflow execution plans
|
@@ -102,14 +101,15 @@ module ForemanTasks
|
|
102
101
|
|
103
102
|
def prepare_filter
|
104
103
|
filter_parts = [filter]
|
105
|
-
filter_parts << %
|
106
|
-
filter_parts << states.map { |s| "state = #{s}" }.join(
|
104
|
+
filter_parts << %(started_at < "#{after.ago.to_s(:db)}") if after > 0
|
105
|
+
filter_parts << states.map { |s| "state = #{s}" }.join(' OR ') if states.any?
|
107
106
|
filter_parts.select(&:present?).join(' AND ')
|
108
107
|
end
|
109
108
|
|
110
109
|
def start_tracking_progress
|
111
110
|
if verbose
|
112
|
-
@current
|
111
|
+
@current = 0
|
112
|
+
@total = tasks.size
|
113
113
|
say "#{@current}/#{@total}", false
|
114
114
|
end
|
115
115
|
end
|
@@ -123,13 +123,11 @@ module ForemanTasks
|
|
123
123
|
|
124
124
|
def say(message, log = true)
|
125
125
|
puts message
|
126
|
-
if log
|
127
|
-
Foreman::Logging.logger('foreman-tasks').info(message)
|
128
|
-
end
|
126
|
+
Foreman::Logging.logger('foreman-tasks').info(message) if log
|
129
127
|
end
|
130
128
|
|
131
129
|
def parse_time_interval(string)
|
132
|
-
matched_string = string.
|
130
|
+
matched_string = string.delete(' ').match(/\A(\d+)(\w)\Z/)
|
133
131
|
unless matched_string
|
134
132
|
raise ArgumentError, "String #{string} isn't an expected specification of time in format of \"{number}{time_unit}\""
|
135
133
|
end
|
@@ -146,7 +144,7 @@ module ForemanTasks
|
|
146
144
|
else
|
147
145
|
raise ArgumentError, "Unexpected time unit in #{string}, expected one of [s,h,d,y]"
|
148
146
|
end
|
149
|
-
|
147
|
+
value
|
150
148
|
end
|
151
149
|
end
|
152
150
|
end
|
@@ -35,14 +35,18 @@ module ForemanTasks
|
|
35
35
|
return @world if @world
|
36
36
|
|
37
37
|
if config.lazy_initialization && defined?(PhusionPassenger)
|
38
|
-
config.dynflow_logger.warn(
|
38
|
+
config.dynflow_logger.warn('ForemanTasks: lazy loading with PhusionPassenger might lead to unexpected results')
|
39
39
|
end
|
40
40
|
config.initialize_world.tap do |world|
|
41
41
|
@world = world
|
42
42
|
|
43
43
|
unless config.remote?
|
44
44
|
# don't try to do any rescuing until the tables are properly migrated
|
45
|
-
if !Foreman.in_rake?('db:migrate') && (
|
45
|
+
if !Foreman.in_rake?('db:migrate') && (begin
|
46
|
+
ForemanTasks::Task.table_exists?
|
47
|
+
rescue
|
48
|
+
(false)
|
49
|
+
end)
|
46
50
|
config.run_on_init_hooks(world)
|
47
51
|
# leave this just for long-running executors
|
48
52
|
unless config.rake_task_with_executor?
|
@@ -66,7 +70,7 @@ module ForemanTasks
|
|
66
70
|
|
67
71
|
def reinitialize!
|
68
72
|
@world = nil
|
69
|
-
|
73
|
+
initialize!
|
70
74
|
end
|
71
75
|
|
72
76
|
def world
|
@@ -79,24 +83,22 @@ module ForemanTasks
|
|
79
83
|
'in some initializer'
|
80
84
|
end
|
81
85
|
|
82
|
-
|
86
|
+
@world
|
83
87
|
end
|
84
88
|
|
85
|
-
|
86
|
-
@world = world
|
87
|
-
end
|
89
|
+
attr_writer :world
|
88
90
|
|
89
91
|
def web_console
|
90
92
|
::Dynflow::Web.setup do
|
91
93
|
before do
|
92
94
|
if !Setting[:dynflow_enable_console] ||
|
93
|
-
|
95
|
+
(Setting[:dynflow_console_require_auth] && !ConsoleAuthorizer.new(env).allow?)
|
94
96
|
halt 403, 'Access forbidden'
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
98
100
|
set(:custom_navigation) do
|
99
|
-
{ _(
|
101
|
+
{ _('Back to tasks') => "/#{ForemanTasks::TasksController.controller_path}" }
|
100
102
|
end
|
101
103
|
set(:world) { ForemanTasks.dynflow.world }
|
102
104
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module ForemanTasks
|
2
2
|
class Dynflow::Configuration
|
3
|
-
|
4
3
|
# the number of threads in the pool handling the execution
|
5
4
|
attr_accessor :pool_size
|
6
5
|
|
@@ -9,7 +8,7 @@ module ForemanTasks
|
|
9
8
|
|
10
9
|
# set true if the executor runs externally (by default true in procution, othewise false)
|
11
10
|
attr_accessor :remote
|
12
|
-
|
11
|
+
alias remote? remote
|
13
12
|
|
14
13
|
# what transaction adapater should be used, by default, it uses the ActiveRecord
|
15
14
|
# based adapter, expecting ActiveRecord is used as ORM in the application
|
@@ -34,7 +33,7 @@ module ForemanTasks
|
|
34
33
|
self.transaction_adapter = ::Dynflow::TransactionAdapters::ActiveRecord.new
|
35
34
|
self.eager_load_paths = []
|
36
35
|
self.lazy_initialization = !Rails.env.production?
|
37
|
-
self.rake_tasks_with_executor = %w
|
36
|
+
self.rake_tasks_with_executor = %w(db:migrate db:seed)
|
38
37
|
|
39
38
|
@on_init = []
|
40
39
|
end
|
@@ -66,8 +65,8 @@ module ForemanTasks
|
|
66
65
|
# it can't be remote
|
67
66
|
def remote?
|
68
67
|
!ForemanTasks.dynflow.executor? &&
|
69
|
-
|
70
|
-
|
68
|
+
!rake_task_with_executor? &&
|
69
|
+
@remote
|
71
70
|
end
|
72
71
|
|
73
72
|
def rake_task_with_executor?
|
@@ -79,7 +78,7 @@ module ForemanTasks
|
|
79
78
|
end
|
80
79
|
|
81
80
|
def increase_db_pool_size?
|
82
|
-
|
81
|
+
ForemanTasks.dynflow.required? && !remote? && !Rails.env.test?
|
83
82
|
end
|
84
83
|
|
85
84
|
# To avoid pottential timeouts on db connection pool, make sure
|
@@ -126,14 +125,14 @@ module ForemanTasks
|
|
126
125
|
db_config['database'] = "#{File.dirname(database)}/dynflow-#{File.basename(database)}"
|
127
126
|
end
|
128
127
|
end
|
129
|
-
|
128
|
+
db_config
|
130
129
|
end
|
131
130
|
|
132
131
|
def initialize_executor(world)
|
133
|
-
if
|
132
|
+
if remote?
|
134
133
|
false
|
135
134
|
else
|
136
|
-
::Dynflow::Executors::Parallel.new(world,
|
135
|
+
::Dynflow::Executors::Parallel.new(world, pool_size)
|
137
136
|
end
|
138
137
|
end
|
139
138
|
|
@@ -145,6 +144,5 @@ module ForemanTasks
|
|
145
144
|
def initialize_persistence
|
146
145
|
ForemanTasks::Dynflow::Persistence.new(default_sequel_adapter_options)
|
147
146
|
end
|
148
|
-
|
149
147
|
end
|
150
148
|
end
|
@@ -21,7 +21,7 @@ module ForemanTasks
|
|
21
21
|
def unlimited_edit?
|
22
22
|
return true if @user.admin?
|
23
23
|
# users with unlimited edit_foreman_tasks can operate with the
|
24
|
-
# console no matter what task it is
|
24
|
+
# console no matter what task it is...
|
25
25
|
edit_permission = Permission.where(:name => :edit_foreman_tasks, :resource_type => ForemanTasks::Task.name).first
|
26
26
|
if @user.filters.joins(:filterings).unlimited.where('filterings.permission_id' => edit_permission).first
|
27
27
|
return true
|
@@ -29,7 +29,7 @@ module ForemanTasks
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def authorized_for_task?
|
32
|
-
if task = extract_task
|
32
|
+
if (task = extract_task)
|
33
33
|
begin
|
34
34
|
original_user = User.current
|
35
35
|
User.current = @user
|
@@ -38,16 +38,15 @@ module ForemanTasks
|
|
38
38
|
User.current = original_user
|
39
39
|
end
|
40
40
|
else
|
41
|
-
|
41
|
+
false
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
def extract_task
|
46
|
-
dynflow_id = @rack_request.path_info[/^\/([\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})/,1]
|
46
|
+
dynflow_id = @rack_request.path_info[/^\/([\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})/, 1]
|
47
47
|
unless dynflow_id.empty?
|
48
48
|
ForemanTasks::Task::DynflowTask.where(:external_id => dynflow_id).first
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
52
51
|
end
|
53
52
|
end
|
@@ -2,25 +2,24 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
module ForemanTasks
|
4
4
|
class Dynflow::Daemon
|
5
|
-
|
6
5
|
# load the Rails environment and initialize the executor
|
7
6
|
# in this thread.
|
8
7
|
def run(foreman_root = Dir.pwd)
|
9
|
-
STDERR.puts(
|
10
|
-
foreman_env_file = File.expand_path(
|
11
|
-
unless File.
|
8
|
+
STDERR.puts('Starting Rails environment')
|
9
|
+
foreman_env_file = File.expand_path('./config/environment.rb', foreman_root)
|
10
|
+
unless File.exist?(foreman_env_file)
|
12
11
|
raise "#{foreman_root} doesn't seem to be a foreman root directory"
|
13
12
|
end
|
14
13
|
ForemanTasks.dynflow.executor!
|
15
14
|
require foreman_env_file
|
16
|
-
STDERR.puts(
|
15
|
+
STDERR.puts('Everything ready')
|
17
16
|
sleep
|
18
17
|
ensure
|
19
|
-
STDERR.puts(
|
18
|
+
STDERR.puts('Exiting')
|
20
19
|
end
|
21
20
|
|
22
21
|
# run the executor as a daemon
|
23
|
-
def run_background(command =
|
22
|
+
def run_background(command = 'start', options = {})
|
24
23
|
default_options = { foreman_root: Dir.pwd,
|
25
24
|
process_name: 'dynflow_executor',
|
26
25
|
pid_dir: "#{Rails.root}/tmp/pids",
|
@@ -36,7 +35,7 @@ module ForemanTasks
|
|
36
35
|
raise "You need to add gem 'daemons' to your Gemfile if you wish to use it."
|
37
36
|
end
|
38
37
|
|
39
|
-
unless %w
|
38
|
+
unless %w(start stop restart run).include?(command)
|
40
39
|
raise "Command exptected to be 'start', 'stop', 'restart', 'run', was #{command.inspect}"
|
41
40
|
end
|
42
41
|
|
@@ -44,19 +43,20 @@ module ForemanTasks
|
|
44
43
|
|
45
44
|
options[:executors_count].times do
|
46
45
|
Daemons.run_proc(options[:process_name],
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
:multiple => true,
|
47
|
+
:dir => options[:pid_dir],
|
48
|
+
:log_dir => options[:log_dir],
|
49
|
+
:dir_mode => :normal,
|
50
|
+
:monitor => true,
|
51
|
+
:log_output => true,
|
52
|
+
:log_output_syslog => true,
|
53
|
+
:ARGV => [command]) do |*_args|
|
54
54
|
begin
|
55
55
|
::Logging.reopen
|
56
56
|
run(options[:foreman_root])
|
57
57
|
rescue => e
|
58
58
|
STDERR.puts e.message
|
59
|
-
Foreman::Logging.exception(
|
59
|
+
Foreman::Logging.exception('Failed running foreman-tasks daemon', e)
|
60
60
|
exit 1
|
61
61
|
end
|
62
62
|
end
|
@@ -66,9 +66,7 @@ module ForemanTasks
|
|
66
66
|
protected
|
67
67
|
|
68
68
|
def world
|
69
|
-
|
69
|
+
ForemanTasks.dynflow.world
|
70
70
|
end
|
71
|
-
|
72
|
-
|
73
71
|
end
|
74
72
|
end
|
@@ -1,19 +1,17 @@
|
|
1
1
|
module ForemanTasks
|
2
|
-
|
3
2
|
# wrap the dynflow persistence to reflect the changes to execution plan
|
4
3
|
# in the Task model. This is probably a temporary solution and
|
5
4
|
# Dynflow will probably get more events-based API but it should be enought
|
6
5
|
# for start, until the requiements on the API are clear enough.
|
7
6
|
class Dynflow::Persistence < ::Dynflow::PersistenceAdapters::Sequel
|
8
|
-
|
9
7
|
def save_execution_plan(execution_plan_id, value)
|
10
8
|
# clear connection only if not running in some active record transaction already
|
11
|
-
clear_connections = ActiveRecord::Base.connection.open_transactions
|
9
|
+
clear_connections = ActiveRecord::Base.connection.open_transactions.zero?
|
12
10
|
super.tap do
|
13
11
|
begin
|
14
12
|
on_execution_plan_save(execution_plan_id, value)
|
15
13
|
rescue => e
|
16
|
-
Foreman::Logging.exception(
|
14
|
+
Foreman::Logging.exception('Error on on_execution_plan_save event', e, :logger => 'foreman-tasks/dynflow')
|
17
15
|
end
|
18
16
|
end
|
19
17
|
ensure
|
@@ -26,11 +24,11 @@ module ForemanTasks
|
|
26
24
|
case data[:state]
|
27
25
|
when :pending
|
28
26
|
task = ForemanTasks::Task::DynflowTask.new_for_execution_plan(execution_plan_id, data)
|
29
|
-
task.start_at ||= Time.now
|
27
|
+
task.start_at ||= Time.zone.now
|
30
28
|
task.save!
|
31
29
|
when :scheduled
|
32
30
|
delayed_plan = load_delayed_plan(execution_plan_id)
|
33
|
-
raise Foreman::Exception
|
31
|
+
raise Foreman::Exception, 'Plan is delayed but the delay record is missing' if delayed_plan.nil?
|
34
32
|
task = ::ForemanTasks::Task::DynflowTask.find_by!(:external_id => execution_plan_id)
|
35
33
|
task.update_from_dynflow(data.merge(:start_at => delayed_plan[:start_at],
|
36
34
|
:start_before => delayed_plan[:start_before]))
|
@@ -39,13 +37,12 @@ module ForemanTasks
|
|
39
37
|
task.update_from_dynflow(data)
|
40
38
|
Lock.owner!(::User.current, task.id) if ::User.current
|
41
39
|
else
|
42
|
-
if task = ::ForemanTasks::Task::DynflowTask.where(:external_id => execution_plan_id).first
|
40
|
+
if (task = ::ForemanTasks::Task::DynflowTask.where(:external_id => execution_plan_id).first)
|
43
41
|
unless task.state.to_s == data[:state].to_s
|
44
42
|
task.update_from_dynflow(data)
|
45
43
|
end
|
46
44
|
end
|
47
45
|
end
|
48
46
|
end
|
49
|
-
|
50
47
|
end
|
51
48
|
end
|
data/lib/foreman_tasks/engine.rb
CHANGED
@@ -4,10 +4,14 @@ require 'gettext_i18n_rails'
|
|
4
4
|
|
5
5
|
module ForemanTasks
|
6
6
|
class Engine < ::Rails::Engine
|
7
|
-
engine_name
|
7
|
+
engine_name 'foreman_tasks'
|
8
8
|
|
9
9
|
initializer 'foreman_tasks.load_default_settings', :before => :load_config_initializers do
|
10
|
-
require_dependency File.expand_path('../../../app/models/setting/foreman_tasks.rb', __FILE__) if
|
10
|
+
require_dependency File.expand_path('../../../app/models/setting/foreman_tasks.rb', __FILE__) if begin
|
11
|
+
Setting.table_exists?
|
12
|
+
rescue
|
13
|
+
(false)
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
# Precompile any JS or CSS files under app/assets/
|
@@ -35,9 +39,9 @@ module ForemanTasks
|
|
35
39
|
Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
|
36
40
|
end
|
37
41
|
|
38
|
-
initializer 'foreman_tasks.register_plugin', :before => :finisher_hook do |
|
42
|
+
initializer 'foreman_tasks.register_plugin', :before => :finisher_hook do |_app|
|
39
43
|
Foreman::Plugin.register :"foreman-tasks" do
|
40
|
-
requires_foreman '>= 1.
|
44
|
+
requires_foreman '>= 1.15.0'
|
41
45
|
divider :top_menu, :parent => :monitor_menu, :last => true
|
42
46
|
menu :top_menu, :tasks,
|
43
47
|
:url_hash => { :controller => 'foreman_tasks/tasks', :action => :index },
|
@@ -51,64 +55,63 @@ module ForemanTasks
|
|
51
55
|
:parent => :monitor_menu,
|
52
56
|
:last => true
|
53
57
|
|
54
|
-
security_block :foreman_tasks do |
|
55
|
-
permission :view_foreman_tasks, {:'foreman_tasks/tasks' => [:auto_complete_search, :sub_tasks, :index, :show],
|
56
|
-
|
57
|
-
permission :edit_foreman_tasks, {:'foreman_tasks/tasks' => [:resume, :unlock, :force_unlock, :cancel_step, :cancel],
|
58
|
-
|
58
|
+
security_block :foreman_tasks do |_map|
|
59
|
+
permission :view_foreman_tasks, { :'foreman_tasks/tasks' => [:auto_complete_search, :sub_tasks, :index, :show],
|
60
|
+
:'foreman_tasks/api/tasks' => [:bulk_search, :show, :index, :summary] }, :resource_type => ForemanTasks::Task.name
|
61
|
+
permission :edit_foreman_tasks, { :'foreman_tasks/tasks' => [:resume, :unlock, :force_unlock, :cancel_step, :cancel],
|
62
|
+
:'foreman_tasks/api/tasks' => [:bulk_resume] }, :resource_type => ForemanTasks::Task.name
|
59
63
|
|
60
|
-
permission :create_recurring_logics, {
|
64
|
+
permission :create_recurring_logics, {}, :resource_type => ForemanTasks::RecurringLogic.name
|
61
65
|
|
62
66
|
permission :view_recurring_logics, { :'foreman_tasks/recurring_logics' => [:index, :show],
|
63
67
|
:'foreman_tasks/api/recurring_logics' => [:index, :show] }, :resource_type => ForemanTasks::RecurringLogic.name
|
64
68
|
|
65
69
|
permission :edit_recurring_logics, { :'foreman_tasks/recurring_logics' => [:cancel],
|
66
70
|
:'foreman_tasks/api/recurring_logics' => [:cancel] }, :resource_type => ForemanTasks::RecurringLogic.name
|
67
|
-
|
68
71
|
end
|
69
72
|
|
70
73
|
logger :dynflow, :enabled => true
|
71
74
|
logger :action, :enabled => true
|
72
75
|
|
73
|
-
role
|
74
|
-
role
|
76
|
+
role 'Tasks Manager', [:view_foreman_tasks, :edit_foreman_tasks]
|
77
|
+
role 'Tasks Reader', [:view_foreman_tasks]
|
75
78
|
|
76
|
-
widget 'foreman_tasks/tasks/dashboard/tasks_status', :sizex=>6, :sizey=>1, :name=> N_('Task Status')
|
77
|
-
widget 'foreman_tasks/tasks/dashboard/latest_tasks_in_error_warning', :sizex=>6, :sizey=>1
|
79
|
+
widget 'foreman_tasks/tasks/dashboard/tasks_status', :sizex => 6, :sizey => 1, :name => N_('Task Status')
|
80
|
+
widget 'foreman_tasks/tasks/dashboard/latest_tasks_in_error_warning', :sizex => 6, :sizey => 1, :name => N_('Latest Warning/Error Tasks')
|
78
81
|
end
|
79
82
|
end
|
80
83
|
|
81
|
-
initializer 'foreman_tasks.ignore_dynflow_tables' do |
|
84
|
+
initializer 'foreman_tasks.ignore_dynflow_tables' do |_app|
|
82
85
|
# Ignore Dynflow tables when schema-dumping. Dynflow tables are handled automatically by Dynflow.
|
83
86
|
ActiveRecord::SchemaDumper.ignore_tables << /^dynflow_.*$/
|
84
87
|
end
|
85
88
|
|
86
|
-
initializer
|
89
|
+
initializer 'foreman_tasks.apipie' do
|
87
90
|
# this condition is here for compatibility reason to work with Foreman 1.4.x
|
88
91
|
if Apipie.configuration.api_controllers_matcher.is_a?(Array) &&
|
89
|
-
|
92
|
+
Apipie.configuration.respond_to?(:checksum_path)
|
90
93
|
Apipie.configuration.api_controllers_matcher << "#{ForemanTasks::Engine.root}/app/controllers/foreman_tasks/api/*.rb"
|
91
94
|
Apipie.configuration.checksum_path += ['/foreman_tasks/api/']
|
92
95
|
end
|
93
96
|
end
|
94
97
|
|
95
|
-
initializer
|
96
|
-
ForemanTasks.dynflow.config.eager_load_paths.concat(%W
|
98
|
+
initializer 'foreman_tasks.register_paths' do |_app|
|
99
|
+
ForemanTasks.dynflow.config.eager_load_paths.concat(%W(#{ForemanTasks::Engine.root}/app/lib/actions))
|
97
100
|
end
|
98
101
|
|
99
|
-
initializer
|
102
|
+
initializer 'foreman_tasks.test_exceptions' do |_app|
|
100
103
|
if defined? ActiveSupport::TestCase
|
101
104
|
require 'foreman_tasks/test_extensions'
|
102
105
|
end
|
103
106
|
end
|
104
107
|
|
105
|
-
initializer
|
108
|
+
initializer 'foreman_tasks.load_app_instance_data' do |app|
|
106
109
|
ForemanTasks::Engine.paths['db/migrate'].existent.each do |path|
|
107
110
|
app.config.paths['db/migrate'] << path
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
111
|
-
initializer
|
114
|
+
initializer 'foreman_tasks.require_dynflow', :before => 'foreman_tasks.initialize_dynflow' do |_app|
|
112
115
|
ForemanTasks.dynflow.require!
|
113
116
|
::ForemanTasks.dynflow.config.on_init do |world|
|
114
117
|
ForemanTasksCore.dynflow_setup(world)
|
@@ -128,8 +131,6 @@ module ForemanTasks
|
|
128
131
|
if ENV['FOREMAN_TASKS_MONKEYS'] == 'true'
|
129
132
|
config.to_prepare do
|
130
133
|
::Api::V2::HostsController.send :include, ForemanTasks::Concerns::HostsControllerExtension
|
131
|
-
::PuppetclassesController.send :include, ForemanTasks::Concerns::EnvironmentsExtension
|
132
|
-
::EnvironmentsController.send :include, ForemanTasks::Concerns::EnvironmentsExtension
|
133
134
|
::Host::Base.send :include, ForemanTasks::Concerns::HostActionSubject
|
134
135
|
end
|
135
136
|
end
|
@@ -147,9 +148,7 @@ module ForemanTasks
|
|
147
148
|
unless ForemanTasks.dynflow.config.lazy_initialization
|
148
149
|
if defined?(PhusionPassenger)
|
149
150
|
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
150
|
-
if forked
|
151
|
-
ForemanTasks.dynflow.initialize!
|
152
|
-
end
|
151
|
+
ForemanTasks.dynflow.initialize! if forked
|
153
152
|
end
|
154
153
|
else
|
155
154
|
ForemanTasks.dynflow.initialize!
|
@@ -158,15 +157,15 @@ module ForemanTasks
|
|
158
157
|
end
|
159
158
|
|
160
159
|
rake_tasks do
|
161
|
-
%w
|
160
|
+
%w(dynflow.rake test.rake export_tasks.rake cleanup.rake).each do |rake_file|
|
162
161
|
full_path = File.expand_path("../tasks/#{rake_file}", __FILE__)
|
163
|
-
load full_path if File.
|
162
|
+
load full_path if File.exist?(full_path)
|
164
163
|
end
|
165
164
|
end
|
166
165
|
end
|
167
166
|
|
168
167
|
def self.table_name_prefix
|
169
|
-
|
168
|
+
'foreman_tasks_'
|
170
169
|
end
|
171
170
|
|
172
171
|
def use_relative_model_naming
|