foreman_remote_execution 3.3.6 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +1 -1
  3. data/app/controllers/api/v2/job_invocations_controller.rb +20 -2
  4. data/app/controllers/foreman_remote_execution/concerns/api/v2/registration_controller_extensions.rb +26 -0
  5. data/app/controllers/foreman_remote_execution/concerns/api/v2/subnets_controller_extensions.rb +21 -0
  6. data/app/controllers/job_invocations_controller.rb +22 -8
  7. data/app/controllers/job_templates_controller.rb +1 -1
  8. data/app/helpers/job_invocations_helper.rb +3 -2
  9. data/app/lib/actions/remote_execution/run_host_job.rb +1 -1
  10. data/app/lib/actions/remote_execution/run_hosts_job.rb +12 -3
  11. data/app/lib/foreman_remote_execution/renderer/scope/input.rb +35 -0
  12. data/app/models/concerns/api/v2/interfaces_controller_extensions.rb +13 -0
  13. data/app/models/concerns/foreman_remote_execution/host_extensions.rb +38 -14
  14. data/app/models/job_invocation.rb +12 -4
  15. data/app/models/job_invocation_composer.rb +3 -3
  16. data/app/models/remote_execution_feature.rb +5 -2
  17. data/app/models/remote_execution_provider.rb +8 -3
  18. data/app/models/setting/remote_execution.rb +2 -2
  19. data/app/models/ssh_execution_provider.rb +1 -1
  20. data/app/services/remote_execution_proxy_selector.rb +3 -0
  21. data/app/views/api/v2/interfaces/execution_flag.json.rabl +1 -0
  22. data/app/views/api/v2/job_invocations/base.json.rabl +1 -0
  23. data/app/views/api/v2/job_invocations/main.json.rabl +1 -1
  24. data/app/views/api/v2/registration/_form.html.erb +12 -0
  25. data/app/views/api/v2/subnets/remote_execution_proxies.json.rabl +3 -0
  26. data/app/views/job_invocations/_form.html.erb +1 -1
  27. data/app/views/job_invocations/_tab_hosts.html.erb +1 -20
  28. data/app/views/job_invocations/_tab_overview.html.erb +13 -1
  29. data/app/views/job_invocations/show.html.erb +3 -0
  30. data/app/views/job_invocations/show.json.erb +2 -1
  31. data/app/views/template_invocations/_output_line_set.html.erb +1 -1
  32. data/app/views/templates/ssh/package_action.erb +1 -0
  33. data/config/routes.rb +1 -0
  34. data/db/migrate/20200623073022_rename_sudo_password_to_effective_user_password.rb +34 -0
  35. data/db/migrate/20200820122057_add_proxy_selector_override_to_remote_execution_feature.rb +5 -0
  36. data/db/seeds.d/20-permissions.rb +9 -0
  37. data/lib/foreman_remote_execution/engine.rb +28 -2
  38. data/lib/foreman_remote_execution/version.rb +1 -1
  39. data/package.json +6 -6
  40. data/test/functional/api/v2/job_invocations_controller_test.rb +83 -1
  41. data/test/functional/api/v2/registration_controller_test.rb +82 -0
  42. data/test/functional/job_invocations_controller_test.rb +71 -0
  43. data/test/support/remote_execution_helper.rb +5 -0
  44. data/test/unit/actions/run_host_job_test.rb +3 -3
  45. data/test/unit/actions/run_hosts_job_test.rb +3 -2
  46. data/test/unit/job_invocation_composer_test.rb +5 -5
  47. data/test/unit/remote_execution_provider_test.rb +6 -6
  48. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +2 -0
  49. data/webpack/__mocks__/foremanReact/components/SearchBar.js +2 -0
  50. data/webpack/__mocks__/foremanReact/constants.js +21 -0
  51. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +2 -0
  52. data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware/IntervalSelectors.js +1 -0
  53. data/webpack/react_app/components/TargetingHosts/TargetingHosts.js +25 -15
  54. data/webpack/react_app/components/TargetingHosts/TargetingHostsHelpers.js +10 -0
  55. data/webpack/react_app/components/TargetingHosts/TargetingHostsPage.js +66 -0
  56. data/webpack/react_app/components/TargetingHosts/TargetingHostsPage.scss +6 -0
  57. data/webpack/react_app/components/TargetingHosts/TargetingHostsSelectors.js +10 -2
  58. data/webpack/react_app/components/TargetingHosts/__tests__/TargetingHostsPage.test.js +9 -0
  59. data/webpack/react_app/components/TargetingHosts/__tests__/TargetingHostsSelectors.test.js +26 -0
  60. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHosts.test.js.snap +17 -2
  61. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsPage.test.js.snap +68 -0
  62. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsSelectors.test.js.snap +11 -0
  63. data/webpack/react_app/components/TargetingHosts/__tests__/fixtures.js +35 -19
  64. data/webpack/react_app/components/TargetingHosts/index.js +73 -13
  65. metadata +26 -3
  66. data/webpack/react_app/components/TargetingHosts/TargetingHostsActions.js +0 -8
@@ -0,0 +1,6 @@
1
+ .targeting-hosts-pagination {
2
+ margin-top: -7px;
3
+ }
4
+ #targeting_hosts {
5
+ min-height: 350px;
6
+ }
@@ -2,11 +2,19 @@ import {
2
2
  selectAPIStatus,
3
3
  selectAPIResponse,
4
4
  } from 'foremanReact/redux/API/APISelectors';
5
+ import { selectDoesIntervalExist } from 'foremanReact/redux/middlewares/IntervalMiddleware/IntervalSelectors';
6
+
5
7
  import { TARGETING_HOSTS } from './TargetingHostsConsts';
6
8
 
7
9
  export const selectItems = state =>
8
10
  selectAPIResponse(state, TARGETING_HOSTS).hosts || [];
9
11
 
10
12
  export const selectAutoRefresh = state =>
11
- selectAPIResponse(state, TARGETING_HOSTS).autoRefresh;
12
- export const selectStatus = state => selectAPIStatus(state, TARGETING_HOSTS);
13
+ selectAPIResponse(state, TARGETING_HOSTS).autoRefresh || '';
14
+
15
+ export const selectApiStatus = state => selectAPIStatus(state, TARGETING_HOSTS);
16
+ export const selectTotalHosts = state =>
17
+ selectAPIResponse(state, TARGETING_HOSTS).total_hosts || 0;
18
+
19
+ export const selectIntervalExists = state =>
20
+ selectDoesIntervalExist(state, TARGETING_HOSTS);
@@ -0,0 +1,9 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+ import TargetingHostsPage from '../TargetingHostsPage';
3
+ import { TargetingHostsPageFixtures } from './fixtures';
4
+
5
+ describe('TargetingHostsPage', () =>
6
+ testComponentSnapshotsWithFixtures(
7
+ TargetingHostsPage,
8
+ TargetingHostsPageFixtures
9
+ ));
@@ -0,0 +1,26 @@
1
+ import { testSelectorsSnapshotWithFixtures } from '@theforeman/test';
2
+
3
+ import {
4
+ selectItems,
5
+ selectAutoRefresh,
6
+ selectApiStatus,
7
+ selectTotalHosts,
8
+ selectIntervalExists,
9
+ } from '../TargetingHostsSelectors';
10
+
11
+ const state = {
12
+ hosts: [],
13
+ autoRefresh: 'true',
14
+ total_hosts: 0,
15
+ };
16
+
17
+ const fixtures = {
18
+ 'should return hosts': () => selectItems(state),
19
+ 'should return autoRefresh': () => selectAutoRefresh(state),
20
+ 'should return apiStatus': () => selectApiStatus(state),
21
+ 'should return totalHosts': () => selectTotalHosts(state),
22
+ 'should return intervalExists': () => selectIntervalExists(state),
23
+ };
24
+
25
+ describe('TargetingHostsSelectors', () =>
26
+ testSelectorsSnapshotWithFixtures(fixtures));
@@ -33,6 +33,13 @@ exports[`TargetingHosts renders 1`] = `
33
33
  name="host"
34
34
  status="success"
35
35
  />
36
+ <HostItem
37
+ actions={Array []}
38
+ key="host2"
39
+ link="/link2"
40
+ name="host2"
41
+ status="success"
42
+ />
36
43
  </tbody>
37
44
  </table>
38
45
  </div>
@@ -52,7 +59,7 @@ exports[`TargetingHosts renders with error 1`] = `
52
59
  exports[`TargetingHosts renders with loading 1`] = `
53
60
  <LoadingState
54
61
  additionalClasses=""
55
- loading={false}
62
+ loading={true}
56
63
  loadingText="Loading"
57
64
  size="lg"
58
65
  timeout={300}
@@ -74,7 +81,15 @@ exports[`TargetingHosts renders with loading 1`] = `
74
81
  </th>
75
82
  </tr>
76
83
  </thead>
77
- <tbody />
84
+ <tbody>
85
+ <tr>
86
+ <td
87
+ colSpan="3"
88
+ >
89
+ No hosts found.
90
+ </td>
91
+ </tr>
92
+ </tbody>
78
93
  </table>
79
94
  </div>
80
95
  </LoadingState>
@@ -0,0 +1,68 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`TargetingHostsPage renders 1`] = `
4
+ <div
5
+ id="targeting_hosts"
6
+ >
7
+ <Row
8
+ bsClass="row"
9
+ componentClass="div"
10
+ >
11
+ <Col
12
+ bsClass="col"
13
+ className="title_filter"
14
+ componentClass="div"
15
+ md={6}
16
+ >
17
+ <SearchBar
18
+ data={
19
+ Object {
20
+ "autocomplete": Object {
21
+ "id": "targeting_hosts_search",
22
+ "searchQuery": "",
23
+ "url": "/hosts/auto_complete_search",
24
+ "useKeyShortcuts": true,
25
+ },
26
+ "bookmarks": Object {},
27
+ "controller": "hosts",
28
+ }
29
+ }
30
+ onSearch={[Function]}
31
+ />
32
+ </Col>
33
+ </Row>
34
+ <br />
35
+ <TargetingHosts
36
+ apiStatus="RESOLVED"
37
+ items={
38
+ Array [
39
+ Object {
40
+ "actions": Array [],
41
+ "link": "/link",
42
+ "name": "host",
43
+ "status": "success",
44
+ },
45
+ Object {
46
+ "actions": Array [],
47
+ "link": "/link2",
48
+ "name": "host2",
49
+ "status": "success",
50
+ },
51
+ ]
52
+ }
53
+ />
54
+ <PaginationWrapper
55
+ className="targeting-hosts-pagination"
56
+ dropdownButtonId="targeting-hosts-pagination-dropdown"
57
+ itemCount={1}
58
+ onChange={[Function]}
59
+ pagination={
60
+ Object {
61
+ "page": 1,
62
+ "perPage": 20,
63
+ }
64
+ }
65
+ viewType="list"
66
+ />
67
+ </div>
68
+ `;
@@ -0,0 +1,11 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`TargetingHostsSelectors should return apiStatus 1`] = `"RESOLVED"`;
4
+
5
+ exports[`TargetingHostsSelectors should return autoRefresh 1`] = `"true"`;
6
+
7
+ exports[`TargetingHostsSelectors should return hosts 1`] = `Array []`;
8
+
9
+ exports[`TargetingHostsSelectors should return intervalExists 1`] = `false`;
10
+
11
+ exports[`TargetingHostsSelectors should return totalHosts 1`] = `0`;
@@ -1,3 +1,18 @@
1
+ const items = [
2
+ {
3
+ name: 'host',
4
+ link: '/link',
5
+ status: 'success',
6
+ actions: [],
7
+ },
8
+ {
9
+ name: 'host2',
10
+ link: '/link2',
11
+ status: 'success',
12
+ actions: [],
13
+ },
14
+ ];
15
+
1
16
  export const HostItemFixtures = {
2
17
  renders: {
3
18
  name: 'Host1',
@@ -15,29 +30,30 @@ export const HostStatusFixtures = {
15
30
 
16
31
  export const TargetingHostsFixtures = {
17
32
  renders: {
18
- status: '',
19
- items: [
20
- {
21
- name: 'host',
22
- link: '/link',
23
- status: 'success',
24
- actions: [],
25
- },
26
- ],
33
+ apiStatus: 'RESOLVED',
34
+ items,
27
35
  },
28
36
  'renders with error': {
29
- status: 'ERROR',
30
- items: [
31
- {
32
- name: 'host',
33
- link: '/link',
34
- status: 'success',
35
- actions: [],
36
- },
37
- ],
37
+ apiStatus: 'ERROR',
38
+ items,
38
39
  },
39
40
  'renders with loading': {
40
- status: '',
41
+ apiStatus: 'PENDING',
41
42
  items: [],
42
43
  },
43
44
  };
45
+
46
+ export const TargetingHostsPageFixtures = {
47
+ renders: {
48
+ handleSearch: () => {},
49
+ searchQuery: '',
50
+ apiStatus: 'RESOLVED',
51
+ items,
52
+ totalHosts: 1,
53
+ pagination: {
54
+ page: 1,
55
+ perPage: 20,
56
+ },
57
+ handlePagination: () => {},
58
+ },
59
+ };
@@ -1,37 +1,97 @@
1
- import React, { useEffect } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { useSelector, useDispatch } from 'react-redux';
3
- import { stopInterval } from 'foremanReact/redux/middlewares/IntervalMiddleware';
4
- import TargetingHosts from './TargetingHosts';
3
+
4
+ import { get } from 'foremanReact/redux/API';
5
+ import { useForemanSettings } from 'foremanReact/Root/Context/ForemanContext';
6
+ import {
7
+ withInterval,
8
+ stopInterval,
9
+ } from 'foremanReact/redux/middlewares/IntervalMiddleware';
5
10
 
6
11
  import {
7
12
  selectItems,
8
- selectStatus,
13
+ selectApiStatus,
9
14
  selectAutoRefresh,
15
+ selectTotalHosts,
16
+ selectIntervalExists,
10
17
  } from './TargetingHostsSelectors';
11
- import { getData } from './TargetingHostsActions';
18
+ import { getApiUrl } from './TargetingHostsHelpers';
12
19
  import { TARGETING_HOSTS } from './TargetingHostsConsts';
20
+ import TargetingHostsPage from './TargetingHostsPage';
13
21
 
14
22
  const WrappedTargetingHosts = () => {
15
23
  const dispatch = useDispatch();
24
+ const { perPage, perPageOptions } = useForemanSettings();
25
+
16
26
  const autoRefresh = useSelector(selectAutoRefresh);
17
27
  const items = useSelector(selectItems);
18
- const status = useSelector(selectStatus);
28
+ const apiStatus = useSelector(selectApiStatus);
29
+ const totalHosts = useSelector(selectTotalHosts);
30
+ const [searchQuery, setSearchQuery] = useState('');
31
+ const [pagination, setPagination] = useState({
32
+ page: 1,
33
+ perPage,
34
+ perPageOptions,
35
+ });
36
+ const [apiUrl, setApiUrl] = useState(getApiUrl(searchQuery, pagination));
37
+ const intervalExists = useSelector(selectIntervalExists);
19
38
 
20
- useEffect(() => {
21
- dispatch(getData());
39
+ const handleSearch = query => {
40
+ const defaultPagination = { page: 1, perPage: pagination.perPage };
41
+ stopApiInterval();
22
42
 
23
- return () => {
43
+ setApiUrl(getApiUrl(query, defaultPagination));
44
+ setSearchQuery(query);
45
+ setPagination(defaultPagination);
46
+ };
47
+
48
+ const handlePagination = args => {
49
+ stopApiInterval();
50
+ setPagination(args);
51
+ setApiUrl(getApiUrl(searchQuery, args));
52
+ };
53
+
54
+ const stopApiInterval = () => {
55
+ if (intervalExists) {
24
56
  dispatch(stopInterval(TARGETING_HOSTS));
25
- };
26
- }, [dispatch]);
57
+ }
58
+ };
59
+
60
+ const getData = url =>
61
+ withInterval(
62
+ get({
63
+ key: TARGETING_HOSTS,
64
+ url,
65
+ handleError: () => {
66
+ dispatch(stopInterval(TARGETING_HOSTS));
67
+ },
68
+ }),
69
+ 1000
70
+ );
27
71
 
28
72
  useEffect(() => {
73
+ dispatch(getData(apiUrl));
74
+
29
75
  if (autoRefresh === 'false') {
30
76
  dispatch(stopInterval(TARGETING_HOSTS));
31
77
  }
32
- }, [autoRefresh, dispatch]);
33
78
 
34
- return <TargetingHosts status={status} items={items} />;
79
+ return () => {
80
+ dispatch(stopInterval(TARGETING_HOSTS));
81
+ };
82
+ }, [dispatch, apiUrl, autoRefresh]);
83
+
84
+ return (
85
+ <TargetingHostsPage
86
+ handleSearch={handleSearch}
87
+ searchQuery={searchQuery}
88
+ apiStatus={apiStatus}
89
+ items={items}
90
+ totalHosts={totalHosts}
91
+ pagination={pagination}
92
+ handlePagination={handlePagination}
93
+ />
94
+ );
35
95
  };
36
96
 
37
97
  export default WrappedTargetingHosts;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_remote_execution
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.6
4
+ version: 4.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman Remote Execution team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-13 00:00:00.000000000 Z
11
+ date: 2020-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
@@ -154,6 +154,8 @@ files:
154
154
  - app/controllers/concerns/foreman/controller/parameters/job_template.rb
155
155
  - app/controllers/concerns/foreman/controller/parameters/remote_execution_feature.rb
156
156
  - app/controllers/concerns/foreman/controller/parameters/targeting.rb
157
+ - app/controllers/foreman_remote_execution/concerns/api/v2/registration_controller_extensions.rb
158
+ - app/controllers/foreman_remote_execution/concerns/api/v2/subnets_controller_extensions.rb
157
159
  - app/controllers/job_invocations_controller.rb
158
160
  - app/controllers/job_templates_controller.rb
159
161
  - app/controllers/remote_execution_features_controller.rb
@@ -170,6 +172,7 @@ files:
170
172
  - app/lib/foreman_remote_execution/renderer/scope/input.rb
171
173
  - app/lib/proxy_api/remote_execution_ssh.rb
172
174
  - app/mailers/.gitkeep
175
+ - app/models/concerns/api/v2/interfaces_controller_extensions.rb
173
176
  - app/models/concerns/foreman_remote_execution/bookmark_extensions.rb
174
177
  - app/models/concerns/foreman_remote_execution/errors_flattener.rb
175
178
  - app/models/concerns/foreman_remote_execution/foreman_tasks_cleaner_extensions.rb
@@ -212,6 +215,7 @@ files:
212
215
  - app/views/api/v2/foreign_input_sets/index.json.rabl
213
216
  - app/views/api/v2/foreign_input_sets/main.json.rabl
214
217
  - app/views/api/v2/foreign_input_sets/show.json.rabl
218
+ - app/views/api/v2/interfaces/execution_flag.json.rabl
215
219
  - app/views/api/v2/job_invocations/base.json.rabl
216
220
  - app/views/api/v2/job_invocations/create.json.rabl
217
221
  - app/views/api/v2/job_invocations/index.json.rabl
@@ -223,11 +227,13 @@ files:
223
227
  - app/views/api/v2/job_templates/main.json.rabl
224
228
  - app/views/api/v2/job_templates/show.json.rabl
225
229
  - app/views/api/v2/job_templates/update.json.rabl
230
+ - app/views/api/v2/registration/_form.html.erb
226
231
  - app/views/api/v2/remote_execution_features/base.json.rabl
227
232
  - app/views/api/v2/remote_execution_features/index.json.rabl
228
233
  - app/views/api/v2/remote_execution_features/main.json.rabl
229
234
  - app/views/api/v2/remote_execution_features/show.json.rabl
230
235
  - app/views/api/v2/smart_proxies/pubkey.json.rabl
236
+ - app/views/api/v2/subnets/remote_execution_proxies.json.rabl
231
237
  - app/views/api/v2/template_invocations/base.json.rabl
232
238
  - app/views/api/v2/template_invocations/template_invocations.json.rabl
233
239
  - app/views/dashboard/.gitkeep
@@ -323,7 +329,10 @@ files:
323
329
  - db/migrate/20180411160809_add_sudo_password_to_job_invocation.rb
324
330
  - db/migrate/20180913101042_add_randomized_ordering_to_targeting.rb
325
331
  - db/migrate/20190111153330_remove_remote_execution_without_proxy_setting.rb
332
+ - db/migrate/20200623073022_rename_sudo_password_to_effective_user_password.rb
333
+ - db/migrate/20200820122057_add_proxy_selector_override_to_remote_execution_feature.rb
326
334
  - db/seeds.d/100-assign_features_with_templates.rb
335
+ - db/seeds.d/20-permissions.rb
327
336
  - db/seeds.d/50-notification_blueprints.rb
328
337
  - db/seeds.d/60-ssh_proxy_feature.rb
329
338
  - db/seeds.d/70-job_templates.rb
@@ -370,6 +379,7 @@ files:
370
379
  - test/functional/api/v2/foreign_input_sets_controller_test.rb
371
380
  - test/functional/api/v2/job_invocations_controller_test.rb
372
381
  - test/functional/api/v2/job_templates_controller_test.rb
382
+ - test/functional/api/v2/registration_controller_test.rb
373
383
  - test/functional/api/v2/remote_execution_features_controller_test.rb
374
384
  - test/functional/api/v2/template_invocations_controller_test.rb
375
385
  - test/functional/cockpit_controller_test.rb
@@ -377,6 +387,7 @@ files:
377
387
  - test/functional/job_templates_controller_test.rb
378
388
  - test/helpers/remote_execution_helper_test.rb
379
389
  - test/models/orchestration/ssh_test.rb
390
+ - test/support/remote_execution_helper.rb
380
391
  - test/test_plugin_helper.rb
381
392
  - test/unit/actions/run_host_job_test.rb
382
393
  - test/unit/actions/run_hosts_job_test.rb
@@ -395,19 +406,29 @@ files:
395
406
  - test/unit/targeting_test.rb
396
407
  - test/unit/template_invocation_input_value_test.rb
397
408
  - webpack/__mocks__/foremanReact/common/I18n.js
409
+ - webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js
410
+ - webpack/__mocks__/foremanReact/components/SearchBar.js
398
411
  - webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js
399
412
  - webpack/__mocks__/foremanReact/constants.js
413
+ - webpack/__mocks__/foremanReact/redux/API/APISelectors.js
414
+ - webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware/IntervalSelectors.js
400
415
  - webpack/index.js
401
416
  - webpack/react_app/components/TargetingHosts/TargetingHosts.js
402
- - webpack/react_app/components/TargetingHosts/TargetingHostsActions.js
403
417
  - webpack/react_app/components/TargetingHosts/TargetingHostsConsts.js
418
+ - webpack/react_app/components/TargetingHosts/TargetingHostsHelpers.js
419
+ - webpack/react_app/components/TargetingHosts/TargetingHostsPage.js
420
+ - webpack/react_app/components/TargetingHosts/TargetingHostsPage.scss
404
421
  - webpack/react_app/components/TargetingHosts/TargetingHostsSelectors.js
405
422
  - webpack/react_app/components/TargetingHosts/__tests__/HostItem.test.js
406
423
  - webpack/react_app/components/TargetingHosts/__tests__/HostStatus.test.js
407
424
  - webpack/react_app/components/TargetingHosts/__tests__/TargetingHosts.test.js
425
+ - webpack/react_app/components/TargetingHosts/__tests__/TargetingHostsPage.test.js
426
+ - webpack/react_app/components/TargetingHosts/__tests__/TargetingHostsSelectors.test.js
408
427
  - webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/HostItem.test.js.snap
409
428
  - webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/HostStatus.test.js.snap
410
429
  - webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHosts.test.js.snap
430
+ - webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsPage.test.js.snap
431
+ - webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsSelectors.test.js.snap
411
432
  - webpack/react_app/components/TargetingHosts/__tests__/fixtures.js
412
433
  - webpack/react_app/components/TargetingHosts/components/HostItem.js
413
434
  - webpack/react_app/components/TargetingHosts/components/HostStatus.js
@@ -453,6 +474,7 @@ test_files:
453
474
  - test/functional/api/v2/foreign_input_sets_controller_test.rb
454
475
  - test/functional/api/v2/job_invocations_controller_test.rb
455
476
  - test/functional/api/v2/job_templates_controller_test.rb
477
+ - test/functional/api/v2/registration_controller_test.rb
456
478
  - test/functional/api/v2/remote_execution_features_controller_test.rb
457
479
  - test/functional/api/v2/template_invocations_controller_test.rb
458
480
  - test/functional/cockpit_controller_test.rb
@@ -460,6 +482,7 @@ test_files:
460
482
  - test/functional/job_templates_controller_test.rb
461
483
  - test/helpers/remote_execution_helper_test.rb
462
484
  - test/models/orchestration/ssh_test.rb
485
+ - test/support/remote_execution_helper.rb
463
486
  - test/test_plugin_helper.rb
464
487
  - test/unit/actions/run_host_job_test.rb
465
488
  - test/unit/actions/run_hosts_job_test.rb