foreman_remote_execution 1.5.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.babelrc +9 -0
  3. data/.eslintignore +3 -0
  4. data/.eslintrc +49 -0
  5. data/.gitignore +1 -0
  6. data/.hound.yml +5 -0
  7. data/.rubocop.yml +4 -1
  8. data/.rubocop_todo.yml +63 -35
  9. data/.travis.yml +6 -0
  10. data/app/assets/javascripts/foreman_remote_execution/template_invocation.js +1 -1
  11. data/app/assets/stylesheets/foreman_remote_execution/job_invocations.css.scss +0 -14
  12. data/app/controllers/job_invocations_controller.rb +18 -0
  13. data/app/helpers/job_invocations_chart_helper.rb +77 -0
  14. data/app/helpers/job_invocations_helper.rb +79 -0
  15. data/app/helpers/remote_execution_helper.rb +10 -50
  16. data/app/models/job_invocation.rb +4 -0
  17. data/app/models/remote_execution_provider.rb +4 -0
  18. data/app/views/job_invocations/_card_results.html.erb +11 -0
  19. data/app/views/job_invocations/_card_schedule.html.erb +32 -0
  20. data/app/views/job_invocations/_card_target_hosts.html.erb +33 -0
  21. data/app/views/job_invocations/_card_user_input.html.erb +16 -0
  22. data/app/views/job_invocations/_tab_hosts.html.erb +1 -1
  23. data/app/views/job_invocations/_tab_overview.html.erb +25 -55
  24. data/app/views/job_invocations/_tab_preview_templates.html.erb +20 -0
  25. data/app/views/job_invocations/_user_input.html.erb +21 -0
  26. data/app/views/job_invocations/show.html.erb +14 -8
  27. data/app/views/job_invocations/show.js.erb +3 -6
  28. data/config/routes.rb +1 -0
  29. data/lib/foreman_remote_execution/engine.rb +2 -2
  30. data/lib/foreman_remote_execution/version.rb +1 -1
  31. data/package.json +62 -0
  32. data/test/unit/job_invocation_test.rb +15 -0
  33. data/webpack/index.js +29 -0
  34. data/webpack/react_app/components/jobInvocations/AggregateStatus/index.js +34 -0
  35. data/webpack/react_app/components/jobInvocations/AggregateStatus/index.test.js +36 -0
  36. data/webpack/react_app/components/jobInvocations/index.js +58 -0
  37. data/webpack/react_app/redux/actions/jobInvocations/index.js +74 -0
  38. data/webpack/react_app/redux/consts.js +6 -0
  39. data/webpack/react_app/redux/reducers/index.js +6 -0
  40. data/webpack/react_app/redux/reducers/jobInvocations/index.fixtures.js +78 -0
  41. data/webpack/react_app/redux/reducers/jobInvocations/index.js +32 -0
  42. data/webpack/react_app/redux/reducers/jobInvocations/index.test.js +37 -0
  43. data/webpack/test_setup.js +11 -0
  44. metadata +26 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ba209c6348446c266991c2e6880200aaf8fb30bb
4
- data.tar.gz: 3621380b18fd2c7da59ba1f7e4e099cdcd3a5fdf
3
+ metadata.gz: 9fcd52aa2585b165caee15553d3ceaaf4fc5cf69
4
+ data.tar.gz: d22298a49fa2ddc29e0d5c5ea022716461ecf527
5
5
  SHA512:
6
- metadata.gz: 0c1fbd4411e47233b8b8b839b1bb104caefbf24438e5c4643218e93d0ebc07163e6abd6fa88175383849baca51fecb05b26b11e9ee9eaba4a74e70469dd3056a
7
- data.tar.gz: 461ec40952a2b9490a65edb47a99048b807d26ca37c1d238586e61093c32cd07ccf8238a856fc9a7567b8c6653173a6df5dfee244fbf313237cab467009ae625
6
+ metadata.gz: bf01f416ab54076ae74f0e13aead95fa68604e6600bac1df9936991e65e3e24fbcfaf8f97ade5c68bcb3a6b25701e27368071bed6de27a31a13b59e875e13756
7
+ data.tar.gz: 3283109dbb5554f722c00bcf8632e9513521641354afcc1f86484e0eefc74da05797fd70bd522b0e95d68ead7a1b28767d9e86e18f4e1da292aa1f9ecf4f8ba3
data/.babelrc ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "presets": ["env", "react"],
3
+ "plugins": [
4
+ "transform-class-properties",
5
+ "transform-object-rest-spread",
6
+ "transform-object-assign",
7
+ "lodash"
8
+ ]
9
+ }
data/.eslintignore ADDED
@@ -0,0 +1,3 @@
1
+ # Ignore all files except webpack directory
2
+ **/*.js
3
+ !webpack/**/*.js
data/.eslintrc ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "root": true,
3
+ "extends": "airbnb-base",
4
+ "plugins": [
5
+ "react"
6
+ ],
7
+ "env": {
8
+ "browser": true,
9
+ "es6": true,
10
+ "node": true,
11
+ "jasmine": true,
12
+ "jest": true
13
+ },
14
+ "globals": {
15
+ "document": false,
16
+ "escape": false,
17
+ "navigator": false,
18
+ "unescape": false,
19
+ "window": false,
20
+ "$": true,
21
+ "_": true,
22
+ "__": true
23
+ },
24
+ "parser": "babel-eslint",
25
+ "rules": {
26
+ "react/jsx-uses-vars": "error",
27
+ "react/jsx-uses-react": "error",
28
+ "no-unused-vars": [
29
+ "error",
30
+ {
31
+ "vars": "all",
32
+ "args": "none"
33
+ }
34
+ ],
35
+ "no-underscore-dangle": "off",
36
+ "no-use-before-define": "off",
37
+ "import/prefer-default-export": "off",
38
+ "import/no-extraneous-dependencies": [
39
+ "error",
40
+ {
41
+ // Allow importing devDependencies like @storybook
42
+ "devDependencies": true
43
+ }
44
+ ],
45
+ // Import rules off for now due to HoundCI issue
46
+ "import/no-unresolved": "off",
47
+ "import/extensions": "off"
48
+ }
49
+ }
data/.gitignore CHANGED
@@ -12,3 +12,4 @@ locale/*/*.pox
12
12
  locale/*/*.edit.po
13
13
  locale/*/*.po.time_stamp
14
14
  Gemfile.lock
15
+ node_modules/
data/.hound.yml CHANGED
@@ -10,4 +10,9 @@ ruby:
10
10
  jshint:
11
11
  enabled: false
12
12
 
13
+ eslint:
14
+ enabled: true
15
+ config_file: .eslintrc
16
+ ignore_file: .eslintignore
17
+
13
18
  fail_on_violations: true
data/.rubocop.yml CHANGED
@@ -18,7 +18,10 @@ Style/Documentation:
18
18
  Metrics/MethodLength:
19
19
  Max: 40
20
20
 
21
- Style/TrailingCommaInLiteral:
21
+ Style/TrailingCommaInArrayLiteral:
22
+ Enabled: false
23
+
24
+ Style/TrailingCommaInHashLiteral:
22
25
  Enabled: false
23
26
 
24
27
  #Style/TrailingCommaInArguments:
data/.rubocop_todo.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config --exclude-limit 0`
3
- # on 2017-12-25 00:41:15 +0100 using RuboCop version 0.52.0.
3
+ # on 2018-04-02 18:24:49 +0200 using RuboCop version 0.54.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -13,7 +13,7 @@
13
13
  Gemspec/OrderedDependencies:
14
14
  Enabled: false
15
15
 
16
- # Offense count: 16
16
+ # Offense count: 17
17
17
  # Cop supports --auto-correct.
18
18
  # Configuration parameters: EnforcedStyle, IndentOneStep, IndentationWidth.
19
19
  # SupportedStyles: case, end
@@ -25,22 +25,17 @@ Layout/CaseIndentation:
25
25
  Layout/EmptyLines:
26
26
  Enabled: false
27
27
 
28
- # Offense count: 1
29
- # Cop supports --auto-correct.
30
- Layout/EmptyLinesAroundArguments:
31
- Enabled: false
32
-
33
- # Offense count: 8
28
+ # Offense count: 7
34
29
  # Cop supports --auto-correct.
35
30
  # Configuration parameters: EnforcedStyle.
36
31
  # SupportedStyles: empty_lines, no_empty_lines
37
32
  Layout/EmptyLinesAroundBlockBody:
38
33
  Enabled: false
39
34
 
40
- # Offense count: 22
35
+ # Offense count: 20
41
36
  # Cop supports --auto-correct.
42
37
  # Configuration parameters: EnforcedStyle.
43
- # SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines
38
+ # SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines, beginning_only, ending_only
44
39
  Layout/EmptyLinesAroundClassBody:
45
40
  Enabled: false
46
41
 
@@ -51,12 +46,6 @@ Layout/EmptyLinesAroundClassBody:
51
46
  Layout/EmptyLinesAroundModuleBody:
52
47
  Enabled: false
53
48
 
54
- # Offense count: 907
55
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
56
- # URISchemes: http, https
57
- Metrics/LineLength:
58
- Max: 204
59
-
60
49
  # Offense count: 1
61
50
  # Cop supports --auto-correct.
62
51
  # Configuration parameters: Width, IgnoredPatterns.
@@ -70,7 +59,7 @@ Layout/IndentationWidth:
70
59
  Layout/MultilineOperationIndentation:
71
60
  Enabled: false
72
61
 
73
- # Offense count: 2
62
+ # Offense count: 1
74
63
  # Cop supports --auto-correct.
75
64
  Layout/SpaceAfterComma:
76
65
  Enabled: false
@@ -81,7 +70,7 @@ Layout/SpaceAfterComma:
81
70
  Layout/SpaceAroundOperators:
82
71
  Enabled: false
83
72
 
84
- # Offense count: 44
73
+ # Offense count: 46
85
74
  # Cop supports --auto-correct.
86
75
  # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBrackets.
87
76
  # SupportedStyles: space, no_space, compact
@@ -89,7 +78,7 @@ Layout/SpaceAroundOperators:
89
78
  Layout/SpaceInsideArrayLiteralBrackets:
90
79
  Enabled: false
91
80
 
92
- # Offense count: 97
81
+ # Offense count: 85
93
82
  # Cop supports --auto-correct.
94
83
  # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
95
84
  # SupportedStyles: space, no_space, compact
@@ -97,18 +86,28 @@ Layout/SpaceInsideArrayLiteralBrackets:
97
86
  Layout/SpaceInsideHashLiteralBraces:
98
87
  Enabled: false
99
88
 
100
- # Offense count: 6
89
+ # Offense count: 5
101
90
  # Configuration parameters: MaximumRangeSize.
102
91
  Lint/MissingCopEnableDirective:
103
92
  Enabled: false
104
93
 
105
- # Offense count: 11
94
+ # Offense count: 1
95
+ # Cop supports --auto-correct.
96
+ Lint/UnneededCopDisableDirective:
97
+ Enabled: false
98
+
99
+ # Offense count: 1
100
+ # Cop supports --auto-correct.
101
+ Lint/UnneededCopEnableDirective:
102
+ Enabled: false
103
+
104
+ # Offense count: 10
106
105
  # Cop supports --auto-correct.
107
106
  # Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
108
107
  Lint/UnusedBlockArgument:
109
108
  Enabled: false
110
109
 
111
- # Offense count: 15
110
+ # Offense count: 14
112
111
  # Cop supports --auto-correct.
113
112
  # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
114
113
  Lint/UnusedMethodArgument:
@@ -118,21 +117,45 @@ Lint/UnusedMethodArgument:
118
117
  Lint/UselessAssignment:
119
118
  Enabled: false
120
119
 
121
- # Offense count: 42
122
- Metrics/AbcSize:
123
- Max: 40
124
-
125
- # Offense count: 3
120
+ # Offense count: 5
126
121
  Metrics/CyclomaticComplexity:
127
122
  Max: 8
128
123
 
124
+ # Offense count: 940
125
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
126
+ # URISchemes: http, https
127
+ Metrics/LineLength:
128
+ Max: 204
129
+
130
+ # Offense count: 2
131
+ Naming/MemoizedInstanceVariableName:
132
+ Enabled: false
133
+
134
+ # Offense count: 3
135
+ # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
136
+ # AllowedNames: io, id, to
137
+ Naming/UncommunicativeMethodParamName:
138
+ Enabled: false
139
+
140
+ # Offense count: 15
141
+ # Cop supports --auto-correct.
142
+ Rails/ActiveRecordAliases:
143
+ Enabled: false
144
+
129
145
  # Offense count: 7
130
146
  # Configuration parameters: Include.
131
147
  # Include: db/migrate/*.rb
132
148
  Rails/CreateTableWithTimestamps:
133
149
  Enabled: false
134
150
 
135
- # Offense count: 27
151
+ # Offense count: 1
152
+ # Cop supports --auto-correct.
153
+ # Configuration parameters: EnforcedStyle.
154
+ # SupportedStyles: numeric, symbolic
155
+ Rails/HttpStatus:
156
+ Enabled: false
157
+
158
+ # Offense count: 23
136
159
  # Configuration parameters: Include.
137
160
  # Include: app/models/**/*.rb
138
161
  Rails/InverseOf:
@@ -144,7 +167,7 @@ Rails/InverseOf:
144
167
  Rails/LexicallyScopedActionFilter:
145
168
  Enabled: false
146
169
 
147
- # Offense count: 3
170
+ # Offense count: 1
148
171
  # Cop supports --auto-correct.
149
172
  Rails/Presence:
150
173
  Enabled: false
@@ -171,20 +194,25 @@ Style/DoubleNegation:
171
194
  Style/Encoding:
172
195
  Enabled: false
173
196
 
174
- # Offense count: 18
197
+ # Offense count: 7
198
+ # Cop supports --auto-correct.
199
+ Style/ExpandPathArguments:
200
+ Enabled: false
201
+
202
+ # Offense count: 15
175
203
  # Configuration parameters: EnforcedStyle.
176
204
  # SupportedStyles: annotated, template, unannotated
177
205
  Style/FormatStringToken:
178
206
  Enabled: false
179
207
 
180
- # Offense count: 1481
208
+ # Offense count: 1527
181
209
  # Cop supports --auto-correct.
182
210
  # Configuration parameters: EnforcedStyle, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols.
183
211
  # SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
184
212
  Style/HashSyntax:
185
213
  Enabled: false
186
214
 
187
- # Offense count: 14
215
+ # Offense count: 17
188
216
  # Cop supports --auto-correct.
189
217
  Style/IfUnlessModifier:
190
218
  Enabled: false
@@ -194,7 +222,7 @@ Style/IfUnlessModifier:
194
222
  Style/LineEndConcatenation:
195
223
  Enabled: false
196
224
 
197
- # Offense count: 17
225
+ # Offense count: 22
198
226
  # Cop supports --auto-correct.
199
227
  # Configuration parameters: PreferredDelimiters.
200
228
  Style/PercentLiteralDelimiters:
@@ -213,14 +241,14 @@ Style/RaiseArgs:
213
241
  Style/RedundantReturn:
214
242
  Enabled: false
215
243
 
216
- # Offense count: 4
244
+ # Offense count: 5
217
245
  # Cop supports --auto-correct.
218
246
  # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
219
247
  # SupportedStyles: single_quotes, double_quotes
220
248
  Style/StringLiterals:
221
249
  Enabled: false
222
250
 
223
- # Offense count: 1
251
+ # Offense count: 2
224
252
  # Cop supports --auto-correct.
225
253
  # Configuration parameters: IgnoredMethods.
226
254
  # IgnoredMethods: respond_to, define_method
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: node_js
2
+ node_js:
3
+ - '6.10' # current EPEL 7
4
+ - '6' # previous LTS
5
+ - '8' # current LTS
6
+ script: ./scripts/travis_run_js_tests.sh
@@ -91,7 +91,7 @@ function delayed_refresh(url, data){
91
91
  url: url,
92
92
  data: data,
93
93
  dataType: "script",
94
- error: function() { $("div.terminal div.printable").append('<div class="line error">' + __('There was an error while updating the status, try refreshing the page.') + '</div>'); }
94
+ error: function() { $("div#job-invocation-chart").append('<div class="line error">' + __('There was an error while updating the status, try refreshing the page.') + '</div>'); }
95
95
  }
96
96
  )
97
97
  }, 1000);
@@ -1,7 +1,3 @@
1
- div#status_chart {
2
- float: right;
3
- }
4
-
5
1
  div.infoblock {
6
2
  margin-bottom: 20px;
7
3
  line-height: 2;
@@ -9,14 +5,4 @@ div.infoblock {
9
5
  pre {
10
6
  margin-top: 5px;
11
7
  }
12
-
13
- div.host_counter {
14
- float: left;
15
- min-width: 100px;
16
- text-align: center;
17
-
18
- .count {
19
- font-size: 20px;
20
- }
21
- }
22
8
  }
@@ -1,6 +1,8 @@
1
1
  class JobInvocationsController < ApplicationController
2
2
  include ::Foreman::Controller::AutoCompleteSearch
3
3
  include ::ForemanTasks::Concerns::Parameters::Triggering
4
+ include ::JobInvocationsChartHelper
5
+
4
6
 
5
7
  def new
6
8
  return @composer = prepare_composer if params[:feature].present?
@@ -62,6 +64,20 @@ class JobInvocationsController < ApplicationController
62
64
  @composer = prepare_composer
63
65
  end
64
66
 
67
+ def chart
68
+ find_resource
69
+ render :json => {
70
+ :finished => @job_invocation.finished?,
71
+ :job_invocations => job_invocation_data(@job_invocation)[:columns],
72
+ :statuses => {
73
+ :success => @job_invocation.progress_report[:success],
74
+ :cancelled => @job_invocation.progress_report[:cancelled],
75
+ :failed => @job_invocation.progress_report[:error],
76
+ :pending => @job_invocation.progress_report[:pending]
77
+ },
78
+ }
79
+ end
80
+
65
81
  def preview_hosts
66
82
  composer = prepare_composer
67
83
 
@@ -103,6 +119,8 @@ class JobInvocationsController < ApplicationController
103
119
  'create'
104
120
  when 'cancel'
105
121
  'cancel'
122
+ when 'chart'
123
+ 'view'
106
124
  else
107
125
  super
108
126
  end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal:true
2
+
3
+ module JobInvocationsChartHelper
4
+ def job_invocation_chart(invocation)
5
+ donut_chart('#status_chart',
6
+ job_invocation_data(invocation)[:columns],
7
+ job_invocation_data(invocation)[:groups])
8
+ end
9
+
10
+ def job_invocation_data(invocation)
11
+ return @job_invocation_data if @job_invocation_data.present?
12
+ progress_report = invocation.progress_report
13
+ success = progress_report[:success]
14
+ cancelled = progress_report[:cancelled]
15
+ failed = progress_report[:error]
16
+ pending = progress_report[:pending]
17
+ columns = [[_('Success'), success, '#5CB85C'],
18
+ [_('Failed'), failed, '#D9534F'],
19
+ [_('Pending'), pending, '#DEDEDE'],
20
+ [_('Cancelled'), cancelled, '#B7312D']]
21
+ groups = [columns.map(&:first)]
22
+
23
+ @job_invocation_data = { :columns => columns, :groups => groups}
24
+ end
25
+
26
+ def job_invocation_status(invocation, percent = nil, verbose = true)
27
+ case invocation.status
28
+ when HostStatus::ExecutionStatus::QUEUED
29
+ if verbose && invocation.task
30
+ _('queued to start executing in %{time}') % {:time => time_ago_in_words(invocation.task.start_at) }
31
+ else
32
+ _('queued')
33
+ end
34
+ when HostStatus::ExecutionStatus::RUNNING
35
+ percent ||= invocation.progress_report[:progress]
36
+ _('running %{percent}%%') % {:percent => percent}
37
+ when HostStatus::ExecutionStatus::OK
38
+ _('succeeded')
39
+ when HostStatus::ExecutionStatus::ERROR
40
+ _('failed')
41
+ else
42
+ _('unknown status')
43
+ end
44
+ end
45
+
46
+ def job_invocation_success_status
47
+ icon_text('ok',
48
+ @job_invocation_data[0][1],
49
+ :kind => 'pficon')
50
+ end
51
+
52
+ def job_invocation_failed_status
53
+ icon_text('error-circle-o',
54
+ @job_invocation_data[1][1],
55
+ :kind => 'pficon')
56
+ end
57
+
58
+ def job_invocation_pending_status
59
+ icon_text('running',
60
+ @job_invocation_data[2][1],
61
+ :kind => 'pficon')
62
+ end
63
+
64
+ def job_invocation_cancelled_status
65
+ icon_text('close',
66
+ @job_invocation_data[3][1],
67
+ :kind => 'pficon')
68
+ end
69
+
70
+ def task_failed?(task)
71
+ %w(warning error).include? task.result
72
+ end
73
+
74
+ def task_cancelled?(task)
75
+ task.execution_plan.errors.map(&:exception).any? { |exception| exception.class == ::ForemanTasks::Task::TaskCancelledException }
76
+ end
77
+ end