foreman_remote_execution 5.0.4 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/README.md +7 -0
  4. data/app/controllers/foreman_remote_execution/concerns/api/v2/registration_controller_extensions.rb +5 -0
  5. data/app/controllers/ui_job_wizard_controller.rb +13 -2
  6. data/app/helpers/remote_execution_helper.rb +1 -1
  7. data/app/lib/actions/remote_execution/run_host_job.rb +3 -1
  8. data/app/lib/foreman_remote_execution/renderer/scope/input.rb +1 -1
  9. data/app/mailers/rex_job_mailer.rb +1 -1
  10. data/app/models/concerns/foreman_remote_execution/host_extensions.rb +4 -0
  11. data/app/models/job_invocation.rb +2 -0
  12. data/app/models/job_template.rb +3 -1
  13. data/app/models/remote_execution_provider.rb +10 -1
  14. data/app/models/ssh_execution_provider.rb +8 -2
  15. data/app/views/api/v2/host/main.rabl +1 -0
  16. data/app/views/job_templates/_custom_tabs.html.erb +4 -9
  17. data/app/views/template_invocations/show.html.erb +7 -1
  18. data/app/views/templates/{ssh → script}/check_update.erb +2 -2
  19. data/app/views/templates/{ssh → script}/module_action.erb +2 -2
  20. data/app/views/templates/{ssh → script}/package_action.erb +2 -2
  21. data/app/views/templates/{ssh → script}/power_action.erb +2 -2
  22. data/app/views/templates/{ssh → script}/puppet_agent_disable.erb +2 -2
  23. data/app/views/templates/{ssh → script}/puppet_agent_enable.erb +2 -2
  24. data/app/views/templates/{ssh → script}/puppet_install_modules_from_forge.erb +2 -2
  25. data/app/views/templates/{ssh → script}/puppet_install_modules_from_git.erb +2 -2
  26. data/app/views/templates/{ssh → script}/puppet_run_once.erb +2 -2
  27. data/app/views/templates/{ssh → script}/run_command.erb +2 -2
  28. data/app/views/templates/{ssh → script}/service_action.erb +2 -2
  29. data/db/migrate/20220321101835_rename_ssh_provider_to_script.rb +29 -0
  30. data/jsconfig.json +8 -0
  31. data/lib/foreman_remote_execution/engine.rb +6 -4
  32. data/lib/foreman_remote_execution/version.rb +1 -1
  33. data/locale/action_names.rb +3 -4
  34. data/locale/de/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  35. data/locale/de/foreman_remote_execution.po +356 -20
  36. data/locale/en/foreman_remote_execution.po +356 -20
  37. data/locale/en_GB/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  38. data/locale/en_GB/foreman_remote_execution.po +356 -20
  39. data/locale/es/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  40. data/locale/es/foreman_remote_execution.po +357 -21
  41. data/locale/foreman_remote_execution.pot +808 -296
  42. data/locale/fr/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  43. data/locale/fr/foreman_remote_execution.po +357 -21
  44. data/locale/ja/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  45. data/locale/ja/foreman_remote_execution.po +357 -21
  46. data/locale/ko/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  47. data/locale/ko/foreman_remote_execution.po +356 -20
  48. data/locale/pt_BR/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  49. data/locale/pt_BR/foreman_remote_execution.po +357 -21
  50. data/locale/ru/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  51. data/locale/ru/foreman_remote_execution.po +356 -20
  52. data/locale/zh_CN/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  53. data/locale/zh_CN/foreman_remote_execution.po +357 -21
  54. data/locale/zh_TW/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  55. data/locale/zh_TW/foreman_remote_execution.po +356 -20
  56. data/package.json +6 -7
  57. data/test/unit/job_invocation_report_template_test.rb +1 -1
  58. data/test/unit/remote_execution_provider_test.rb +2 -0
  59. data/test/unit/targeting_test.rb +1 -1
  60. data/webpack/JobWizard/JobWizard.js +30 -7
  61. data/webpack/JobWizard/JobWizard.scss +5 -0
  62. data/webpack/JobWizard/JobWizardConstants.js +2 -1
  63. data/webpack/JobWizard/__tests__/fixtures.js +13 -2
  64. data/webpack/JobWizard/__tests__/integration.test.js +6 -1
  65. data/webpack/JobWizard/autofill.js +34 -9
  66. data/webpack/JobWizard/index.js +0 -7
  67. data/webpack/JobWizard/steps/CategoryAndTemplate/CategoryAndTemplate.js +24 -15
  68. data/webpack/JobWizard/steps/CategoryAndTemplate/index.js +25 -7
  69. data/webpack/JobWizard/steps/HostsAndInputs/HostSearch.js +1 -1
  70. data/webpack/JobWizard/steps/HostsAndInputs/__tests__/HostsAndInputs.test.js +28 -0
  71. data/webpack/JobWizard/steps/Schedule/RepeatOn.js +1 -1
  72. data/webpack/JobWizard/steps/form/Formatter.js +18 -3
  73. data/webpack/JobWizard/steps/form/GroupedSelectField.js +7 -1
  74. data/webpack/__mocks__/foremanReact/components/Pagination.js +2 -0
  75. data/webpack/__mocks__/foremanReact/constants.js +1 -0
  76. data/webpack/global_index.js +4 -0
  77. data/webpack/react_app/components/FeaturesDropdown/actions.js +13 -0
  78. data/webpack/react_app/components/FeaturesDropdown/constant.js +2 -0
  79. data/webpack/react_app/components/FeaturesDropdown/index.js +74 -0
  80. data/webpack/react_app/components/HostKebab/KebabItems.js +22 -0
  81. data/webpack/react_app/components/RecentJobsCard/RecentJobsCard.js +6 -1
  82. data/webpack/react_app/components/RecentJobsCard/RecentJobsTable.js +2 -2
  83. data/webpack/react_app/components/RecentJobsCard/constants.js +1 -0
  84. data/webpack/react_app/components/TargetingHosts/TargetingHostsHelpers.js +1 -1
  85. data/webpack/react_app/components/TargetingHosts/TargetingHostsPage.js +1 -6
  86. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHostsPage.test.js.snap +1 -9
  87. data/webpack/react_app/components/TargetingHosts/index.js +2 -3
  88. data/webpack/react_app/extend/fillKebabItems.js +11 -0
  89. data/webpack/react_app/extend/fillRexFeaturesDropdown.js +11 -0
  90. metadata +24 -16
  91. data/app/views/templates/README.md +0 -6
  92. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
@@ -0,0 +1,74 @@
1
+ import PropTypes from 'prop-types';
2
+ import React, { useState } from 'react';
3
+ import { useDispatch } from 'react-redux';
4
+ import {
5
+ DropdownItem,
6
+ Dropdown,
7
+ DropdownToggle,
8
+ DropdownToggleAction,
9
+ } from '@patternfly/react-core';
10
+ import { push } from 'connected-react-router';
11
+
12
+ import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
13
+ import { translate as __ } from 'foremanReact/common/I18n';
14
+ import { foremanUrl } from 'foremanReact/common/helpers';
15
+ import { STATUS } from 'foremanReact/constants';
16
+
17
+ import { REX_FEATURES_API, NEW_JOB_PAGE } from './constant';
18
+ import { runFeature } from './actions';
19
+
20
+ const FeaturesDropdown = ({ hostId }) => {
21
+ const [isOpen, setIsOpen] = useState(false);
22
+ const {
23
+ response: { results: features },
24
+ status,
25
+ } = useAPI('get', foremanUrl(REX_FEATURES_API));
26
+
27
+ const dispatch = useDispatch();
28
+ const dropdownItems = features
29
+ ?.filter(feature => feature.host_action_button)
30
+ ?.map(({ name, label, id, description }) => (
31
+ <DropdownItem
32
+ onClick={() => dispatch(runFeature(hostId, label, name))}
33
+ key={id}
34
+ description={description}
35
+ >
36
+ {name}
37
+ </DropdownItem>
38
+ ));
39
+ const scheduleJob = [
40
+ <DropdownToggleAction
41
+ onClick={() => dispatch(push(`${NEW_JOB_PAGE}=${hostId}`))}
42
+ key="schedule-job-action"
43
+ >
44
+ {__('Schedule a job')}
45
+ </DropdownToggleAction>,
46
+ ];
47
+
48
+ return (
49
+ <Dropdown
50
+ alignments={{ default: 'right' }}
51
+ onSelect={() => setIsOpen(false)}
52
+ toggle={
53
+ <DropdownToggle
54
+ splitButtonItems={scheduleJob}
55
+ toggleVariant="primary"
56
+ onToggle={() => setIsOpen(prev => !prev)}
57
+ isDisabled={status === STATUS.PENDING}
58
+ splitButtonVariant="action"
59
+ />
60
+ }
61
+ isOpen={isOpen}
62
+ dropdownItems={dropdownItems}
63
+ />
64
+ );
65
+ };
66
+
67
+ FeaturesDropdown.propTypes = {
68
+ hostId: PropTypes.number,
69
+ };
70
+ FeaturesDropdown.defaultProps = {
71
+ hostId: undefined,
72
+ };
73
+
74
+ export default FeaturesDropdown;
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { useSelector } from 'react-redux';
3
+ import { DropdownItem } from '@patternfly/react-core';
4
+ import { CodeIcon } from '@patternfly/react-icons';
5
+ import { selectAPIResponse } from 'foremanReact/redux/API/APISelectors';
6
+ import { translate as __ } from 'foremanReact/common/I18n';
7
+ import { HOST_DETAILS_KEY } from 'foremanReact/components/HostDetails/consts';
8
+
9
+ const HostKebabItems = () => {
10
+ const { cockpit_url: consoleUrl } = useSelector(state =>
11
+ selectAPIResponse(state, HOST_DETAILS_KEY)
12
+ );
13
+
14
+ if (!consoleUrl) return null;
15
+ return (
16
+ <DropdownItem icon={<CodeIcon />} href={consoleUrl}>
17
+ {__('Web Console')}
18
+ </DropdownItem>
19
+ );
20
+ };
21
+
22
+ export default HostKebabItems;
@@ -52,7 +52,12 @@ const RecentJobsCard = ({ hostDetails: { name, id } }) => {
52
52
  </DropdownItem>,
53
53
  ]}
54
54
  >
55
- <Tabs mountOnEnter activeKey={activeTab} onSelect={handleTabClick}>
55
+ <Tabs
56
+ mountOnEnter
57
+ unmountOnExit
58
+ activeKey={activeTab}
59
+ onSelect={handleTabClick}
60
+ >
56
61
  <Tab
57
62
  eventKey={FINISHED_TAB}
58
63
  title={<TabTitleText>{__('Finished')}</TabTitleText>}
@@ -19,7 +19,7 @@ import { translate as __ } from 'foremanReact/common/I18n';
19
19
  import { foremanUrl } from 'foremanReact/common/helpers';
20
20
 
21
21
  import JobStatusIcon from './JobStatusIcon';
22
- import { JOB_API_URL, JOBS_IN_CARD } from './constants';
22
+ import { JOB_API_URL, JOBS_IN_CARD, RECENT_JOBS_KEY } from './constants';
23
23
 
24
24
  const RecentJobsTable = ({ status, hostId }) => {
25
25
  const jobsUrl =
@@ -30,7 +30,7 @@ const RecentJobsTable = ({ status, hostId }) => {
30
30
  const {
31
31
  response: { results: jobs },
32
32
  status: responseStatus,
33
- } = useAPI('get', jobsUrl);
33
+ } = useAPI('get', jobsUrl, RECENT_JOBS_KEY);
34
34
 
35
35
  return (
36
36
  <DataList aria-label="recent-jobs-table" isCompact>
@@ -10,3 +10,4 @@ export const JOB_BASE_URL = '/job_invocations?search=host+%3D+';
10
10
  export const JOB_API_URL =
11
11
  '/api/job_invocations?order=start_at+DESC&search=targeted_host_id%3D';
12
12
  export const JOBS_IN_CARD = 3;
13
+ export const RECENT_JOBS_KEY = { key: 'RECENT_JOBS_KEY' };
@@ -4,7 +4,7 @@ export const getApiUrl = (searchQuery, pagination) => {
4
4
  const baseUrl = getURI()
5
5
  .search('')
6
6
  .addQuery('page', pagination.page)
7
- .addQuery('per_page', pagination.perPage);
7
+ .addQuery('per_page', pagination.per_page);
8
8
 
9
9
  return searchQuery ? baseUrl.addQuery('search', searchQuery) : baseUrl;
10
10
  };
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { Grid } from 'patternfly-react';
4
4
 
5
5
  import SearchBar from 'foremanReact/components/SearchBar';
6
- import Pagination from 'foremanReact/components/Pagination/PaginationWrapper';
6
+ import Pagination from 'foremanReact/components/Pagination';
7
7
  import { getControllerSearchProps } from 'foremanReact/constants';
8
8
 
9
9
  import TargetingHosts from './TargetingHosts';
@@ -15,7 +15,6 @@ const TargetingHostsPage = ({
15
15
  apiStatus,
16
16
  items,
17
17
  totalHosts,
18
- pagination,
19
18
  handlePagination,
20
19
  }) => (
21
20
  <div id="targeting_hosts">
@@ -39,11 +38,8 @@ const TargetingHostsPage = ({
39
38
  <br />
40
39
  <TargetingHosts apiStatus={apiStatus} items={items} />
41
40
  <Pagination
42
- viewType="table"
43
41
  itemCount={totalHosts}
44
- pagination={pagination}
45
42
  onChange={args => handlePagination(args)}
46
- dropdownButtonId="targeting-hosts-pagination-dropdown"
47
43
  className="targeting-hosts-pagination"
48
44
  />
49
45
  </div>
@@ -55,7 +51,6 @@ TargetingHostsPage.propTypes = {
55
51
  apiStatus: PropTypes.string,
56
52
  items: PropTypes.array.isRequired,
57
53
  totalHosts: PropTypes.number.isRequired,
58
- pagination: PropTypes.object.isRequired,
59
54
  handlePagination: PropTypes.func.isRequired,
60
55
  };
61
56
 
@@ -52,18 +52,10 @@ exports[`TargetingHostsPage renders 1`] = `
52
52
  ]
53
53
  }
54
54
  />
55
- <PaginationWrapper
55
+ <Pagination
56
56
  className="targeting-hosts-pagination"
57
- dropdownButtonId="targeting-hosts-pagination-dropdown"
58
57
  itemCount={1}
59
58
  onChange={[Function]}
60
- pagination={
61
- Object {
62
- "page": 1,
63
- "perPage": 20,
64
- }
65
- }
66
- viewType="table"
67
59
  />
68
60
  </div>
69
61
  `;
@@ -30,14 +30,14 @@ const WrappedTargetingHosts = () => {
30
30
  const [searchQuery, setSearchQuery] = useState('');
31
31
  const [pagination, setPagination] = useState({
32
32
  page: 1,
33
- perPage,
33
+ per_page: perPage,
34
34
  perPageOptions,
35
35
  });
36
36
  const [apiUrl, setApiUrl] = useState(getApiUrl(searchQuery, pagination));
37
37
  const intervalExists = useSelector(selectIntervalExists);
38
38
 
39
39
  const handleSearch = query => {
40
- const defaultPagination = { page: 1, perPage: pagination.perPage };
40
+ const defaultPagination = { page: 1, per_page: pagination.per_page };
41
41
  stopApiInterval();
42
42
 
43
43
  setApiUrl(getApiUrl(query, defaultPagination));
@@ -88,7 +88,6 @@ const WrappedTargetingHosts = () => {
88
88
  apiStatus={apiStatus}
89
89
  items={items}
90
90
  totalHosts={totalHosts}
91
- pagination={pagination}
92
91
  handlePagination={handlePagination}
93
92
  />
94
93
  );
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
+ import KebabItems from '../components/HostKebab/KebabItems';
4
+
5
+ export default () =>
6
+ addGlobalFill(
7
+ 'host-details-kebab',
8
+ 'rex-host-details-kebab-job',
9
+ <KebabItems key="rex-host-details-kebab-job" />,
10
+ 100
11
+ );
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
+ import FeaturesDropdown from '../components/FeaturesDropdown';
4
+
5
+ export default () =>
6
+ addGlobalFill(
7
+ '_rex-host-features',
8
+ '_rex-host-features',
9
+ <FeaturesDropdown key="_rex-host-features" />,
10
+ 1000
11
+ );
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: 5.0.4
4
+ version: 6.1.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: 2022-03-01 00:00:00.000000000 Z
11
+ date: 2022-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
@@ -201,6 +201,7 @@ files:
201
201
  - app/views/api/v2/foreign_input_sets/index.json.rabl
202
202
  - app/views/api/v2/foreign_input_sets/main.json.rabl
203
203
  - app/views/api/v2/foreign_input_sets/show.json.rabl
204
+ - app/views/api/v2/host/main.rabl
204
205
  - app/views/api/v2/interfaces/execution_flag.json.rabl
205
206
  - app/views/api/v2/job_invocations/base.json.rabl
206
207
  - app/views/api/v2/job_invocations/create.json.rabl
@@ -263,18 +264,17 @@ files:
263
264
  - app/views/template_invocations/_refresh.js.erb
264
265
  - app/views/template_invocations/show.html.erb
265
266
  - app/views/template_invocations/show.js.erb
266
- - app/views/templates/README.md
267
- - app/views/templates/ssh/check_update.erb
268
- - app/views/templates/ssh/module_action.erb
269
- - app/views/templates/ssh/package_action.erb
270
- - app/views/templates/ssh/power_action.erb
271
- - app/views/templates/ssh/puppet_agent_disable.erb
272
- - app/views/templates/ssh/puppet_agent_enable.erb
273
- - app/views/templates/ssh/puppet_install_modules_from_forge.erb
274
- - app/views/templates/ssh/puppet_install_modules_from_git.erb
275
- - app/views/templates/ssh/puppet_run_once.erb
276
- - app/views/templates/ssh/run_command.erb
277
- - app/views/templates/ssh/service_action.erb
267
+ - app/views/templates/script/check_update.erb
268
+ - app/views/templates/script/module_action.erb
269
+ - app/views/templates/script/package_action.erb
270
+ - app/views/templates/script/power_action.erb
271
+ - app/views/templates/script/puppet_agent_disable.erb
272
+ - app/views/templates/script/puppet_agent_enable.erb
273
+ - app/views/templates/script/puppet_install_modules_from_forge.erb
274
+ - app/views/templates/script/puppet_install_modules_from_git.erb
275
+ - app/views/templates/script/puppet_run_once.erb
276
+ - app/views/templates/script/run_command.erb
277
+ - app/views/templates/script/service_action.erb
278
278
  - config/routes.rb
279
279
  - db/migrate/20150612121541_add_job_template_to_template.rb
280
280
  - db/migrate/20150708133241_add_targeting.rb
@@ -322,6 +322,7 @@ files:
322
322
  - db/migrate/20210312074713_add_provider_inputs.rb
323
323
  - db/migrate/2021051713291621250977_add_host_proxy_invocations.rb
324
324
  - db/migrate/20210816100932_rex_setting_category_to_dsl.rb
325
+ - db/migrate/20220321101835_rename_ssh_provider_to_script.rb
325
326
  - db/seeds.d/100-assign_features_with_templates.rb
326
327
  - db/seeds.d/20-permissions.rb
327
328
  - db/seeds.d/50-notification_blueprints.rb
@@ -334,6 +335,7 @@ files:
334
335
  - extra/cockpit/foreman-cockpit.service
335
336
  - extra/cockpit/settings.yml.example
336
337
  - foreman_remote_execution.gemspec
338
+ - jsconfig.json
337
339
  - lib/foreman_remote_execution.rb
338
340
  - lib/foreman_remote_execution/engine.rb
339
341
  - lib/foreman_remote_execution/version.rb
@@ -463,7 +465,7 @@ files:
463
465
  - webpack/__mocks__/foremanReact/common/helpers.js
464
466
  - webpack/__mocks__/foremanReact/components/AutoComplete/AutoCompleteActions.js
465
467
  - webpack/__mocks__/foremanReact/components/AutoComplete/AutoCompleteConstants.js
466
- - webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js
468
+ - webpack/__mocks__/foremanReact/components/Pagination.js
467
469
  - webpack/__mocks__/foremanReact/components/SearchBar.js
468
470
  - webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js
469
471
  - webpack/__mocks__/foremanReact/constants.js
@@ -476,6 +478,10 @@ files:
476
478
  - webpack/global_index.js
477
479
  - webpack/helpers.js
478
480
  - webpack/index.js
481
+ - webpack/react_app/components/FeaturesDropdown/actions.js
482
+ - webpack/react_app/components/FeaturesDropdown/constant.js
483
+ - webpack/react_app/components/FeaturesDropdown/index.js
484
+ - webpack/react_app/components/HostKebab/KebabItems.js
479
485
  - webpack/react_app/components/RecentJobsCard/JobStatusIcon.js
480
486
  - webpack/react_app/components/RecentJobsCard/RecentJobsCard.js
481
487
  - webpack/react_app/components/RecentJobsCard/RecentJobsTable.js
@@ -508,7 +514,9 @@ files:
508
514
  - webpack/react_app/components/jobInvocations/AggregateStatus/index.js
509
515
  - webpack/react_app/components/jobInvocations/AggregateStatus/index.test.js
510
516
  - webpack/react_app/components/jobInvocations/index.js
517
+ - webpack/react_app/extend/fillKebabItems.js
511
518
  - webpack/react_app/extend/fillRecentJobsCard.js
519
+ - webpack/react_app/extend/fillRexFeaturesDropdown.js
512
520
  - webpack/react_app/extend/fillregistrationAdvanced.js
513
521
  - webpack/react_app/extend/reducers.js
514
522
  - webpack/react_app/redux/actions/jobInvocations/index.js
@@ -537,7 +545,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
537
545
  - !ruby/object:Gem::Version
538
546
  version: '0'
539
547
  requirements: []
540
- rubygems_version: 3.1.2
548
+ rubygems_version: 3.2.26
541
549
  signing_key:
542
550
  specification_version: 4
543
551
  summary: A plugin bringing remote execution to the Foreman, completing the config
@@ -1,6 +0,0 @@
1
- # Job Templates
2
-
3
- **IMPORTANT** Do not submit pull requests here, these templates are only
4
- updated during the release process. The
5
- [community-templates](https://github.com/theforeman/community-templates) repos
6
- is the canonical source for job templates.
@@ -1,2 +0,0 @@
1
- const PaginationWrapper = () => jest.fn();
2
- export default PaginationWrapper;