foreman-tasks 0.13.1 → 0.13.2

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
- SHA256:
3
- metadata.gz: 464f9df51dc38a0d63e3e573e462f9f57bc5d091f0bdc0090327229d6b8ecffb
4
- data.tar.gz: 5d2f0b357ce12025975c5cd62d2d31637d5cbcff20349e3af89edb213e8c553a
2
+ SHA1:
3
+ metadata.gz: 25fc44af39850ad061431b4262495b931072731c
4
+ data.tar.gz: 925eb0edab02549e5a27980b83c2356732eb871d
5
5
  SHA512:
6
- metadata.gz: df01ce6f12aec5edd07cfe1ba355d86ad130df011be72c559dc100f92e2dabcfae356aa636bc73454393acd52aa02d569fe3addefe6d4940aa2d9ec2289a0a6d
7
- data.tar.gz: 2e6da699d36a27a4f5727475e998ee52e07861e0a2eecd8a879a9b17f6b27121a225edb34f66338939c11e9110bb3fd53f0edc090b113fedb983db5bdd8798f6
6
+ metadata.gz: 1cfa0af234b3c6adc0b80ea15411ce3d7bc9d4e0326d620b0495ae914a2adf628762d49a7f9460573c290b1fad3d4535db3c2024c068c40fbdbfcb8cd186c249
7
+ data.tar.gz: 11a2abde6bf2eed2ead3d6fef4e6cc1dc9baaa9b828c30afa4938387f9451a1ee25226382d0cb32c6e8c952d833b5197d94a99009142f198c36e93835055eace
data/README.md CHANGED
@@ -13,6 +13,15 @@ happening/happened in your Foreman instance. A framework for asynchronous tasks
13
13
  * [foreman-users](https://groups.google.com/forum/?fromgroups#!forum/foreman-users)
14
14
  * [foreman-dev](https://groups.google.com/forum/?fromgroups#!forum/foreman-dev)
15
15
 
16
+ ## Compatibility
17
+
18
+ | Foreman Version | Plugin Version |
19
+ | --------------- | -------------- |
20
+ | >= 1.15 | ~> 0.9.0 |
21
+ | >= 1.16 | ~> 0.10.0 |
22
+ | >= 1.17 | ~> 0.11.0 |
23
+ | >= 1.18 | ~> 0.13.0 |
24
+
16
25
  Installation
17
26
  ------------
18
27
 
@@ -12,6 +12,7 @@ module ForemanTasks
12
12
  before_action :find_resource, :only => %w[show cancel]
13
13
 
14
14
  api :GET, '/recurring_logics', N_('List recurring logics')
15
+ param_group :search_and_pagination, ::Api::V2::BaseController
15
16
  def index
16
17
  @recurring_logics = resource_scope_for_index
17
18
  end
@@ -1,4 +1,5 @@
1
1
  module ForemanTasks
2
+ # rubocop:disable Metrics/ClassLength
2
3
  module Api
3
4
  class TasksController < ::Api::V2::BaseController
4
5
  include ::Foreman::Controller::SmartProxyAuth
@@ -118,7 +119,9 @@ module ForemanTasks
118
119
  end
119
120
  def index
120
121
  scope = resource_scope.search_for(params[:search]).select('DISTINCT foreman_tasks_tasks.*')
121
- total = scope.count
122
+
123
+ total = resource_scope.count
124
+ subtotal = scope.count
122
125
 
123
126
  ordering_params = {
124
127
  sort_by: params[:sort_by] || 'started_at',
@@ -128,14 +131,14 @@ module ForemanTasks
128
131
 
129
132
  pagination_params = {
130
133
  page: params[:page] || 1,
131
- per_page: params[:per_page] || 20
134
+ per_page: params[:per_page] || Setting[:entries_per_page] || 20
132
135
  }
133
136
  scope = pagination_scope(scope, pagination_params)
134
137
  results = scope.map { |task| task_hash(task) }
135
138
 
136
139
  render :json => {
137
140
  total: total,
138
- subtotal: results.count,
141
+ subtotal: subtotal,
139
142
  page: pagination_params[:page],
140
143
  per_page: pagination_params[:per_page],
141
144
  sort: {
@@ -264,4 +267,5 @@ module ForemanTasks
264
267
  end
265
268
  end
266
269
  end
270
+ # rubocop:enable Metrics/ClassLength
267
271
  end
@@ -125,8 +125,17 @@ module ForemanTasks
125
125
  end
126
126
 
127
127
  def filter(scope)
128
- scope.search_for(params[:search], :order => params[:order])
128
+ search = current_taxonomy_search
129
+ search = [search, params[:search]].select(&:present?).join(' AND ')
130
+ scope.search_for(search, :order => params[:order])
129
131
  .paginate(:page => params[:page], :per_page => params[:per_page]).distinct
130
132
  end
133
+
134
+ def current_taxonomy_search
135
+ conditions = []
136
+ conditions << "organization_id = #{Organization.current.id}" if Organization.current
137
+ conditions << "location_id = #{Location.current.id}" if Location.current
138
+ conditions.empty? ? '' : "(#{conditions.join(' AND ')})"
139
+ end
131
140
  end
132
141
  end
@@ -1,6 +1,6 @@
1
1
  module Actions
2
2
  class Base < Dynflow::Action
3
- middleware.use ::Actions::Middleware::RailsExecutorWrap if Rails::VERSION::MAJOR > 4
3
+ middleware.use ::Actions::Middleware::RailsExecutorWrap
4
4
 
5
5
  def task
6
6
  @task ||= ::ForemanTasks::Task::DynflowTask.where(:external_id => execution_plan_id).first!
@@ -19,6 +19,10 @@ module Actions
19
19
  restore_current_taxonomies { pass }
20
20
  end
21
21
 
22
+ def hook(*args)
23
+ restore_current_taxonomies { pass(*args) }
24
+ end
25
+
22
26
  private
23
27
 
24
28
  def with_current_taxonomies
@@ -19,6 +19,11 @@ module Actions
19
19
  restore_curent_user { pass }
20
20
  end
21
21
 
22
+ # Run all execution plan lifecycle hooks as the original user
23
+ def hook(*args)
24
+ restore_curent_user { pass(*args) }
25
+ end
26
+
22
27
  private
23
28
 
24
29
  def with_current_user
@@ -8,11 +8,7 @@ module ForemanTasks
8
8
  belongs_to :triggering
9
9
 
10
10
  has_many :tasks, :through => :task_group
11
- if Rails::VERSION::MAJOR < 4
12
- has_many :task_groups, :through => :tasks, :uniq => true
13
- else
14
- has_many :task_groups, -> { distinct }, :through => :tasks
15
- end
11
+ has_many :task_groups, -> { distinct }, :through => :tasks
16
12
 
17
13
  scoped_search :on => :id, :complete_value => false, :validator => ScopedSearch::Validators::INTEGER
18
14
  scoped_search :on => :max_iteration, :complete_value => false, :rename => :iteration_limit
@@ -28,9 +24,13 @@ module ForemanTasks
28
24
  end
29
25
 
30
26
  def start(action_class, *args)
27
+ start_after(action_class, Time.zone.now, *args)
28
+ end
29
+
30
+ def start_after(action_class, time, *args)
31
31
  self.state = 'active'
32
32
  save!
33
- trigger_repeat(action_class, *args)
33
+ trigger_repeat_after(time, action_class, *args)
34
34
  end
35
35
 
36
36
  def trigger_repeat_after(time, action_class, *args)
@@ -26,18 +26,12 @@ module ForemanTasks
26
26
 
27
27
  has_many :task_group_members, :dependent => :destroy
28
28
  has_many :task_groups, :through => :task_group_members
29
- if Rails::VERSION::MAJOR < 4
30
- has_many :recurring_logic_task_groups, :through => :task_group_members, :conditions => { :type => 'ForemanTasks::TaskGroups::RecurringLogicTaskGroup' }, :source => :task_group
31
- has_many :owners, :through => :locks, :source => :resource, :source_type => 'User',
32
- :conditions => ['foreman_tasks_locks.name = ?', Lock::OWNER_LOCK_NAME]
33
- else
34
- has_many :recurring_logic_task_groups, -> { where :type => 'ForemanTasks::TaskGroups::RecurringLogicTaskGroup' },
35
- :through => :task_group_members, :source => :task_group
36
- # in fact, the task has only one owner but Rails don't let you to
37
- # specify has_one relation though has_many relation
38
- has_many :owners, -> { where(['foreman_tasks_locks.name = ?', Lock::OWNER_LOCK_NAME]) },
39
- :through => :locks, :source => :resource, :source_type => 'User'
40
- end
29
+ has_many :recurring_logic_task_groups, -> { where :type => 'ForemanTasks::TaskGroups::RecurringLogicTaskGroup' },
30
+ :through => :task_group_members, :source => :task_group
31
+ # in fact, the task has only one owner but Rails don't let you to
32
+ # specify has_one relation though has_many relation
33
+ has_many :owners, -> { where(['foreman_tasks_locks.name = ?', Lock::OWNER_LOCK_NAME]) },
34
+ :through => :locks, :source => :resource, :source_type => 'User'
41
35
 
42
36
  scoped_search :on => :id, :complete_value => false
43
37
  scoped_search :on => :action, :complete_value => false
@@ -48,6 +42,8 @@ module ForemanTasks
48
42
  scoped_search :on => :start_at, :complete_value => false
49
43
  scoped_search :on => :ended_at, :complete_value => false
50
44
  scoped_search :on => :parent_task_id, :complete_value => true
45
+ scoped_search :relation => :locks, :on => :resource_id, :complete_value => false, :rename => 'location_id', :ext_method => :search_by_taxonomy, :only_explicit => true
46
+ scoped_search :relation => :locks, :on => :resource_id, :complete_value => false, :rename => 'organization_id', :ext_method => :search_by_taxonomy, :only_explicit => true
51
47
  scoped_search :relation => :locks, :on => :resource_type, :complete_value => true, :rename => 'resource_type', :ext_method => :search_by_generic_resource
52
48
  scoped_search :relation => :locks, :on => :resource_id, :complete_value => false, :rename => 'resource_id', :ext_method => :search_by_generic_resource
53
49
  scoped_search :relation => :owners,
@@ -141,6 +137,20 @@ module ForemanTasks
141
137
  { :conditions => condition, :joins => :locks }
142
138
  end
143
139
 
140
+ def self.search_by_taxonomy(key, operator, value)
141
+ uniq_suffix = SecureRandom.hex(3)
142
+ resource_type = key == 'location_id' ? 'Location' : 'Organization'
143
+
144
+ joins = <<-SQL
145
+ LEFT JOIN foreman_tasks_locks AS foreman_tasks_locks_taxonomy#{uniq_suffix}
146
+ ON (foreman_tasks_locks_taxonomy#{uniq_suffix}.task_id = foreman_tasks_tasks.id AND
147
+ foreman_tasks_locks_taxonomy#{uniq_suffix}.resource_type = '#{resource_type}')
148
+ SQL
149
+ # Select only those tasks which either have the correct taxonomy or are not related to any
150
+ sql = "foreman_tasks_locks_taxonomy#{uniq_suffix}.resource_id #{operator} ? OR foreman_tasks_locks_taxonomy#{uniq_suffix}.resource_id IS NULL"
151
+ { :conditions => sanitize_sql_for_conditions([sql, value]), :joins => joins }
152
+ end
153
+
144
154
  def self.search_by_owner(key, operator, value)
145
155
  return { :conditions => '0 = 1' } if value == 'current_user' && User.current.nil?
146
156
 
@@ -228,7 +238,7 @@ module ForemanTasks
228
238
  part.to_s
229
239
  end
230
240
  end.join('; ')
231
- parts.join(' ')
241
+ parts.join(' ').strip
232
242
  end
233
243
 
234
244
  protected
@@ -15,7 +15,7 @@ module ForemanTasks
15
15
  self.start_at = string_to_time(utc_zone, data[:start_at]) if data[:start_at]
16
16
  self.start_before = string_to_time(utc_zone, data[:start_before]) if data[:start_before]
17
17
  self.parent_task_id ||= begin
18
- if main_action.present? && main_action.caller_execution_plan_id
18
+ if main_action.try(:caller_execution_plan_id)
19
19
  DynflowTask.where(:external_id => main_action.caller_execution_plan_id).first!.id
20
20
  end
21
21
  end
@@ -70,7 +70,6 @@ module ForemanTasks
70
70
  end
71
71
 
72
72
  def label
73
- return execution_plan_action.input['job_class'] if active_job?
74
73
  return main_action.class.name if main_action.present?
75
74
  self[:label]
76
75
  end
@@ -106,8 +105,12 @@ module ForemanTasks
106
105
  def main_action
107
106
  return @main_action if defined?(@main_action)
108
107
  if active_job?
109
- action = execution_plan_action
110
- active_job_action(action.input['job_class'], action.input['job_arguments'])
108
+ args = if execution_plan.delay_record
109
+ execution_plan.delay_record.args.first
110
+ else
111
+ execution_plan_action.input
112
+ end
113
+ @main_action = active_job_action(args['job_class'], args['job_arguments'])
111
114
  else
112
115
  @main_action = execution_plan && execution_plan.root_plan_step.try(:action, execution_plan)
113
116
  end
@@ -118,7 +121,9 @@ module ForemanTasks
118
121
  # humanized_* methods for foreman-tasks integration.
119
122
  def active_job_action(klass, args)
120
123
  return if klass.blank?
121
- klass.constantize.new(*args)
124
+ if (active_job_class = klass.safe_constantize)
125
+ active_job_class.new(*args)
126
+ end
122
127
  end
123
128
 
124
129
  def active_job?
@@ -142,7 +147,7 @@ module ForemanTasks
142
147
  method = find_humanize_method_kind(method)
143
148
  Match! method, :humanized_name, :humanized_input, :humanized_output, :humanized_errors
144
149
  if method != :humanized_name && execution_scheduled?
145
- return N_('N/A')
150
+ return
146
151
  elsif method == :humanized_name && main_action.nil?
147
152
  return N_(label)
148
153
  end
@@ -1,5 +1,5 @@
1
1
  object @task if @task
2
2
 
3
- attributes :id, :label, :pending
3
+ attributes :id, :label, :pending, :action
4
4
  attributes :username, :started_at, :ended_at, :state, :result, :progress
5
5
  attributes :input, :output, :humanized, :cli_example
@@ -2,20 +2,7 @@
2
2
  <% title_actions csv_link, help_button %>
3
3
  <% stylesheet 'foreman_tasks/tasks' %>
4
4
 
5
- <script>
6
-
7
- var currentTwoPaneTask;
8
-
9
- $(document).on('click', ".table-two-pane td.two-pane-link", function(e) {
10
- currentTwoPaneTask = $(this).find("a");
11
- if(currentTwoPaneTask.length){
12
- e.preventDefault();
13
- two_pane_open(currentTwoPaneTask);
14
- }
15
- });
16
-
17
- </script>
18
- <table class="<%= table_css_classes('table-fixed table-two-pane') %>">
5
+ <table class="<%= table_css_classes('table-fixed') %>">
19
6
  <tr>
20
7
  <th class="col-md-4"><%= _("Action") %></th>
21
8
  <th class="col-md-1"><%= _("State") %></th>
@@ -26,7 +13,7 @@ $(document).on('click', ".table-two-pane td.two-pane-link", function(e) {
26
13
  </tr>
27
14
  <% for task in @tasks %>
28
15
  <tr>
29
- <td class="task-id two-pane-link ellipsis">
16
+ <td class="task-id ellipsis">
30
17
  <%= link_to_if_authorized(format_task_input(task),
31
18
  hash_for_foreman_tasks_task_path(:id => task)) %>
32
19
  </td>
@@ -1,94 +1,117 @@
1
1
  <% stylesheet 'foreman_tasks/tasks' %>
2
2
 
3
- <script>
4
- if (typeof taskProgressReloader === 'undefined') {
5
- var taskProgressReloader = {
6
- timeoutId: null,
7
- formId: null,
8
- reload: function () {
9
- // we need different reload mechanism for two-pane and non-two-pane
10
- if (typeof currentTwoPaneTask !== 'undefined') {
11
- if($('.two-pane-right').length && $('form#' + taskProgressReloader.formId).length) {
12
- taskProgressReloader.timeoutId = null;
13
- two_pane_open(currentTwoPaneTask);
3
+ <%= breadcrumbs(
4
+ items: [
5
+ {
6
+ caption: _('Tasks'),
7
+ url: url_for(foreman_tasks_tasks_path)
8
+ },
9
+ {
10
+ caption: truncate(format_task_input(@task), :length => 50)
11
+ }
12
+ ],
13
+ name_field: 'action',
14
+ resource_url: foreman_tasks_api_tasks_path,
15
+ switcher_item_url: foreman_tasks_task_path(:id => ':id')
16
+ ) %>
17
+
18
+
19
+ <div class="task-details">
20
+ <script>
21
+ if (typeof taskProgressReloader === 'undefined') {
22
+ var taskProgressReloader = {
23
+ timeoutId: null,
24
+ formId: null,
25
+ reload: function () {
26
+ tfm.tools.showSpinner();
27
+ taskProgressReloader.timeoutId = null;
28
+ taskProgressReloader.formId = null;
29
+
30
+ $.ajax({
31
+ type:'GET',
32
+ url: document.location.href,
33
+ headers: {"X-Foreman-Layout": "two-pane"},
34
+ success: function(response){
35
+ $('#content .task-details').replaceWith($(response));
36
+ },
37
+ error: function(response){
38
+ document.location.reload();
39
+ },
40
+ complete: function(){
41
+ tfm.tools.hideSpinner();
42
+ }
43
+ });
44
+ },
45
+
46
+ start: function () {
47
+ var button = $('.reload-button');
48
+ if (!taskProgressReloader.timeoutId) {
49
+ taskProgressReloader.timeoutId = setTimeout(this.reload, 5000);
50
+ taskProgressReloader.formId = $(button).closest('form')[0].id;
51
+ }
52
+ button.html('<span class="glyphicon glyphicon-refresh spin"></span> <%= _('Stop auto-reloading') %>');
53
+ button.show();
54
+ },
55
+
56
+ stop: function () {
57
+ if (taskProgressReloader.timeoutId) {
58
+ clearTimeout(taskProgressReloader.timeoutId);
59
+ }
60
+ taskProgressReloader.timeoutId = null;
61
+ taskProgressReloader.formId = null;
62
+ var button = $('.reload-button');
63
+ button.html('<span class="glyphicon glyphicon-refresh"></span> <%= _('Start auto-reloading') %>');
64
+ button.show();
65
+ },
66
+
67
+ toggle: function () {
68
+ if (taskProgressReloader.timeoutId) {
69
+ this.stop();
14
70
  } else {
15
- taskProgressReloader.stop();
71
+ this.start();
16
72
  }
17
- } else {
18
- document.location.reload();
19
73
  }
20
- },
74
+ };
75
+ }
21
76
 
22
- start: function () {
23
- var button = $('.reload-button');
24
- if (!taskProgressReloader.timeoutId) {
25
- taskProgressReloader.timeoutId = setTimeout(this.reload, 5000);
26
- taskProgressReloader.formId = $(button).closest('form')[0].id;
77
+ $(document).ready(function () {
78
+ $('.modal-submit').click(function(e){
79
+ if($(this).hasClass('disabled')){
80
+ e.preventDefault();
27
81
  }
28
- button.html('<span class="glyphicon glyphicon-refresh spin"></span> <%= _('Stop auto-reloading') %>');
29
- button.show();
30
- },
82
+ });
83
+ $('.disable-unlock').click(function() {
84
+ var button = $(this).parents('.modal').find('.modal-submit');
31
85
 
32
- stop: function () {
33
- if (taskProgressReloader.timeoutId) {
34
- clearTimeout(taskProgressReloader.timeoutId);
86
+ if($(this).is(':checked')){
87
+ button.removeClass('disabled')
35
88
  }
36
- taskProgressReloader.timeoutId = null;
37
- taskProgressReloader.formId = null;
38
- var button = $('.reload-button');
39
- button.html('<span class="glyphicon glyphicon-refresh"></span> <%= _('Start auto-reloading') %>');
40
- button.show();
41
- },
42
-
43
- toggle: function () {
44
- if (taskProgressReloader.timeoutId) {
45
- this.stop();
46
- } else {
47
- this.start();
89
+ else{
90
+ button.addClass('disabled')
48
91
  }
49
- }
50
- };
51
- }
52
-
53
- $(document).ready(function () {
54
- $('.modal-submit').click(function(e){
55
- if($(this).hasClass('disabled')){
56
- e.preventDefault();
57
- }
58
- });
59
- $('.disable-unlock').click(function() {
60
- var button = $(this).parents('.modal').find('.modal-submit');
61
-
62
- if($(this).is(':checked')){
63
- button.removeClass('disabled')
64
- }
65
- else{
66
- button.addClass('disabled')
67
- }
68
- });
92
+ });
69
93
 
70
- $('.reload-button').click(function (event) {
71
- taskProgressReloader.toggle();
72
- event.preventDefault();
73
- });
94
+ $('.reload-button').click(function (event) {
95
+ taskProgressReloader.toggle();
96
+ event.preventDefault();
97
+ });
74
98
 
75
- $('.reload-button-stop').click(function (event) {
76
- taskProgressReloader.stop();
77
- });
99
+ $('.reload-button-stop').click(function (event) {
100
+ taskProgressReloader.stop();
101
+ });
78
102
 
79
- $('ul.nav-tabs a' ).click(function (event) {
103
+ $('ul.nav-tabs a' ).click(function (event) {
104
+ taskProgressReloader.stop();
105
+ });
106
+
107
+ <% if @task.state != 'stopped' %>
108
+ taskProgressReloader.start();
109
+ <% else %>
80
110
  taskProgressReloader.stop();
111
+ <% end %>
81
112
  });
113
+ </script>
82
114
 
83
- <% if @task.state != 'stopped' %>
84
- taskProgressReloader.start();
85
- <% else %>
86
- taskProgressReloader.stop();
87
- <% end %>
88
- });
89
- </script>
90
-
91
- <div class="task-details">
92
115
 
93
116
  <%= form_for @task, :url => "#" do %>
94
117
 
@@ -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", '~> 1.0'
32
+ s.add_dependency "dynflow", '~> 1.0', '>= 1.0.5'
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.rb CHANGED
@@ -34,11 +34,7 @@ module ForemanTasks
34
34
  end
35
35
 
36
36
  def self.rails_safe_trigger_task
37
- if Rails::VERSION::MAJOR > 4
38
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
39
- yield
40
- end
41
- else
37
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
42
38
  yield
43
39
  end
44
40
  end
@@ -103,6 +103,7 @@ module ForemanTasks
103
103
  delete_remote_tasks(chunk)
104
104
  end
105
105
  end
106
+ delete_orphaned_locks
106
107
  delete_orphaned_dynflow_tasks
107
108
  end
108
109
 
@@ -147,6 +148,15 @@ module ForemanTasks
147
148
  ForemanTasks.dynflow.world.persistence.delete_execution_plans({ 'uuid' => uuids }, batch_size, @backup_dir)
148
149
  end
149
150
 
151
+ def delete_orphaned_locks
152
+ orphaned_locks = ForemanTasks::Lock.left_outer_joins(:task).where(:'foreman_tasks_tasks.id' => nil)
153
+ with_noop(orphaned_locks, 'orphaned task locks') do |source, name|
154
+ with_batches(source, name) do |chunk|
155
+ ForemanTasks::Lock.where(id: chunk.pluck(:id)).delete_all
156
+ end
157
+ end
158
+ end
159
+
150
160
  def delete_orphaned_dynflow_tasks
151
161
  with_noop(orphaned_dynflow_tasks, 'orphaned execution plans') do |source, name|
152
162
  with_batches(source, name) do |chunk|
@@ -1,3 +1,3 @@
1
1
  module ForemanTasks
2
- VERSION = '0.13.1'.freeze
2
+ VERSION = '0.13.2'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  # Autogenerated!
2
- _("Action with sub plans")
2
+ _("Remote action:")
3
+ _("Import Puppet classes")
3
4
  _("Import facts")
4
- _("Import Puppet classes")
5
+ _("Action with sub plans")
Binary file
@@ -5,7 +5,7 @@
5
5
  #
6
6
  msgid ""
7
7
  msgstr ""
8
- "Project-Id-Version: foreman_tasks 0.1.2\n"
8
+ "Project-Id-Version: foreman_tasks 0.2.5\n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
10
  "PO-Revision-Date: 2016-02-03 09:55-0500\n"
11
11
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
@@ -150,6 +150,9 @@ msgstr ""
150
150
  msgid "External Id"
151
151
  msgstr ""
152
152
 
153
+ msgid "Failed to check on tasks on proxy at %{url}: %{exception}"
154
+ msgstr ""
155
+
153
156
  msgid "Failed to initialize"
154
157
  msgstr ""
155
158
 
@@ -271,6 +274,9 @@ msgstr ""
271
274
  msgid "Parent task"
272
275
  msgstr ""
273
276
 
277
+ msgid "Proxy task gone missing from the smart proxy"
278
+ msgstr ""
279
+
274
280
  msgid "Raw"
275
281
  msgstr ""
276
282
 
@@ -289,6 +295,9 @@ msgstr ""
289
295
  msgid "Recurring logics"
290
296
  msgstr ""
291
297
 
298
+ msgid "Remote action:"
299
+ msgstr ""
300
+
292
301
  msgid "Repeat N times"
293
302
  msgstr ""
294
303
 
@@ -436,9 +445,6 @@ msgstr ""
436
445
  msgid "Thu"
437
446
  msgstr ""
438
447
 
439
- msgid "Time in second during which a task has to be started on the proxy"
440
- msgstr ""
441
-
442
448
  msgid "Time in seconds between retries"
443
449
  msgstr ""
444
450
 
@@ -8,8 +8,8 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: foreman_tasks 1.0.0\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2018-03-12 13:50-0400\n"
12
- "PO-Revision-Date: 2018-03-12 13:50-0400\n"
11
+ "POT-Creation-Date: 2018-06-14 21:03+0200\n"
12
+ "PO-Revision-Date: 2018-06-14 21:03+0200\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
15
  "Language: \n"
@@ -22,87 +22,87 @@ msgstr ""
22
22
  msgid "List recurring logics"
23
23
  msgstr ""
24
24
 
25
- #: ../app/controllers/foreman_tasks/api/recurring_logics_controller.rb:19
25
+ #: ../app/controllers/foreman_tasks/api/recurring_logics_controller.rb:20
26
26
  msgid "Show recurring logic details"
27
27
  msgstr ""
28
28
 
29
- #: ../app/controllers/foreman_tasks/api/recurring_logics_controller.rb:23
29
+ #: ../app/controllers/foreman_tasks/api/recurring_logics_controller.rb:24
30
30
  msgid "Cancel recurring logic"
31
31
  msgstr ""
32
32
 
33
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:73
33
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:74
34
34
  msgid "Resume all paused error tasks"
35
35
  msgstr ""
36
36
 
37
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:74
37
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:75
38
38
  msgid "Resume tasks matching search string"
39
39
  msgstr ""
40
40
 
41
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:75
41
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:76
42
42
  msgid "Resume specific tasks by ID"
43
43
  msgstr ""
44
44
 
45
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:110
45
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:111
46
46
  msgid "List tasks"
47
47
  msgstr ""
48
48
 
49
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:111
49
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:112
50
50
  msgid "Search string"
51
51
  msgstr ""
52
52
 
53
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:112
53
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:113
54
54
  msgid "Page number, starting at 1"
55
55
  msgstr ""
56
56
 
57
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:113
57
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:114
58
58
  msgid "Number of results per page to return"
59
59
  msgstr ""
60
60
 
61
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:114
61
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:115
62
62
  msgid "Sort field and order, e.g. 'name DESC'"
63
63
  msgstr ""
64
64
 
65
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:115
65
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:116
66
66
  msgid "Hash version of 'order' param"
67
67
  msgstr ""
68
68
 
69
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:116
69
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:117
70
70
  msgid "Field to sort the results on"
71
71
  msgstr ""
72
72
 
73
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:117
73
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:118
74
74
  msgid "How to order the sorted results (e.g. ASC for ascending)"
75
75
  msgstr ""
76
76
 
77
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:149
77
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:152
78
78
  msgid "Send data to the task from external executor (such as smart_proxy_dynflow)"
79
79
  msgstr ""
80
80
 
81
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:151
81
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:154
82
82
  msgid "UUID of the task"
83
83
  msgstr ""
84
84
 
85
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:152
85
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:155
86
86
  msgid "The ID of the step inside the execution plan to send the event to"
87
87
  msgstr ""
88
88
 
89
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:154
89
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:157
90
90
  msgid "Data to be sent to the action"
91
91
  msgstr ""
92
92
 
93
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:182
93
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:185
94
94
  msgid "User search_params requires user_id to be specified"
95
95
  msgstr ""
96
96
 
97
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:191
97
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:194
98
98
  msgid "Resource search_params requires resource_type and resource_id to be specified"
99
99
  msgstr ""
100
100
 
101
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:198
101
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:201
102
102
  msgid "Task search_params requires task_id to be specified"
103
103
  msgstr ""
104
104
 
105
- #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:202
105
+ #: ../app/controllers/foreman_tasks/api/tasks_controller.rb:205
106
106
  msgid "Type %s for search_params is not supported"
107
107
  msgstr ""
108
108
 
@@ -148,8 +148,7 @@ msgstr ""
148
148
 
149
149
  #: ../app/helpers/foreman_tasks/foreman_tasks_helper.rb:36
150
150
  #: ../app/helpers/foreman_tasks/foreman_tasks_helper.rb:45
151
- #: ../app/models/foreman_tasks/recurring_logic.rb:101
152
- #: ../app/models/foreman_tasks/task/dynflow_task.rb:110
151
+ #: ../app/models/foreman_tasks/recurring_logic.rb:110
153
152
  #: ../app/views/foreman_tasks/tasks/dashboard/_latest_tasks_in_error_warning.html.erb:14
154
153
  #: ../app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb:14
155
154
  msgid "N/A"
@@ -312,7 +311,7 @@ msgstr ""
312
311
  msgid "The targets are of different types"
313
312
  msgstr ""
314
313
 
315
- #: ../app/lib/actions/foreman/host/import_facts.rb:44 action_names.rb:3
314
+ #: ../app/lib/actions/foreman/host/import_facts.rb:44 action_names.rb:5
316
315
  msgid "Import facts"
317
316
  msgstr ""
318
317
 
@@ -352,7 +351,7 @@ msgstr ""
352
351
  msgid "organization"
353
352
  msgstr ""
354
353
 
355
- #: ../app/lib/actions/helpers/with_continuous_output.rb:20
354
+ #: ../app/lib/actions/helpers/with_continuous_output.rb:24
356
355
  msgid "Failed to initialize"
357
356
  msgstr ""
358
357
 
@@ -364,31 +363,39 @@ msgstr ""
364
363
  msgid "All proxies with the required feature are unavailable at the moment"
365
364
  msgstr ""
366
365
 
367
- #: ../app/lib/actions/proxy_action.rb:63
366
+ #: ../app/lib/actions/middleware/watch_delegated_proxy_sub_tasks.rb:68
367
+ msgid "Failed to check on tasks on proxy at %{url}: %{exception}"
368
+ msgstr ""
369
+
370
+ #: ../app/lib/actions/proxy_action.rb:79
368
371
  msgid "The smart proxy task %s failed."
369
372
  msgstr ""
370
373
 
371
- #: ../app/lib/actions/proxy_action.rb:77
374
+ #: ../app/lib/actions/proxy_action.rb:90
372
375
  msgid "Cancel enforced: the task might be still running on the proxy"
373
376
  msgstr ""
374
377
 
375
- #: ../app/lib/actions/proxy_action.rb:87
378
+ #: ../app/lib/actions/proxy_action.rb:100
376
379
  msgid "Task aborted: the task might be still running on the proxy"
377
380
  msgstr ""
378
381
 
379
- #: ../app/lib/actions/proxy_action.rb:129
382
+ #: ../app/lib/actions/proxy_action.rb:121
383
+ msgid "Proxy task gone missing from the smart proxy"
384
+ msgstr ""
385
+
386
+ #: ../app/lib/actions/proxy_action.rb:151
380
387
  msgid "Initialization error: %s"
381
388
  msgstr ""
382
389
 
383
- #: ../app/models/foreman_tasks/recurring_logic.rb:95
390
+ #: ../app/models/foreman_tasks/recurring_logic.rb:104
384
391
  msgid "Active"
385
392
  msgstr ""
386
393
 
387
- #: ../app/models/foreman_tasks/recurring_logic.rb:97
394
+ #: ../app/models/foreman_tasks/recurring_logic.rb:106
388
395
  msgid "Cancelled"
389
396
  msgstr ""
390
397
 
391
- #: ../app/models/foreman_tasks/recurring_logic.rb:99
398
+ #: ../app/models/foreman_tasks/recurring_logic.rb:108
392
399
  msgid "Finished"
393
400
  msgstr ""
394
401
 
@@ -456,10 +463,6 @@ msgstr ""
456
463
  msgid "Time in seconds between retries"
457
464
  msgstr ""
458
465
 
459
- #: ../app/models/setting/foreman_tasks.rb:13
460
- msgid "Time in second during which a task has to be started on the proxy"
461
- msgstr ""
462
-
463
466
  #: ../app/views/common/_trigger_form.html.erb:2
464
467
  msgid "Schedule"
465
468
  msgstr ""
@@ -489,7 +492,7 @@ msgstr ""
489
492
  #: ../app/views/foreman_tasks/task_groups/recurring_logic_task_groups/_recurring_logic_task_group.html.erb:12
490
493
  #: ../app/views/foreman_tasks/tasks/_errors.html.erb:16
491
494
  #: ../app/views/foreman_tasks/tasks/_running_steps.html.erb:19
492
- #: ../app/views/foreman_tasks/tasks/index.html.erb:20
495
+ #: ../app/views/foreman_tasks/tasks/index.html.erb:7
493
496
  msgid "Action"
494
497
  msgstr ""
495
498
 
@@ -523,7 +526,7 @@ msgstr ""
523
526
  #: ../app/views/foreman_tasks/tasks/_running_steps.html.erb:24
524
527
  #: ../app/views/foreman_tasks/tasks/dashboard/_latest_tasks_in_error_warning.html.erb:5
525
528
  #: ../app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb:4
526
- #: ../app/views/foreman_tasks/tasks/index.html.erb:21
529
+ #: ../app/views/foreman_tasks/tasks/index.html.erb:8
527
530
  msgid "State"
528
531
  msgstr ""
529
532
 
@@ -604,7 +607,7 @@ msgstr ""
604
607
  #: ../app/views/foreman_tasks/tasks/_details.html.erb:96
605
608
  #: ../app/views/foreman_tasks/tasks/dashboard/_latest_tasks_in_error_warning.html.erb:6
606
609
  #: ../app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb:5
607
- #: ../app/views/foreman_tasks/tasks/index.html.erb:22
610
+ #: ../app/views/foreman_tasks/tasks/index.html.erb:9
608
611
  msgid "Result"
609
612
  msgstr ""
610
613
 
@@ -617,12 +620,12 @@ msgid "Execution type"
617
620
  msgstr ""
618
621
 
619
622
  #: ../app/views/foreman_tasks/tasks/_details.html.erb:127
620
- #: ../app/views/foreman_tasks/tasks/index.html.erb:23
623
+ #: ../app/views/foreman_tasks/tasks/index.html.erb:10
621
624
  msgid "Started at"
622
625
  msgstr ""
623
626
 
624
627
  #: ../app/views/foreman_tasks/tasks/_details.html.erb:131
625
- #: ../app/views/foreman_tasks/tasks/index.html.erb:24
628
+ #: ../app/views/foreman_tasks/tasks/index.html.erb:11
626
629
  msgid "Ended at"
627
630
  msgstr ""
628
631
 
@@ -633,7 +636,7 @@ msgid "Output"
633
636
  msgstr ""
634
637
 
635
638
  #: ../app/views/foreman_tasks/tasks/_details.html.erb:188
636
- #: ../app/views/foreman_tasks/tasks/show.html.erb:98
639
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:121
637
640
  msgid "Errors"
638
641
  msgstr ""
639
642
 
@@ -720,35 +723,36 @@ msgid "Last start time"
720
723
  msgstr ""
721
724
 
722
725
  #: ../app/views/foreman_tasks/tasks/index.html.erb:1
726
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:6
723
727
  #: ../lib/foreman_tasks/engine.rb:48
724
728
  msgid "Tasks"
725
729
  msgstr ""
726
730
 
727
- #: ../app/views/foreman_tasks/tasks/index.html.erb:25
731
+ #: ../app/views/foreman_tasks/tasks/index.html.erb:12
728
732
  msgid "User"
729
733
  msgstr ""
730
734
 
731
- #: ../app/views/foreman_tasks/tasks/show.html.erb:28
735
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:52
732
736
  msgid "Stop auto-reloading"
733
737
  msgstr ""
734
738
 
735
- #: ../app/views/foreman_tasks/tasks/show.html.erb:39
739
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:63
736
740
  msgid "Start auto-reloading"
737
741
  msgstr ""
738
742
 
739
- #: ../app/views/foreman_tasks/tasks/show.html.erb:96
743
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:119
740
744
  msgid "Task"
741
745
  msgstr ""
742
746
 
743
- #: ../app/views/foreman_tasks/tasks/show.html.erb:97
747
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:120
744
748
  msgid "Running Steps"
745
749
  msgstr ""
746
750
 
747
- #: ../app/views/foreman_tasks/tasks/show.html.erb:99
751
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:122
748
752
  msgid "Locks"
749
753
  msgstr ""
750
754
 
751
- #: ../app/views/foreman_tasks/tasks/show.html.erb:100
755
+ #: ../app/views/foreman_tasks/tasks/show.html.erb:123
752
756
  msgid "Raw"
753
757
  msgstr ""
754
758
 
@@ -767,5 +771,9 @@ msgid "Recurring Logics"
767
771
  msgstr ""
768
772
 
769
773
  #: action_names.rb:2
774
+ msgid "Remote action:"
775
+ msgstr ""
776
+
777
+ #: action_names.rb:3
770
778
  msgid "Action with sub plans"
771
779
  msgstr ""
@@ -12,6 +12,54 @@ module ForemanTasks
12
12
  :dynflow_task
13
13
  end
14
14
  # rubocop:enable Naming/AccessorMethodName
15
+
16
+ def linked_task(resource)
17
+ FactoryBot.create(:some_task).tap { |t| ForemanTasks::Lock.link!(resource, t.id) }
18
+ end
19
+
20
+ def in_taxonomy_scope(organization, location = nil)
21
+ Organization.current = organization
22
+ Location.current = location unless location.nil?
23
+ yield organization, location
24
+ Organization.current = Location.current = nil
25
+ end
26
+
27
+ describe 'taxonomy scoping' do
28
+ let(:organizations) { (0..1).map { FactoryBot.create(:organization) } }
29
+ let(:tasks) { organizations.map { |o| linked_task(o) } + [FactoryBot.create(:some_task)] }
30
+
31
+ it 'takes other searches into account' do
32
+ task = tasks.first
33
+ @controller.stubs(:params).returns(:search => "id = #{task.id}")
34
+ in_taxonomy_scope(organizations.first) do |_o, _l|
35
+ results = @controller.send(:filter, ForemanTasks::Task)
36
+ results.map(&:id).sort.must_equal [task.id]
37
+ end
38
+ end
39
+
40
+ it 'does not scope by taxonomy if unset' do
41
+ organizations
42
+ tasks
43
+ @controller.send(:current_taxonomy_search).must_equal ''
44
+ results = @controller.send(:filter, ForemanTasks::Task)
45
+ results.map(&:id).sort.must_equal tasks.map(&:id).sort
46
+ end
47
+
48
+ it 'scopes by organization if set' do
49
+ scoped, _, unscoped = tasks
50
+ in_taxonomy_scope(organizations.first) do |o, _l|
51
+ @controller.send(:current_taxonomy_search).must_equal "(organization_id = #{o.id})"
52
+ results = @controller.send(:filter, ForemanTasks::Task)
53
+ results.map(&:id).sort.must_equal [scoped, unscoped].map(&:id).sort
54
+ end
55
+ end
56
+
57
+ it 'scopes by org and location if set' do
58
+ in_taxonomy_scope(organizations.first, FactoryBot.create(:location)) do |o, l|
59
+ @controller.send(:current_taxonomy_search).must_equal "(organization_id = #{o.id} AND location_id = #{l.id})"
60
+ end
61
+ end
62
+ end
15
63
  end
16
64
  end
17
65
  end
@@ -1,5 +1,7 @@
1
1
  require 'test_helper'
2
+ require_relative './support/dummy_active_job'
2
3
  require_relative './support/dummy_dynflow_action'
4
+ require_relative './support/dummy_recurring_dynflow_action'
3
5
  require_relative './support/dummy_proxy_action'
4
6
  require_relative './support/dummy_task_group'
5
7
 
@@ -0,0 +1,7 @@
1
+ module Support
2
+ class DummyActiveJob < ApplicationJob
3
+ def humanized_name
4
+ "Dummy action"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Support
2
+ class DummyRecurringDynflowAction < Actions::EntryAction
3
+ include Actions::RecurringAction
4
+ end
5
+ end
@@ -39,12 +39,18 @@ class TasksTest < ActiveSupport::TestCase
39
39
  task.started_at = task.ended_at = Time.zone.now
40
40
  task.save
41
41
  end]
42
+ lock_to_delete = tasks_to_delete.first.locks.create(:name => 'read', :resource => User.current)
43
+
44
+ tasks_to_keep = [FactoryBot.create(:dynflow_task, :product_create_task)]
45
+ lock_to_keep = tasks_to_keep.first.locks.create(:name => 'read', :resource => User.current)
42
46
 
43
- tasks_to_keep = [FactoryBot.create(:dynflow_task, :product_create_task)]
44
47
  cleaner.expects(:tasks_to_csv)
45
48
  cleaner.delete
46
49
  ForemanTasks::Task.where(id: tasks_to_delete).must_be_empty
47
50
  ForemanTasks::Task.where(id: tasks_to_keep).must_equal tasks_to_keep
51
+
52
+ ForemanTasks::Lock.find_by(id: lock_to_delete.id).must_be_nil
53
+ ForemanTasks::Lock.find_by(id: lock_to_keep.id).wont_be_nil
48
54
  end
49
55
 
50
56
  it 'supports passing empty filter (just delete all)' do
@@ -76,7 +82,7 @@ class TasksTest < ActiveSupport::TestCase
76
82
  w.close
77
83
  header, *data = r.readlines.map(&:chomp)
78
84
  header.must_equal ForemanTasks::Task.attribute_names.join(',')
79
- expected_lines = tasks_to_delete.map { |task| task.attributes.values.join(',') }
85
+ expected_lines = tasks_to_delete.map { |task| task.attributes.values.to_csv.chomp }
80
86
  data.count.must_equal expected_lines.count
81
87
  expected_lines.each { |line| data.must_include line }
82
88
  ForemanTasks::Task.where(id: tasks_to_delete).must_be_empty
@@ -88,6 +88,15 @@ class RecurringLogicsTest < ActiveSupport::TestCase
88
88
  recurring_logic.start(::Support::DummyDynflowAction)
89
89
  end
90
90
 
91
+ it 'can start at' do
92
+ recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline('* * * * *')
93
+
94
+ future_time = Time.zone.now + 1.week
95
+ recurring_logic.start_after(::Support::DummyRecurringDynflowAction, future_time)
96
+
97
+ assert_equal future_time.change(:min => future_time.min + 1, :sec => 0), recurring_logic.tasks.first.start_at
98
+ end
99
+
91
100
  it 'has a task group associated to all tasks that were created as part of the recurring logic' do
92
101
  recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline('* * * * *')
93
102
  recurring_logic.save
@@ -56,6 +56,15 @@ class TasksTest < ActiveSupport::TestCase
56
56
  end
57
57
  end
58
58
 
59
+ describe 'active job task' do
60
+ it 'when scheduled to the future, the label and action is set properly' do
61
+ job = Support::DummyActiveJob.set(:wait => 12.hours).perform_later
62
+ task = ForemanTasks::Task.find_by!(:external_id => job.provider_job_id)
63
+ task.action.must_equal "Dummy action"
64
+ task.label.must_equal "Support::DummyActiveJob"
65
+ end
66
+ end
67
+
59
68
  describe 'task without valid execution plan' do
60
69
  let(:task) do
61
70
  task = FactoryBot.create(:dynflow_task).tap do |task|
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.13.1
4
+ version: 0.13.2
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-05-15 00:00:00.000000000 Z
11
+ date: 2018-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: foreman-tasks-core
@@ -31,6 +31,9 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.0'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.5
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +41,9 @@ dependencies:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
43
  version: '1.0'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.5
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: sinatra
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -250,8 +256,10 @@ files:
250
256
  - test/helpers/foreman_tasks/tasks_helper_test.rb
251
257
  - test/lib/actions/middleware/keep_current_taxonomies_test.rb
252
258
  - test/lib/actions/middleware/keep_current_user_test.rb
259
+ - test/support/dummy_active_job.rb
253
260
  - test/support/dummy_dynflow_action.rb
254
261
  - test/support/dummy_proxy_action.rb
262
+ - test/support/dummy_recurring_dynflow_action.rb
255
263
  - test/support/dummy_task_group.rb
256
264
  - test/tasks/generate_task_actions_test.rb
257
265
  - test/unit/actions/action_with_sub_plans_test.rb
@@ -286,7 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
294
  version: '0'
287
295
  requirements: []
288
296
  rubyforge_project:
289
- rubygems_version: 2.7.3
297
+ rubygems_version: 2.6.12
290
298
  signing_key:
291
299
  specification_version: 4
292
300
  summary: Foreman plugin for showing tasks information for resoruces and users
@@ -302,8 +310,10 @@ test_files:
302
310
  - test/helpers/foreman_tasks/tasks_helper_test.rb
303
311
  - test/lib/actions/middleware/keep_current_taxonomies_test.rb
304
312
  - test/lib/actions/middleware/keep_current_user_test.rb
313
+ - test/support/dummy_active_job.rb
305
314
  - test/support/dummy_dynflow_action.rb
306
315
  - test/support/dummy_proxy_action.rb
316
+ - test/support/dummy_recurring_dynflow_action.rb
307
317
  - test/support/dummy_task_group.rb
308
318
  - test/tasks/generate_task_actions_test.rb
309
319
  - test/unit/actions/action_with_sub_plans_test.rb