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,29 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+
3
+ import SortableHeaderItem from '../SortableHeaderItem';
4
+
5
+ const changeSort = () => {};
6
+
7
+ const fixtures = {
8
+ 'should render when not selected': {
9
+ changeSort,
10
+ sort: { attribute: '', order: 'asc' },
11
+ value: 'severity',
12
+ title: 'severity',
13
+ },
14
+ 'should render when selected and sorting asc': {
15
+ changeSort,
16
+ sort: { attribute: 'severity', order: 'asc' },
17
+ value: 'severity',
18
+ title: 'Severity',
19
+ },
20
+ 'should render when selected and sorting desc': {
21
+ changeSort,
22
+ sort: { attribute: 'severity', order: 'desc' },
23
+ value: 'severity',
24
+ title: 'Severity',
25
+ },
26
+ };
27
+
28
+ describe('SortableHeaderItem', () =>
29
+ testComponentSnapshotsWithFixtures(SortableHeaderItem, fixtures));
@@ -0,0 +1,32 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`InhibitorInfoItem should render when inhibitor 1`] = `
4
+ <InfoItem
5
+ itemId="inhibitor-5"
6
+ tooltipText="This issue inhibits the upgrade."
7
+ >
8
+ <span>
9
+ <Icon
10
+ className="severity-high"
11
+ name="security"
12
+ type="pf"
13
+ />
14
+ Inhibitor
15
+ </span>
16
+ </InfoItem>
17
+ `;
18
+
19
+ exports[`InhibitorInfoItem should render when not inhibitor 1`] = `
20
+ <EmptyInfoItem
21
+ attr="inhibitor"
22
+ entry={
23
+ Object {
24
+ "flags": Array [],
25
+ "id": 5,
26
+ "preupgradeReportId": 7,
27
+ "severity": "low",
28
+ "title": "no title",
29
+ }
30
+ }
31
+ />
32
+ `;
@@ -19,16 +19,11 @@ exports[`PreupgradeReportEntry should render 1`] = `
19
19
  className=""
20
20
  stacked={false}
21
21
  >
22
- <Icon
23
- name="resources-full"
24
- style={
25
- Object {
26
- "color": "#39a5dc",
27
- }
28
- }
29
- type="pf"
22
+ <img
23
+ alt="Low Risk Factor"
24
+ className="severity-img"
25
+ src={[Function]}
30
26
  />
31
- low
32
27
  </ListViewInfoItem>,
33
28
  <EmptyInfoItem
34
29
  attr="remediation"
@@ -41,11 +36,25 @@ exports[`PreupgradeReportEntry should render 1`] = `
41
36
  }
42
37
  }
43
38
  />,
39
+ <InhibitorInfoItem
40
+ entry={
41
+ Object {
42
+ "id": 5,
43
+ "preupgradeReportId": 7,
44
+ "severity": "low",
45
+ "title": "no title",
46
+ }
47
+ }
48
+ />,
44
49
  ]
45
50
  }
46
51
  checkboxInput={
47
52
  <input
53
+ checked={false}
54
+ disabled={true}
55
+ onChange={[Function]}
48
56
  type="checkbox"
57
+ value={false}
49
58
  />
50
59
  }
51
60
  compoundExpand={false}
@@ -106,14 +115,11 @@ exports[`PreupgradeReportEntry should render 1`] = `
106
115
  componentClass="div"
107
116
  md={8}
108
117
  >
109
- <Icon
110
- name="resources-full"
111
- style={
112
- Object {
113
- "color": "#39a5dc",
114
- }
115
- }
116
- type="pf"
118
+ <img
119
+ alt="Low Risk Factor"
120
+ className="severity-img"
121
+ key="5-7-sv5"
122
+ src={[Function]}
117
123
  />
118
124
 
119
125
  low
@@ -0,0 +1,113 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`PreupgradeReportsListHeader should render 1`] = `
4
+ <ListViewItem
5
+ actions={null}
6
+ additionalInfo={
7
+ Array [
8
+ <InfoItem
9
+ itemId="0"
10
+ tooltipText=""
11
+ >
12
+ <strong>
13
+ <SortableHeaderItem
14
+ changeSort={[Function]}
15
+ sort={
16
+ Object {
17
+ "attribute": "",
18
+ "order": "asc",
19
+ }
20
+ }
21
+ title="Host"
22
+ value="hostname"
23
+ />
24
+ </strong>
25
+ </InfoItem>,
26
+ <InfoItem
27
+ itemId="1"
28
+ tooltipText=""
29
+ >
30
+ <strong>
31
+ <SortableHeaderItem
32
+ changeSort={[Function]}
33
+ sort={
34
+ Object {
35
+ "attribute": "",
36
+ "order": "asc",
37
+ }
38
+ }
39
+ title="Risk Factor"
40
+ value="severity"
41
+ />
42
+ </strong>
43
+ </InfoItem>,
44
+ <InfoItem
45
+ itemId="2"
46
+ tooltipText=""
47
+ >
48
+ <strong>
49
+ <SortableHeaderItem
50
+ changeSort={[Function]}
51
+ sort={
52
+ Object {
53
+ "attribute": "",
54
+ "order": "asc",
55
+ }
56
+ }
57
+ title="Has Remediation?"
58
+ value="fix"
59
+ />
60
+ </strong>
61
+ </InfoItem>,
62
+ <InfoItem
63
+ itemId="3"
64
+ tooltipText=""
65
+ >
66
+ <strong>
67
+ <SortableHeaderItem
68
+ changeSort={[Function]}
69
+ sort={
70
+ Object {
71
+ "attribute": "",
72
+ "order": "asc",
73
+ }
74
+ }
75
+ title="Inhibitor?"
76
+ value="inhibitor"
77
+ />
78
+ </strong>
79
+ </InfoItem>,
80
+ ]
81
+ }
82
+ checkboxInput={
83
+ <input
84
+ onClick={[Function]}
85
+ type="checkbox"
86
+ />
87
+ }
88
+ className="list-view-header"
89
+ compoundExpand={false}
90
+ compoundExpanded={false}
91
+ description={
92
+ <SortableHeaderItem
93
+ changeSort={[Function]}
94
+ sort={
95
+ Object {
96
+ "attribute": "",
97
+ "order": "asc",
98
+ }
99
+ }
100
+ title="Title"
101
+ value="title"
102
+ />
103
+ }
104
+ heading={null}
105
+ hideCloseIcon={true}
106
+ initExpanded={false}
107
+ leftContent={null}
108
+ onCloseCompoundExpand={[Function]}
109
+ onExpand={[Function]}
110
+ onExpandClose={[Function]}
111
+ stacked={true}
112
+ />
113
+ `;
@@ -0,0 +1,36 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`SortableHeaderItem should render when not selected 1`] = `
4
+ <span
5
+ className="sortable-header "
6
+ onClick={[Function]}
7
+ >
8
+ severity
9
+ </span>
10
+ `;
11
+
12
+ exports[`SortableHeaderItem should render when selected and sorting asc 1`] = `
13
+ <span
14
+ className="sortable-header active"
15
+ onClick={[Function]}
16
+ >
17
+ <Icon
18
+ name="angle-up"
19
+ type="fa"
20
+ />
21
+ Severity
22
+ </span>
23
+ `;
24
+
25
+ exports[`SortableHeaderItem should render when selected and sorting desc 1`] = `
26
+ <span
27
+ className="sortable-header active"
28
+ onClick={[Function]}
29
+ >
30
+ <Icon
31
+ name="angle-down"
32
+ type="fa"
33
+ />
34
+ Severity
35
+ </span>
36
+ `;
@@ -44,8 +44,6 @@ Array [
44
44
  ]
45
45
  `;
46
46
 
47
- exports[`PreupgradeReportList/helpers should return hex for severity 1`] = `"#39a5dc"`;
48
-
49
47
  exports[`PreupgradeReportList/helpers should return remediations 1`] = `
50
48
  Array [
51
49
  <Row
@@ -93,14 +91,10 @@ exports[`PreupgradeReportList/helpers should return severity 1`] = `
93
91
  componentClass="div"
94
92
  md={8}
95
93
  >
96
- <Icon
97
- name="resources-full"
98
- style={
99
- Object {
100
- "color": "#cc0000",
101
- }
102
- }
103
- type="pf"
94
+ <img
95
+ alt="High Risk Factor"
96
+ className="severity-img"
97
+ src={[Function]}
104
98
  />
105
99
 
106
100
  high
@@ -1,7 +1,6 @@
1
1
  import { testSelectorsSnapshotWithFixtures } from '@theforeman/test';
2
2
 
3
3
  import {
4
- presentSeverity,
5
4
  tagInfo,
6
5
  hasRemediations,
7
6
  getTitle,
@@ -15,7 +14,6 @@ import {
15
14
  import { reportEntry } from './PreupgradeReportEntry.fixtures';
16
15
 
17
16
  const fixtures = {
18
- 'should return hex for severity': () => presentSeverity('low'),
19
17
  'should return tag info': () => tagInfo(reportEntry.tags),
20
18
  'should detect if has remediations': () => hasRemediations(reportEntry),
21
19
  'should return title': () => getTitle(reportEntry),
@@ -6,4 +6,10 @@
6
6
 
7
7
  .pre-wrap{
8
8
  white-space: pre-wrap;
9
- }
9
+ }
10
+
11
+ .severity-img{
12
+ width: 18px;
13
+ height: 18px;
14
+ margin-right: 10px;
15
+ }
@@ -1,23 +1,13 @@
1
1
  import React from 'react';
2
2
  import { Grid, ListView, Badge, Icon } from 'patternfly-react';
3
3
  import EmptyInfoItem from './EmptyInfoItem';
4
+ import SeverityHigh from './images/i_severity-high.svg';
5
+ import SeverityMedium from './images/i_severity-med.svg';
6
+ import SeverityLow from './images/i_severity-low.svg';
4
7
 
5
8
  export const itemIteratorId = (entry, ...rest) =>
6
9
  `${entry.id}-${entry.preupgradeReportId}-${rest.join('-')}`;
7
10
 
8
- export const presentSeverity = severity => {
9
- switch (severity) {
10
- case 'low':
11
- return '#39a5dc';
12
- case 'medium':
13
- return '#f0ab00';
14
- case 'high':
15
- return '#cc0000';
16
- default:
17
- return '#39a5dc';
18
- }
19
- };
20
-
21
11
  export const tagInfo = tags =>
22
12
  tags.map(attr => (
23
13
  <Badge key={attr} variant="pill primary">
@@ -25,6 +15,49 @@ export const tagInfo = tags =>
25
15
  </Badge>
26
16
  ));
27
17
 
18
+ export const getSeverityImg = entry => {
19
+ const key = itemIteratorId(entry, `sv${entry.id}`);
20
+
21
+ switch (entry.severity) {
22
+ case 'low':
23
+ return (
24
+ <img
25
+ key={key}
26
+ src={SeverityLow}
27
+ alt="Low Risk Factor"
28
+ className="severity-img"
29
+ />
30
+ );
31
+ case 'medium':
32
+ return (
33
+ <img
34
+ key={key}
35
+ src={SeverityMedium}
36
+ alt="Medium Risk Factor"
37
+ className="severity-img"
38
+ />
39
+ );
40
+ case 'high':
41
+ return (
42
+ <img
43
+ key={key}
44
+ src={SeverityHigh}
45
+ alt="High Risk Factor"
46
+ className="severity-img"
47
+ />
48
+ );
49
+ default:
50
+ return (
51
+ <img
52
+ key={key}
53
+ src={SeverityLow}
54
+ alt="Low Risk Factor"
55
+ className="severity-img"
56
+ />
57
+ );
58
+ }
59
+ };
60
+
28
61
  export const hasRemediations = entry => {
29
62
  const key = itemIteratorId(entry, `rm${entry.id}`);
30
63
  if (entry.detail && entry.detail.remediations) {
@@ -60,12 +93,7 @@ export const getSeverity = entry => {
60
93
  <strong>Risk Factor</strong>
61
94
  </Grid.Col>
62
95
  <Grid.Col md={8}>
63
- <Icon
64
- type="pf"
65
- name="resources-full"
66
- style={{ color: presentSeverity(entry.severity) }}
67
- />{' '}
68
- {entry.severity}
96
+ {getSeverityImg(entry)} {entry.severity}
69
97
  </Grid.Col>
70
98
  </Grid.Row>
71
99
  );
@@ -0,0 +1,61 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Layer_1"
14
+ x="0px"
15
+ y="0px"
16
+ viewBox="0 0 146 166"
17
+ style="enable-background:new 0 0 146 166;"
18
+ xml:space="preserve"
19
+ sodipodi:docname="i_critical.svg"
20
+ inkscape:version="0.92.1 r"><metadata
21
+ id="metadata4612"><rdf:RDF><cc:Work
22
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
23
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
24
+ id="defs4610" /><sodipodi:namedview
25
+ pagecolor="#ffffff"
26
+ bordercolor="#666666"
27
+ borderopacity="1"
28
+ objecttolerance="10"
29
+ gridtolerance="10"
30
+ guidetolerance="10"
31
+ inkscape:pageopacity="0"
32
+ inkscape:pageshadow="2"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1055"
35
+ id="namedview4608"
36
+ showgrid="false"
37
+ inkscape:zoom="1.4216867"
38
+ inkscape:cx="73"
39
+ inkscape:cy="83"
40
+ inkscape:window-x="0"
41
+ inkscape:window-y="1050"
42
+ inkscape:window-maximized="1"
43
+ inkscape:current-layer="Layer_1" /><style
44
+ type="text/css"
45
+ id="style4593">
46
+ .st0{fill:#808080;}
47
+ .st1{fill:#CC0000;}
48
+ </style><g
49
+ id="g4605"><path
50
+ class="st1"
51
+ d="M114.6,143.3H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,138.5,121.8,143.3,114.6,143.3z"
52
+ id="path4597" /><path
53
+ class="st1"
54
+ d="M114.6,110.2H31c-7.2,0-13-4.8-13-10.6l0,0C18,93.7,23.9,89,31,89h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,105.4,121.8,110.2,114.6,110.2z"
55
+ id="path4599" /><path
56
+ class="st1"
57
+ d="M115,77.1H31.4c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6H115c7.2,0,13,4.8,13,10.6l0,0 C128,72.3,122.1,77.1,115,77.1z"
58
+ id="path4601" /><path
59
+ class="st1"
60
+ d="M114.6,44H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.7,13-10.7h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,39.2,121.8,44,114.6,44z"
61
+ id="path4603" /></g></svg>