foreman-tasks 1.1.2 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/README.md +2 -0
  4. data/app/controllers/foreman_tasks/api/tasks_controller.rb +33 -1
  5. data/app/controllers/foreman_tasks/tasks_controller.rb +9 -14
  6. data/app/lib/actions/proxy_action.rb +1 -1
  7. data/app/models/foreman_tasks/task.rb +4 -0
  8. data/app/models/foreman_tasks/task/dynflow_task.rb +3 -1
  9. data/app/models/setting/foreman_tasks.rb +1 -1
  10. data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
  11. data/app/views/foreman_tasks/api/tasks/details.json.rabl +0 -1
  12. data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
  13. data/config/routes.rb +1 -0
  14. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
  15. data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
  16. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +3 -3
  17. data/db/seeds.d/30-notification_blueprints.rb +7 -0
  18. data/lib/foreman_tasks/engine.rb +2 -7
  19. data/lib/foreman_tasks/version.rb +1 -1
  20. data/locale/action_names.rb +1 -1
  21. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  22. data/locale/en/foreman_tasks.po +270 -54
  23. data/locale/foreman_tasks.pot +630 -292
  24. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  25. data/locale/fr/foreman_tasks.po +817 -0
  26. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  27. data/locale/ja/foreman_tasks.po +817 -0
  28. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  29. data/locale/zh_CN/foreman_tasks.po +816 -0
  30. data/package.json +1 -0
  31. data/script/npm_link_foreman_js.sh +26 -0
  32. data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
  33. data/webpack/ForemanTasks/Components/{TasksTable/TasksTableActionHelpers.js → TaskActions/TaskActionHelpers.js} +21 -6
  34. data/webpack/ForemanTasks/Components/{TasksTable/__tests__/TasksTableActionHelpers.test.js → TaskActions/TaskActionHelpers.test.js} +2 -2
  35. data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
  36. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
  37. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
  38. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
  39. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
  40. data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
  41. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
  42. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +149 -167
  43. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
  44. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +68 -3
  45. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
  46. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
  47. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +124 -76
  48. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +35 -5
  49. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +3 -14
  50. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +40 -16
  51. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -4
  52. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -6
  53. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -10
  54. data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
  55. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
  56. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +7 -1
  57. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +18 -2
  58. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +30 -13
  59. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +91 -0
  60. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +13 -4
  61. data/webpack/ForemanTasks/Components/TaskDetails/index.js +6 -8
  62. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
  63. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
  64. data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
  65. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
  66. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
  67. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
  68. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +46 -0
  69. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
  70. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
  71. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
  72. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +55 -0
  73. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
  74. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
  75. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +32 -0
  76. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
  77. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
  78. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
  79. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +135 -35
  80. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +13 -9
  81. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +26 -66
  82. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +10 -12
  83. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +30 -96
  84. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
  85. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +8 -4
  86. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +50 -2
  87. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -12
  88. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +22 -26
  89. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
  90. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -14
  91. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +155 -0
  92. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -14
  93. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +17 -124
  94. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +63 -133
  95. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
  96. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
  97. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
  98. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
  99. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
  100. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
  101. data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -2
  102. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +55 -19
  103. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +75 -19
  104. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +88 -21
  105. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
  106. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
  107. data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
  108. data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
  109. data/webpack/ForemanTasks/Components/common/{ToastTypesConstants.js → ToastsHelpers/ToastTypesConstants.js} +0 -0
  110. data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
  111. data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -0
  112. data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
  113. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
  114. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
  115. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  116. data/webpack/__mocks__/foremanReact/{API.js → redux/API.js} +1 -1
  117. metadata +41 -21
  118. data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
  119. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
  120. data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
  121. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
  122. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
  123. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
  124. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
  125. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
  126. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
  127. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
  128. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
  129. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
  130. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
  131. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
  132. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ResumeButton.test.js.snap +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88767e3fa6070985ad11cf3ebe2ffec115a849a35d68ba9822b799ada08f20fd
4
- data.tar.gz: 9e839c4b8fcca99cba833f26950c784589477c7efa487953adf20622575e1e92
3
+ metadata.gz: 62a10715bd5b194c1cb750c2f100b60a2f3bca155e0df6d303b284cf157a87d9
4
+ data.tar.gz: fd24e269912731dd0e2cee07e99e694dbf98547cab3a3d3dd89963f87d2dc3b9
5
5
  SHA512:
6
- metadata.gz: 0bf4b6de277203877b5b9d88d330458f6ba53bb0e968041b1f7148a06851a5b2b963b1b3febea3d17ea84ffb51ce4085fe96169e1615e10e7a81a1db50b61f38
7
- data.tar.gz: 2fe44f74fc96870485075b7cd294d27aa13108eeb3ddbc48fe8aaeb1bd39fa58fdf20dc584362f4bbbea6f52d54510b78bb987cffdd551b9c19c03886847e64a
6
+ metadata.gz: 011ae333df38537c17b1593a06f41828aa600e45d653c4231644b7d86e0a0ea92016de9d36abb067c432eb4e04466bec72e9ceb9f6ad87be3142b9896d7f18e4
7
+ data.tar.gz: 0c06ac795bc95787682262e42e8330b5b1e10d0923bc68581ba19623be01cac63ab6bab70d67a168a51c61b2f34f383f19c95276eee9fd564fb7a8c32edec16f
@@ -1,4 +1,6 @@
1
1
  language: node_js
2
+ cache:
3
+ npm: false
2
4
  node_js:
3
5
  - '10'
4
6
  - '12'
data/README.md CHANGED
@@ -23,6 +23,8 @@ happening/happened in your Foreman instance. A framework for asynchronous tasks
23
23
  | >= 1.18 | ~> 0.13.0 |
24
24
  | >= 1.20 | ~> 0.14.0 |
25
25
  | >= 1.22 | ~> 0.15.0 |
26
+ | >= 2.0 | ~> 1.0.0 |
27
+ | >= 2.1 | ~> 2.0.0 |
26
28
 
27
29
  Installation
28
30
  ------------
@@ -141,6 +141,34 @@ module ForemanTasks
141
141
  }
142
142
  end
143
143
 
144
+ api :POST, '/tasks/bulk_stop', N_('Stop all stoppable tasks')
145
+ param :search, String, :desc => N_('Stop tasks matching search string')
146
+ param :task_ids, Array, :desc => N_('Stop specific tasks by ID')
147
+ def bulk_stop
148
+ if params[:search].nil? && params[:task_ids].nil?
149
+ raise BadRequest, _('Please provide at least one of search or task_ids parameters in the request')
150
+ end
151
+
152
+ filtered_scope = bulk_scope
153
+ total_length = filtered_scope.count
154
+ to_stop = filtered_scope.where.not(state: :stopped)
155
+ to_stop_length = to_stop.count
156
+ skipped_length = total_length - to_stop_length
157
+
158
+ to_stop.find_each { |task| task.update(state: :stopped) }
159
+
160
+ if params[:search]
161
+ notification = UINotifications::Tasks::TaskBulkStop.new(filtered_scope.first, to_stop_length, skipped_length)
162
+ notification.deliver!
163
+ end
164
+
165
+ render :json => {
166
+ total: total_length,
167
+ stopped_length: to_stop_length,
168
+ skipped_length: skipped_length
169
+ }
170
+ end
171
+
144
172
  api :GET, '/tasks', N_('List tasks')
145
173
  param :search, String, :desc => N_('Search string')
146
174
  param :page, :number, :desc => N_('Page number, starting at 1')
@@ -287,11 +315,15 @@ module ForemanTasks
287
315
  @resource_scope ||= ForemanTasks::Task.authorized("#{action_permission}_foreman_tasks")
288
316
  end
289
317
 
318
+ def controller_permission
319
+ 'foreman_tasks'
320
+ end
321
+
290
322
  def action_permission
291
323
  case params[:action]
292
324
  when 'bulk_search', 'summary', 'details', 'sub_tasks'
293
325
  :view
294
- when 'bulk_resume', 'bulk_cancel'
326
+ when 'bulk_resume', 'bulk_cancel', 'bulk_stop'
295
327
  :edit
296
328
  else
297
329
  super
@@ -3,8 +3,6 @@ module ForemanTasks
3
3
  include Foreman::Controller::AutoCompleteSearch
4
4
  include Foreman::Controller::CsvResponder
5
5
 
6
- before_action :restrict_dangerous_actions, :only => [:unlock, :force_unlock]
7
-
8
6
  def show
9
7
  @task = resource_base.find(params[:id])
10
8
  render :layout => !request.xhr?
@@ -33,9 +31,12 @@ module ForemanTasks
33
31
 
34
32
  def cancel_step
35
33
  task = find_dynflow_task
36
- flash[:info] = _('Trying to cancel step %s') % params[:step_id]
37
- ForemanTasks.dynflow.world.event(task.external_id, params[:step_id].to_i, ::Dynflow::Action::Cancellable::Cancel).wait
38
- redirect_to foreman_tasks_task_path(task)
34
+ result = ForemanTasks.dynflow.world.event(task.external_id, params[:step_id].to_i, ::Dynflow::Action::Cancellable::Cancel).wait
35
+ if result.rejected?
36
+ render json: { error: result.reason }, status: :bad_request
37
+ else
38
+ render json: { statusText: 'OK' }
39
+ end
39
40
  end
40
41
 
41
42
  def cancel
@@ -72,19 +73,17 @@ module ForemanTasks
72
73
  if task.paused?
73
74
  task.state = :stopped
74
75
  task.save!
75
- flash[:info] = _('The task resources were unlocked.')
76
+ render json: { statusText: 'OK' }
76
77
  else
77
- flash[:warning] = _('The execution has to be paused.')
78
+ render json: {}, status: :bad_request
78
79
  end
79
- redirect_back(:fallback_location => foreman_tasks_task_path(task))
80
80
  end
81
81
 
82
82
  def force_unlock
83
83
  task = find_dynflow_task
84
84
  task.state = :stopped
85
85
  task.save!
86
- flash[:info] = _('The task resources were unlocked with force.')
87
- redirect_back(:fallback_location => foreman_tasks_task_path(task))
86
+ render json: { statusText: 'OK' }
88
87
  end
89
88
 
90
89
  # we need do this to make the Foreman helpers working properly
@@ -103,10 +102,6 @@ module ForemanTasks
103
102
  csv_response(@tasks, [:id, :action, :state, :result, 'started_at.in_time_zone', 'ended_at.in_time_zone', :username], ['Id', 'Action', 'State', 'Result', 'Started At', 'Ended At', 'User'])
104
103
  end
105
104
 
106
- def restrict_dangerous_actions
107
- render_403 unless Setting['dynflow_allow_dangerous_actions']
108
- end
109
-
110
105
  def controller_permission
111
106
  'foreman_tasks'
112
107
  end
@@ -257,7 +257,7 @@ module Actions
257
257
  if failed_proxy_tasks.count < options[:retry_count]
258
258
  suspend do |suspended_action|
259
259
  @world.clock.ping suspended_action,
260
- Time.zone.now + options[:retry_interval],
260
+ Time.now.getlocal + options[:retry_interval],
261
261
  event
262
262
  end
263
263
  else
@@ -70,6 +70,10 @@ module ForemanTasks
70
70
  end)
71
71
  scope :for_action_types, (->(action_types) { where('foreman_tasks_tasks.label IN (?)', Array(action_types)) })
72
72
 
73
+ class Jail < Safemode::Jail
74
+ allow :started_at, :ended_at, :result, :state, :label, :main_action
75
+ end
76
+
73
77
  def input
74
78
  {}
75
79
  end
@@ -46,7 +46,8 @@ module ForemanTasks
46
46
  end
47
47
 
48
48
  def progress
49
- execution_plan.try(:progress) || 0
49
+ progress_raw = execution_plan.try(:progress) || 0
50
+ progress_raw.round(2)
50
51
  end
51
52
 
52
53
  def execution_plan(silence_exception = true)
@@ -119,6 +120,7 @@ module ForemanTasks
119
120
  begin
120
121
  f_action = f.action(execution_plan)
121
122
  {
123
+ id: f_action.id,
122
124
  action_class: f.action_class.name,
123
125
  state: f.state,
124
126
  input: f_action.input.pretty_inspect,
@@ -2,7 +2,6 @@ class Setting::ForemanTasks < Setting
2
2
  def self.default_settings
3
3
  [
4
4
  set('foreman_tasks_sync_task_timeout', N_('Number of seconds to wait for synchronous task to finish.'), 120),
5
- set('dynflow_allow_dangerous_actions', N_('Allow unlocking actions which can have dangerous consequences.'), false),
6
5
  set('dynflow_enable_console', N_('Enable the dynflow console (/foreman_tasks/dynflow) for debugging'), true),
7
6
  set('dynflow_console_require_auth', N_('Require user to be authenticated as user with admin rights when accessing dynflow console'), true),
8
7
  set('foreman_tasks_proxy_action_retry_count', N_('Number of attempts to start a task on the smart proxy before failing'), 4),
@@ -24,6 +23,7 @@ class Setting::ForemanTasks < Setting
24
23
 
25
24
  def self.load_defaults
26
25
  Setting::BLANK_ATTRS.push('foreman_tasks_troubleshooting_url')
26
+ Setting::NONZERO_ATTRS.push('foreman_tasks_polling_multiplier')
27
27
  super
28
28
  end
29
29
  end
@@ -0,0 +1,36 @@
1
+ module UINotifications
2
+ module Tasks
3
+ class TaskBulkStop < ::UINotifications::Base
4
+ def initialize(task, stopped_length, skipped_length)
5
+ @subject = task
6
+ @stopped_length = stopped_length
7
+ @skipped_length = skipped_length
8
+ end
9
+
10
+ def create
11
+ Notification.create!(
12
+ initiator: initiator,
13
+ audience: audience,
14
+ subject: subject,
15
+ notification_blueprint: blueprint,
16
+ message: message,
17
+ notification_recipients: [NotificationRecipient.create(:user => User.current)]
18
+ )
19
+ end
20
+
21
+ def audience
22
+ Notification::AUDIENCE_GLOBAL
23
+ end
24
+
25
+ def message
26
+ ('%{stopped} Tasks were stopped. %{skipped} Tasks were already stopped. ' %
27
+ { stopped: @stopped_length,
28
+ skipped: @skipped_length })
29
+ end
30
+
31
+ def blueprint
32
+ @blueprint ||= NotificationBlueprint.find_by(name: 'tasks_bulk_stop')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -9,7 +9,6 @@ node(:failed_steps) { @task.input_output_failed_steps }
9
9
  node(:running_steps) { @task.input_output_running_steps }
10
10
  node(:help) { troubleshooting_info_text }
11
11
  node(:has_sub_tasks) { @task.sub_tasks.any? }
12
- node(:allowDangerousActions) { Setting['dynflow_allow_dangerous_actions'] }
13
12
  node(:locks) do
14
13
  @task.locks.map do |lock|
15
14
  { name: lock.name, exclusive: lock.exclusive, resource_type: lock.resource_type, resource_id: lock.resource_id }
@@ -1,5 +1,7 @@
1
1
  object @task if @task
2
2
 
3
+ extends 'api/v2/layouts/permissions'
4
+
3
5
  attributes :id, :label, :pending, :action
4
6
  attributes :username, :started_at, :ended_at, :state, :result, :progress
5
7
  attributes :input, :output, :humanized, :cli_example, :start_at
@@ -56,6 +56,7 @@ Foreman::Application.routes.draw do
56
56
  post :bulk_search
57
57
  post :bulk_resume
58
58
  post :bulk_cancel
59
+ post :bulk_stop
59
60
  get :summary
60
61
  get '/summary/:id/sub_tasks/', action: 'summary_sub_tasks'
61
62
  post :callback
@@ -0,0 +1,35 @@
1
+ class RenameBookmarksController < ActiveRecord::Migration[5.2]
2
+ def up
3
+ original_controller = 'foreman_tasks_tasks'
4
+ original_bookmarks = Bookmark.where(controller: original_controller)
5
+ original_bookmarks_names = Hash[original_bookmarks.pluck(:name, :id)]
6
+
7
+ new_controller = 'foreman_tasks/tasks'
8
+ new_bookmarks = Bookmark.where(controller: new_controller)
9
+ new_bookmarks.find_each do |new_bookmark|
10
+ name = new_bookmark.name
11
+ is_name_taken = original_bookmarks_names.key? name
12
+
13
+ if is_name_taken
14
+ original_bookmark = original_bookmarks.find(original_bookmarks_names[name])
15
+ is_duplicated = original_bookmark.query == new_bookmark.query &&
16
+ original_bookmark.owner_id == new_bookmark.owner_id &&
17
+ original_bookmark.owner_type == new_bookmark.owner_type &&
18
+ original_bookmark.public == new_bookmark.public
19
+
20
+ if is_duplicated
21
+ original_bookmark.destroy
22
+ else
23
+ modified_name = "#{name}_#{generate_token}"
24
+ original_bookmark.update(name: modified_name)
25
+ end
26
+ end
27
+ # Revert to the original controller name
28
+ new_bookmark.update(controller: original_controller)
29
+ end
30
+ end
31
+
32
+ def generate_token
33
+ SecureRandom.base64(5).gsub(/[^0-9a-z ]/i, '')
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ class DropDynflowAllowDangerousActionsSetting < ActiveRecord::Migration[6.0]
2
+ def up
3
+ Setting.where(name: 'dynflow_allow_dangerous_actions').delete_all
4
+ end
5
+ end
@@ -2,8 +2,8 @@ class AddTaskLockIndexOnResourceTypeAndTaskId < ActiveRecord::Migration[6.0]
2
2
  def change
3
3
  add_index :foreman_tasks_locks, [:task_id, :resource_type, :resource_id], name: 'index_tasks_locks_on_task_id_resource_type_and_resource_id'
4
4
  # These indexes are not needed as they can be gained from partial index lookups
5
- remove_index :foreman_tasks_locks, :task_id
6
- remove_index :foreman_tasks_locks, :name
7
- remove_index :foreman_tasks_locks, :resource_type
5
+ [:task_id, :name, :resource_type].each do |index|
6
+ remove_index :foreman_tasks_locks, index if index_exists?(:foreman_tasks_locks, index)
7
+ end
8
8
  end
9
9
  end
@@ -41,6 +41,13 @@ blueprints = [
41
41
  name: 'tasks_bulk_cancel',
42
42
  level: 'info',
43
43
  message: "DYNAMIC",
44
+ },
45
+
46
+ {
47
+ group: N_('Tasks'),
48
+ name: 'tasks_bulk_stop',
49
+ level: 'info',
50
+ message: "DYNAMIC",
44
51
  }
45
52
  ]
46
53
 
@@ -34,7 +34,7 @@ module ForemanTasks
34
34
 
35
35
  initializer 'foreman_tasks.register_plugin', :before => :finisher_hook do |_app|
36
36
  Foreman::Plugin.register :"foreman-tasks" do
37
- requires_foreman '>= 2.0.0'
37
+ requires_foreman '>= 2.1.0'
38
38
  divider :top_menu, :parent => :monitor_menu, :last => true, :caption => N_('Foreman Tasks')
39
39
  menu :top_menu, :tasks,
40
40
  :url_hash => { :controller => 'foreman_tasks/tasks', :action => :index },
@@ -53,7 +53,7 @@ module ForemanTasks
53
53
  :'foreman_tasks/react' => [:index],
54
54
  :'foreman_tasks/api/tasks' => [:bulk_search, :show, :index, :summary, :summary_sub_tasks, :details, :sub_tasks] }, :resource_type => ForemanTasks::Task.name
55
55
  permission :edit_foreman_tasks, { :'foreman_tasks/tasks' => [:resume, :unlock, :force_unlock, :cancel_step, :cancel, :abort],
56
- :'foreman_tasks/api/tasks' => [:bulk_resume, :bulk_cancel] }, :resource_type => ForemanTasks::Task.name
56
+ :'foreman_tasks/api/tasks' => [:bulk_resume, :bulk_cancel, :bulk_stop] }, :resource_type => ForemanTasks::Task.name
57
57
 
58
58
  permission :create_recurring_logics, {}, :resource_type => ForemanTasks::RecurringLogic.name
59
59
 
@@ -79,11 +79,6 @@ module ForemanTasks
79
79
  end
80
80
  end
81
81
 
82
- initializer 'foreman_tasks.ignore_dynflow_tables' do |_app|
83
- # Ignore Dynflow tables when schema-dumping. Dynflow tables are handled automatically by Dynflow.
84
- ActiveRecord::SchemaDumper.ignore_tables << /^dynflow_.*$/
85
- end
86
-
87
82
  initializer 'foreman_tasks.apipie' do
88
83
  # this condition is here for compatibility reason to work with Foreman 1.4.x
89
84
  if Apipie.configuration.api_controllers_matcher.is_a?(Array) &&
@@ -1,3 +1,3 @@
1
1
  module ForemanTasks
2
- VERSION = '1.1.2'.freeze
2
+ VERSION = '2.0.2'.freeze
3
3
  end
@@ -1,5 +1,5 @@
1
1
  # Autogenerated!
2
2
  _("Remote action:")
3
3
  _("Import Puppet classes")
4
- _("Import facts")
5
4
  _("Action with sub plans")
5
+ _("Import facts")
@@ -5,7 +5,7 @@
5
5
  #
6
6
  msgid ""
7
7
  msgstr ""
8
- "Project-Id-Version: foreman_tasks 0.2.5\n"
8
+ "Project-Id-Version: foreman_tasks 0.3.4\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"
@@ -17,10 +17,16 @@ msgstr ""
17
17
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
18
18
  "\n"
19
19
 
20
- msgid " seconds"
20
+ msgid "${taskReload ? 'Stop' : 'Start'} auto-reloading"
21
21
  msgstr ""
22
22
 
23
- msgid "%s ago"
23
+ msgid "%(last)s Last %(time)s"
24
+ msgstr ""
25
+
26
+ msgid "%(older)s Older %(time)s"
27
+ msgstr ""
28
+
29
+ msgid "%s Selected Tasks"
24
30
  msgstr ""
25
31
 
26
32
  msgid "%s is not valid format of cron line"
@@ -38,7 +44,10 @@ msgstr ""
38
44
  msgid "%{value} is wrong format"
39
45
  msgstr ""
40
46
 
41
- msgid "(Disabled)"
47
+ msgid "12h"
48
+ msgstr ""
49
+
50
+ msgid "24h"
42
51
  msgstr ""
43
52
 
44
53
  msgid ":after setting in tasks cleanup section is deprecated, use :after in :rules section to set the value. to cleanup rules"
@@ -56,13 +65,16 @@ msgstr ""
56
65
  msgid "Active"
57
66
  msgstr ""
58
67
 
59
- msgid "All proxies with the required feature are unavailable at the moment"
68
+ msgid "Active Filters:"
60
69
  msgstr ""
61
70
 
62
- msgid "Allow triggering tasks on the smart proxy in batches"
71
+ msgid "All %s tasks are selected. "
72
+ msgstr ""
73
+
74
+ msgid "All proxies with the required feature are unavailable at the moment"
63
75
  msgstr ""
64
76
 
65
- msgid "Allow unlocking actions which can have dangerous consequences."
77
+ msgid "Allow triggering tasks on the smart proxy in batches"
66
78
  msgstr ""
67
79
 
68
80
  msgid "Associated resources"
@@ -72,9 +84,6 @@ msgstr ""
72
84
  msgid "At"
73
85
  msgstr ""
74
86
 
75
- msgid "Auto Reload"
76
- msgstr ""
77
-
78
87
  msgid "Back to tasks"
79
88
  msgstr ""
80
89
 
@@ -87,21 +96,69 @@ msgstr ""
87
96
  msgid "Cancel"
88
97
  msgstr ""
89
98
 
99
+ msgid "Cancel Selected"
100
+ msgstr ""
101
+
102
+ msgid "Cancel all cancellable tasks"
103
+ msgstr ""
104
+
90
105
  msgid "Cancel enforced: the task might be still running on the proxy"
91
106
  msgstr ""
92
107
 
93
108
  msgid "Cancel recurring logic"
94
109
  msgstr ""
95
110
 
111
+ msgid "Cancel selected tasks"
112
+ msgstr ""
113
+
114
+ msgid "Cancel specific tasks by ID"
115
+ msgstr ""
116
+
117
+ msgid "Cancel tasks matching search string"
118
+ msgstr ""
119
+
120
+ msgid "Canceling selected tasks, this might take a while"
121
+ msgstr ""
122
+
123
+ msgid "Canceling with force selected tasks, this might take a while"
124
+ msgstr ""
125
+
96
126
  msgid "Cancelled"
97
127
  msgstr ""
98
128
 
129
+ msgid "Cannot cancel tasks at the moment"
130
+ msgstr ""
131
+
132
+ msgid "Cannot force cancel tasks at the moment"
133
+ msgstr ""
134
+
135
+ msgid "Cannot resume tasks at the moment"
136
+ msgstr ""
137
+
99
138
  msgid "Cannot update a cancelled Recurring Logic."
100
139
  msgstr ""
101
140
 
102
141
  msgid "Changing request id %{request_id} to saved id %{saved_id}"
103
142
  msgstr ""
104
143
 
144
+ msgid "Clear All Filters"
145
+ msgstr ""
146
+
147
+ msgid "Clear Cancelled"
148
+ msgstr ""
149
+
150
+ msgid "Complete"
151
+ msgstr ""
152
+
153
+ msgid "Conflicts with tasks:"
154
+ msgstr ""
155
+
156
+ msgid "Could not cancel step."
157
+ msgstr ""
158
+
159
+ msgid "Could not receive data: ${error && error.message}"
160
+ msgstr ""
161
+
105
162
  msgid "Cron line"
106
163
  msgstr ""
107
164
 
@@ -123,9 +180,15 @@ msgstr ""
123
180
  msgid "Delayed"
124
181
  msgstr ""
125
182
 
183
+ msgid "Delete recurring logics by search query"
184
+ msgstr ""
185
+
126
186
  msgid "Details"
127
187
  msgstr ""
128
188
 
189
+ msgid "Details of %s task"
190
+ msgstr ""
191
+
129
192
  msgid "Disable"
130
193
  msgstr ""
131
194
 
@@ -147,9 +210,6 @@ msgstr ""
147
210
  msgid "Enable the dynflow console (/foreman_tasks/dynflow) for debugging"
148
211
  msgstr ""
149
212
 
150
- msgid "Ended at"
151
- msgstr ""
152
-
153
213
  msgid "Ends"
154
214
  msgstr ""
155
215
 
@@ -159,6 +219,9 @@ msgstr ""
159
219
  msgid "Errors"
160
220
  msgstr ""
161
221
 
222
+ msgid "Errors:"
223
+ msgstr ""
224
+
162
225
  msgid "Event delivered by request %{request_id}"
163
226
  msgstr ""
164
227
 
@@ -171,7 +234,7 @@ msgstr ""
171
234
  msgid "Execution plan data not available "
172
235
  msgstr ""
173
236
 
174
- msgid "Execution type"
237
+ msgid "Export All"
175
238
  msgstr ""
176
239
 
177
240
  msgid "External Id"
@@ -189,6 +252,15 @@ msgstr ""
189
252
  msgid "Finished"
190
253
  msgstr ""
191
254
 
255
+ msgid "Force Cancel"
256
+ msgstr ""
257
+
258
+ msgid "Force Cancel Selected"
259
+ msgstr ""
260
+
261
+ msgid "Force Cancel selected tasks"
262
+ msgstr ""
263
+
192
264
  msgid "Force Unlock"
193
265
  msgstr ""
194
266
 
@@ -204,9 +276,6 @@ msgstr ""
204
276
  msgid "How to order the sorted results (e.g. ASC for ascending)"
205
277
  msgstr ""
206
278
 
207
- msgid "I understand that this may cause harm and have working database backups of all backend services."
208
- msgstr ""
209
-
210
279
  msgid "ID"
211
280
  msgstr ""
212
281
 
@@ -246,6 +315,9 @@ msgstr ""
246
315
  msgid "Latest Warning/Error Tasks"
247
316
  msgstr ""
248
317
 
318
+ msgid "Less than a second"
319
+ msgstr ""
320
+
249
321
  msgid "List of tasks"
250
322
  msgstr ""
251
323
 
@@ -261,6 +333,9 @@ msgstr ""
261
333
  msgid "Mon"
262
334
  msgstr ""
263
335
 
336
+ msgid "More than"
337
+ msgstr ""
338
+
264
339
  msgid "N/A"
265
340
  msgstr ""
266
341
 
@@ -273,6 +348,12 @@ msgstr ""
273
348
  msgid "Next occurrence"
274
349
  msgstr ""
275
350
 
351
+ msgid "No"
352
+ msgstr ""
353
+
354
+ msgid "No Tasks"
355
+ msgstr ""
356
+
276
357
  msgid "No errors"
277
358
  msgstr ""
278
359
 
@@ -282,12 +363,21 @@ msgstr ""
282
363
  msgid "No running steps"
283
364
  msgstr ""
284
365
 
366
+ msgid "No start or end dates"
367
+ msgstr ""
368
+
285
369
  msgid "No task could be started"
286
370
  msgstr ""
287
371
 
288
372
  msgid "No. of Tasks"
289
373
  msgstr ""
290
374
 
375
+ msgid "Not all the selected tasks can be cancelled"
376
+ msgstr ""
377
+
378
+ msgid "Not all the selected tasks can be resumed"
379
+ msgstr ""
380
+
291
381
  msgid "Number of attempts to start a task on the smart proxy before failing"
292
382
  msgstr ""
293
383
 
@@ -304,15 +394,39 @@ msgstr ""
304
394
  msgid "On"
305
395
  msgstr ""
306
396
 
397
+ msgid "Operation"
398
+ msgstr ""
399
+
307
400
  msgid "Output"
308
401
  msgstr ""
309
402
 
403
+ msgid "Output:"
404
+ msgstr ""
405
+
310
406
  msgid "Page number, starting at 1"
311
407
  msgstr ""
312
408
 
313
409
  msgid "Parent task"
314
410
  msgstr ""
315
411
 
412
+ msgid "Paused"
413
+ msgstr ""
414
+
415
+ msgid "Please inspect their state, fix their errors and resume them."
416
+ msgstr ""
417
+
418
+ msgid "Please provide a search parameter in the request"
419
+ msgstr ""
420
+
421
+ msgid "Please provide at least one of search or task_ids parameters in the request"
422
+ msgstr ""
423
+
424
+ msgid "Polling intervals multiplier"
425
+ msgstr ""
426
+
427
+ msgid "Polling multiplier which is used to multiply the default polling intervals. This can be used to prevent polling too frequently for long running tasks."
428
+ msgstr ""
429
+
316
430
  msgid "Proxy task gone missing from the smart proxy"
317
431
  msgstr ""
318
432
 
@@ -334,9 +448,6 @@ msgstr ""
334
448
  msgid "Recurring logics"
335
449
  msgstr ""
336
450
 
337
- msgid "Remote action:"
338
- msgstr ""
339
-
340
451
  msgid "Repeat N times"
341
452
  msgstr ""
342
453
 
@@ -349,10 +460,13 @@ msgstr ""
349
460
  msgid "Require user to be authenticated as user with admin rights when accessing dynflow console"
350
461
  msgstr ""
351
462
 
352
- msgid "Resource search_params requires resource_type and resource_id to be specified"
463
+ msgid "Required lock is already taken by other running tasks."
464
+ msgstr ""
465
+
466
+ msgid "Required lock: %s"
353
467
  msgstr ""
354
468
 
355
- msgid "Resources will be unlocked and will not prevent other tasks from being run. As the task might be still running, it should be avoided to use this unless you are really sure the task got stuck"
469
+ msgid "Resource search_params requires resource_type and resource_id to be specified"
356
470
  msgstr ""
357
471
 
358
472
  msgid "Result"
@@ -361,15 +475,27 @@ msgstr ""
361
475
  msgid "Resume"
362
476
  msgstr ""
363
477
 
478
+ msgid "Resume Selected"
479
+ msgstr ""
480
+
364
481
  msgid "Resume all paused error tasks"
365
482
  msgstr ""
366
483
 
484
+ msgid "Resume selected tasks"
485
+ msgstr ""
486
+
367
487
  msgid "Resume specific tasks by ID"
368
488
  msgstr ""
369
489
 
370
490
  msgid "Resume tasks matching search string"
371
491
  msgstr ""
372
492
 
493
+ msgid "Resuming selected tasks, this might take a while"
494
+ msgstr ""
495
+
496
+ msgid "Running"
497
+ msgstr ""
498
+
373
499
  msgid "Running Steps"
374
500
  msgstr ""
375
501
 
@@ -382,12 +508,27 @@ msgstr ""
382
508
  msgid "Schedule future execution"
383
509
  msgstr ""
384
510
 
511
+ msgid "Scheduled"
512
+ msgstr ""
513
+
514
+ msgid "Search query"
515
+ msgstr ""
516
+
385
517
  msgid "Search string"
386
518
  msgstr ""
387
519
 
388
520
  msgid "See %{link} for more details on how to resolve the issue"
389
521
  msgstr ""
390
522
 
523
+ msgid "Select Action"
524
+ msgstr ""
525
+
526
+ msgid "Select All"
527
+ msgstr ""
528
+
529
+ msgid "Select row"
530
+ msgstr ""
531
+
391
532
  msgid "Send data to the task from external executor (such as smart_proxy_dynflow)"
392
533
  msgstr ""
393
534
 
@@ -403,9 +544,6 @@ msgstr ""
403
544
  msgid "Start at"
404
545
  msgstr ""
405
546
 
406
- msgid "Start auto-reloading"
407
- msgstr ""
408
-
409
547
  msgid "Start before"
410
548
  msgstr ""
411
549
 
@@ -418,12 +556,27 @@ msgstr ""
418
556
  msgid "State"
419
557
  msgstr ""
420
558
 
421
- msgid "Stop auto-reloading"
559
+ msgid "Step Canceled"
560
+ msgstr ""
561
+
562
+ msgid "Stop all stoppable tasks"
563
+ msgstr ""
564
+
565
+ msgid "Stop specific tasks by ID"
566
+ msgstr ""
567
+
568
+ msgid "Stop tasks matching search string"
569
+ msgstr ""
570
+
571
+ msgid "Stopped"
422
572
  msgstr ""
423
573
 
424
574
  msgid "Sub tasks"
425
575
  msgstr ""
426
576
 
577
+ msgid "Sub tasks of %s"
578
+ msgstr ""
579
+
427
580
  msgid "Sun"
428
581
  msgstr ""
429
582
 
@@ -439,6 +592,9 @@ msgstr ""
439
592
  msgid "Task aborted: the task might be still running on the proxy"
440
593
  msgstr ""
441
594
 
595
+ msgid "Task cannot be canceled"
596
+ msgstr ""
597
+
442
598
  msgid "Task count"
443
599
  msgstr ""
444
600
 
@@ -448,19 +604,13 @@ msgstr ""
448
604
  msgid "Task search_params requires task_id to be specified"
449
605
  msgstr ""
450
606
 
451
- msgid "Tasks"
607
+ msgid "Task was canceled"
452
608
  msgstr ""
453
609
 
454
- msgid "The ID of the step inside the execution plan to send the event to"
455
- msgstr ""
456
-
457
- msgid "The execution has to be paused."
458
- msgstr ""
459
-
460
- msgid "The execution has to be resumable."
610
+ msgid "Tasks"
461
611
  msgstr ""
462
612
 
463
- msgid "The execution was resumed."
613
+ msgid "The ID of the step inside the execution plan to send the event to"
464
614
  msgstr ""
465
615
 
466
616
  msgid "The recommended approach is to investigate the error messages below and in 'errors' tab, address the primary cause of the issue and resume the task."
@@ -475,24 +625,15 @@ msgstr ""
475
625
  msgid "The task cannot be aborted at the moment."
476
626
  msgstr ""
477
627
 
478
- msgid "The task cannot be cancelled at the moment."
479
- msgstr ""
480
-
481
628
  msgid "The task could not be started"
482
629
  msgstr ""
483
630
 
484
- msgid "The task resources were unlocked with force."
485
- msgstr ""
486
-
487
- msgid "The task resources were unlocked."
488
- msgstr ""
489
-
490
631
  msgid "There is %{count} paused task in the system that need attention"
491
632
  msgid_plural "There are %{count} paused tasks in the system that need attention"
492
633
  msgstr[0] ""
493
634
  msgstr[1] ""
494
635
 
495
- msgid "This will unlock the resources that the task is running against. Please note that this might lead to inconsistent state and should be used with caution, after making sure that the task can't be resumed."
636
+ msgid "This action will delete all cancelled recurring logics. Please note that this action can't be reversed."
496
637
  msgstr ""
497
638
 
498
639
  msgid "Thu"
@@ -501,16 +642,16 @@ msgstr ""
501
642
  msgid "Time in seconds between retries"
502
643
  msgstr ""
503
644
 
504
- msgid "Triggered by"
645
+ msgid "Total"
505
646
  msgstr ""
506
647
 
507
- msgid "Trying to abort the task"
648
+ msgid "Troubleshooting"
508
649
  msgstr ""
509
650
 
510
- msgid "Trying to cancel step %s"
651
+ msgid "Trying to abort the task"
511
652
  msgstr ""
512
653
 
513
- msgid "Trying to cancel the task"
654
+ msgid "Trying to cancel step"
514
655
  msgstr ""
515
656
 
516
657
  msgid "Tue"
@@ -522,6 +663,9 @@ msgstr ""
522
663
  msgid "UUID of the task"
523
664
  msgstr ""
524
665
 
666
+ msgid "Undo selection"
667
+ msgstr ""
668
+
525
669
  msgid "Unlimited"
526
670
  msgstr ""
527
671
 
@@ -534,28 +678,34 @@ msgstr ""
534
678
  msgid "Url pointing to the task troubleshooting documentation. It should contain %{label} placeholder, that will be replaced with normalized task label (restricted to only alphanumeric characters)). %{version} placeholder is also available."
535
679
  msgstr ""
536
680
 
537
- msgid "User"
538
- msgstr ""
539
-
540
681
  msgid "User search_params requires user_id to be specified"
541
682
  msgstr ""
542
683
 
543
684
  msgid "Wed"
544
685
  msgstr ""
545
686
 
546
- msgid "You can find resource locks on this page. Exclusive lock marked with locked icon means that no other task can use locked resource while this task is running. Non-exclusive lock marked with unlocked icon means other tasks can access the resource freely, it is only used to indicate the relation of this task with the resource"
687
+ msgid "With focus on last"
688
+ msgstr ""
689
+
690
+ msgid "Yes"
547
691
  msgstr ""
548
692
 
549
693
  msgid "activation key"
550
694
  msgstr ""
551
695
 
696
+ msgid "cannot be cancelled with force at the moment."
697
+ msgstr ""
698
+
552
699
  msgid "content view"
553
700
  msgstr ""
554
701
 
555
702
  msgid "content view version"
556
703
  msgstr ""
557
704
 
558
- msgid "in %s"
705
+ msgid "could not be resumed"
706
+ msgstr ""
707
+
708
+ msgid "error"
559
709
  msgstr ""
560
710
 
561
711
  #. TRANSLATORS: this translation is referring to an option which is a time interval
@@ -578,23 +728,89 @@ msgstr ""
578
728
  msgid "is month (range: 1-12)"
579
729
  msgstr ""
580
730
 
731
+ msgid "last"
732
+ msgstr ""
733
+
734
+ msgid "mode"
735
+ msgstr ""
736
+
581
737
  msgid "mode has to be one of %{allowed_modes}"
582
738
  msgstr ""
583
739
 
740
+ msgid "older"
741
+ msgstr ""
742
+
584
743
  msgid "organization"
585
744
  msgstr ""
586
745
 
746
+ msgid "paused"
747
+ msgstr ""
748
+
587
749
  msgid "product"
588
750
  msgstr ""
589
751
 
590
752
  msgid "repository"
591
753
  msgstr ""
592
754
 
755
+ msgid "resources cannot be unlocked at the moment."
756
+ msgstr ""
757
+
758
+ msgid "resources were unlocked "
759
+ msgstr ""
760
+
761
+ msgid "resources were unlocked with force."
762
+ msgstr ""
763
+
764
+ msgid "result"
765
+ msgstr ""
766
+
767
+ msgid "running"
768
+ msgstr ""
769
+
770
+ msgid "scheduled"
771
+ msgstr ""
772
+
773
+ msgid "seconds"
774
+ msgstr ""
775
+
776
+ msgid "state"
777
+ msgstr ""
778
+
779
+ msgid "stopped"
780
+ msgstr ""
781
+
782
+ msgid "success"
783
+ msgstr ""
784
+
593
785
  msgid "system"
594
786
  msgstr ""
595
787
 
788
+ msgid "task has to be cancellable"
789
+ msgstr ""
790
+
791
+ msgid "task has to be resumable"
792
+ msgstr ""
793
+
794
+ msgid "tasks."
795
+ msgstr ""
796
+
797
+ msgid "time"
798
+ msgstr ""
799
+
596
800
  msgid "troubleshooting documentation"
597
801
  msgstr ""
598
802
 
599
803
  msgid "user"
600
804
  msgstr ""
805
+
806
+ msgid "warning"
807
+ msgstr ""
808
+
809
+ msgid "was cancelled"
810
+ msgstr ""
811
+
812
+ msgid "was resumed"
813
+ msgstr ""
814
+
815
+ msgid "week"
816
+ msgstr ""