foreman_leapp 0.0.6 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -20
  3. data/app/controllers/api/v2/concerns/api_authorizer.rb +27 -0
  4. data/app/controllers/api/v2/preupgrade_reports_controller.rb +21 -2
  5. data/app/controllers/preupgrade_reports_controller.rb +11 -1
  6. data/app/lib/actions/preupgrade_job.rb +2 -1
  7. data/app/lib/helpers/job_helper.rb +3 -4
  8. data/app/models/preupgrade_report.rb +1 -0
  9. data/app/models/preupgrade_report_entry.rb +1 -0
  10. data/app/views/api/v2/preupgrade_report_entries/base.json.rabl +1 -1
  11. data/app/views/api/v2/preupgrade_reports/job_invocation.json.rabl +3 -0
  12. data/app/views/foreman_leapp/job_templates/leapp_check.erb +15 -0
  13. data/app/views/foreman_leapp/job_templates/{preupgrade.erb → leapp_preupgrade.erb} +5 -2
  14. data/app/views/foreman_leapp/job_templates/leapp_remediation.erb +29 -0
  15. data/app/views/foreman_leapp/job_templates/{upgrade.erb → leapp_upgrade.erb} +9 -7
  16. data/config/routes.rb +2 -1
  17. data/db/migrate/20200429080939_report_entries_flags.rb +5 -0
  18. data/db/seeds.d/10_leapp_preupgrade.rb +1 -1
  19. data/lib/foreman_leapp/engine.rb +7 -6
  20. data/lib/foreman_leapp/version.rb +1 -1
  21. data/locale/action_names.rb +6 -0
  22. data/locale/en/foreman_leapp.po +104 -2
  23. data/locale/foreman_leapp.pot +164 -8
  24. data/package.json +3 -2
  25. data/test/functional/api/v2/preupgrade_reports_controller_test.rb +89 -6
  26. data/test/functional/preupgrade_reports_controller_test.rb +27 -4
  27. data/test/unit/actions/preupgrade_job_test.rb +1 -1
  28. data/test/unit/helpers/job_helper_test.rb +3 -10
  29. data/webpack/__mocks__/foremanReact/common/I18n.js +1 -1
  30. data/webpack/__mocks__/foremanReact/components/common/EmptyState.js +1 -0
  31. data/webpack/components/PreupgradeReports/PreupgradeReports.js +104 -21
  32. data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +1 -1
  33. data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +132 -15
  34. data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +2 -0
  35. data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +10 -0
  36. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +45 -7
  37. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +17 -1
  38. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +43 -3
  39. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReports.test.js.snap +82 -134
  40. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +409 -2
  41. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +21 -1
  42. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +17 -1
  43. data/webpack/components/PreupgradeReports/components/EntriesFilter.js +121 -0
  44. data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +3 -0
  45. data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +30 -0
  46. data/webpack/components/PreupgradeReports/components/{FixAllButton.js → FixSelectedButton.js} +6 -8
  47. data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +15 -0
  48. data/webpack/components/PreupgradeReports/components/NoReports.js +35 -0
  49. data/webpack/components/PreupgradeReports/components/NoReports.test.js +15 -0
  50. data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +29 -0
  51. data/webpack/components/PreupgradeReports/components/{FixAllButton.test.js → UpgradeAllButton.test.js} +3 -4
  52. data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +330 -0
  53. data/webpack/components/PreupgradeReports/components/__snapshots__/{FixAllButton.test.js.snap → FixSelectedButton.test.js.snap} +9 -3
  54. data/webpack/components/PreupgradeReports/components/__snapshots__/NoReports.test.js.snap +19 -0
  55. data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +29 -0
  56. data/webpack/components/PreupgradeReports/index.js +22 -4
  57. data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +37 -0
  58. data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +16 -0
  59. data/webpack/components/PreupgradeReportsList/__tests__/__snapshots__/PreupgradeReportsList.test.js.snap +38 -0
  60. data/webpack/components/PreupgradeReportsList/components/InfoItem.js +1 -1
  61. data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +33 -0
  62. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +19 -9
  63. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +56 -0
  64. data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +50 -0
  65. data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +27 -0
  66. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +2 -0
  67. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +14 -0
  68. data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +29 -0
  69. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +32 -0
  70. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +23 -17
  71. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +113 -0
  72. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +36 -0
  73. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +4 -10
  74. data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +0 -2
  75. data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +7 -1
  76. data/webpack/components/PreupgradeReportsList/components/helpers.js +47 -19
  77. data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +61 -0
  78. data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +61 -0
  79. data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +62 -0
  80. data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +62 -0
  81. data/webpack/components/PreupgradeReportsList/index.js +28 -3
  82. metadata +54 -18
  83. data/app/views/foreman_leapp/job_templates/remediation.erb +0 -17
@@ -0,0 +1,37 @@
1
+ @import '~@theforeman/vendor/scss/variables';
2
+
3
+ #preupgrade-report-entries-list-view {
4
+ .sortable-header {
5
+ &.active {
6
+ color: $color-pf-blue-400;
7
+ }
8
+
9
+ &:hover {
10
+ cursor: pointer;
11
+ }
12
+
13
+ .fa-angle-up, .fa-angle-down {
14
+ margin-right: 10px;
15
+ }
16
+ }
17
+
18
+ .list-view-pf-additional-info-item {
19
+ flex: 1;
20
+ }
21
+
22
+ .list-view-header {
23
+ border-top: 0px;
24
+ background-color: $color-pf-white;
25
+ border-left-color: $color-pf-white;
26
+ border-right-color: $color-pf-white;
27
+
28
+ .list-view-pf-description {
29
+ font-size: 16px;
30
+ font-weight: 600;
31
+ }
32
+
33
+ .list-view-pf-checkbox {
34
+ margin-left: 17px;
35
+ }
36
+ }
37
+ }
@@ -9,14 +9,30 @@ const allEntries = [
9
9
  { title: 'Not enough credits', severity: 'low' },
10
10
  ];
11
11
 
12
+ const isSelected = () => false;
13
+ const toggleSelected = () => {};
14
+ const sort = { attribute: '', order: 'asc' };
15
+ const changeSort = () => {};
16
+ const toggleSelectAll = () => {};
17
+
12
18
  const fixtures = {
13
19
  'should render': {
14
20
  allEntries,
15
21
  fixAllWorking: false,
22
+ isSelected,
23
+ toggleSelected,
24
+ sort,
25
+ changeSort,
26
+ toggleSelectAll,
16
27
  },
17
28
  'should render when working': {
18
29
  allEntries,
19
30
  fixAllWorking: true,
31
+ isSelected,
32
+ toggleSelected,
33
+ sort,
34
+ changeSort,
35
+ toggleSelectAll,
20
36
  },
21
37
  };
22
38
 
@@ -3,7 +3,18 @@
3
3
  exports[`PreupgradeReportsList should render 1`] = `
4
4
  <ListView
5
5
  className=""
6
+ id="preupgrade-report-entries-list-view"
6
7
  >
8
+ <PreupgradeReportsListHeader
9
+ changeSort={[Function]}
10
+ sort={
11
+ Object {
12
+ "attribute": "",
13
+ "order": "asc",
14
+ }
15
+ }
16
+ toggleSelectAll={[Function]}
17
+ />
7
18
  <PreupgradeReportEntry
8
19
  entry={
9
20
  Object {
@@ -11,7 +22,9 @@ exports[`PreupgradeReportsList should render 1`] = `
11
22
  "title": "Fix me!",
12
23
  }
13
24
  }
25
+ isEntrySelected={false}
14
26
  key="0"
27
+ toggleSelected={[Function]}
15
28
  />
16
29
  <PreupgradeReportEntry
17
30
  entry={
@@ -20,7 +33,9 @@ exports[`PreupgradeReportsList should render 1`] = `
20
33
  "title": "I am broken too",
21
34
  }
22
35
  }
36
+ isEntrySelected={false}
23
37
  key="1"
38
+ toggleSelected={[Function]}
24
39
  />
25
40
  <PreupgradeReportEntry
26
41
  entry={
@@ -29,7 +44,9 @@ exports[`PreupgradeReportsList should render 1`] = `
29
44
  "title": "Octocat is not happy",
30
45
  }
31
46
  }
47
+ isEntrySelected={false}
32
48
  key="2"
49
+ toggleSelected={[Function]}
33
50
  />
34
51
  <PreupgradeReportEntry
35
52
  entry={
@@ -38,7 +55,9 @@ exports[`PreupgradeReportsList should render 1`] = `
38
55
  "title": "Not enough credits",
39
56
  }
40
57
  }
58
+ isEntrySelected={false}
41
59
  key="3"
60
+ toggleSelected={[Function]}
42
61
  />
43
62
  <PaginationWrapper
44
63
  dropdownButtonId="preupgrade-report-entries-pagination-dropdown"
@@ -65,7 +84,18 @@ exports[`PreupgradeReportsList should render 1`] = `
65
84
  exports[`PreupgradeReportsList should render when working 1`] = `
66
85
  <ListView
67
86
  className=""
87
+ id="preupgrade-report-entries-list-view"
68
88
  >
89
+ <PreupgradeReportsListHeader
90
+ changeSort={[Function]}
91
+ sort={
92
+ Object {
93
+ "attribute": "",
94
+ "order": "asc",
95
+ }
96
+ }
97
+ toggleSelectAll={[Function]}
98
+ />
69
99
  <PreupgradeReportEntry
70
100
  entry={
71
101
  Object {
@@ -73,7 +103,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
73
103
  "title": "Fix me!",
74
104
  }
75
105
  }
106
+ isEntrySelected={false}
76
107
  key="0"
108
+ toggleSelected={[Function]}
77
109
  />
78
110
  <PreupgradeReportEntry
79
111
  entry={
@@ -82,7 +114,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
82
114
  "title": "I am broken too",
83
115
  }
84
116
  }
117
+ isEntrySelected={false}
85
118
  key="1"
119
+ toggleSelected={[Function]}
86
120
  />
87
121
  <PreupgradeReportEntry
88
122
  entry={
@@ -91,7 +125,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
91
125
  "title": "Octocat is not happy",
92
126
  }
93
127
  }
128
+ isEntrySelected={false}
94
129
  key="2"
130
+ toggleSelected={[Function]}
95
131
  />
96
132
  <PreupgradeReportEntry
97
133
  entry={
@@ -100,7 +136,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
100
136
  "title": "Not enough credits",
101
137
  }
102
138
  }
139
+ isEntrySelected={false}
103
140
  key="3"
141
+ toggleSelected={[Function]}
104
142
  />
105
143
  <PaginationWrapper
106
144
  dropdownButtonId="preupgrade-report-entries-pagination-dropdown"
@@ -14,7 +14,7 @@ const InfoItem = ({ itemId, children, tooltipText }) => {
14
14
  </OverlayTrigger>
15
15
  );
16
16
  return (
17
- <ListView.InfoItem key={itemId} className="additional-info-wide">
17
+ <ListView.InfoItem key={itemId}>
18
18
  {tooltipText ? overlay : children}
19
19
  </ListView.InfoItem>
20
20
  );
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Icon } from 'patternfly-react';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
5
+
6
+ import { isInhibitor } from '../../PreupgradeReports/PreupgradeReportsHelpers';
7
+ import InfoItem from './InfoItem';
8
+ import EmptyInfoItem from './EmptyInfoItem';
9
+
10
+ const InhibitorInfoItem = ({ entry }) => {
11
+ const key = `inhibitor-${entry.id}`;
12
+
13
+ if (isInhibitor(entry)) {
14
+ return (
15
+ <InfoItem
16
+ itemId={key}
17
+ tooltipText={__('This issue inhibits the upgrade.')}
18
+ >
19
+ <span>
20
+ <Icon type="pf" name="security" className="severity-high" />
21
+ {__('Inhibitor')}
22
+ </span>
23
+ </InfoItem>
24
+ );
25
+ }
26
+ return <EmptyInfoItem entry={entry} attr="inhibitor" />;
27
+ };
28
+
29
+ InhibitorInfoItem.propTypes = {
30
+ entry: PropTypes.object.isRequired,
31
+ };
32
+
33
+ export default InhibitorInfoItem;
@@ -3,9 +3,10 @@ import { ListView, Grid, Icon } from 'patternfly-react';
3
3
  import PropTypes from 'prop-types';
4
4
  import './foreman_leapp.scss';
5
5
 
6
+ import InhibitorInfoItem from './InhibitorInfoItem';
7
+
6
8
  import {
7
9
  itemIteratorId,
8
- presentSeverity,
9
10
  hasRemediations,
10
11
  getExternals,
11
12
  getRemediations,
@@ -13,27 +14,34 @@ import {
13
14
  getSeverity,
14
15
  getSummary,
15
16
  getTags,
17
+ getSeverityImg,
16
18
  } from './helpers';
17
19
 
18
- const PreupgradeReportEntry = ({ entry }) => (
20
+ import { entryFixable } from '../../PreupgradeReports/PreupgradeReportsHelpers';
21
+
22
+ const PreupgradeReportEntry = ({ entry, isEntrySelected, toggleSelected }) => (
19
23
  <ListView.Item
20
24
  key={entry.id}
21
25
  stacked
22
- checkboxInput={<input type="checkbox" />}
26
+ checkboxInput={
27
+ <input
28
+ type="checkbox"
29
+ value={isEntrySelected}
30
+ checked={isEntrySelected}
31
+ disabled={!entryFixable(entry)}
32
+ onChange={() => toggleSelected(entry, isEntrySelected)}
33
+ />
34
+ }
23
35
  description={entry.title}
24
36
  additionalInfo={[
25
37
  <ListView.InfoItem key={itemIteratorId(entry, entry.hostname)}>
26
38
  <Icon type="pf" name="cluster" /> {entry.hostname}
27
39
  </ListView.InfoItem>,
28
40
  <ListView.InfoItem key={itemIteratorId(entry, entry.severity)}>
29
- <Icon
30
- type="pf"
31
- name="resources-full"
32
- style={{ color: presentSeverity(entry.severity) }}
33
- />
34
- {entry.severity}
41
+ {getSeverityImg(entry)}
35
42
  </ListView.InfoItem>,
36
43
  hasRemediations(entry),
44
+ <InhibitorInfoItem key={itemIteratorId(entry, 'flags')} entry={entry} />,
37
45
  ]}
38
46
  >
39
47
  <Grid fluid>
@@ -49,6 +57,8 @@ const PreupgradeReportEntry = ({ entry }) => (
49
57
 
50
58
  PreupgradeReportEntry.propTypes = {
51
59
  entry: PropTypes.object.isRequired,
60
+ isEntrySelected: PropTypes.bool.isRequired,
61
+ toggleSelected: PropTypes.func.isRequired,
52
62
  };
53
63
 
54
64
  export default PreupgradeReportEntry;
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { ListView } from 'patternfly-react';
3
+ import PropTypes from 'prop-types';
4
+
5
+ import { translate as __ } from 'foremanReact/common/I18n';
6
+
7
+ import InfoItem from './InfoItem';
8
+ import SortableHeaderItem from './SortableHeaderItem';
9
+
10
+ const PreupgradeReportsListHeader = ({ sort, changeSort, toggleSelectAll }) => {
11
+ const additionalInfoColumns = [
12
+ { label: __('Host'), value: 'hostname' },
13
+ { label: __('Risk Factor'), value: 'severity' },
14
+ { label: __('Has Remediation?'), value: 'fix' },
15
+ { label: __('Inhibitor?'), value: 'inhibitor' },
16
+ ];
17
+
18
+ const additionalInfo = additionalInfoColumns.map((col, idx) => (
19
+ <InfoItem itemId={idx.toString()} key={idx}>
20
+ <strong>
21
+ <SortableHeaderItem
22
+ title={col.label}
23
+ sort={sort}
24
+ value={col.value}
25
+ changeSort={changeSort}
26
+ />
27
+ </strong>
28
+ </InfoItem>
29
+ ));
30
+
31
+ return (
32
+ <ListView.Item
33
+ additionalInfo={additionalInfo}
34
+ className="list-view-header"
35
+ checkboxInput={<input type="checkbox" onClick={toggleSelectAll} />}
36
+ description={
37
+ <SortableHeaderItem
38
+ title={__('Title')}
39
+ sort={sort}
40
+ value="title"
41
+ changeSort={changeSort}
42
+ />
43
+ }
44
+ hideCloseIcon
45
+ stacked
46
+ />
47
+ );
48
+ };
49
+
50
+ PreupgradeReportsListHeader.propTypes = {
51
+ sort: PropTypes.object.isRequired,
52
+ changeSort: PropTypes.func.isRequired,
53
+ toggleSelectAll: PropTypes.func.isRequired,
54
+ };
55
+
56
+ export default PreupgradeReportsListHeader;
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { Icon } from 'patternfly-react';
3
+ import classNames from 'classnames';
4
+ import PropTypes from 'prop-types';
5
+
6
+ const SortableHeaderItem = ({ value, title, sort, changeSort }) => {
7
+ const chooseChevron = (active, order) => {
8
+ if (!active) {
9
+ return null;
10
+ }
11
+
12
+ const direction = order === 'asc' ? 'angle-up' : 'angle-down';
13
+
14
+ return <Icon type="fa" name={direction} />;
15
+ };
16
+
17
+ const active = sort.attribute === value;
18
+
19
+ const clickHandler = () => {
20
+ let direction = 'asc';
21
+
22
+ if (active) {
23
+ direction = sort.order === 'asc' ? 'desc' : 'asc';
24
+ }
25
+
26
+ changeSort({
27
+ attribute: value,
28
+ order: direction,
29
+ });
30
+ };
31
+
32
+ return (
33
+ <span
34
+ className={`sortable-header ${classNames({ active })}`}
35
+ onClick={clickHandler}
36
+ >
37
+ {chooseChevron(active, sort.order)}
38
+ {title}
39
+ </span>
40
+ );
41
+ };
42
+
43
+ SortableHeaderItem.propTypes = {
44
+ sort: PropTypes.object.isRequired,
45
+ changeSort: PropTypes.func.isRequired,
46
+ value: PropTypes.string.isRequired,
47
+ title: PropTypes.string.isRequired,
48
+ };
49
+
50
+ export default SortableHeaderItem;
@@ -0,0 +1,27 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+
3
+ import InhibitorInfoItem from '../InhibitorInfoItem';
4
+
5
+ const fixtures = {
6
+ 'should render when inhibitor': {
7
+ entry: {
8
+ title: 'no title',
9
+ severity: 'low',
10
+ id: 5,
11
+ preupgradeReportId: 7,
12
+ flags: ['inhibitor'],
13
+ },
14
+ },
15
+ 'should render when not inhibitor': {
16
+ entry: {
17
+ title: 'no title',
18
+ severity: 'low',
19
+ id: 5,
20
+ preupgradeReportId: 7,
21
+ flags: [],
22
+ },
23
+ },
24
+ };
25
+
26
+ describe('InhibitorInfoItem', () =>
27
+ testComponentSnapshotsWithFixtures(InhibitorInfoItem, fixtures));
@@ -5,6 +5,8 @@ import PreupgradeReportEntry from '../PreupgradeReportEntry';
5
5
  const fixtures = {
6
6
  'should render': {
7
7
  entry: { title: 'no title', severity: 'low', id: 5, preupgradeReportId: 7 },
8
+ isEntrySelected: false,
9
+ toggleSelected: () => {},
8
10
  },
9
11
  };
10
12
 
@@ -0,0 +1,14 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+
3
+ import PreupgradeReportsListHeader from '../PreupgradeReportsListHeader';
4
+
5
+ const fixtures = {
6
+ 'should render': {
7
+ sort: { attribute: '', order: 'asc' },
8
+ changeSort: () => {},
9
+ toggleSelectAll: () => {},
10
+ },
11
+ };
12
+
13
+ describe('PreupgradeReportsListHeader', () =>
14
+ testComponentSnapshotsWithFixtures(PreupgradeReportsListHeader, fixtures));