foreman-tasks 0.10.6 → 0.10.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_tasks/tasks_controller.rb +9 -0
- data/app/helpers/foreman_tasks/tasks_helper.rb +2 -12
- data/app/models/foreman_tasks/task.rb +13 -0
- data/app/views/foreman_tasks/recurring_logics/index.html.erb +1 -1
- data/app/views/foreman_tasks/task_groups/recurring_logic_task_groups/_recurring_logic_task_group.html.erb +1 -1
- data/app/views/foreman_tasks/tasks/_details.html.erb +1 -2
- data/app/views/foreman_tasks/tasks/index.html.erb +2 -2
- data/bin/dynflow-executor +72 -0
- data/bin/foreman-tasks +6 -0
- data/deploy/foreman-tasks.service +16 -0
- data/deploy/foreman-tasks.sysconfig +26 -0
- data/lib/foreman_tasks/tasks/export_tasks.rake +0 -1
- data/lib/foreman_tasks/version.rb +1 -1
- data/test/helpers/foreman_tasks/tasks_helper_test.rb +3 -5
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a0751a80db307b33d589a66517a407b71d125aa
|
4
|
+
data.tar.gz: 1df0beb219ea10aa2e3a498f0794f95ed241b9ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50b67165fdaab0a560a0c5954423808a78eeeeedf6aeb7e16f236f178c59ec76251691f7fa57d37161184399b7b4795afabb2275db54f55ae4eeecc1f581c114
|
7
|
+
data.tar.gz: a061ad464f3954f0114c5d3c5c83a7a66a1295595672605b49f3918a179dfce73e4c210515a5653a180914efcedfcc31c95d02c013d3c9fbe5f3e52d75111856
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module ForemanTasks
|
2
2
|
class TasksController < ::ApplicationController
|
3
3
|
include Foreman::Controller::AutoCompleteSearch
|
4
|
+
include Foreman::Controller::CsvResponder
|
4
5
|
|
5
6
|
before_action :restrict_dangerous_actions, :only => [:unlock, :force_unlock]
|
6
7
|
|
@@ -11,6 +12,14 @@ module ForemanTasks
|
|
11
12
|
def index
|
12
13
|
params[:order] ||= 'started_at DESC'
|
13
14
|
@tasks = filter(resource_base)
|
15
|
+
respond_to do |format|
|
16
|
+
format.html do
|
17
|
+
render :index
|
18
|
+
end
|
19
|
+
format.csv do
|
20
|
+
csv_response(@tasks, [:to_label, :state, :result, 'started_at.in_time_zone', 'ended_at.in_time_zone', :username], ['Action', 'State', 'Result', 'Started At', 'Ended At', 'User'])
|
21
|
+
end
|
22
|
+
end
|
14
23
|
end
|
15
24
|
|
16
25
|
def sub_tasks
|
@@ -1,17 +1,7 @@
|
|
1
1
|
module ForemanTasks
|
2
2
|
module TasksHelper
|
3
|
-
def format_task_input(task
|
4
|
-
|
5
|
-
parts = []
|
6
|
-
parts << task.get_humanized(:name) if include_action
|
7
|
-
parts << Array(task.get_humanized(:input)).map do |part|
|
8
|
-
if part.is_a? Array
|
9
|
-
part[1][:text]
|
10
|
-
else
|
11
|
-
part.to_s
|
12
|
-
end
|
13
|
-
end.join('; ')
|
14
|
-
parts.join(' ')
|
3
|
+
def format_task_input(task)
|
4
|
+
task ? task.to_label : '-'
|
15
5
|
end
|
16
6
|
|
17
7
|
def format_recurring_logic_limit(thing)
|
@@ -202,6 +202,19 @@ module ForemanTasks
|
|
202
202
|
result.symbolize_keys
|
203
203
|
end
|
204
204
|
|
205
|
+
def to_label
|
206
|
+
parts = []
|
207
|
+
parts << get_humanized(:name)
|
208
|
+
parts << Array(get_humanized(:input)).map do |part|
|
209
|
+
if part.is_a? Array
|
210
|
+
part[1][:text]
|
211
|
+
else
|
212
|
+
part.to_s
|
213
|
+
end
|
214
|
+
end.join('; ')
|
215
|
+
parts.join(' ')
|
216
|
+
end
|
217
|
+
|
205
218
|
protected
|
206
219
|
|
207
220
|
def generate_id
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<tr>
|
19
19
|
<td><%= link_to(recurring_logic.cron_line, foreman_tasks_recurring_logic_path(recurring_logic)) %></td>
|
20
20
|
<td><%= link_to(recurring_logic.tasks.count, foreman_tasks_tasks_url(:search => "task_group.id = #{recurring_logic.task_group.id}")) %></td>
|
21
|
-
<td><%= format_task_input(recurring_logic.tasks.first
|
21
|
+
<td><%= format_task_input(recurring_logic.tasks.first) %></td>
|
22
22
|
<td><%= recurring_logic.tasks.order(:started_at).where('started_at IS NOT NULL').last.try(:started_at) || "-" %></td>
|
23
23
|
<td><%= recurring_logic_next_occurrence recurring_logic %></td>
|
24
24
|
<td><%= recurring_logic.iteration %></td>
|
@@ -89,8 +89,7 @@
|
|
89
89
|
<div class="col-md-6">
|
90
90
|
<div>
|
91
91
|
<span class="param-name list-group-item-heading"><%= _("Name") %>:</span>
|
92
|
-
|
93
|
-
<span class="param-value" data-original-title="<%= task_label %>" rel="twipsy"> <%= truncate(task_label, :length => 50) %></span>
|
92
|
+
<span class="param-value" data-original-title="<%= @task.to_label %>" rel="twipsy"> <%= truncate(@task.to_label, :length => 50) %></span>
|
94
93
|
</div>
|
95
94
|
<div>
|
96
95
|
<span class="param-name list-group-item-heading"><%= _("Result") %>:</span>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<% title _("Tasks") %>
|
2
|
-
<% title_actions
|
2
|
+
<% title_actions csv_link, help_button %>
|
3
3
|
<% stylesheet 'foreman_tasks/tasks' %>
|
4
4
|
|
5
5
|
<script>
|
@@ -27,7 +27,7 @@ $(document).on('click', ".table-two-pane td.two-pane-link", function(e) {
|
|
27
27
|
<% for task in @tasks %>
|
28
28
|
<tr>
|
29
29
|
<td class="task-id two-pane-link ellipsis">
|
30
|
-
<%= link_to_if_authorized(
|
30
|
+
<%= link_to_if_authorized(task.to_label,
|
31
31
|
hash_for_foreman_tasks_task_path(:id => task)) %>
|
32
32
|
</td>
|
33
33
|
<td class="ellipsis"><%= task.state %></td>
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
class ArgvParser
|
6
|
+
attr_reader :options, :command
|
7
|
+
|
8
|
+
def initialize(argv, file)
|
9
|
+
@options = { foreman_root: Dir.pwd }
|
10
|
+
|
11
|
+
opts = OptionParser.new do |opts|
|
12
|
+
opts.banner = banner(file)
|
13
|
+
|
14
|
+
opts.on('-h', '--help', 'Show this message') do
|
15
|
+
puts opts
|
16
|
+
exit 1
|
17
|
+
end
|
18
|
+
opts.on('-f', '--foreman-root=PATH', "Path to Foreman Rails root path. By default '#{@options[:foreman_root]}'") do |path|
|
19
|
+
@options[:foreman_root] = path
|
20
|
+
end
|
21
|
+
opts.on('-c', '--executors-count=COUNT', 'Number of parallel executors to spawn. Overrides EXECUTORS_COUNT environment varaible.') do |count|
|
22
|
+
@options[:executors_count] = count.to_i
|
23
|
+
end
|
24
|
+
opts.on('-m', '--memory-limit=SIZE', 'Limits the amount of memory an executor can consume. Overrides EXECUTOR_MEMORY_LIMIT environment varaible. You can use kb, mb, gb') do |size|
|
25
|
+
@options[:memory_limit] = size
|
26
|
+
end
|
27
|
+
opts.on('--executor-memory-init-delay=SECONDS', 'Start memory polling after SECONDS. Overrides EXECUTOR_MEMORY_MONITOR_DELAY environment varaible.') do |seconds|
|
28
|
+
@options[:memory_init_delay] = seconds.to_i
|
29
|
+
end
|
30
|
+
opts.on('--executor-memory-polling-interval=SECONDS', 'Check for memory useage every SECONDS sec. Overrides EXECUTOR_MEMORY_MONITOR_INTERVAL environment varaible.') do |seconds|
|
31
|
+
@options[:memory_polling_interval] = seconds.to_i
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
args = opts.parse!(argv)
|
36
|
+
@command = args.first || 'run'
|
37
|
+
end
|
38
|
+
|
39
|
+
def banner(file)
|
40
|
+
banner = <<BANNER
|
41
|
+
Run Dynflow executor for Foreman tasks.
|
42
|
+
|
43
|
+
Usage: #{File.basename(file)} [options] ACTION"
|
44
|
+
|
45
|
+
ACTION can be one of:
|
46
|
+
|
47
|
+
* start - start the executor on background. It creates these files
|
48
|
+
in tmp/pid directory:
|
49
|
+
|
50
|
+
* dynflow_executor_monitor.pid - pid of monitor ensuring
|
51
|
+
the executor keeps running
|
52
|
+
* dynflow_executor.pid - pid of the executor itself
|
53
|
+
* dynflow_executor.output - stdout of the executor
|
54
|
+
* stop - stops the running executor
|
55
|
+
* restart - restarts the running executor
|
56
|
+
* run - run the executor in foreground
|
57
|
+
|
58
|
+
BANNER
|
59
|
+
banner
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# run the script if it's executed explicitly
|
64
|
+
if $PROGRAM_NAME == __FILE__
|
65
|
+
parser = ArgvParser.new(ARGV, $PROGRAM_NAME)
|
66
|
+
|
67
|
+
Dir.chdir(parser.options[:foreman_root])
|
68
|
+
app_file = File.expand_path('./config/application', parser.options[:foreman_root])
|
69
|
+
require app_file
|
70
|
+
|
71
|
+
Dynflow::Rails::Daemon.new.run_background(parser.command, parser.options)
|
72
|
+
end
|
data/bin/foreman-tasks
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
[Unit]
|
2
|
+
Description=Foreman jobs daemon
|
3
|
+
Documentation=https://github.com/theforeman/foreman-tasks
|
4
|
+
After=network.target remote-fs.target nss-lookup.target
|
5
|
+
|
6
|
+
[Service]
|
7
|
+
Type=forking
|
8
|
+
User=foreman
|
9
|
+
TimeoutSec=600
|
10
|
+
WorkingDirectory=/usr/share/foreman
|
11
|
+
ExecStart=/usr/bin/foreman-tasks start
|
12
|
+
ExecStop=/usr/bin/foreman-tasks stop
|
13
|
+
EnvironmentFile=-/etc/sysconfig/foreman-tasks
|
14
|
+
|
15
|
+
[Install]
|
16
|
+
WantedBy=multi-user.target
|
@@ -0,0 +1,26 @@
|
|
1
|
+
FOREMAN_USER=foreman
|
2
|
+
BUNDLER_EXT_HOME=/usr/share/foreman
|
3
|
+
RAILS_RELATIVE_URL_ROOT=$FOREMAN_PREFIX
|
4
|
+
RAILS_ENV=production
|
5
|
+
FOREMAN_LOGGING=warn
|
6
|
+
FOREMAN_LOGGING_SQL=warn
|
7
|
+
FOREMAN_TASK_PARAMS="-p foreman"
|
8
|
+
FOREMAN_LOG_DIR=/var/log/foreman
|
9
|
+
|
10
|
+
RUBY_GC_MALLOC_LIMIT=4000100
|
11
|
+
RUBY_GC_MALLOC_LIMIT_MAX=16000100
|
12
|
+
RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1.1
|
13
|
+
RUBY_GC_OLDMALLOC_LIMIT=16000100
|
14
|
+
RUBY_GC_OLDMALLOC_LIMIT_MAX=16000100
|
15
|
+
|
16
|
+
#Set the number of executors you want to run
|
17
|
+
#EXECUTORS_COUNT=1
|
18
|
+
|
19
|
+
#Set memory limit for executor process, before it's restarted automatically
|
20
|
+
#EXECUTOR_MEMORY_LIMIT=2gb
|
21
|
+
|
22
|
+
#Set delay before first memory polling to let executor initialize (in sec)
|
23
|
+
#EXECUTOR_MEMORY_MONITOR_DELAY=7200 #default: 2 hours
|
24
|
+
|
25
|
+
#Set memory polling interval, process memory will be checked every N seconds.
|
26
|
+
#EXECUTOR_MEMORY_MONITOR_INTERVAL=60
|
@@ -11,12 +11,11 @@ module ForemanTasks
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'formats the task input properly' do
|
14
|
-
format_task_input(@task).must_equal("user 'Anonymous Admin'")
|
15
|
-
format_task_input(@task, true).must_equal("Create user 'Anonymous Admin'")
|
14
|
+
format_task_input(@task).must_equal("Create user 'Anonymous Admin'")
|
16
15
|
end
|
17
16
|
|
18
17
|
it 'displays the dash if task is nil' do
|
19
|
-
format_task_input(nil
|
18
|
+
format_task_input(nil).must_equal('-')
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
@@ -36,8 +35,7 @@ module ForemanTasks
|
|
36
35
|
|
37
36
|
it 'formats the task input properly' do
|
38
37
|
response = "product 'product-2'; organization 'test-0'"
|
39
|
-
format_task_input(@task).must_equal(response)
|
40
|
-
format_task_input(@task, true).must_equal("Create #{response}")
|
38
|
+
format_task_input(@task).must_equal("Create #{response}")
|
41
39
|
end
|
42
40
|
end
|
43
41
|
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.10.
|
4
|
+
version: 0.10.7
|
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-
|
11
|
+
date: 2017-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foreman-tasks-core
|
@@ -182,6 +182,8 @@ files:
|
|
182
182
|
- app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb
|
183
183
|
- app/views/foreman_tasks/tasks/index.html.erb
|
184
184
|
- app/views/foreman_tasks/tasks/show.html.erb
|
185
|
+
- bin/dynflow-executor
|
186
|
+
- bin/foreman-tasks
|
185
187
|
- config/foreman-tasks.yaml.example
|
186
188
|
- config/routes.rb
|
187
189
|
- db/migrate/20131205204140_create_foreman_tasks.rb
|
@@ -200,6 +202,8 @@ files:
|
|
200
202
|
- db/seeds.d/20-foreman_tasks_permissions.rb
|
201
203
|
- db/seeds.d/60-dynflow_proxy_feature.rb
|
202
204
|
- db/seeds.d/61-foreman_tasks_bookmarks.rb
|
205
|
+
- deploy/foreman-tasks.service
|
206
|
+
- deploy/foreman-tasks.sysconfig
|
203
207
|
- extra/dynflow-debug.sh
|
204
208
|
- extra/dynflow-executor.example
|
205
209
|
- foreman-tasks.gemspec
|