foreman_rh_cloud 5.0.29 → 5.0.30
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/config/Gemfile.lock.gh_test +204 -168
- data/config/package-lock.json +41822 -0
- data/config/package-lock.json.gh_test +14336 -7973
- data/config/routes.rb +1 -1
- data/lib/foreman_inventory_upload/generators/tags.rb +8 -1
- data/lib/foreman_rh_cloud/engine.rb +10 -1
- data/lib/foreman_rh_cloud/version.rb +1 -1
- data/package.json +1 -1
- data/test/unit/rh_cloud_permissions_test.rb +14 -0
- data/test/unit/tags_generator_test.rb +15 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +1 -1
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/InventoryFilter.js +3 -3
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/index.js +0 -2
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +1 -1
- data/webpack/ForemanRhCloudFills.js +8 -1
- data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +1 -1
- data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +1 -1
- data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +75 -0
- data/webpack/InsightsHostDetailsTab/InsightsTotalRiskChart.js +147 -0
- data/webpack/InsightsHostDetailsTab/NewHostDetailsTab.js +0 -1
- data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +1 -0
- data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +0 -0
- data/webpack/common/ForemanTasks/ForemanTasksActions.js +1 -1
- metadata +7 -4
- data/webpack/__mocks__/foremanReact/components/Layout/LayoutSelectors.js +0 -1
data/config/routes.rb
CHANGED
|
@@ -18,7 +18,7 @@ Rails.application.routes.draw do
|
|
|
18
18
|
namespace :insights_cloud do
|
|
19
19
|
resources :tasks, only: [:create]
|
|
20
20
|
resource :settings, only: [:show, :update]
|
|
21
|
-
resources :hits,
|
|
21
|
+
resources :hits, only: [:index] do
|
|
22
22
|
collection do
|
|
23
23
|
get 'auto_complete_search'
|
|
24
24
|
get 'resolutions', to: 'hits#resolutions'
|
|
@@ -13,7 +13,7 @@ module ForemanInventoryUpload
|
|
|
13
13
|
organizations +
|
|
14
14
|
content_data +
|
|
15
15
|
satellite_server_data
|
|
16
|
-
).reject { |key, value| value.empty? }
|
|
16
|
+
).reject { |key, value| value.empty? }.map { |key, value| [key, truncated_value(value)] }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def generate_parameters
|
|
@@ -21,6 +21,7 @@ module ForemanInventoryUpload
|
|
|
21
21
|
|
|
22
22
|
(@host.host_params || {})
|
|
23
23
|
.select { |_name, value| value.present? || value.is_a?(FalseClass) }
|
|
24
|
+
.map { |key, value| [key, truncated_value(value)] }
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
private
|
|
@@ -57,6 +58,12 @@ module ForemanInventoryUpload
|
|
|
57
58
|
['organization_id', @host.organization_id.to_s],
|
|
58
59
|
]
|
|
59
60
|
end
|
|
61
|
+
|
|
62
|
+
def truncated_value(value)
|
|
63
|
+
return 'Original value exceeds 250 characters' if value.to_s.length > 250
|
|
64
|
+
|
|
65
|
+
value
|
|
66
|
+
end
|
|
60
67
|
end
|
|
61
68
|
end
|
|
62
69
|
end
|
|
@@ -48,13 +48,22 @@ module ForemanRhCloud
|
|
|
48
48
|
security_block :foreman_rh_cloud do
|
|
49
49
|
permission(
|
|
50
50
|
:generate_foreman_rh_cloud,
|
|
51
|
-
'foreman_inventory_upload/reports': [:generate]
|
|
51
|
+
'foreman_inventory_upload/reports': [:generate],
|
|
52
|
+
'foreman_inventory_upload/tasks': [:create],
|
|
53
|
+
'api/v2/rh_cloud/inventory': [:sync_inventory_status, :download_file, :generate_report, :enable_cloud_connector],
|
|
54
|
+
'foreman_inventory_upload/uploads': [:enable_cloud_connector],
|
|
55
|
+
'foreman_inventory_upload/uploads_settings': [:set_advanced_setting],
|
|
56
|
+
'insights_cloud/settings': [:save_token_and_sync, :update],
|
|
57
|
+
'insights_cloud/tasks': [:create]
|
|
52
58
|
)
|
|
53
59
|
permission(
|
|
54
60
|
:view_foreman_rh_cloud,
|
|
55
61
|
'foreman_inventory_upload/accounts': [:index],
|
|
56
62
|
'foreman_inventory_upload/reports': [:last],
|
|
57
63
|
'foreman_inventory_upload/uploads': [:auto_upload, :show_auto_upload, :download_file, :last],
|
|
64
|
+
'foreman_inventory_upload/tasks': [:show],
|
|
65
|
+
'foreman_inventory_upload/cloud_status': [:index],
|
|
66
|
+
'foreman_inventory_upload/uploads_settings': [:index],
|
|
58
67
|
'react': [:index]
|
|
59
68
|
)
|
|
60
69
|
permission(
|
data/package.json
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'test_plugin_helper'
|
|
2
|
+
require 'unit/shared/access_permissions_test_base'
|
|
3
|
+
|
|
4
|
+
class RhCloudPermissionsTest < ActiveSupport::TestCase
|
|
5
|
+
include AccessPermissionsTestBase
|
|
6
|
+
|
|
7
|
+
check_routes(
|
|
8
|
+
Rails.application.routes,
|
|
9
|
+
[
|
|
10
|
+
'insights_cloud/api/machine_telemetries/forward_request',
|
|
11
|
+
'insights_cloud/api/machine_telemetries/branch_info',
|
|
12
|
+
],
|
|
13
|
+
skip_patterns: [/^(?!foreman_inventory_upload|insights_cloud|.*rh_cloud).*/]) # include only plugin paths
|
|
14
|
+
end
|
|
@@ -103,6 +103,21 @@ class TagsGeneratorTest < ActiveSupport::TestCase
|
|
|
103
103
|
assert_equal 0, actual.count
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
+
test 'truncates parameter tags' do
|
|
107
|
+
Setting[:include_parameter_tags] = true
|
|
108
|
+
|
|
109
|
+
@host.stubs(:host_params).returns(
|
|
110
|
+
{
|
|
111
|
+
'str_param' => 'a' * 251,
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
generator = create_generator
|
|
116
|
+
actual = Hash[generator.generate_parameters]
|
|
117
|
+
|
|
118
|
+
assert_equal 'Original value exceeds 250 characters', actual['str_param']
|
|
119
|
+
end
|
|
120
|
+
|
|
106
121
|
private
|
|
107
122
|
|
|
108
123
|
def create_generator
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { API } from 'foremanReact/redux/API';
|
|
2
|
-
import { addToast } from 'foremanReact/
|
|
2
|
+
import { addToast } from 'foremanReact/components/ToastsList';
|
|
3
3
|
import { inventoryUrl } from '../../ForemanInventoryHelpers';
|
|
4
4
|
import {
|
|
5
5
|
INVENTORY_ACCOUNT_STATUS_POLLING,
|
|
@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
|
|
|
4
4
|
import { FormGroup, TextInput } from '@patternfly/react-core';
|
|
5
5
|
import { noop } from 'foremanReact/common/helpers';
|
|
6
6
|
import { translate as __ } from 'foremanReact/common/I18n';
|
|
7
|
+
import { useForemanOrganization } from 'foremanReact/Root/Context/ForemanContext';
|
|
7
8
|
import ClearButton from './Components/ClearButton';
|
|
8
9
|
import './inventoryFilter.scss';
|
|
9
10
|
import { ANY_ORGANIZATION } from './InventoryFilterConstants';
|
|
@@ -12,13 +13,14 @@ const InventoryFilter = ({
|
|
|
12
13
|
handleFilterChange,
|
|
13
14
|
handleFilterClear,
|
|
14
15
|
filterTerm,
|
|
15
|
-
organization,
|
|
16
16
|
}) => {
|
|
17
17
|
useEffect(() => {
|
|
18
18
|
const initialTerm = organization === ANY_ORGANIZATION ? '' : organization;
|
|
19
19
|
handleFilterChange(initialTerm);
|
|
20
20
|
}, []);
|
|
21
21
|
|
|
22
|
+
const organization = useForemanOrganization()?.title;
|
|
23
|
+
|
|
22
24
|
return (
|
|
23
25
|
<form id="inventory_filter_form">
|
|
24
26
|
<FormGroup>
|
|
@@ -39,14 +41,12 @@ InventoryFilter.propTypes = {
|
|
|
39
41
|
handleFilterChange: PropTypes.func,
|
|
40
42
|
handleFilterClear: PropTypes.func,
|
|
41
43
|
filterTerm: PropTypes.string,
|
|
42
|
-
organization: PropTypes.string,
|
|
43
44
|
};
|
|
44
45
|
|
|
45
46
|
InventoryFilter.defaultProps = {
|
|
46
47
|
handleFilterChange: noop,
|
|
47
48
|
handleFilterClear: noop,
|
|
48
49
|
filterTerm: '',
|
|
49
|
-
organization: '',
|
|
50
50
|
};
|
|
51
51
|
|
|
52
52
|
export default InventoryFilter;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { bindActionCreators } from 'redux';
|
|
2
2
|
import { connect } from 'react-redux';
|
|
3
|
-
import { selectCurrentOrganization } from 'foremanReact/components/Layout/LayoutSelectors';
|
|
4
3
|
import reducer from './InventoryFilterReducer';
|
|
5
4
|
import * as actions from './InventoryFilterActions';
|
|
6
5
|
import InventoryFilter from './InventoryFilter';
|
|
@@ -10,7 +9,6 @@ export const reducers = { inventoryFilter: reducer };
|
|
|
10
9
|
|
|
11
10
|
const mapStateToProps = state => ({
|
|
12
11
|
filterTerm: selectFilterTerm(state),
|
|
13
|
-
organization: selectCurrentOrganization(state),
|
|
14
12
|
});
|
|
15
13
|
// map action dispatchers to props
|
|
16
14
|
const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
|
data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { post } from 'foremanReact/redux/API';
|
|
3
|
-
import { addToast } from 'foremanReact/
|
|
3
|
+
import { addToast } from 'foremanReact/components/ToastsList';
|
|
4
4
|
import { translate as __ } from 'foremanReact/common/I18n';
|
|
5
5
|
import { inventoryUrl } from '../../../../ForemanInventoryHelpers';
|
|
6
6
|
import Toast from './components/Toast';
|
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
|
|
3
3
|
import InventoryAutoUploadSwitcher from './ForemanInventoryUpload/SubscriptionsPageExtension/InventoryAutoUpload';
|
|
4
4
|
import NewHostDetailsTab from './InsightsHostDetailsTab/NewHostDetailsTab';
|
|
5
|
+
import InsightsTotalRiskCard from './InsightsHostDetailsTab/InsightsTotalRiskChart';
|
|
5
6
|
|
|
6
7
|
const fills = [
|
|
7
8
|
{
|
|
@@ -14,7 +15,13 @@ const fills = [
|
|
|
14
15
|
slot: 'host-details-page-tabs',
|
|
15
16
|
name: 'Insights',
|
|
16
17
|
component: props => <NewHostDetailsTab {...props} />,
|
|
17
|
-
weight:
|
|
18
|
+
weight: 400,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
slot: 'details-cards',
|
|
22
|
+
name: 'insights-total-risk-chart',
|
|
23
|
+
component: props => <InsightsTotalRiskCard {...props} />,
|
|
24
|
+
weight: 1100,
|
|
18
25
|
},
|
|
19
26
|
];
|
|
20
27
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { API } from 'foremanReact/redux/API';
|
|
2
|
-
import { addToast } from 'foremanReact/
|
|
2
|
+
import { addToast } from 'foremanReact/components/ToastsList';
|
|
3
3
|
import { insightsCloudUrl } from '../../InsightsCloudSyncHelpers';
|
|
4
4
|
import {
|
|
5
5
|
INSIGHTS_SYNC_SETTING_SET,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { API } from 'foremanReact/redux/API';
|
|
2
|
-
import { addToast } from 'foremanReact/
|
|
2
|
+
import { addToast } from 'foremanReact/components/ToastsList';
|
|
3
3
|
import { insightsCloudUrl } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
|
|
4
4
|
import {
|
|
5
5
|
INSIGHTS_HITS_REQUEST,
|
|
@@ -1,2 +1,77 @@
|
|
|
1
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
|
2
|
+
|
|
1
3
|
export const INSIGHTS_HITS_REQUEST = 'INSIGHTS_HITS_REQUEST';
|
|
2
4
|
export const INSIGHTS_HITS_SUCCESS = 'INSIGHTS_HITS_SUCCESS';
|
|
5
|
+
|
|
6
|
+
export const getInitialRisks = () => ({
|
|
7
|
+
1: {
|
|
8
|
+
value: 0,
|
|
9
|
+
title: __('Low'),
|
|
10
|
+
hoverFill: '#2b9af3',
|
|
11
|
+
},
|
|
12
|
+
2: {
|
|
13
|
+
value: 0,
|
|
14
|
+
title: __('Moderate'),
|
|
15
|
+
hoverFill: '#d5a632',
|
|
16
|
+
},
|
|
17
|
+
3: {
|
|
18
|
+
value: 0,
|
|
19
|
+
title: __('Important'),
|
|
20
|
+
hoverFill: '#ec7a08',
|
|
21
|
+
},
|
|
22
|
+
4: {
|
|
23
|
+
value: 0,
|
|
24
|
+
title: __('Critical'),
|
|
25
|
+
hoverFill: '#7d1007',
|
|
26
|
+
},
|
|
27
|
+
total: 0,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const colorScale = ['#bee1f4', '#f4c145', '#f4b678', '#c9190b'];
|
|
31
|
+
|
|
32
|
+
export const theme = {
|
|
33
|
+
legend: {
|
|
34
|
+
gutter: 20,
|
|
35
|
+
orientation: 'horizontal',
|
|
36
|
+
titleOrientation: 'top',
|
|
37
|
+
style: {
|
|
38
|
+
data: {
|
|
39
|
+
type: 'square',
|
|
40
|
+
},
|
|
41
|
+
labels: {
|
|
42
|
+
fontFamily: 'RedHatText',
|
|
43
|
+
fontSize: 14,
|
|
44
|
+
letterSpacing: 'normal',
|
|
45
|
+
padding: 10,
|
|
46
|
+
stroke: 'transparent',
|
|
47
|
+
fill: '#06c',
|
|
48
|
+
textDecorationColor: '#06c',
|
|
49
|
+
},
|
|
50
|
+
title: {
|
|
51
|
+
fontFamily: 'RedHatText',
|
|
52
|
+
fontSize: 14,
|
|
53
|
+
letterSpacing: 'normal',
|
|
54
|
+
padding: 2,
|
|
55
|
+
stroke: 'transparent',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
colorScale,
|
|
59
|
+
},
|
|
60
|
+
pie: {
|
|
61
|
+
colorScale,
|
|
62
|
+
height: 230,
|
|
63
|
+
padAngle: 1,
|
|
64
|
+
padding: 20,
|
|
65
|
+
style: {
|
|
66
|
+
data: { padding: 8, stroke: 'transparent', strokeWidth: 1 },
|
|
67
|
+
labels: {
|
|
68
|
+
fontFamily: 'RedHatText',
|
|
69
|
+
fontSize: 14,
|
|
70
|
+
letterSpacing: 'normal',
|
|
71
|
+
padding: 8,
|
|
72
|
+
stroke: 'transparent',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
width: 230,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import React, { useEffect, useState, useMemo } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { useDispatch } from 'react-redux';
|
|
4
|
+
import { push } from 'connected-react-router';
|
|
5
|
+
import { useHistory } from 'react-router-dom';
|
|
6
|
+
import { DropdownItem, Bullseye, Title } from '@patternfly/react-core';
|
|
7
|
+
import { ChartDonut, ChartLegend, ChartLabel } from '@patternfly/react-charts';
|
|
8
|
+
import { STATUS } from 'foremanReact/constants';
|
|
9
|
+
import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
|
|
10
|
+
import CardTemplate from 'foremanReact/components/HostDetails/Templates/CardItem/CardTemplate';
|
|
11
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
|
12
|
+
import SkeletonLoader from 'foremanReact/components/common/SkeletonLoader';
|
|
13
|
+
import { insightsCloudUrl } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
|
|
14
|
+
import { getInitialRisks, theme } from './InsightsTabConstants';
|
|
15
|
+
|
|
16
|
+
const InsightsTotalRiskCard = ({ hostDetails: { id } }) => {
|
|
17
|
+
const [totalRisks, setTotalRisks] = useState(getInitialRisks());
|
|
18
|
+
const hashHistory = useHistory();
|
|
19
|
+
const dispatch = useDispatch();
|
|
20
|
+
const API_KEY = `HOST_${id}_RECOMMENDATIONS`;
|
|
21
|
+
const API_OPTIONS = useMemo(() => ({ key: API_KEY }), [API_KEY]);
|
|
22
|
+
const {
|
|
23
|
+
status = STATUS.PENDING,
|
|
24
|
+
response: { hits = [] },
|
|
25
|
+
} = useAPI('get', insightsCloudUrl(`hits/${id}`), API_OPTIONS);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (status !== STATUS.PENDING) {
|
|
29
|
+
const risks = getInitialRisks();
|
|
30
|
+
hits.forEach(({ total_risk: risk }) => {
|
|
31
|
+
risks[risk].value += 1;
|
|
32
|
+
});
|
|
33
|
+
risks.total = hits.length;
|
|
34
|
+
setTotalRisks(risks);
|
|
35
|
+
}
|
|
36
|
+
}, [hits, status]);
|
|
37
|
+
|
|
38
|
+
const onChartClick = (evt, { index }) => {
|
|
39
|
+
hashHistory.push(`/Insights`);
|
|
40
|
+
dispatch(
|
|
41
|
+
push({
|
|
42
|
+
search: `search=total_risk+%3D+${index + 1}`,
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const onChartHover = (evt, { index }) => [
|
|
48
|
+
{
|
|
49
|
+
mutation: ({ style }) => ({
|
|
50
|
+
style: { ...style, fill: totalRisks[index + 1]?.hoverFill },
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const { 1: low, 2: moderate, 3: important, 4: critical, total } = totalRisks;
|
|
56
|
+
|
|
57
|
+
// eslint-disable-next-line react/prop-types
|
|
58
|
+
const LegendLabel = ({ index, ...rest }) => (
|
|
59
|
+
<a key={index} onClick={() => onChartClick(null, { index })}>
|
|
60
|
+
<ChartLabel {...rest} />
|
|
61
|
+
</a>
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const legend = (
|
|
65
|
+
<ChartLegend
|
|
66
|
+
height={400}
|
|
67
|
+
width={200}
|
|
68
|
+
fontSize={14}
|
|
69
|
+
rowGutter={{ top: -5, bottom: -5 }}
|
|
70
|
+
orientation="vertical"
|
|
71
|
+
labelComponent={<LegendLabel />}
|
|
72
|
+
data={[
|
|
73
|
+
{ name: `${low.title}: ${low.value}` },
|
|
74
|
+
{ name: `${moderate.title}: ${moderate.value}` },
|
|
75
|
+
{ name: `${important.title}: ${important.value}` },
|
|
76
|
+
{ name: `${critical.title}: ${critical.value}` },
|
|
77
|
+
]}
|
|
78
|
+
/>
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const cardBody = (
|
|
82
|
+
<ChartDonut
|
|
83
|
+
ariaDesc="Number of recommendations total-risks"
|
|
84
|
+
constrainToVisibleArea
|
|
85
|
+
data={[
|
|
86
|
+
{ x: low.title, y: low.value },
|
|
87
|
+
{ x: moderate.title, y: moderate.value },
|
|
88
|
+
{ x: important.title, y: important.value },
|
|
89
|
+
{ x: critical.title, y: critical.value },
|
|
90
|
+
]}
|
|
91
|
+
labels={({ datum: { x, y } }) => `${x}: ${y}`}
|
|
92
|
+
legendComponent={legend}
|
|
93
|
+
legendPosition="right"
|
|
94
|
+
subTitle="Recommendations"
|
|
95
|
+
title={`${total}`}
|
|
96
|
+
padding={{
|
|
97
|
+
bottom: 20,
|
|
98
|
+
left: 20,
|
|
99
|
+
right: 140,
|
|
100
|
+
top: 20,
|
|
101
|
+
}}
|
|
102
|
+
width={350}
|
|
103
|
+
theme={theme}
|
|
104
|
+
events={[
|
|
105
|
+
{
|
|
106
|
+
target: 'data',
|
|
107
|
+
eventHandlers: {
|
|
108
|
+
onClick: onChartClick,
|
|
109
|
+
onMouseOver: onChartHover,
|
|
110
|
+
onMouseOut: () => [{ mutation: () => null }],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
]}
|
|
114
|
+
/>
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<CardTemplate
|
|
119
|
+
header={__('Total Risks')}
|
|
120
|
+
dropdownItems={[
|
|
121
|
+
<DropdownItem
|
|
122
|
+
key="insights-tab"
|
|
123
|
+
onClick={() => hashHistory.push(`/Insights`)}
|
|
124
|
+
>
|
|
125
|
+
{__('View all recommendations')}
|
|
126
|
+
</DropdownItem>,
|
|
127
|
+
]}
|
|
128
|
+
>
|
|
129
|
+
<SkeletonLoader
|
|
130
|
+
status={status}
|
|
131
|
+
emptyState={
|
|
132
|
+
<Bullseye>
|
|
133
|
+
<Title headingLevel="h4"> {__('No results found')} </Title>
|
|
134
|
+
</Bullseye>
|
|
135
|
+
}
|
|
136
|
+
>
|
|
137
|
+
<div id="rh-cloud-total-risk-card">{cardBody}</div>
|
|
138
|
+
</SkeletonLoader>
|
|
139
|
+
</CardTemplate>
|
|
140
|
+
);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
InsightsTotalRiskCard.propTypes = {
|
|
144
|
+
hostDetails: PropTypes.object.isRequired,
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export default InsightsTotalRiskCard;
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
selectSearch,
|
|
21
21
|
selectHits,
|
|
22
22
|
} from '../InsightsCloudSync/Components/InsightsTable/InsightsTableSelectors';
|
|
23
|
-
import './InsightsTab.scss';
|
|
24
23
|
import { redHatAdvisorSystems } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
|
|
25
24
|
|
|
26
25
|
const NewHostDetailsTab = ({ hostName, router }) => {
|
data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js}
RENAMED
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { get } from 'foremanReact/redux/API';
|
|
3
3
|
import { withInterval } from 'foremanReact/redux/middlewares/IntervalMiddleware';
|
|
4
|
-
import { addToast } from 'foremanReact/
|
|
4
|
+
import { addToast } from 'foremanReact/components/ToastsList';
|
|
5
5
|
import { translate as __ } from 'foremanReact/common/I18n';
|
|
6
6
|
import { foremanTaskDetailsUrl } from './ForemanTasksHelpers';
|
|
7
7
|
import { foremanUrl } from '../../ForemanRhCloudHelpers';
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreman_rh_cloud
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.0.
|
|
4
|
+
version: 5.0.30
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Foreman Red Hat Cloud team
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-01-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: katello
|
|
@@ -176,6 +176,7 @@ files:
|
|
|
176
176
|
- app/views/layouts/foreman_rh_cloud/application.html.erb
|
|
177
177
|
- config/Gemfile.lock.gh_test
|
|
178
178
|
- config/database.yml.example
|
|
179
|
+
- config/package-lock.json
|
|
179
180
|
- config/package-lock.json.gh_test
|
|
180
181
|
- config/package-lock.json.plugin
|
|
181
182
|
- config/rh_cert-api_chain.pem
|
|
@@ -262,6 +263,7 @@ files:
|
|
|
262
263
|
- test/unit/insights_facet_test.rb
|
|
263
264
|
- test/unit/metadata_generator_test.rb
|
|
264
265
|
- test/unit/rh_cloud_http_proxy_test.rb
|
|
266
|
+
- test/unit/rh_cloud_permissions_test.rb
|
|
265
267
|
- test/unit/services/foreman_rh_cloud/branch_info_test.rb
|
|
266
268
|
- test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb
|
|
267
269
|
- test/unit/services/foreman_rh_cloud/cloud_status_service_test.rb
|
|
@@ -595,6 +597,7 @@ files:
|
|
|
595
597
|
- webpack/InsightsHostDetailsTab/InsightsTabConstants.js
|
|
596
598
|
- webpack/InsightsHostDetailsTab/InsightsTabReducer.js
|
|
597
599
|
- webpack/InsightsHostDetailsTab/InsightsTabSelectors.js
|
|
600
|
+
- webpack/InsightsHostDetailsTab/InsightsTotalRiskChart.js
|
|
598
601
|
- webpack/InsightsHostDetailsTab/NewHostDetailsTab.js
|
|
599
602
|
- webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js
|
|
600
603
|
- webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js
|
|
@@ -615,11 +618,10 @@ files:
|
|
|
615
618
|
- webpack/__mocks__/foremanReact/common/helpers.js
|
|
616
619
|
- webpack/__mocks__/foremanReact/components/Head.js
|
|
617
620
|
- webpack/__mocks__/foremanReact/components/Layout/LayoutConstants.js
|
|
618
|
-
- webpack/__mocks__/foremanReact/components/
|
|
621
|
+
- webpack/__mocks__/foremanReact/components/ToastsList/index.js
|
|
619
622
|
- webpack/__mocks__/foremanReact/constants.js
|
|
620
623
|
- webpack/__mocks__/foremanReact/redux/API/APISelectors.js
|
|
621
624
|
- webpack/__mocks__/foremanReact/redux/API/index.js
|
|
622
|
-
- webpack/__mocks__/foremanReact/redux/actions/toasts.js
|
|
623
625
|
- webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js
|
|
624
626
|
- webpack/__mocks__/foremanReact/routes/RouterSelector.js
|
|
625
627
|
- webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js
|
|
@@ -696,6 +698,7 @@ test_files:
|
|
|
696
698
|
- test/unit/insights_facet_test.rb
|
|
697
699
|
- test/unit/metadata_generator_test.rb
|
|
698
700
|
- test/unit/rh_cloud_http_proxy_test.rb
|
|
701
|
+
- test/unit/rh_cloud_permissions_test.rb
|
|
699
702
|
- test/unit/services/foreman_rh_cloud/branch_info_test.rb
|
|
700
703
|
- test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb
|
|
701
704
|
- test/unit/services/foreman_rh_cloud/cloud_status_service_test.rb
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const selectCurrentOrganization = state => 'some-org';
|