foreman_rh_cloud 11.0.3 → 11.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/app/controllers/api/v2/advisor_engine/advisor_engine_controller.rb +98 -0
- data/app/controllers/api/v2/rh_cloud/advisor_engine_config_controller.rb +16 -0
- data/app/models/concerns/rh_cloud_host.rb +5 -0
- data/app/services/foreman_rh_cloud/cloud_connector.rb +1 -1
- data/app/services/foreman_rh_cloud/cloud_request.rb +1 -1
- data/app/services/foreman_rh_cloud/hits_uploader.rb +55 -0
- data/app/views/api/v2/advisor_engine/host_details.json.rabl +9 -0
- data/app/views/api/v2/hosts/insights/base.rabl +5 -0
- data/app/views/api/v2/hosts/insights/insights.rabl +3 -0
- data/config/routes.rb +6 -1
- data/db/migrate/20241217190624_add_unique_index_to_rule_id_and_host_id_in_insights_hits.rb +5 -0
- data/db/migrate/20241220184900_change_sync_insights_recommendations_to_true.rb +5 -0
- data/lib/foreman_inventory_upload/async/generate_all_reports_job.rb +21 -13
- data/lib/foreman_inventory_upload/async/upload_report_job.rb +1 -1
- data/lib/foreman_inventory_upload/generators/slice.rb +1 -1
- data/lib/foreman_rh_cloud/engine.rb +24 -5
- data/lib/foreman_rh_cloud/version.rb +1 -1
- data/lib/foreman_rh_cloud.rb +21 -31
- data/lib/insights_cloud/async/insights_scheduled_sync.rb +10 -2
- data/lib/inventory_sync/async/inventory_full_sync.rb +0 -10
- data/lib/inventory_sync/async/inventory_scheduled_sync.rb +15 -7
- data/package.json +1 -1
- data/test/controllers/insights_cloud/api/advisor_engine_controller_test.rb +48 -0
- data/test/controllers/insights_sync/settings_controller_test.rb +3 -0
- data/test/factories/insights_factories.rb +1 -1
- data/test/jobs/inventory_scheduled_sync_test.rb +10 -0
- data/test/unit/rh_cloud_http_proxy_test.rb +1 -26
- data/test/unit/services/foreman_rh_cloud/hits_uploader_test.rb +120 -0
- data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageTitle.test.js.snap +1 -1
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/CloudConnectorButton/CloudConnectorButton.js +2 -2
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/CloudConnectorButton/__tests__/__snapshots__/CloudConnectorButton.test.js.snap +2 -2
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/PageDescription.js +3 -1
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/__tests__/__snapshots__/PageDescription.test.js.snap +1 -1
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButton.test.js.snap +1 -1
- data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +1 -1
- data/webpack/ForemanInventoryUpload/ForemanInventoryConstants.js +1 -1
- data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +1 -1
- data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettings.js +26 -22
- data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +2 -1
- data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTable.js +10 -1
- data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTableConstants.js +8 -1
- data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTableHelpers.js +3 -1
- data/webpack/InsightsCloudSync/Components/ToolbarDropdown.js +5 -0
- data/webpack/InsightsCloudSync/InsightsCloudSync.js +1 -2
- data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +1 -1
- data/webpack/InsightsHostDetailsTab/NewHostDetailsTab.js +3 -1
- data/webpack/__mocks__/foremanReact/common/hooks/API/APIHooks.js +3 -0
- data/webpack/common/Hooks/ConfigHooks.js +19 -0
- metadata +17 -9
- data/webpack/InsightsCloudSync/Components/InsightsHeader/InsightsHeader.scss +0 -8
- data/webpack/InsightsCloudSync/Components/InsightsHeader/index.js +0 -16
- data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettings.test.js +0 -18
- data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettings.test.js.snap +0 -15
- data/webpack/InsightsCloudSync/Components/__tests__/InsightsHeader.test.js +0 -10
- data/webpack/InsightsCloudSync/Components/__tests__/__snapshots__/InsightsHeader.test.js.snap +0 -13
@@ -2,6 +2,9 @@ require 'test_plugin_helper'
|
|
2
2
|
|
3
3
|
class SettingsControllerTest < ActionController::TestCase
|
4
4
|
tests InsightsCloud::SettingsController
|
5
|
+
def setup
|
6
|
+
ForemanRhCloud.stubs(:with_local_advisor_engine?).returns(false)
|
7
|
+
end
|
5
8
|
|
6
9
|
test 'should return allow_auto_insights_sync setting' do
|
7
10
|
Setting[:allow_auto_insights_sync] = false
|
@@ -14,6 +14,16 @@ class InventoryScheduledSyncTest < ActiveSupport::TestCase
|
|
14
14
|
ForemanTasks.sync_task(InventorySync::Async::InventoryScheduledSync)
|
15
15
|
end
|
16
16
|
|
17
|
+
test 'Skips execution if with_local_advisor_engine? is true' do
|
18
|
+
ForemanRhCloud.stubs(:with_local_advisor_engine?).returns(true)
|
19
|
+
|
20
|
+
InventorySync::Async::InventoryScheduledSync.any_instance.expects(:plan_org_sync).never
|
21
|
+
|
22
|
+
task = ForemanTasks.sync_task(InventorySync::Async::InventoryScheduledSync)
|
23
|
+
status = task.output[:status].to_s
|
24
|
+
assert_match(/Foreman is configured with the use_local_advisor_engine option/, status)
|
25
|
+
end
|
26
|
+
|
17
27
|
test 'Skips execution if auto upload is disabled' do
|
18
28
|
Setting[:allow_auto_inventory_upload] = false
|
19
29
|
|
@@ -4,29 +4,12 @@ class RhCloudHttpProxyTest < ActiveSupport::TestCase
|
|
4
4
|
setup do
|
5
5
|
@global_content_proxy_mock = 'http://global:content@localhost:80'
|
6
6
|
@global_foreman_proxy_mock = 'http://global:foreman@localhost:80'
|
7
|
-
@katello_cdn_proxy_mock = {
|
8
|
-
host: 'localhost',
|
9
|
-
port: '80',
|
10
|
-
user: 'katello',
|
11
|
-
password: 'cdn',
|
12
|
-
scheme: 'http',
|
13
|
-
}
|
14
|
-
@katello_cdn_proxy_string_mock = 'http://katello:cdn@localhost:80'
|
15
7
|
end
|
16
8
|
|
17
9
|
test 'selects global content proxy' do
|
18
10
|
setup_global_content_proxy
|
19
11
|
setup_global_foreman_proxy
|
20
|
-
|
21
|
-
assert_equal @global_content_proxy_mock, ForemanRhCloud.proxy_setting
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
test 'selects cdn proxy' do
|
26
|
-
setup_global_foreman_proxy
|
27
|
-
setup_cdn_proxy do
|
28
|
-
assert_equal @katello_cdn_proxy_string_mock, ForemanRhCloud.proxy_setting
|
29
|
-
end
|
12
|
+
assert_equal @global_content_proxy_mock, ForemanRhCloud.proxy_setting
|
30
13
|
end
|
31
14
|
|
32
15
|
test 'selects global foreman proxy' do
|
@@ -44,14 +27,6 @@ class RhCloudHttpProxyTest < ActiveSupport::TestCase
|
|
44
27
|
Setting[:http_proxy] = @global_foreman_proxy_mock
|
45
28
|
end
|
46
29
|
|
47
|
-
def setup_cdn_proxy
|
48
|
-
old_cdn_setting = SETTINGS[:katello][:cdn_proxy]
|
49
|
-
SETTINGS[:katello][:cdn_proxy] = @katello_cdn_proxy_mock
|
50
|
-
yield
|
51
|
-
ensure
|
52
|
-
SETTINGS[:katello][:cdn_proxy] = old_cdn_setting
|
53
|
-
end
|
54
|
-
|
55
30
|
test 'transform proxy scheme test' do
|
56
31
|
mock_http_proxy = 'http://user:password@localhost:8888'
|
57
32
|
mock_https_proxy = 'https://user:password@localhost:8888'
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
|
3
|
+
class HitsUploaderTest < ActiveSupport::TestCase
|
4
|
+
PAYLOAD = {
|
5
|
+
resolutions: [
|
6
|
+
{
|
7
|
+
rule_id: "R123",
|
8
|
+
description: "Apply security patch to fix vulnerability CVE-2025-0001.",
|
9
|
+
needs_reboot: true,
|
10
|
+
resolution_risk: "Medium",
|
11
|
+
resolution_type: "fix",
|
12
|
+
},
|
13
|
+
{
|
14
|
+
rule_id: "R124",
|
15
|
+
description: "Update configuration file to improve system stability.",
|
16
|
+
needs_reboot: false,
|
17
|
+
resolution_risk: "Low",
|
18
|
+
resolution_type: "fix",
|
19
|
+
},
|
20
|
+
],
|
21
|
+
rules: [
|
22
|
+
{
|
23
|
+
rule_id: "R123",
|
24
|
+
description: "Security patch for CVE-2025-0001.",
|
25
|
+
category_name: "Security",
|
26
|
+
impact_name: "High",
|
27
|
+
summary: "Fixes critical vulnerability.",
|
28
|
+
generic: "Security updates are mandatory.",
|
29
|
+
reason: "Vulnerability exposed in external audit.",
|
30
|
+
total_risk: 5,
|
31
|
+
reboot_required: true,
|
32
|
+
more_info: "https://example.com/security-update",
|
33
|
+
rating: 4.8,
|
34
|
+
},
|
35
|
+
{
|
36
|
+
rule_id: "R124",
|
37
|
+
description: "Configuration update to improve performance.",
|
38
|
+
category_name: "Availability",
|
39
|
+
impact_name: "Medium",
|
40
|
+
summary: "Improves application stability and reduces crashes.",
|
41
|
+
generic: "Periodic updates recommended.",
|
42
|
+
reason: "Frequent crashes observed in logs.",
|
43
|
+
total_risk: 3,
|
44
|
+
reboot_required: false,
|
45
|
+
more_info: "https://example.com/config-update",
|
46
|
+
rating: 4.0,
|
47
|
+
},
|
48
|
+
],
|
49
|
+
hits: [
|
50
|
+
{
|
51
|
+
rule_id: "R123",
|
52
|
+
title: "Critical Vulnerability Patch",
|
53
|
+
solution_url: "https://example.com/solution",
|
54
|
+
total_risk: 5,
|
55
|
+
likelihood: 4,
|
56
|
+
publish_date: "2025-01-01",
|
57
|
+
results_url: "https://example.com/results",
|
58
|
+
},
|
59
|
+
{
|
60
|
+
rule_id: "R124",
|
61
|
+
title: "Configuration Update",
|
62
|
+
solution_url: "https://example.com/config-solution",
|
63
|
+
total_risk: 3,
|
64
|
+
likelihood: 3,
|
65
|
+
publish_date: "2025-01-02",
|
66
|
+
results_url: "https://example.com/config-results",
|
67
|
+
},
|
68
|
+
],
|
69
|
+
details: "{\"summary\": \"Detected issues and resolutions applied successfully.\"}",
|
70
|
+
}.freeze
|
71
|
+
|
72
|
+
setup do
|
73
|
+
@host = FactoryBot.create(:host)
|
74
|
+
@uuid = SecureRandom.uuid
|
75
|
+
uploader = ForemanRhCloud::HitsUploader.new(host: @host, payload: PAYLOAD, uuid: @uuid)
|
76
|
+
uploader.upload!
|
77
|
+
@host.reload
|
78
|
+
end
|
79
|
+
|
80
|
+
test 'facets' do
|
81
|
+
assert_equal @uuid, @host.insights_facet.uuid
|
82
|
+
end
|
83
|
+
|
84
|
+
test 'hits' do
|
85
|
+
assert_equal PAYLOAD[:hits].count, @host.insights_facet.hits_count
|
86
|
+
assert_includes @host.insights_facet.hits.pluck(:rule_id), "R124"
|
87
|
+
end
|
88
|
+
|
89
|
+
test "resolutions" do
|
90
|
+
assert_equal 2, InsightsResolution.where(rule_id: ["R123", "R124"]).count
|
91
|
+
end
|
92
|
+
|
93
|
+
test "details" do
|
94
|
+
fact_name = FactName.where(name: "insights::hit_details").first
|
95
|
+
fact_value = @host.fact_values.where(fact_name: fact_name).first
|
96
|
+
refute_nil fact_value
|
97
|
+
assert_equal PAYLOAD[:details], fact_value.value
|
98
|
+
end
|
99
|
+
|
100
|
+
test "empty payload" do
|
101
|
+
payload = {
|
102
|
+
resolutions: [],
|
103
|
+
rules: [],
|
104
|
+
hits: [],
|
105
|
+
details: "",
|
106
|
+
}
|
107
|
+
|
108
|
+
@host = FactoryBot.create(:host)
|
109
|
+
@uuid = SecureRandom.uuid
|
110
|
+
uploader = ForemanRhCloud::HitsUploader.new(host: @host, payload: payload, uuid: @uuid)
|
111
|
+
uploader.upload!
|
112
|
+
@host.reload
|
113
|
+
assert_equal @uuid, @host.insights_facet.uuid
|
114
|
+
assert_empty @host.insights_facet.hits
|
115
|
+
assert_equal 0, @host.insights_facet.hits_count
|
116
|
+
fact_name = FactName.where(name: "insights::hit_details").first
|
117
|
+
fact_value = @host.fact_values.where(fact_name: fact_name).first
|
118
|
+
assert_nil fact_value
|
119
|
+
end
|
120
|
+
end
|
@@ -24,7 +24,7 @@ exports[`PageTitle rendering render without Props 1`] = `
|
|
24
24
|
dropdownItems={
|
25
25
|
Array [
|
26
26
|
<DropdownItem
|
27
|
-
href="/foreman_tasks/tasks?search=
|
27
|
+
href="/foreman_tasks/tasks?search=label+%3D+ForemanInventoryUpload%3A%3AAsync%3A%3AGenerateReportJob+or+label+%3D+ForemanInventoryUpload%3A%3AAsync%3A%3AGenerateAllReportsJob&page=1"
|
28
28
|
rel="noopener noreferrer"
|
29
29
|
target="_blank"
|
30
30
|
>
|
@@ -37,14 +37,14 @@ export const CloudConnectorButton = ({ status, onClick, jobLink }) => {
|
|
37
37
|
if (status === CONNECTOR_STATUS.RESOLVED) {
|
38
38
|
return (
|
39
39
|
<Button variant="secondary" onClick={onClick}>
|
40
|
-
{__('Reconfigure
|
40
|
+
{__('Reconfigure cloud connector')}
|
41
41
|
</Button>
|
42
42
|
);
|
43
43
|
}
|
44
44
|
|
45
45
|
return (
|
46
46
|
<Button variant="secondary" onClick={onClick}>
|
47
|
-
{__('Configure
|
47
|
+
{__('Configure cloud connector')}
|
48
48
|
</Button>
|
49
49
|
);
|
50
50
|
};
|
@@ -5,7 +5,7 @@ exports[`CloudConnectorButton render no cloud connector 1`] = `
|
|
5
5
|
onClick={[MockFunction]}
|
6
6
|
variant="secondary"
|
7
7
|
>
|
8
|
-
Configure
|
8
|
+
Configure cloud connector
|
9
9
|
</Button>
|
10
10
|
`;
|
11
11
|
|
@@ -51,6 +51,6 @@ exports[`CloudConnectorButton render resolved cloud connector 1`] = `
|
|
51
51
|
onClick={[MockFunction]}
|
52
52
|
variant="secondary"
|
53
53
|
>
|
54
|
-
Reconfigure
|
54
|
+
Reconfigure cloud connector
|
55
55
|
</Button>
|
56
56
|
`;
|
@@ -34,7 +34,9 @@ export const PageDescription = () => (
|
|
34
34
|
'To manually upload the data for a specific organization, select an organization and click {restartButtonName}.'
|
35
35
|
)}
|
36
36
|
values={{
|
37
|
-
restartButtonName:
|
37
|
+
restartButtonName: (
|
38
|
+
<strong>{__('Generate and upload report')}</strong>
|
39
|
+
),
|
38
40
|
}}
|
39
41
|
/>
|
40
42
|
</Text>
|
@@ -6,6 +6,6 @@ export const DOCS_BUTTON_TEXT = __('Documentation');
|
|
6
6
|
|
7
7
|
export const ACTIONS_HISTORY_BUTTON_TEXT = __('Actions history');
|
8
8
|
|
9
|
-
export const SYNC_BUTTON_TEXT = __(' Sync inventory status');
|
9
|
+
export const SYNC_BUTTON_TEXT = __(' Sync all inventory status');
|
10
10
|
|
11
11
|
export const CLOUD_PING_TITLE = __('Connectivity test');
|
@@ -13,7 +13,7 @@ export const getInventoryDocsUrl = () =>
|
|
13
13
|
|
14
14
|
export const getActionsHistoryUrl = () =>
|
15
15
|
foremanUrl(
|
16
|
-
'/foreman_tasks/tasks?search=
|
16
|
+
'/foreman_tasks/tasks?search=label+%3D+ForemanInventoryUpload%3A%3AAsync%3A%3AGenerateReportJob+or+label+%3D+ForemanInventoryUpload%3A%3AAsync%3A%3AGenerateAllReportsJob&page=1'
|
17
17
|
);
|
18
18
|
|
19
19
|
export const isExitCodeLoading = exitCode => {
|
@@ -1,32 +1,36 @@
|
|
1
|
-
import React, {
|
1
|
+
import React, { useEffect } from 'react';
|
2
2
|
import PropTypes from 'prop-types';
|
3
3
|
import { translate as __ } from 'foremanReact/common/I18n';
|
4
4
|
import SwitcherPF4 from '../../../common/Switcher/SwitcherPF4';
|
5
5
|
import './insightsSettings.scss';
|
6
|
+
import { useAdvisorEngineConfig } from '../../../common/Hooks/ConfigHooks';
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
const InsightsSettings = ({
|
9
|
+
insightsSyncEnabled,
|
10
|
+
getInsightsSyncSettings,
|
11
|
+
setInsightsSyncEnabled,
|
12
|
+
}) => {
|
13
|
+
const isLocalAdvisorEngine = useAdvisorEngineConfig();
|
14
|
+
useEffect(() => {
|
10
15
|
getInsightsSyncSettings();
|
11
|
-
}
|
16
|
+
}, [getInsightsSyncSettings]);
|
12
17
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
18
|
+
if (isLocalAdvisorEngine) return null;
|
19
|
+
|
20
|
+
return (
|
21
|
+
<div className="insights_settings">
|
22
|
+
<SwitcherPF4
|
23
|
+
id="insights_sync_switcher"
|
24
|
+
label={__('Sync automatically')}
|
25
|
+
tooltip={__(
|
26
|
+
'Enable automatic synchronization of Insights recommendations from the Red Hat cloud'
|
27
|
+
)}
|
28
|
+
isChecked={insightsSyncEnabled}
|
29
|
+
onChange={() => setInsightsSyncEnabled(!insightsSyncEnabled)}
|
30
|
+
/>
|
31
|
+
</div>
|
32
|
+
);
|
33
|
+
};
|
30
34
|
|
31
35
|
InsightsSettings.propTypes = {
|
32
36
|
insightsSyncEnabled: PropTypes.bool.isRequired,
|
@@ -12,6 +12,7 @@ import TableEmptyState from '../../../common/table/EmptyState';
|
|
12
12
|
import { modifySelectedRows, getSortColumnIndex } from './InsightsTableHelpers';
|
13
13
|
import Pagination from './Pagination';
|
14
14
|
import './table.scss';
|
15
|
+
import { useAdvisorEngineConfig } from '../../../common/Hooks/ConfigHooks';
|
15
16
|
|
16
17
|
const InsightsTable = ({
|
17
18
|
page,
|
@@ -43,9 +44,17 @@ const InsightsTable = ({
|
|
43
44
|
fetchInsights({ page, perPage, query, sortBy, sortOrder });
|
44
45
|
}, [hostname]);
|
45
46
|
|
47
|
+
const isLocalAdvisorEngine = useAdvisorEngineConfig();
|
48
|
+
|
46
49
|
useEffect(() => {
|
47
50
|
setRows(
|
48
|
-
modifySelectedRows(
|
51
|
+
modifySelectedRows(
|
52
|
+
hits,
|
53
|
+
selectedIds,
|
54
|
+
showSelectAllAlert,
|
55
|
+
hideHost,
|
56
|
+
isLocalAdvisorEngine
|
57
|
+
)
|
49
58
|
);
|
50
59
|
|
51
60
|
if (hideHost) setColumns(getColumnsWithoutHostname());
|
@@ -31,10 +31,11 @@ export const hasPlaybookFormatter = ({ title: hasPlaybook }) => ({
|
|
31
31
|
});
|
32
32
|
|
33
33
|
export const actionsFormatter = (props, { rowData = {} }) => {
|
34
|
-
const { recommendationUrl, accessRHUrl } = rowData;
|
34
|
+
const { recommendationUrl, accessRHUrl, isLocalAdvisorEngine } = rowData;
|
35
35
|
const dropdownItems = [];
|
36
36
|
|
37
37
|
recommendationUrl &&
|
38
|
+
!isLocalAdvisorEngine &&
|
38
39
|
dropdownItems.push(
|
39
40
|
<DropdownItem key="recommendation-url">
|
40
41
|
<a href={recommendationUrl} target="_blank" rel="noopener noreferrer">
|
@@ -121,4 +122,10 @@ export const INSIGHTS_SET_SELECT_ALL_ALERT = 'INSIGHTS_SET_SELECT_ALL_ALERT';
|
|
121
122
|
|
122
123
|
export const INSIGHTS_SET_SELECT_ALL = 'INSIGHTS_SET_SELECT_ALL';
|
123
124
|
|
125
|
+
export const ADVISOR_ENGINE_CONFIG_KEY = 'ADVISOR_ENGINE_CONFIG';
|
126
|
+
|
127
|
+
export const ADVISOR_ENGINE_CONFIG_PATH = foremanUrl(
|
128
|
+
'/api/v2/rh_cloud/advisor_engine_config'
|
129
|
+
);
|
130
|
+
|
124
131
|
export const NEW_HOST_PATH = '/new/hosts/';
|
@@ -6,7 +6,8 @@ export const modifySelectedRows = (
|
|
6
6
|
hits,
|
7
7
|
selectedIds,
|
8
8
|
showSelectAllAlert,
|
9
|
-
hideHost
|
9
|
+
hideHost,
|
10
|
+
isLocalAdvisorEngine
|
10
11
|
) => {
|
11
12
|
if (hits.length === 0) return [];
|
12
13
|
|
@@ -34,6 +35,7 @@ export const modifySelectedRows = (
|
|
34
35
|
selected: selectedIds[id] || (disableCheckbox && showSelectAllAlert),
|
35
36
|
recommendationUrl: results_url,
|
36
37
|
accessRHUrl: solution_url,
|
38
|
+
isLocalAdvisorEngine,
|
37
39
|
};
|
38
40
|
}
|
39
41
|
);
|
@@ -4,9 +4,14 @@ import { translate as __ } from 'foremanReact/common/I18n';
|
|
4
4
|
import { Dropdown, DropdownItem, KebabToggle } from '@patternfly/react-core';
|
5
5
|
import { ExternalLinkAltIcon } from '@patternfly/react-icons';
|
6
6
|
import { redHatAdvisorSystems } from '../InsightsCloudSyncHelpers';
|
7
|
+
import { useAdvisorEngineConfig } from '../../common/Hooks/ConfigHooks';
|
7
8
|
|
8
9
|
const ToolbarDropdown = ({ onRecommendationSync }) => {
|
9
10
|
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
11
|
+
const isLocalAdvisorEngine = useAdvisorEngineConfig();
|
12
|
+
if (isLocalAdvisorEngine) {
|
13
|
+
return null;
|
14
|
+
}
|
10
15
|
const dropdownItems = [
|
11
16
|
<DropdownItem
|
12
17
|
key="recommendation-manual-sync"
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import PropTypes from 'prop-types';
|
3
3
|
import PageLayout from 'foremanReact/routes/common/PageLayout/PageLayout';
|
4
|
-
import InsightsHeader from './Components/InsightsHeader';
|
5
4
|
import InsightsTable from './Components/InsightsTable';
|
6
5
|
import RemediationModal from './Components/RemediationModal';
|
7
6
|
import {
|
@@ -37,7 +36,7 @@ const InsightsCloudSync = ({ syncInsights, query, fetchInsights }) => {
|
|
37
36
|
header={INSIGHTS_SYNC_PAGE_TITLE}
|
38
37
|
toolbarButtons={toolbarButtons}
|
39
38
|
searchQuery={query}
|
40
|
-
beforeToolbarComponent={
|
39
|
+
beforeToolbarComponent={null}
|
41
40
|
>
|
42
41
|
<InsightsTable />
|
43
42
|
</PageLayout>
|
@@ -21,11 +21,13 @@ import {
|
|
21
21
|
selectHits,
|
22
22
|
} from '../InsightsCloudSync/Components/InsightsTable/InsightsTableSelectors';
|
23
23
|
import { redHatAdvisorSystems } from '../InsightsCloudSync/InsightsCloudSyncHelpers';
|
24
|
+
import { useAdvisorEngineConfig } from '../common/Hooks/ConfigHooks';
|
24
25
|
|
25
26
|
const NewHostDetailsTab = ({ hostName, router }) => {
|
26
27
|
const dispatch = useDispatch();
|
27
28
|
const query = useSelector(selectSearch);
|
28
29
|
const hits = useSelector(selectHits);
|
30
|
+
const isLocalAdvisorEngine = useAdvisorEngineConfig();
|
29
31
|
|
30
32
|
useEffect(() => () => router.replace({ search: null }), [router]);
|
31
33
|
|
@@ -41,7 +43,7 @@ const NewHostDetailsTab = ({ hostName, router }) => {
|
|
41
43
|
</DropdownItem>,
|
42
44
|
];
|
43
45
|
|
44
|
-
if (hits.length) {
|
46
|
+
if (hits.length && !isLocalAdvisorEngine) {
|
45
47
|
const { host_uuid: uuid } = hits[0];
|
46
48
|
dropdownItems.push(
|
47
49
|
<DropdownItem key="insights-advisor-link" ouiaId="insights-advisor-link">
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
|
2
|
+
import {
|
3
|
+
ADVISOR_ENGINE_CONFIG_KEY,
|
4
|
+
ADVISOR_ENGINE_CONFIG_PATH,
|
5
|
+
} from '../../InsightsCloudSync/Components/InsightsTable/InsightsTableConstants';
|
6
|
+
|
7
|
+
export const useAdvisorEngineConfig = () => {
|
8
|
+
const { response: advisorEngineConfig } = useAPI(
|
9
|
+
'get',
|
10
|
+
ADVISOR_ENGINE_CONFIG_PATH,
|
11
|
+
{
|
12
|
+
key: ADVISOR_ENGINE_CONFIG_KEY,
|
13
|
+
}
|
14
|
+
);
|
15
|
+
|
16
|
+
// eslint-disable-next-line camelcase
|
17
|
+
const isLocalAdvisorEngine = advisorEngineConfig?.use_local_advisor_engine;
|
18
|
+
return isLocalAdvisorEngine;
|
19
|
+
};
|