foreman_remote_execution 4.5.1 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby_ci.yml +7 -0
  3. data/app/controllers/ui_job_wizard_controller.rb +7 -0
  4. data/app/graphql/types/job_invocation.rb +16 -0
  5. data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +5 -1
  6. data/app/helpers/remote_execution_helper.rb +9 -3
  7. data/app/lib/actions/remote_execution/run_hosts_job.rb +1 -1
  8. data/app/models/job_invocation_composer.rb +3 -3
  9. data/app/models/job_template.rb +1 -1
  10. data/app/models/remote_execution_feature.rb +5 -1
  11. data/app/models/remote_execution_provider.rb +1 -1
  12. data/app/views/templates/ssh/module_action.erb +1 -0
  13. data/app/views/templates/ssh/power_action.erb +2 -0
  14. data/app/views/templates/ssh/puppet_run_once.erb +1 -0
  15. data/foreman_remote_execution.gemspec +2 -4
  16. data/lib/foreman_remote_execution/engine.rb +3 -0
  17. data/lib/foreman_remote_execution/version.rb +1 -1
  18. data/test/graphql/queries/job_invocation_query_test.rb +31 -0
  19. data/test/graphql/queries/job_invocations_query_test.rb +35 -0
  20. data/test/unit/concerns/host_extensions_test.rb +4 -4
  21. data/test/unit/input_template_renderer_test.rb +1 -89
  22. data/test/unit/job_invocation_composer_test.rb +1 -12
  23. data/webpack/JobWizard/JobWizard.js +28 -8
  24. data/webpack/JobWizard/JobWizard.scss +39 -0
  25. data/webpack/JobWizard/JobWizardConstants.js +10 -0
  26. data/webpack/JobWizard/JobWizardSelectors.js +9 -0
  27. data/webpack/JobWizard/__tests__/fixtures.js +104 -2
  28. data/webpack/JobWizard/__tests__/integration.test.js +13 -85
  29. data/webpack/JobWizard/steps/AdvancedFields/AdvancedFields.js +21 -4
  30. data/webpack/JobWizard/steps/AdvancedFields/DescriptionField.js +67 -0
  31. data/webpack/JobWizard/steps/AdvancedFields/Fields.js +73 -59
  32. data/webpack/JobWizard/steps/AdvancedFields/__tests__/AdvancedFields.test.js +135 -16
  33. data/webpack/JobWizard/steps/AdvancedFields/__tests__/DescriptionField.test.js +23 -0
  34. data/webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.test.js +122 -51
  35. data/webpack/JobWizard/steps/Schedule/QueryType.js +48 -0
  36. data/webpack/JobWizard/steps/Schedule/RepeatOn.js +61 -0
  37. data/webpack/JobWizard/steps/Schedule/ScheduleType.js +25 -0
  38. data/webpack/JobWizard/steps/Schedule/StartEndDates.js +51 -0
  39. data/webpack/JobWizard/steps/Schedule/__tests__/StartEndDates.test.js +22 -0
  40. data/webpack/JobWizard/steps/Schedule/index.js +41 -0
  41. data/webpack/JobWizard/steps/form/FormHelpers.js +1 -0
  42. data/webpack/JobWizard/steps/form/Formatter.js +149 -0
  43. data/webpack/JobWizard/steps/form/NumberInput.js +33 -0
  44. data/webpack/JobWizard/steps/form/SelectField.js +14 -2
  45. data/webpack/JobWizard/steps/form/__tests__/Formatter.test.js.example +76 -0
  46. data/webpack/__mocks__/foremanReact/components/SearchBar.js +18 -1
  47. data/webpack/react_app/components/RecentJobsCard/JobStatusIcon.js +43 -0
  48. data/webpack/react_app/components/RecentJobsCard/RecentJobsCard.js +72 -66
  49. data/webpack/react_app/components/RecentJobsCard/RecentJobsTable.js +98 -0
  50. data/webpack/react_app/components/RecentJobsCard/constants.js +11 -0
  51. data/webpack/react_app/components/RecentJobsCard/styles.scss +11 -0
  52. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsPage.test.js.snap +1 -0
  53. data/webpack/react_app/extend/fillRecentJobsCard.js +1 -1
  54. metadata +23 -27
  55. data/webpack/JobWizard/__tests__/JobWizard.test.js +0 -13
  56. data/webpack/JobWizard/__tests__/__snapshots__/JobWizard.test.js.snap +0 -32
  57. data/webpack/JobWizard/steps/AdvancedFields/__tests__/__snapshots__/AdvancedFields.test.js.snap +0 -249
  58. data/webpack/JobWizard/steps/CategoryAndTemplate/__snapshots__/CategoryAndTemplate.test.js.snap +0 -113
  59. data/webpack/JobWizard/steps/form/__tests__/GroupedSelectField.test.js +0 -38
  60. data/webpack/JobWizard/steps/form/__tests__/SelectField.test.js +0 -23
  61. data/webpack/JobWizard/steps/form/__tests__/__snapshots__/GroupedSelectField.test.js.snap +0 -37
  62. data/webpack/JobWizard/steps/form/__tests__/__snapshots__/SelectField.test.js.snap +0 -23
  63. data/webpack/react_app/components/RecentJobsCard/styles.css +0 -15
@@ -1,113 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`CategoryAndTemplate rendering render with error 1`] = `
4
- <Fragment>
5
- <Title
6
- headingLevel="h2"
7
- >
8
- Category and Template
9
- </Title>
10
- <Text
11
- component="p"
12
- >
13
- All fields are required.
14
- </Text>
15
- <Form>
16
- <SelectField
17
- fieldId="job_category"
18
- isDisabled={false}
19
- label="Job category"
20
- options={Array []}
21
- placeholderText=""
22
- setValue={[Function]}
23
- value={null}
24
- />
25
- <GroupedSelectField
26
- fieldId="job_template"
27
- groups={Array []}
28
- isDisabled={true}
29
- label="Job template"
30
- placeholderText="Error"
31
- selected={null}
32
- setSelected={[MockFunction]}
33
- />
34
- <Alert
35
- title="Errors:"
36
- variant="danger"
37
- >
38
- <span>
39
- Templates list failed with:
40
-
41
- I have an error
42
- </span>
43
- </Alert>
44
- </Form>
45
- </Fragment>
46
- `;
47
-
48
- exports[`CategoryAndTemplate rendering renders with props 1`] = `
49
- <Fragment>
50
- <Title
51
- headingLevel="h2"
52
- >
53
- Category and Template
54
- </Title>
55
- <Text
56
- component="p"
57
- >
58
- All fields are required.
59
- </Text>
60
- <Form>
61
- <SelectField
62
- fieldId="job_category"
63
- isDisabled={false}
64
- label="Job category"
65
- options={
66
- Array [
67
- "Commands",
68
- "Ansible Playbook",
69
- "Ansible Galaxy",
70
- "Ansible Roles Installation",
71
- ]
72
- }
73
- placeholderText=""
74
- setValue={[Function]}
75
- value="I am a category"
76
- />
77
- <GroupedSelectField
78
- fieldId="job_template"
79
- groups={
80
- Array [
81
- Object {
82
- "groupLabel": "SSH",
83
- "options": Array [
84
- Object {
85
- "label": "ab Run Command - SSH Default clone",
86
- "value": 190,
87
- },
88
- ],
89
- },
90
- Object {
91
- "groupLabel": "Ansible",
92
- "options": Array [
93
- Object {
94
- "label": "Ansible Roles - Ansible Default",
95
- "value": 168,
96
- },
97
- Object {
98
- "label": "Ansible Roles - Install from git",
99
- "value": 170,
100
- },
101
- ],
102
- },
103
- ]
104
- }
105
- isDisabled={false}
106
- label="Job template"
107
- placeholderText=""
108
- selected="ab Run Command - SSH Default clone"
109
- setSelected={[MockFunction]}
110
- />
111
- </Form>
112
- </Fragment>
113
- `;
@@ -1,38 +0,0 @@
1
- import React from 'react';
2
- import * as patternfly from '@patternfly/react-core';
3
- import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
4
- import { GroupedSelectField } from '../GroupedSelectField';
5
-
6
- jest.spyOn(patternfly, 'Select');
7
- jest.spyOn(patternfly, 'SelectOption');
8
- patternfly.Select.mockImplementation(props => <div>{props}</div>);
9
- patternfly.SelectOption.mockImplementation(props => <div>{props}</div>);
10
-
11
- const fixtures = {
12
- 'renders with props': {
13
- label: 'grouped select',
14
- fieldId: 'field-id',
15
- groups: [
16
- {
17
- groupLabel: 'Ansible',
18
- options: [
19
- {
20
- label: 'Ansible Roles - Ansible Default',
21
- value: 168,
22
- },
23
- {
24
- label: 'Ansible Roles - Install from git',
25
- value: 170,
26
- },
27
- ],
28
- },
29
- ],
30
- selected: 170,
31
- setSelected: jest.fn(),
32
- },
33
- };
34
-
35
- describe('GroupedSelectField', () => {
36
- describe('rendering', () =>
37
- testComponentSnapshotsWithFixtures(GroupedSelectField, fixtures));
38
- });
@@ -1,23 +0,0 @@
1
- import React from 'react';
2
- import * as patternfly from '@patternfly/react-core';
3
- import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
4
- import { SelectField } from '../SelectField';
5
-
6
- jest.spyOn(patternfly, 'Select');
7
- jest.spyOn(patternfly, 'SelectOption');
8
- patternfly.Select.mockImplementation(props => <div>{props}</div>);
9
- patternfly.SelectOption.mockImplementation(props => <div>{props}</div>);
10
- const fixtures = {
11
- 'renders with props': {
12
- label: 'grouped select',
13
- fieldId: 'field-id',
14
- options: ['Commands'],
15
- value: 'Commands',
16
- setValue: jest.fn(),
17
- },
18
- };
19
-
20
- describe('SelectField', () => {
21
- describe('rendering', () =>
22
- testComponentSnapshotsWithFixtures(SelectField, fixtures));
23
- });
@@ -1,37 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`GroupedSelectField rendering renders with props 1`] = `
4
- <FormGroup
5
- fieldId="field-id"
6
- label="grouped select"
7
- >
8
- <mockConstructor
9
- className="without_select2"
10
- isGrouped={true}
11
- isOpen={false}
12
- menuAppendTo={[Function]}
13
- onClear={[Function]}
14
- onFilter={[Function]}
15
- onSelect={[Function]}
16
- onToggle={[Function]}
17
- selections={170}
18
- variant="typeahead"
19
- >
20
- <SelectGroup
21
- key="0"
22
- label="Ansible"
23
- >
24
- <mockConstructor
25
- key="0"
26
- onClick={[Function]}
27
- value="Ansible Roles - Ansible Default"
28
- />
29
- <mockConstructor
30
- key="1"
31
- onClick={[Function]}
32
- value="Ansible Roles - Install from git"
33
- />
34
- </SelectGroup>
35
- </mockConstructor>
36
- </FormGroup>
37
- `;
@@ -1,23 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`SelectField rendering renders with props 1`] = `
4
- <FormGroup
5
- fieldId="field-id"
6
- label="grouped select"
7
- >
8
- <mockConstructor
9
- className="without_select2"
10
- isOpen={false}
11
- maxHeight="45vh"
12
- menuAppendTo={[Function]}
13
- onSelect={[Function]}
14
- onToggle={[Function]}
15
- selections="Commands"
16
- >
17
- <mockConstructor
18
- key="0"
19
- value="Commands"
20
- />
21
- </mockConstructor>
22
- </FormGroup>
23
- `;
@@ -1,15 +0,0 @@
1
- .properties-side-panel-pf-property-value {
2
- font-size: 14px !important;
3
- margin-top: 8px;
4
- word-break: break-word;
5
- }
6
-
7
- .properties-side-panel-pf-property-label {
8
- font-weight: 700 !important;
9
- font-size: 14px !important;
10
- margin: 0 !important;
11
- }
12
-
13
- .properties-side-panel-pf-property {
14
- margin-top: 24px;
15
- }