foreman_remote_execution 4.4.0 → 4.5.0

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/api/v2/job_invocations_controller.rb +13 -24
  3. data/app/controllers/job_templates_controller.rb +4 -4
  4. data/app/controllers/ui_job_wizard_controller.rb +12 -0
  5. data/app/helpers/job_invocations_helper.rb +2 -2
  6. data/app/helpers/remote_execution_helper.rb +8 -8
  7. data/app/lib/actions/remote_execution/run_host_job.rb +31 -5
  8. data/app/models/concerns/foreman_remote_execution/host_extensions.rb +5 -5
  9. data/app/models/host_status/execution_status.rb +5 -5
  10. data/app/models/job_invocation.rb +23 -7
  11. data/app/models/job_invocation_composer.rb +59 -17
  12. data/app/models/ssh_execution_provider.rb +4 -4
  13. data/app/overrides/execution_interface.rb +8 -8
  14. data/app/overrides/subnet_proxies.rb +6 -6
  15. data/config/routes.rb +1 -0
  16. data/db/migrate/20180110104432_rename_template_invocation_permission.rb +1 -1
  17. data/db/migrate/20190111153330_remove_remote_execution_without_proxy_setting.rb +4 -4
  18. data/extra/cockpit/foreman-cockpit-session +6 -6
  19. data/lib/foreman_remote_execution/engine.rb +11 -6
  20. data/lib/foreman_remote_execution/version.rb +1 -1
  21. data/package.json +2 -1
  22. data/test/functional/api/v2/job_invocations_controller_test.rb +14 -1
  23. data/test/unit/job_invocation_composer_test.rb +45 -1
  24. data/webpack/JobWizard/JobWizard.js +59 -18
  25. data/webpack/JobWizard/JobWizard.scss +3 -1
  26. data/webpack/JobWizard/JobWizardConstants.js +1 -0
  27. data/webpack/JobWizard/JobWizardSelectors.js +18 -1
  28. data/webpack/JobWizard/__tests__/JobWizard.test.js +4 -11
  29. data/webpack/JobWizard/__tests__/__snapshots__/JobWizard.test.js.snap +0 -51
  30. data/webpack/JobWizard/__tests__/__snapshots__/integration.test.js.snap +43 -0
  31. data/webpack/JobWizard/__tests__/fixtures.js +26 -0
  32. data/webpack/JobWizard/__tests__/integration.test.js +156 -0
  33. data/webpack/JobWizard/steps/AdvancedFields/AdvancedFields.js +93 -0
  34. data/webpack/JobWizard/steps/AdvancedFields/Fields.js +181 -0
  35. data/webpack/JobWizard/steps/AdvancedFields/__tests__/AdvancedFields.test.js +25 -0
  36. data/webpack/JobWizard/steps/AdvancedFields/__tests__/__snapshots__/AdvancedFields.test.js.snap +249 -0
  37. data/webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.js +34 -2
  38. data/webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.test.js +10 -3
  39. data/webpack/JobWizard/steps/CategoryAndTemplate/__snapshots__/CategoryAndTemplate.test.js.snap +50 -1
  40. data/webpack/JobWizard/steps/CategoryAndTemplate/index.js +9 -1
  41. data/webpack/JobWizard/steps/form/FormHelpers.js +19 -0
  42. data/webpack/JobWizard/steps/form/GroupedSelectField.js +3 -0
  43. data/webpack/JobWizard/steps/form/SelectField.js +10 -1
  44. data/webpack/JobWizard/steps/form/__tests__/__snapshots__/GroupedSelectField.test.js.snap +1 -0
  45. data/webpack/JobWizard/steps/form/__tests__/__snapshots__/SelectField.test.js.snap +1 -0
  46. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +21 -2
  47. data/webpack/global_index.js +5 -3
  48. data/webpack/index.js +3 -0
  49. data/webpack/react_app/components/RecentJobsCard/RecentJobsCard.js +1 -5
  50. data/webpack/react_app/components/TargetingHosts/__tests__/TargetingHostsSelectors.test.js +8 -3
  51. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsSelectors.test.js.snap +7 -2
  52. data/webpack/react_app/extend/{fills.js → fillRecentJobsCard.js} +7 -6
  53. data/webpack/react_app/extend/fillregistrationAdvanced.js +11 -0
  54. data/webpack/react_app/extend/reducers.js +2 -1
  55. metadata +12 -4
  56. data/webpack/fills_index.js +0 -11
@@ -8,6 +8,9 @@ import {
8
8
  selectJobTemplates,
9
9
  selectJobCategoriesStatus,
10
10
  filterJobTemplates,
11
+ selectCategoryError,
12
+ selectAllTemplatesError,
13
+ selectTemplateError,
11
14
  } from '../../JobWizardSelectors';
12
15
  import { CategoryAndTemplate } from './CategoryAndTemplate';
13
16
 
@@ -41,7 +44,6 @@ const ConnectedCategoryAndTemplate = ({
41
44
  }, [jobCategoriesStatus, dispatch, setCategory]);
42
45
 
43
46
  const jobCategories = useSelector(selectJobCategories);
44
-
45
47
  useEffect(() => {
46
48
  if (category) {
47
49
  const templatesUrlObject = new URI(templatesUrl);
@@ -63,6 +65,11 @@ const ConnectedCategoryAndTemplate = ({
63
65
 
64
66
  const jobTemplates = useSelector(selectJobTemplates);
65
67
 
68
+ const errors = {
69
+ categoryError: useSelector(selectCategoryError),
70
+ allTemplatesError: useSelector(selectAllTemplatesError),
71
+ templateError: useSelector(selectTemplateError),
72
+ };
66
73
  return (
67
74
  <CategoryAndTemplate
68
75
  jobTemplates={jobTemplates}
@@ -71,6 +78,7 @@ const ConnectedCategoryAndTemplate = ({
71
78
  selectedTemplateID={jobTemplate}
72
79
  setCategory={setCategory}
73
80
  selectedCategory={category}
81
+ errors={errors}
74
82
  />
75
83
  );
76
84
  };
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { Popover } from '@patternfly/react-core';
3
+ import { HelpIcon } from '@patternfly/react-icons';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
5
+
6
+ export const helpLabel = (text, id) => {
7
+ if (!text) return null;
8
+ return (
9
+ <Popover id={`${id}-help`} bodyContent={text} aria-label="help-text">
10
+ <button
11
+ aria-label={__('open-help-tooltip-button')}
12
+ onClick={e => e.preventDefault()}
13
+ className="pf-c-form__group-label-help"
14
+ >
15
+ <HelpIcon noVerticalAlign />
16
+ </button>
17
+ </Popover>
18
+ );
19
+ };
@@ -14,6 +14,7 @@ export const GroupedSelectField = ({
14
14
  groups,
15
15
  selected,
16
16
  setSelected,
17
+ ...props
17
18
  }) => {
18
19
  const [isOpen, setIsOpen] = useState(false);
19
20
  const onSelect = selection => {
@@ -67,6 +68,8 @@ export const GroupedSelectField = ({
67
68
  selections={selected}
68
69
  className="without_select2"
69
70
  onClear={onClear}
71
+ menuAppendTo={() => document.body}
72
+ {...props}
70
73
  >
71
74
  {options}
72
75
  </Select>
@@ -2,7 +2,14 @@ import React, { useState } from 'react';
2
2
  import { FormGroup, Select, SelectOption } from '@patternfly/react-core';
3
3
  import PropTypes from 'prop-types';
4
4
 
5
- export const SelectField = ({ label, fieldId, options, value, setValue }) => {
5
+ export const SelectField = ({
6
+ label,
7
+ fieldId,
8
+ options,
9
+ value,
10
+ setValue,
11
+ ...props
12
+ }) => {
6
13
  const onSelect = (event, selection) => {
7
14
  setValue(selection);
8
15
  setIsOpen(false);
@@ -17,6 +24,8 @@ export const SelectField = ({ label, fieldId, options, value, setValue }) => {
17
24
  isOpen={isOpen}
18
25
  className="without_select2"
19
26
  maxHeight="45vh"
27
+ menuAppendTo={() => document.body}
28
+ {...props}
20
29
  >
21
30
  {options.map((option, index) => (
22
31
  <SelectOption key={index} value={option} />
@@ -9,6 +9,7 @@ exports[`GroupedSelectField rendering renders with props 1`] = `
9
9
  className="without_select2"
10
10
  isGrouped={true}
11
11
  isOpen={false}
12
+ menuAppendTo={[Function]}
12
13
  onClear={[Function]}
13
14
  onFilter={[Function]}
14
15
  onSelect={[Function]}
@@ -9,6 +9,7 @@ exports[`SelectField rendering renders with props 1`] = `
9
9
  className="without_select2"
10
10
  isOpen={false}
11
11
  maxHeight="45vh"
12
+ menuAppendTo={[Function]}
12
13
  onSelect={[Function]}
13
14
  onToggle={[Function]}
14
15
  selections="Commands"
@@ -1,2 +1,21 @@
1
- export const selectAPIStatus = () => 'RESOLVED';
2
- export const selectAPIResponse = state => state;
1
+ export const selectAPI = state => state;
2
+ export const selectAPIByKey = (state, key) => selectAPI(state)[key] || {};
3
+
4
+ export const selectAPIStatus = (state, key) =>
5
+ selectAPIByKey(state, key).status;
6
+
7
+ export const selectAPIPayload = (state, key) =>
8
+ selectAPIByKey(state, key).payload || {};
9
+
10
+ export const selectAPIResponse = (state, key) =>
11
+ selectAPIByKey(state, key).response || {};
12
+
13
+ export const selectAPIError = (state, key) =>
14
+ selectAPIStatus(state, key) === 'ERROR'
15
+ ? selectAPIResponse(state, key)
16
+ : null;
17
+
18
+ export const selectAPIErrorMessage = (state, key) => {
19
+ const error = selectAPIError(state, key);
20
+ return error && error.message;
21
+ };
@@ -1,8 +1,10 @@
1
1
  import { registerRoutes } from 'foremanReact/routes/RoutingService';
2
2
  import routes from './Routes/routes';
3
+ import fillregistrationAdvanced from './react_app/extend/fillregistrationAdvanced';
4
+ import fillRecentJobsCard from './react_app/extend/fillRecentJobsCard';
3
5
  import registerReducers from './react_app/extend/reducers';
4
- import registerFills from './react_app/extend/fills';
5
6
 
6
- registerRoutes('foreman_remote_execution', routes);
7
7
  registerReducers();
8
- registerFills();
8
+ registerRoutes('foreman_remote_execution', routes);
9
+ fillRecentJobsCard();
10
+ fillregistrationAdvanced();
data/webpack/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import componentRegistry from 'foremanReact/components/componentRegistry';
2
2
  import JobInvocationContainer from './react_app/components/jobInvocations';
3
3
  import TargetingHosts from './react_app/components/TargetingHosts';
4
+ import registerReducers from './react_app/extend/reducers';
5
+
6
+ registerReducers();
4
7
 
5
8
  const components = [
6
9
  { name: 'JobInvocationContainer', type: JobInvocationContainer },
@@ -6,15 +6,11 @@ import Skeleton from 'react-loading-skeleton';
6
6
  import ElipsisWithTooltip from 'react-ellipsis-with-tooltip';
7
7
 
8
8
  import { Grid, GridItem } from '@patternfly/react-core';
9
- import {
10
- OkIcon,
11
- ErrorCircleOIcon,
12
- } from '@patternfly/react-icons/dist/js/icons';
13
9
  import {
14
10
  PropertiesSidePanel,
15
11
  PropertyItem,
16
12
  } from '@patternfly/react-catalog-view-extension';
17
- import { ArrowIcon } from '@patternfly/react-icons';
13
+ import { ArrowIcon, ErrorCircleOIcon, OkIcon } from '@patternfly/react-icons';
18
14
 
19
15
  import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
20
16
  import CardItem from 'foremanReact/components/HostDetails/Templates/CardItem/CardTemplate';
@@ -9,9 +9,14 @@ import {
9
9
  } from '../TargetingHostsSelectors';
10
10
 
11
11
  const state = {
12
- hosts: [],
13
- autoRefresh: 'true',
14
- total_hosts: 0,
12
+ TARGETING_HOSTS: {
13
+ status: 'RESOLVED',
14
+ response: {
15
+ hosts: [1, 2],
16
+ total_hosts: 2,
17
+ autoRefresh: 'true',
18
+ },
19
+ },
15
20
  };
16
21
 
17
22
  const fixtures = {
@@ -4,8 +4,13 @@ exports[`TargetingHostsSelectors should return apiStatus 1`] = `"RESOLVED"`;
4
4
 
5
5
  exports[`TargetingHostsSelectors should return autoRefresh 1`] = `"true"`;
6
6
 
7
- exports[`TargetingHostsSelectors should return hosts 1`] = `Array []`;
7
+ exports[`TargetingHostsSelectors should return hosts 1`] = `
8
+ Array [
9
+ 1,
10
+ 2,
11
+ ]
12
+ `;
8
13
 
9
14
  exports[`TargetingHostsSelectors should return intervalExists 1`] = `false`;
10
15
 
11
- exports[`TargetingHostsSelectors should return totalHosts 1`] = `0`;
16
+ exports[`TargetingHostsSelectors should return totalHosts 1`] = `2`;
@@ -2,9 +2,10 @@ import React from 'react';
2
2
  import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
3
  import RecentJobsCard from '../components/RecentJobsCard';
4
4
 
5
- export default addGlobalFill(
6
- 'details-cards',
7
- 'rex-host-details-latest-jobs',
8
- <RecentJobsCard />,
9
- 1000
10
- );
5
+ export default () =>
6
+ addGlobalFill(
7
+ 'details-cards',
8
+ 'rex-host-details-latest-jobs',
9
+ <RecentJobsCard />,
10
+ 1000
11
+ );
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
+ import RexInterface from '../components/RegistrationExtension/RexInterface';
4
+
5
+ export default () =>
6
+ addGlobalFill(
7
+ 'registrationAdvanced',
8
+ 'foreman-remote-exectuion-rex-interface',
9
+ <RexInterface key="registration-rex-interface" />,
10
+ 100
11
+ );
@@ -1,4 +1,5 @@
1
1
  import { registerReducer } from 'foremanReact/common/MountingService';
2
2
  import rootReducer from '../redux/reducers';
3
3
 
4
- export default registerReducer('foremanRemoteExecutionReducers', rootReducer);
4
+ export default () =>
5
+ registerReducer('foremanRemoteExecutionReducers', rootReducer);
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: 4.4.0
4
+ version: 4.5.0
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: 2021-05-10 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
@@ -406,11 +406,19 @@ files:
406
406
  - webpack/JobWizard/JobWizardSelectors.js
407
407
  - webpack/JobWizard/__tests__/JobWizard.test.js
408
408
  - webpack/JobWizard/__tests__/__snapshots__/JobWizard.test.js.snap
409
+ - webpack/JobWizard/__tests__/__snapshots__/integration.test.js.snap
410
+ - webpack/JobWizard/__tests__/fixtures.js
411
+ - webpack/JobWizard/__tests__/integration.test.js
409
412
  - webpack/JobWizard/index.js
413
+ - webpack/JobWizard/steps/AdvancedFields/AdvancedFields.js
414
+ - webpack/JobWizard/steps/AdvancedFields/Fields.js
415
+ - webpack/JobWizard/steps/AdvancedFields/__tests__/AdvancedFields.test.js
416
+ - webpack/JobWizard/steps/AdvancedFields/__tests__/__snapshots__/AdvancedFields.test.js.snap
410
417
  - webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.js
411
418
  - webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.test.js
412
419
  - webpack/JobWizard/steps/CategoryAndTemplate/__snapshots__/CategoryAndTemplate.test.js.snap
413
420
  - webpack/JobWizard/steps/CategoryAndTemplate/index.js
421
+ - webpack/JobWizard/steps/form/FormHelpers.js
414
422
  - webpack/JobWizard/steps/form/GroupedSelectField.js
415
423
  - webpack/JobWizard/steps/form/SelectField.js
416
424
  - webpack/JobWizard/steps/form/__tests__/GroupedSelectField.test.js
@@ -429,7 +437,6 @@ files:
429
437
  - webpack/__mocks__/foremanReact/redux/API/index.js
430
438
  - webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware/IntervalSelectors.js
431
439
  - webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js
432
- - webpack/fills_index.js
433
440
  - webpack/global_index.js
434
441
  - webpack/index.js
435
442
  - webpack/react_app/components/RecentJobsCard/RecentJobsCard.js
@@ -462,7 +469,8 @@ files:
462
469
  - webpack/react_app/components/jobInvocations/AggregateStatus/index.js
463
470
  - webpack/react_app/components/jobInvocations/AggregateStatus/index.test.js
464
471
  - webpack/react_app/components/jobInvocations/index.js
465
- - webpack/react_app/extend/fills.js
472
+ - webpack/react_app/extend/fillRecentJobsCard.js
473
+ - webpack/react_app/extend/fillregistrationAdvanced.js
466
474
  - webpack/react_app/extend/reducers.js
467
475
  - webpack/react_app/redux/actions/jobInvocations/index.js
468
476
  - webpack/react_app/redux/consts.js
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
-
4
- import RexInterface from './react_app/components/RegistrationExtension/RexInterface';
5
-
6
- addGlobalFill(
7
- 'registrationAdvanced',
8
- 'foreman-remote-exectuion-rex-interface',
9
- <RexInterface key="registration-rex-interface" />,
10
- 100
11
- );