foreman-tasks 1.1.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/js_tests.yml +27 -0
  3. data/.github/workflows/ruby_tests.yml +74 -0
  4. data/.rubocop.yml +12 -4
  5. data/.rubocop_todo.yml +32 -25
  6. data/Gemfile +5 -0
  7. data/README.md +2 -0
  8. data/app/controllers/foreman_tasks/api/tasks_controller.rb +63 -58
  9. data/app/controllers/foreman_tasks/concerns/parameters/triggering.rb +1 -1
  10. data/app/controllers/foreman_tasks/recurring_logics_controller.rb +7 -0
  11. data/app/controllers/foreman_tasks/tasks_controller.rb +9 -14
  12. data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +3 -3
  13. data/app/lib/actions/proxy_action.rb +1 -1
  14. data/app/models/foreman_tasks/recurring_logic.rb +1 -1
  15. data/app/models/foreman_tasks/task.rb +15 -0
  16. data/app/models/foreman_tasks/task/dynflow_task.rb +29 -33
  17. data/app/models/foreman_tasks/task/status_explicator.rb +1 -1
  18. data/app/models/foreman_tasks/triggering.rb +1 -1
  19. data/app/models/setting/foreman_tasks.rb +2 -2
  20. data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
  21. data/app/views/foreman_tasks/api/tasks/details.json.rabl +0 -1
  22. data/app/views/foreman_tasks/api/tasks/index.json.rabl +2 -0
  23. data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
  24. data/app/views/foreman_tasks/recurring_logics/index.html.erb +3 -1
  25. data/config/routes.rb +3 -1
  26. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
  27. data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
  28. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +1 -1
  29. data/db/seeds.d/30-notification_blueprints.rb +14 -7
  30. data/db/seeds.d/61-foreman_tasks_bookmarks.rb +1 -1
  31. data/lib/foreman_tasks/cleaner.rb +4 -6
  32. data/lib/foreman_tasks/dynflow/configuration.rb +1 -1
  33. data/lib/foreman_tasks/dynflow/persistence.rb +4 -6
  34. data/lib/foreman_tasks/engine.rb +3 -8
  35. data/lib/foreman_tasks/version.rb +1 -1
  36. data/locale/action_names.rb +1 -1
  37. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  38. data/locale/en/foreman_tasks.po +270 -54
  39. data/locale/foreman_tasks.pot +630 -292
  40. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  41. data/locale/fr/foreman_tasks.po +817 -0
  42. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  43. data/locale/ja/foreman_tasks.po +817 -0
  44. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  45. data/locale/zh_CN/foreman_tasks.po +816 -0
  46. data/package.json +1 -1
  47. data/script/npm_link_foreman_js.sh +26 -0
  48. data/test/controllers/api/recurring_logics_controller_test.rb +1 -1
  49. data/test/controllers/api/tasks_controller_test.rb +7 -7
  50. data/test/controllers/tasks_controller_test.rb +6 -6
  51. data/test/core/unit/runner_test.rb +20 -20
  52. data/test/core/unit/task_launcher_test.rb +8 -8
  53. data/test/helpers/foreman_tasks/foreman_tasks_helper_test.rb +7 -7
  54. data/test/helpers/foreman_tasks/tasks_helper_test.rb +3 -3
  55. data/test/lib/actions/middleware/keep_current_request_id_test.rb +3 -3
  56. data/test/support/history_tasks_builder.rb +1 -1
  57. data/test/tasks/generate_task_actions_test.rb +1 -1
  58. data/test/unit/actions/action_with_sub_plans_test.rb +2 -2
  59. data/test/unit/actions/bulk_action_test.rb +6 -6
  60. data/test/unit/actions/proxy_action_test.rb +20 -20
  61. data/test/unit/actions/recurring_action_test.rb +30 -32
  62. data/test/unit/cleaner_test.rb +24 -24
  63. data/test/unit/dashboard_table_filter_test.rb +5 -5
  64. data/test/unit/otp_manager_test.rb +2 -2
  65. data/test/unit/proxy_selector_test.rb +9 -9
  66. data/test/unit/recurring_logic_test.rb +32 -32
  67. data/test/unit/remote_task_test.rb +2 -2
  68. data/test/unit/task_groups_test.rb +4 -4
  69. data/test/unit/task_test.rb +18 -18
  70. data/test/unit/triggering_test.rb +8 -8
  71. data/test/unit/troubleshooting_help_generator_test.rb +6 -6
  72. data/test/unit/ui_notifications_test.rb +11 -11
  73. data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
  74. data/webpack/ForemanTasks/Components/{TasksTable/TasksTableActionHelpers.js → TaskActions/TaskActionHelpers.js} +21 -6
  75. data/webpack/ForemanTasks/Components/{TasksTable/__tests__/TasksTableActionHelpers.test.js → TaskActions/TaskActionHelpers.test.js} +2 -2
  76. data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
  77. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
  78. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
  79. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
  80. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
  81. data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
  82. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
  83. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +38 -205
  84. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskButtons.js +168 -0
  85. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +6 -7
  86. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskSkeleton.js +48 -0
  87. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
  88. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +14 -7
  89. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskButtons.test.js +95 -0
  90. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
  91. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
  92. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +90 -189
  93. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskButtons.test.js.snap +212 -0
  94. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +8 -4
  95. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +100 -53
  96. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +3 -14
  97. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +57 -110
  98. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -17
  99. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +57 -37
  100. data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
  101. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
  102. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +13 -1
  103. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +6 -6
  104. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +86 -19
  105. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +25 -21
  106. data/webpack/ForemanTasks/Components/TaskDetails/index.js +12 -11
  107. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
  108. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
  109. data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
  110. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
  111. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
  112. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
  113. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +46 -0
  114. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
  115. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
  116. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
  117. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +55 -0
  118. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
  119. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
  120. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +32 -0
  121. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
  122. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
  123. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
  124. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +135 -35
  125. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +13 -9
  126. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +26 -66
  127. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +10 -12
  128. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +30 -96
  129. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
  130. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +8 -4
  131. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +50 -2
  132. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -12
  133. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +22 -26
  134. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
  135. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -14
  136. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +155 -0
  137. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -14
  138. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +17 -124
  139. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +63 -133
  140. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
  141. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
  142. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
  143. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
  144. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
  145. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
  146. data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -2
  147. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +55 -19
  148. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +75 -19
  149. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +88 -21
  150. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
  151. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
  152. data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
  153. data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
  154. data/webpack/ForemanTasks/Components/common/{ToastTypesConstants.js → ToastsHelpers/ToastTypesConstants.js} +0 -0
  155. data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
  156. data/webpack/ForemanTasks/Components/common/urlHelpers.js +7 -0
  157. data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -2
  158. data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
  159. data/webpack/__mocks__/foremanReact/common/helpers.js +2 -0
  160. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
  161. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
  162. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  163. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +10 -0
  164. data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
  165. data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js +5 -0
  166. metadata +51 -28
  167. data/.travis.yml +0 -5
  168. data/script/travis_run_js_tests.sh +0 -7
  169. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -44
  170. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsReducer.test.js +0 -33
  171. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsReducer.test.js.snap +0 -26
  172. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/integration.test.js.snap +0 -122
  173. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +0 -63
  174. data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
  175. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
  176. data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
  177. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
  178. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
  179. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
  180. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
  181. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
  182. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
  183. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
  184. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
  185. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
  186. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
  187. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
  188. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ResumeButton.test.js.snap +0 -15
  189. data/webpack/__mocks__/foremanReact/API.js +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2763cf62835dc3d4375a83b6fdff446ef0f50b0229c732a0e6b17e681b45935b
4
- data.tar.gz: 8845f763b8d400ed8e8dcf267798e4891234f7eada43ae3f38292409d0ca50fd
3
+ metadata.gz: 24da58e2837688da28a18832b72b154ac74868157f6176f942119b8b856987c8
4
+ data.tar.gz: 3031305c5f86f3b03aed95a4501670cbd2dbd595db38f638354ff046f416823a
5
5
  SHA512:
6
- metadata.gz: 7aba491ebd02b8361ea237d588b256c8d4e6bc8e7d1b0d30872acc6267fce59cbaa46695c20c4099c897081cde81ae363de22c69456a97ddbb059a0be83303df
7
- data.tar.gz: fa79277831760d12364f69f7390664e391531e98451e50861ffc174210be91073deae4bcb697b0d8adc944bc7cc3a3e28b092812e0186da5782a6ac554bc6869
6
+ metadata.gz: a6a21ff8c4b9336f63118c2cdf6a4f11bf25ff882fe1dbd1b17d05f9722705c9cebabb522792416758c3fede1a8507d720cac0317076d8e833bfbb95a83fa8a4
7
+ data.tar.gz: bef5dd6cac70ac43d53e83950668e930883649d42966b10ff6303e0d581431d3f11028ae24c7ecc9ed0e2875214f4a512cfbaa46f1da81fd912d6a6f25da2db2
@@ -0,0 +1,27 @@
1
+ name: JavaScript Testing
2
+ on:
3
+ pull_request:
4
+ paths:
5
+ - 'webpack/**'
6
+ - 'package.json'
7
+ - '.github/workflows/js_tests.yml'
8
+
9
+ jobs:
10
+ test_js:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ node-version: [10, 12]
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Setup Node
19
+ uses: actions/setup-node@v1
20
+ with:
21
+ node-version: ${{ matrix.node-version }}
22
+ - name: Npm install
23
+ run: npm install
24
+ - name: Run plugin linter
25
+ run: npm run lint
26
+ - name: Run plugin tests
27
+ run: npm run test
@@ -0,0 +1,74 @@
1
+ name: Ruby Testing
2
+ on: [pull_request]
3
+ env:
4
+ RAILS_ENV: test
5
+ DATABASE_URL: postgresql://postgres:@localhost/test
6
+ DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL: true
7
+ jobs:
8
+ rubocop:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Setup Ruby
13
+ uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6
16
+ - name: Setup
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs=3 --retry=3
20
+ - name: Run rubocop
21
+ run: bundle exec rubocop
22
+ test_ruby:
23
+ runs-on: ubuntu-latest
24
+ needs: rubocop
25
+ services:
26
+ postgres:
27
+ image: postgres:12.1
28
+ ports: ['5432:5432']
29
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
30
+ strategy:
31
+ fail-fast: false
32
+ matrix:
33
+ foreman-core-branch: [develop]
34
+ ruby-version: [2.5, 2.6]
35
+ node-version: [12]
36
+ steps:
37
+ - run: sudo apt-get update
38
+ - run: sudo apt-get install build-essential libcurl4-openssl-dev zlib1g-dev libpq-dev
39
+ - uses: actions/checkout@v2
40
+ with:
41
+ repository: theforeman/foreman
42
+ ref: ${{ matrix.foreman-core-branch }}
43
+ - uses: actions/checkout@v2
44
+ with:
45
+ path: foreman-tasks
46
+ - name: Setup Ruby
47
+ uses: ruby/setup-ruby@v1
48
+ with:
49
+ ruby-version: ${{ matrix.ruby-version }}
50
+ - name: Setup Node
51
+ uses: actions/setup-node@v1
52
+ with:
53
+ node-version: ${{ matrix.node-version }}
54
+ - uses: actions/cache@v2
55
+ with:
56
+ path: vendor/bundle
57
+ key: ${{ runner.os }}-fgems-${{ matrix.ruby-version }}-${{ hashFiles('Gemfile.lock') }}
58
+ restore-keys: |
59
+ ${{ runner.os }}-fgems-${{ matrix.ruby-version }}-
60
+ - name: Setup Bundler
61
+ run: |
62
+ echo "gem 'foreman-tasks', path: './foreman-tasks'" > bundler.d/foreman-tasks.local.rb
63
+ gem install bundler
64
+ bundle config set without journald development console libvirt
65
+ bundle config set path vendor/bundle
66
+ - name: Prepare test env
67
+ run: |
68
+ bundle install --jobs=3 --retry=3
69
+ bundle exec rake db:create
70
+ bundle exec rake db:migrate
71
+ - name: Run plugin tests
72
+ run: |
73
+ bundle exec rake test:foreman-tasks
74
+ bundle exec rake test TEST="test/unit/foreman/access_permissions_test.rb"
@@ -6,10 +6,10 @@ require:
6
6
  inherit_from: .rubocop_todo.yml
7
7
 
8
8
  AllCops:
9
- Include:
10
- - 'Rakefile'
11
- - 'app/views/foreman_tasks/api/**/*.rabl'
12
- - lib/**/*.rake
9
+ Exclude:
10
+ - 'node_modules/**/*'
11
+ - 'locale/*'
12
+ TargetRubyVersion: 2.5
13
13
 
14
14
  Lint/ShadowingOuterLocalVariable:
15
15
  Enabled: false
@@ -68,6 +68,8 @@ Naming/FileName:
68
68
  - Gemfile
69
69
  - db/seeds.d/*
70
70
  - lib/foreman-tasks.rb
71
+ - gemfile.d/foreman-tasks.rb
72
+
71
73
 
72
74
  Layout/HeredocIndentation:
73
75
  Exclude:
@@ -115,3 +117,9 @@ Naming/RescuedExceptionsVariableName:
115
117
 
116
118
  Style/WordArray:
117
119
  Enabled: false
120
+
121
+ Style/TrailingCommaInArrayLiteral:
122
+ EnforcedStyleForMultiline: comma
123
+
124
+ Style/TrailingCommaInHashLiteral:
125
+ EnforcedStyleForMultiline: comma
@@ -1,21 +1,34 @@
1
- # Offense count: 1
2
- Lint/EmptyWhen:
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-08-07 08:31:32 UTC using RuboCop version 0.89.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 2
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
3
13
  Exclude:
4
- - 'app/lib/actions/proxy_action.rb'
14
+ - 'foreman-tasks-core.gemspec'
15
+ - 'foreman-tasks.gemspec'
5
16
 
6
17
  # Offense count: 1
7
18
  Lint/UselessAssignment:
8
19
  Exclude:
9
20
  - 'lib/foreman_tasks/tasks/export_tasks.rake'
10
21
 
11
- Minitest/AssertEmpty:
12
- Enabled: false
13
-
14
- Minitest/AssertEqual:
15
- Enabled: false
16
-
17
- Minitest/GlobalExpectations:
18
- Enabled: false
22
+ # Offense count: 1
23
+ # Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms.
24
+ # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
25
+ Naming/FileName:
26
+ Exclude:
27
+ - '*.gemspec'
28
+ - 'Gemfile'
29
+ - 'db/seeds.d/*'
30
+ - 'lib/foreman-tasks.rb'
31
+ - 'gemfile.d/foreman-tasks.rb'
19
32
 
20
33
  # Offense count: 3
21
34
  # Configuration parameters: EnforcedStyleForLeadingUnderscores.
@@ -28,7 +41,7 @@ Naming/MemoizedInstanceVariableName:
28
41
 
29
42
  # Offense count: 11
30
43
  # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
31
- # AllowedNames: io, id, to, by, on, in, at, ip, db, os, pp
44
+ # AllowedNames: at, by, db, id, in, io, ip, of, on, os, pp, to
32
45
  Naming/MethodParameterName:
33
46
  Exclude:
34
47
  - 'app/helpers/foreman_tasks/foreman_tasks_helper.rb'
@@ -67,11 +80,13 @@ Rails/OutputSafety:
67
80
  Exclude:
68
81
  - 'app/helpers/foreman_tasks/foreman_tasks_helper.rb'
69
82
 
70
- # Offense count: 1
83
+ # Offense count: 2
71
84
  # Configuration parameters: Include.
72
85
  # Include: **/Rakefile, **/*.rake
73
86
  Rails/RakeEnvironment:
74
87
  Exclude:
88
+ - 'lib/capistrano/tasks/**/*.rake'
89
+ - 'lib/foreman_tasks/tasks/dynflow.rake'
75
90
  - 'lib/foreman_tasks/tasks/test.rake'
76
91
 
77
92
  # Offense count: 12
@@ -92,22 +107,14 @@ Style/ClassAndModuleChildren:
92
107
  - 'test/controllers/api/recurring_logics_controller_test.rb'
93
108
  - 'test/controllers/api/tasks_controller_test.rb'
94
109
 
95
- # Offense count: 2
110
+ # Offense count: 1
111
+ # Configuration parameters: EnforcedStyle.
112
+ # SupportedStyles: allowed_in_returns, forbidden
96
113
  Style/DoubleNegation:
97
114
  Exclude:
98
- - 'app/models/foreman_tasks/lock.rb'
99
115
  - 'app/models/foreman_tasks/recurring_logic.rb'
100
116
 
101
- # Offense count: 36
117
+ # Offense count: 35
102
118
  # Configuration parameters: MinBodyLength.
103
119
  Style/GuardClause:
104
120
  Enabled: false
105
-
106
- Style/HashEachMethods:
107
- Enabled: false
108
-
109
- Style/HashTransformKeys:
110
- Enabled: false
111
-
112
- Style/HashTransformValues:
113
- Enabled: false
data/Gemfile CHANGED
@@ -13,3 +13,8 @@ gemspec :name => 'foreman-tasks'
13
13
 
14
14
  # To use debugger
15
15
  # gem 'debugger'
16
+
17
+ gem 'rubocop', '~> 0.87'
18
+ gem 'rubocop-minitest', '~> 0.9.0'
19
+ gem 'rubocop-performance', '~> 1.5.2'
20
+ gem 'rubocop-rails', '~> 2.5.2'
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
  ------------
@@ -31,17 +31,6 @@ module ForemanTasks
31
31
  param :id, :identifier, desc: 'UUID of the task'
32
32
  def details; end
33
33
 
34
- api :GET, '/tasks/:id/sub_tasks', 'Show sub_tasks details'
35
- param :id, :identifier, desc: 'UUID of the task'
36
- def sub_tasks
37
- parent_task = resource_scope.find(params[:id])
38
- filtered_scope = parent_task.sub_tasks
39
- action_name = { "action_name" => parent_task.action }
40
-
41
- filtered_scope = DashboardTableFilter.new(filtered_scope, params).scope
42
- render :json => action_name.merge(tasks_list(filtered_scope))
43
- end
44
-
45
34
  api :POST, '/tasks/bulk_search', 'List dynflow tasks for uuids'
46
35
  param :searches, Array, :desc => 'List of uuids to fetch info about' do
47
36
  param :search_id, String, :desc => <<-DESC
@@ -116,7 +105,7 @@ module ForemanTasks
116
105
  total: resumed.length + failed.length + skipped.length,
117
106
  resumed: resumed,
118
107
  failed: failed,
119
- skipped: skipped
108
+ skipped: skipped,
120
109
  }
121
110
  end
122
111
 
@@ -137,22 +126,61 @@ module ForemanTasks
137
126
  render :json => {
138
127
  total: cancelled.length + skipped.length,
139
128
  cancelled: cancelled,
140
- skipped: skipped
129
+ skipped: skipped,
141
130
  }
142
131
  end
143
132
 
144
- api :GET, '/tasks', N_('List tasks')
145
- param :search, String, :desc => N_('Search string')
146
- param :page, :number, :desc => N_('Page number, starting at 1')
147
- param :per_page, :number, :desc => N_('Number of results per page to return')
148
- param :order, String, :desc => N_("Sort field and order, e.g. 'name DESC'")
149
- param :sort, Hash, :desc => N_("Hash version of 'order' param") do
150
- param :by, String, :desc => N_('Field to sort the results on')
151
- param :order, String, :desc => N_('How to order the sorted results (e.g. ASC for ascending)')
133
+ api :POST, '/tasks/bulk_stop', N_('Stop all stoppable tasks')
134
+ param :search, String, :desc => N_('Stop tasks matching search string')
135
+ param :task_ids, Array, :desc => N_('Stop specific tasks by ID')
136
+ def bulk_stop
137
+ if params[:search].nil? && params[:task_ids].nil?
138
+ raise BadRequest, _('Please provide at least one of search or task_ids parameters in the request')
139
+ end
140
+
141
+ filtered_scope = bulk_scope
142
+ total_length = filtered_scope.count
143
+ to_stop = filtered_scope.where.not(state: :stopped)
144
+ to_stop_length = to_stop.count
145
+ skipped_length = total_length - to_stop_length
146
+
147
+ to_stop.find_each { |task| task.update(state: :stopped) }
148
+
149
+ if params[:search]
150
+ notification = UINotifications::Tasks::TaskBulkStop.new(filtered_scope.first, to_stop_length, skipped_length)
151
+ notification.deliver!
152
+ end
153
+
154
+ render :json => {
155
+ total: total_length,
156
+ stopped_length: to_stop_length,
157
+ skipped_length: skipped_length,
158
+ }
152
159
  end
160
+
161
+ api :GET, '/tasks', N_('List tasks')
162
+ api :GET, '/tasks/:parent_task_id/sub_tasks', 'Show sub_tasks details'
163
+ param :parent_task_id, :identifier, desc: 'UUID of the task'
164
+ param_group :search_and_pagination, ::Api::V2::BaseController
153
165
  def index
154
- filtered_scope = DashboardTableFilter.new(resource_scope, params).scope
155
- render :json => tasks_list(filtered_scope)
166
+ if params[:sort_by] || params[:sort_order]
167
+ Foreman::Deprecation.api_deprecation_warning(
168
+ "The sort params sort_by and sort_order are deprecated.
169
+ Please use the order param instead as one string 'order=started_at desc'"
170
+ )
171
+
172
+ ordering_params = {
173
+ sort_by: params[:sort_by] || 'started_at',
174
+ sort_order: params[:sort_order] || 'DESC',
175
+ }
176
+ params[:order] = "#{ordering_params[:sort_by]} #{ordering_params[:sort_order]}"
177
+ end
178
+ params[:order] ||= 'started_at DESC'
179
+ @tasks = DashboardTableFilter.new(resource_scope_for_index, params).scope.order(params[:order].to_s)
180
+ end
181
+
182
+ def search_options
183
+ [params[:search], {}]
156
184
  end
157
185
 
158
186
  def_param_group :callback_target do
@@ -284,53 +312,30 @@ module ForemanTasks
284
312
  end
285
313
 
286
314
  def resource_scope(_options = {})
287
- @resource_scope ||= ForemanTasks::Task.authorized("#{action_permission}_foreman_tasks")
315
+ scope = ForemanTasks::Task.authorized("#{action_permission}_foreman_tasks")
316
+ scope = scope.where(:parent_task_id => params[:parent_task_id]) if params[:parent_task_id]
317
+ scope
318
+ end
319
+
320
+ def resource_scope_for_index(*args)
321
+ super.select("DISTINCT foreman_tasks_tasks.*, coalesce(ended_at, current_timestamp) - coalesce(coalesce(started_at, ended_at), current_timestamp) as duration")
322
+ end
323
+
324
+ def controller_permission
325
+ 'foreman_tasks'
288
326
  end
289
327
 
290
328
  def action_permission
291
329
  case params[:action]
292
330
  when 'bulk_search', 'summary', 'details', 'sub_tasks'
293
331
  :view
294
- when 'bulk_resume', 'bulk_cancel'
332
+ when 'bulk_resume', 'bulk_cancel', 'bulk_stop'
295
333
  :edit
296
334
  else
297
335
  super
298
336
  end
299
337
  end
300
338
 
301
- def tasks_list(filtered_scope)
302
- total = resource_scope.count
303
-
304
- search_scope = filtered_scope.search_for(params[:search])
305
- subtotal = search_scope.select('DISTINCT foreman_tasks_tasks.id').count
306
- filtered_scope = search_scope.select('DISTINCT foreman_tasks_tasks.*')
307
-
308
- ordering_params = {
309
- sort_by: params[:sort_by] || 'started_at',
310
- sort_order: params[:sort_order] || 'DESC'
311
- }
312
- filtered_scope = ordering_scope(filtered_scope, ordering_params)
313
-
314
- pagination_params = {
315
- page: params[:page] || 1,
316
- per_page: params[:per_page] || Setting[:entries_per_page] || 20
317
- }
318
- filtered_scope = pagination_scope(filtered_scope, pagination_params)
319
- results = filtered_scope.map { |task| task_hash(task) }
320
-
321
- {
322
- total: total,
323
- subtotal: subtotal,
324
- page: pagination_params[:page],
325
- per_page: pagination_params[:per_page],
326
- sort: {
327
- by: ordering_params[:sort_by],
328
- order: ordering_params[:sort_order]
329
- },
330
- results: results
331
- }
332
- end
333
-
334
339
  def bulk_scope
335
340
  scope = resource_scope
336
341
  scope = scope.search_for(params[:search]) if params[:search]
@@ -15,7 +15,7 @@ module ForemanTasks
15
15
  *::ForemanTasks::Triggering::PARAMS,
16
16
  :days_of_week => {},
17
17
  :time => {},
18
- :end_time => {}
18
+ :end_time => {},
19
19
  ],
20
20
  :nested => true
21
21
  )
@@ -1,5 +1,7 @@
1
1
  module ForemanTasks
2
2
  class RecurringLogicsController < ::ApplicationController
3
+ include Foreman::Controller::AutoCompleteSearch
4
+
3
5
  before_action :find_recurring_logic, :only => [:show, :cancel, :enable, :disable]
4
6
 
5
7
  def index
@@ -41,6 +43,11 @@ module ForemanTasks
41
43
  def change_enabled(value)
42
44
  begin
43
45
  @recurring_logic.update!(:enabled => value)
46
+ flash[:success] = if value
47
+ _('The recurring logic was enabled.')
48
+ else
49
+ _('The recurring logic was disabled.')
50
+ end
44
51
  rescue RecurringLogicCancelledException => e
45
52
  @errors = e.message
46
53
  end