foreman_leapp 4.2.0 → 4.3.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/foreman_leapp/locale/de/foreman_leapp.js +2 -2
- data/app/assets/javascripts/foreman_leapp/locale/en/foreman_leapp.js +1 -1
- data/app/assets/javascripts/foreman_leapp/locale/fr/foreman_leapp.js +12 -12
- data/app/assets/javascripts/foreman_leapp/locale/ja/foreman_leapp.js +12 -12
- data/app/assets/javascripts/foreman_leapp/locale/ka/foreman_leapp.js +1 -1
- data/app/assets/javascripts/foreman_leapp/locale/ko/foreman_leapp.js +13 -13
- data/app/assets/javascripts/foreman_leapp/locale/zh_CN/foreman_leapp.js +12 -12
- data/app/controllers/api/v2/preupgrade_report_entries_controller.rb +17 -29
- data/app/controllers/concerns/foreman_leapp/preupgrade_report_entry_bulk_remediate.rb +69 -0
- data/config/routes.rb +1 -2
- data/lib/foreman_leapp/engine.rb +1 -12
- data/lib/foreman_leapp/version.rb +1 -1
- data/locale/de/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/de/foreman_leapp.po +3 -3
- data/locale/en/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/en/foreman_leapp.po +1 -1
- data/locale/foreman_leapp.pot +2 -2
- data/locale/fr/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/fr/foreman_leapp.po +13 -13
- data/locale/ja/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/ja/foreman_leapp.po +13 -13
- data/locale/ka/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/ka/foreman_leapp.po +1 -1
- data/locale/ko/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/ko/foreman_leapp.po +15 -16
- data/locale/zh_CN/LC_MESSAGES/foreman_leapp.mo +0 -0
- data/locale/zh_CN/foreman_leapp.po +13 -13
- data/package.json +0 -1
- data/test/functional/api/v2/preupgrade_report_entries_controller_test.rb +64 -0
- data/webpack/components/PreupgradeReportsTable/PreupgradeReportsTableHelpers.js +43 -16
- data/webpack/components/PreupgradeReportsTable/__tests__/PreupgradeReportsTable.test.js +41 -8
- data/webpack/components/PreupgradeReportsTable/index.js +64 -71
- data/webpack/index.js +0 -13
- metadata +3 -66
- data/app/controllers/preupgrade_reports_controller.rb +0 -17
- data/app/views/job_invocations/_leapp_preupgrade_report.html.erb +0 -11
- data/app/views/preupgrade_report_entries/base.json.rabl +0 -4
- data/app/views/preupgrade_reports/index.json.rabl +0 -3
- data/app/views/preupgrade_reports/show.json.rabl +0 -7
- data/test/functional/preupgrade_reports_controller_test.rb +0 -39
- data/webpack/components/PreupgradeReports/PreupgradeReports.js +0 -154
- data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +0 -31
- data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +0 -152
- data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +0 -37
- data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +0 -18
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +0 -129
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +0 -159
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +0 -78
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsReducer.test.js +0 -44
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsSelectors.test.js +0 -28
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +0 -489
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +0 -102
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +0 -76
- data/webpack/components/PreupgradeReports/components/EntriesFilter.js +0 -121
- data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +0 -3
- data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +0 -30
- data/webpack/components/PreupgradeReports/components/FixSelectedButton.js +0 -35
- data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +0 -15
- data/webpack/components/PreupgradeReports/components/NoReports.js +0 -35
- data/webpack/components/PreupgradeReports/components/NoReports.test.js +0 -29
- data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +0 -28
- data/webpack/components/PreupgradeReports/components/UpgradeAllButton.test.js +0 -17
- data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +0 -330
- data/webpack/components/PreupgradeReports/components/__snapshots__/FixSelectedButton.test.js.snap +0 -40
- data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +0 -41
- data/webpack/components/PreupgradeReports/index.js +0 -57
- data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +0 -37
- data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +0 -124
- data/webpack/components/PreupgradeReportsList/components/EmptyInfoItem.js +0 -16
- data/webpack/components/PreupgradeReportsList/components/InfoItem.js +0 -34
- data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +0 -33
- data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +0 -64
- data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +0 -56
- data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +0 -50
- data/webpack/components/PreupgradeReportsList/components/__tests__/EmptyInfoItem.test.js +0 -13
- data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +0 -27
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.fixtures.js +0 -38
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +0 -14
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +0 -14
- data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +0 -29
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/EmptyInfoItem.test.js.snap +0 -8
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +0 -32
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +0 -134
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +0 -113
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +0 -36
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +0 -197
- data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +0 -28
- data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +0 -15
- data/webpack/components/PreupgradeReportsList/components/helpers.js +0 -186
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +0 -61
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +0 -61
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +0 -62
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +0 -62
- data/webpack/components/PreupgradeReportsList/index.js +0 -61
- data/webpack/consts.js +0 -3
- data/webpack/csrf.js +0 -4
- data/webpack/reducer.js +0 -5
data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`UpgradeAllButton should render 1`] = `
|
|
4
|
-
<form
|
|
5
|
-
action="/job_invocations/new"
|
|
6
|
-
method="post"
|
|
7
|
-
>
|
|
8
|
-
<Button
|
|
9
|
-
active={false}
|
|
10
|
-
block={false}
|
|
11
|
-
bsClass="btn"
|
|
12
|
-
bsStyle="default"
|
|
13
|
-
disabled={false}
|
|
14
|
-
type="submit"
|
|
15
|
-
>
|
|
16
|
-
Run Upgrade
|
|
17
|
-
</Button>
|
|
18
|
-
<input
|
|
19
|
-
name="authenticity_token"
|
|
20
|
-
type="hidden"
|
|
21
|
-
value="abcd"
|
|
22
|
-
/>
|
|
23
|
-
<input
|
|
24
|
-
name="feature"
|
|
25
|
-
type="hidden"
|
|
26
|
-
value="leapp_upgrade"
|
|
27
|
-
/>
|
|
28
|
-
<input
|
|
29
|
-
key="5"
|
|
30
|
-
name="host_ids[]"
|
|
31
|
-
type="hidden"
|
|
32
|
-
value={5}
|
|
33
|
-
/>
|
|
34
|
-
<input
|
|
35
|
-
key="6"
|
|
36
|
-
name="host_ids[]"
|
|
37
|
-
type="hidden"
|
|
38
|
-
value={6}
|
|
39
|
-
/>
|
|
40
|
-
</form>
|
|
41
|
-
`;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import React, { useEffect } from 'react';
|
|
2
|
-
import { useDispatch, useSelector } from 'react-redux';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
4
|
-
|
|
5
|
-
import PreupgradeReports from './PreupgradeReports';
|
|
6
|
-
|
|
7
|
-
import getCsrfToken from '../../csrf';
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
selectPreupgradeReports,
|
|
11
|
-
selectLoadingPreupgradeReports,
|
|
12
|
-
selectReportsExpected,
|
|
13
|
-
selectError,
|
|
14
|
-
selectJobInvocationsPolling,
|
|
15
|
-
} from './PreupgradeReportsSelectors';
|
|
16
|
-
|
|
17
|
-
import { getPreupgradeReportsAction } from './PreupgradeReportsActions';
|
|
18
|
-
|
|
19
|
-
const WrappedPreupgradeReports = ({ url, newJobInvocationUrl }) => {
|
|
20
|
-
const loading = useSelector(state => selectLoadingPreupgradeReports(state));
|
|
21
|
-
const preupgradeReports = useSelector(state =>
|
|
22
|
-
selectPreupgradeReports(state)
|
|
23
|
-
);
|
|
24
|
-
const error = useSelector(state => selectError(state));
|
|
25
|
-
|
|
26
|
-
const invocationPending = useSelector(state =>
|
|
27
|
-
selectJobInvocationsPolling(state)
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
const reportsExpected = useSelector(state => selectReportsExpected(state));
|
|
31
|
-
|
|
32
|
-
const dispatch = useDispatch();
|
|
33
|
-
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
if (!invocationPending) {
|
|
36
|
-
dispatch(getPreupgradeReportsAction(url));
|
|
37
|
-
}
|
|
38
|
-
}, [dispatch, url, invocationPending]);
|
|
39
|
-
|
|
40
|
-
return (
|
|
41
|
-
<PreupgradeReports
|
|
42
|
-
preupgradeReports={preupgradeReports}
|
|
43
|
-
error={error}
|
|
44
|
-
loading={loading}
|
|
45
|
-
csrfToken={getCsrfToken()}
|
|
46
|
-
newJobInvocationUrl={newJobInvocationUrl}
|
|
47
|
-
reportsExpected={reportsExpected}
|
|
48
|
-
/>
|
|
49
|
-
);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
WrappedPreupgradeReports.propTypes = {
|
|
53
|
-
url: PropTypes.string.isRequired,
|
|
54
|
-
newJobInvocationUrl: PropTypes.string.isRequired,
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export default WrappedPreupgradeReports;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
@import 'foremanReact/common/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
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { render, screen, fireEvent } from '@testing-library/react';
|
|
3
|
-
import '@testing-library/jest-dom';
|
|
4
|
-
|
|
5
|
-
import PreupgradeReportsList from '../index';
|
|
6
|
-
|
|
7
|
-
jest.mock('foremanReact/components/Pagination', () => {
|
|
8
|
-
const MockPagination = () => <div data-testid="pagination">Pagination</div>;
|
|
9
|
-
return MockPagination;
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
jest.mock('../components/images/i_severity-high.svg', () => 'severity-high.svg');
|
|
13
|
-
jest.mock('../components/images/i_severity-med.svg', () => 'severity-med.svg');
|
|
14
|
-
jest.mock('../components/images/i_severity-low.svg', () => 'severity-low.svg');
|
|
15
|
-
|
|
16
|
-
const createMockEntries = count =>
|
|
17
|
-
Array.from({ length: count }, (_, i) => ({
|
|
18
|
-
id: i + 1,
|
|
19
|
-
preupgradeReportId: 100,
|
|
20
|
-
title: `Entry ${i + 1}`,
|
|
21
|
-
hostname: `host${i + 1}.example.com`,
|
|
22
|
-
severity: i % 3 === 0 ? 'high' : i % 3 === 1 ? 'medium' : 'low',
|
|
23
|
-
flags: i === 0 ? ['inhibitor'] : [],
|
|
24
|
-
detail: {
|
|
25
|
-
remediations:
|
|
26
|
-
i < 2
|
|
27
|
-
? [{ type: 'command', context: ['echo', 'fix', 'command'] }]
|
|
28
|
-
: [],
|
|
29
|
-
},
|
|
30
|
-
}));
|
|
31
|
-
|
|
32
|
-
const defaultProps = {
|
|
33
|
-
allEntries: createMockEntries(4),
|
|
34
|
-
isSelected: () => false,
|
|
35
|
-
toggleSelected: jest.fn(),
|
|
36
|
-
sort: { attribute: '', order: 'asc' },
|
|
37
|
-
changeSort: jest.fn(),
|
|
38
|
-
toggleSelectAll: jest.fn(),
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const renderComponent = (props = {}) =>
|
|
42
|
-
render(<PreupgradeReportsList {...defaultProps} {...props} />);
|
|
43
|
-
|
|
44
|
-
describe('PreupgradeReportsList', () => {
|
|
45
|
-
beforeEach(() => {
|
|
46
|
-
jest.clearAllMocks();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('renders the list header', () => {
|
|
50
|
-
renderComponent();
|
|
51
|
-
|
|
52
|
-
expect(screen.getByText('Title')).toBeInTheDocument();
|
|
53
|
-
expect(screen.getByText('Host')).toBeInTheDocument();
|
|
54
|
-
expect(screen.getByText('Risk Factor')).toBeInTheDocument();
|
|
55
|
-
expect(screen.getByText('Has Remediation?')).toBeInTheDocument();
|
|
56
|
-
expect(screen.getByText('Inhibitor?')).toBeInTheDocument();
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('renders entry titles', () => {
|
|
60
|
-
renderComponent();
|
|
61
|
-
|
|
62
|
-
expect(screen.getByText('Entry 1')).toBeInTheDocument();
|
|
63
|
-
expect(screen.getByText('Entry 2')).toBeInTheDocument();
|
|
64
|
-
expect(screen.getByText('Entry 3')).toBeInTheDocument();
|
|
65
|
-
expect(screen.getByText('Entry 4')).toBeInTheDocument();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('renders entry hostnames', () => {
|
|
69
|
-
renderComponent();
|
|
70
|
-
|
|
71
|
-
expect(screen.getByText('host1.example.com')).toBeInTheDocument();
|
|
72
|
-
expect(screen.getByText('host2.example.com')).toBeInTheDocument();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('renders checkboxes for entries', () => {
|
|
76
|
-
renderComponent();
|
|
77
|
-
|
|
78
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
79
|
-
expect(checkboxes.length).toBeGreaterThan(0);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('calls toggleSelectAll when header checkbox is clicked', () => {
|
|
83
|
-
const toggleSelectAll = jest.fn();
|
|
84
|
-
renderComponent({ toggleSelectAll });
|
|
85
|
-
|
|
86
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
87
|
-
fireEvent.click(checkboxes[0]);
|
|
88
|
-
|
|
89
|
-
expect(toggleSelectAll).toHaveBeenCalled();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('renders with empty entries array', () => {
|
|
93
|
-
renderComponent({ allEntries: [] });
|
|
94
|
-
|
|
95
|
-
expect(screen.getByText('Title')).toBeInTheDocument();
|
|
96
|
-
expect(screen.queryByText('Entry 1')).not.toBeInTheDocument();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('renders entries with selected state', () => {
|
|
100
|
-
const isSelected = entry => entry.id === 1;
|
|
101
|
-
renderComponent({ isSelected });
|
|
102
|
-
|
|
103
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
104
|
-
const entryCheckboxes = checkboxes.slice(1);
|
|
105
|
-
expect(entryCheckboxes[0]).toBeChecked();
|
|
106
|
-
expect(entryCheckboxes[1]).not.toBeChecked();
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it('calls toggleSelected when entry checkbox is clicked', () => {
|
|
110
|
-
const toggleSelected = jest.fn();
|
|
111
|
-
renderComponent({ toggleSelected });
|
|
112
|
-
|
|
113
|
-
const checkboxes = screen.getAllByRole('checkbox');
|
|
114
|
-
fireEvent.click(checkboxes[1]);
|
|
115
|
-
|
|
116
|
-
expect(toggleSelected).toHaveBeenCalled();
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it('renders pagination component', () => {
|
|
120
|
-
renderComponent();
|
|
121
|
-
|
|
122
|
-
expect(screen.getByTestId('pagination')).toBeInTheDocument();
|
|
123
|
-
});
|
|
124
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
|
|
4
|
-
import InfoItem from './InfoItem';
|
|
5
|
-
import { itemIteratorId } from './helpers';
|
|
6
|
-
|
|
7
|
-
const EmptyInfoItem = ({ entry, attr }) => (
|
|
8
|
-
<InfoItem itemId={itemIteratorId(entry, attr)} />
|
|
9
|
-
);
|
|
10
|
-
|
|
11
|
-
EmptyInfoItem.propTypes = {
|
|
12
|
-
entry: PropTypes.object.isRequired,
|
|
13
|
-
attr: PropTypes.string.isRequired,
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export default EmptyInfoItem;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ListView, OverlayTrigger, Tooltip } from 'patternfly-react';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
4
|
-
|
|
5
|
-
const InfoItem = ({ itemId, children, tooltipText }) => {
|
|
6
|
-
const overlay = (
|
|
7
|
-
<OverlayTrigger
|
|
8
|
-
overlay={tooltipText ? <Tooltip id={itemId}>{tooltipText}</Tooltip> : ''}
|
|
9
|
-
placement="top"
|
|
10
|
-
trigger={['hover', 'focus']}
|
|
11
|
-
rootClose={false}
|
|
12
|
-
>
|
|
13
|
-
{children}
|
|
14
|
-
</OverlayTrigger>
|
|
15
|
-
);
|
|
16
|
-
return (
|
|
17
|
-
<ListView.InfoItem key={itemId}>
|
|
18
|
-
{tooltipText ? overlay : children}
|
|
19
|
-
</ListView.InfoItem>
|
|
20
|
-
);
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
InfoItem.propTypes = {
|
|
24
|
-
itemId: PropTypes.string.isRequired,
|
|
25
|
-
children: PropTypes.node,
|
|
26
|
-
tooltipText: PropTypes.string,
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
InfoItem.defaultProps = {
|
|
30
|
-
tooltipText: '',
|
|
31
|
-
children: undefined,
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export default InfoItem;
|
|
@@ -1,33 +0,0 @@
|
|
|
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;
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ListView, Grid, Icon } from 'patternfly-react';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
4
|
-
import './foreman_leapp.scss';
|
|
5
|
-
|
|
6
|
-
import InhibitorInfoItem from './InhibitorInfoItem';
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
itemIteratorId,
|
|
10
|
-
hasRemediations,
|
|
11
|
-
getExternals,
|
|
12
|
-
getRemediations,
|
|
13
|
-
getTitle,
|
|
14
|
-
getSeverity,
|
|
15
|
-
getSummary,
|
|
16
|
-
getTags,
|
|
17
|
-
getSeverityImg,
|
|
18
|
-
} from './helpers';
|
|
19
|
-
|
|
20
|
-
import { entryFixable } from '../../PreupgradeReports/PreupgradeReportsHelpers';
|
|
21
|
-
|
|
22
|
-
const PreupgradeReportEntry = ({ entry, isEntrySelected, toggleSelected }) => (
|
|
23
|
-
<ListView.Item
|
|
24
|
-
key={entry.id}
|
|
25
|
-
stacked
|
|
26
|
-
checkboxInput={
|
|
27
|
-
<input
|
|
28
|
-
type="checkbox"
|
|
29
|
-
value={isEntrySelected}
|
|
30
|
-
checked={isEntrySelected}
|
|
31
|
-
disabled={!entryFixable(entry)}
|
|
32
|
-
onChange={() => toggleSelected(entry, isEntrySelected)}
|
|
33
|
-
/>
|
|
34
|
-
}
|
|
35
|
-
description={entry.title}
|
|
36
|
-
additionalInfo={[
|
|
37
|
-
<ListView.InfoItem key={itemIteratorId(entry, entry.hostname)}>
|
|
38
|
-
<Icon type="pf" name="cluster" /> {entry.hostname}
|
|
39
|
-
</ListView.InfoItem>,
|
|
40
|
-
<ListView.InfoItem key={itemIteratorId(entry, entry.severity)}>
|
|
41
|
-
{getSeverityImg(entry)}
|
|
42
|
-
</ListView.InfoItem>,
|
|
43
|
-
hasRemediations(entry),
|
|
44
|
-
<InhibitorInfoItem key={itemIteratorId(entry, 'flags')} entry={entry} />,
|
|
45
|
-
]}
|
|
46
|
-
>
|
|
47
|
-
<Grid fluid>
|
|
48
|
-
{getTitle(entry)}
|
|
49
|
-
{getSeverity(entry)}
|
|
50
|
-
{getSummary(entry)}
|
|
51
|
-
{getTags(entry)}
|
|
52
|
-
{getExternals(entry)}
|
|
53
|
-
{getRemediations(entry)}
|
|
54
|
-
</Grid>
|
|
55
|
-
</ListView.Item>
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
PreupgradeReportEntry.propTypes = {
|
|
59
|
-
entry: PropTypes.object.isRequired,
|
|
60
|
-
isEntrySelected: PropTypes.bool.isRequired,
|
|
61
|
-
toggleSelected: PropTypes.func.isRequired,
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
export default PreupgradeReportEntry;
|
|
@@ -1,56 +0,0 @@
|
|
|
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;
|
|
@@ -1,50 +0,0 @@
|
|
|
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;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
|
2
|
-
|
|
3
|
-
import EmptyInfoItem from '../EmptyInfoItem';
|
|
4
|
-
|
|
5
|
-
const fixtures = {
|
|
6
|
-
'should render': {
|
|
7
|
-
entry: { title: 'no title', severity: 'low', id: 5, preupgradeReportId: 7 },
|
|
8
|
-
attr: 'title',
|
|
9
|
-
},
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
describe('EmptyInfoItem', () =>
|
|
13
|
-
testComponentSnapshotsWithFixtures(EmptyInfoItem, fixtures));
|
data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
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));
|
data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.fixtures.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export const reportEntry = {
|
|
2
|
-
hostname: 'leapp-20200407164551',
|
|
3
|
-
severity: 'high',
|
|
4
|
-
title: 'Difference in Python versions and support in RHEL 8',
|
|
5
|
-
timeStamp: '2020-04-08T16:49:34.453295Z',
|
|
6
|
-
tags: ['python'],
|
|
7
|
-
summary: 'This checks difference in python versions',
|
|
8
|
-
detail: {
|
|
9
|
-
related_resources: [
|
|
10
|
-
{
|
|
11
|
-
scheme: 'package',
|
|
12
|
-
title: 'python',
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
scheme: 'package',
|
|
16
|
-
title: 'python2',
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
scheme: 'package',
|
|
20
|
-
title: 'python3',
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
external: [
|
|
24
|
-
{
|
|
25
|
-
url:
|
|
26
|
-
'https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/configuring_basic_system_settings/#using-python3',
|
|
27
|
-
title: 'Difference in Python versions and support in RHEL 8',
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
remediations: [
|
|
31
|
-
{
|
|
32
|
-
type: 'hint',
|
|
33
|
-
context:
|
|
34
|
-
'Please run "alternatives --set python /usr/bin/python3" after upgrade',
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
};
|
data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
|
2
|
-
|
|
3
|
-
import PreupgradeReportEntry from '../PreupgradeReportEntry';
|
|
4
|
-
|
|
5
|
-
const fixtures = {
|
|
6
|
-
'should render': {
|
|
7
|
-
entry: { title: 'no title', severity: 'low', id: 5, preupgradeReportId: 7 },
|
|
8
|
-
isEntrySelected: false,
|
|
9
|
-
toggleSelected: () => {},
|
|
10
|
-
},
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
describe('PreupgradeReportEntry', () =>
|
|
14
|
-
testComponentSnapshotsWithFixtures(PreupgradeReportEntry, fixtures));
|
|
@@ -1,14 +0,0 @@
|
|
|
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));
|
data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
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));
|