diff --git a/frontend/packages/insights-plugin/locales/en/insights-plugin.json b/frontend/packages/insights-plugin/locales/en/insights-plugin.json
index 9fcd7a7c09d..f062ce97521 100644
--- a/frontend/packages/insights-plugin/locales/en/insights-plugin.json
+++ b/frontend/packages/insights-plugin/locales/en/insights-plugin.json
@@ -4,16 +4,19 @@
"important": "important",
"critical": "critical",
"Insights Advisor identifies and prioritizes risks to security, performance, availability, and stability of your clusters.": "Insights Advisor identifies and prioritizes risks to security, performance, availability, and stability of your clusters.",
- "Temporary unavailable.": "Temporary unavailable.",
- "Disabled or waiting for results.": "Disabled or waiting for results.",
+ "Temporarily unavailable.": "Temporarily unavailable.",
+ "Disabled.": "Disabled.",
+ "Waiting for results.": "Waiting for results.",
"Total issue": "Total issue",
"Total issue_plural": "Total issues",
"Total Risk": "Total Risk",
"Fixable issues": "Fixable issues",
- "View all in OpenShift Cluster Manager": "View all in OpenShift Cluster Manager",
- "Go to OpenShift Cluster Manager": "Go to OpenShift Cluster Manager",
+ "View all recommendations in Insights Advisor": "View all recommendations in Insights Advisor",
+ "View more in Insights Advisor": "View more in Insights Advisor",
"More about Insights": "More about Insights",
"Not available": "Not available",
+ "Disabled": "Disabled",
+ "Issues pending": "Issues pending",
"{{issuesNumber}} issue found": "{{issuesNumber}} issue found",
"{{issuesNumber}} issues found": "{{issuesNumber}} issues found",
"Insights": "Insights",
diff --git a/frontend/packages/insights-plugin/src/components/InsightsPopup/index.tsx b/frontend/packages/insights-plugin/src/components/InsightsPopup/index.tsx
index 3d31174c0cc..e92f82ad49f 100644
--- a/frontend/packages/insights-plugin/src/components/InsightsPopup/index.tsx
+++ b/frontend/packages/insights-plugin/src/components/InsightsPopup/index.tsx
@@ -10,8 +10,9 @@ import {
legendColorScale,
riskSorting,
mapMetrics,
- isWaitingOrDisabled as _isWaitingOrDisabled,
- isError as _isError,
+ isWaiting,
+ isDisabled,
+ isError,
} from './mappers';
import './style.scss';
@@ -21,16 +22,20 @@ const DataComponent: React.FC = ({ x, y, datum }) => {
};
export const InsightsPopup: React.FC = ({ responses, k8sResult }) => {
+ const [
+ { response: metricsResponse, error: metricsError },
+ { response: operatorStatusResponse, error: operatorStatusError },
+ ] = responses;
const { t } = useTranslation();
- const metrics = mapMetrics(responses[0].response);
+ const metrics = mapMetrics(metricsResponse);
const clusterID = (k8sResult as K8sResourceKind)?.data?.spec?.clusterID || '';
const riskEntries = Object.entries(metrics).sort(
([k1], [k2]) => riskSorting[k1] - riskSorting[k2],
);
const numberOfIssues = Object.values(metrics).reduce((acc, cur) => acc + cur, 0);
-
- const isWaitingOrDisabled = _isWaitingOrDisabled(metrics);
- const isError = _isError(metrics);
+ const waiting = isWaiting(metrics) || !metricsResponse || !operatorStatusResponse;
+ const error = isError(metrics) || metricsError || operatorStatusError;
+ const disabled = isDisabled(operatorStatusResponse);
const riskKeys = {
// t('insights-plugin~low')
@@ -50,18 +55,14 @@ export const InsightsPopup: React.FC = ({ responses,
'insights-plugin~Insights Advisor identifies and prioritizes risks to security, performance, availability, and stability of your clusters.',
)}
- {isError && (
-
- {t('insights-plugin~Temporary unavailable.')}
-
- )}
- {isWaitingOrDisabled && (
-
- {t('insights-plugin~Disabled or waiting for results.')}
-
- )}
-
- {!isWaitingOrDisabled && !isError && (
+ {error ? (
+
{t('insights-plugin~Temporarily unavailable.')}
+ ) : disabled ? (
+
{t('insights-plugin~Disabled.')}
+ ) : waiting ? (
+
{t('insights-plugin~Waiting for results.')}
+ ) : (
+
({
@@ -99,35 +100,32 @@ export const InsightsPopup: React.FC = ({ responses,
}}
/>
- )}
-
-
- {!isWaitingOrDisabled && !isError && clusterID && (
- <>
-
{t('insights-plugin~Fixable issues')}
+ {clusterID ? (
+ <>
+
{t('insights-plugin~Fixable issues')}
+
+
+
+ >
+ ) : (
- >
- )}
- {!isWaitingOrDisabled && !isError && !clusterID && (
-
-
-
- )}
- {(isWaitingOrDisabled || isError) && (
-
- )}
-
+ )}
+
+ )}
+ {(waiting || disabled || error) && (
+
+ )}
);
};
diff --git a/frontend/packages/insights-plugin/src/components/InsightsPopup/mappers.ts b/frontend/packages/insights-plugin/src/components/InsightsPopup/mappers.ts
index 0c3bb9f765b..11fa94ec466 100644
--- a/frontend/packages/insights-plugin/src/components/InsightsPopup/mappers.ts
+++ b/frontend/packages/insights-plugin/src/components/InsightsPopup/mappers.ts
@@ -57,7 +57,9 @@ export const mapMetrics = (response: PrometheusResponse): Metrics => {
// An error occurred while requesting Insights results (e.g. IO is turned off)
export const isError = (values: Metrics) => _.isEmpty(values);
-/* Insights Operator is disabled (e.g. pull-secret is removed) or has been
- just initialized and waiting for the first results. */
-export const isWaitingOrDisabled = (values: Metrics) =>
+// Insights Operator has been just initialized and waiting for the first results
+export const isWaiting = (values: Metrics) =>
Object.values(values).some((cur: number) => cur === -1);
+
+// Insights Operator is disabled by removing the pull secret
+export const isDisabled = (response) => !!parseInt(response?.data?.result?.[0]?.value?.[1], 10);
diff --git a/frontend/packages/insights-plugin/src/components/InsightsPopup/status.ts b/frontend/packages/insights-plugin/src/components/InsightsPopup/status.ts
index 2f1a74145fb..b5861fd47b5 100644
--- a/frontend/packages/insights-plugin/src/components/InsightsPopup/status.ts
+++ b/frontend/packages/insights-plugin/src/components/InsightsPopup/status.ts
@@ -3,31 +3,56 @@ import * as _ from 'lodash';
import { PrometheusResponse } from '@console/internal/components/graphs';
import { PrometheusHealthHandler, SubsystemHealth } from '@console/plugin-sdk';
import { HealthState } from '@console/shared/src/components/dashboard/status-card/states';
-import { mapMetrics, isError, isWaitingOrDisabled } from './mappers';
+import { mapMetrics, isError, isWaiting, isDisabled } from './mappers';
-export const getClusterInsightsComponentStatus = (
- response: PrometheusResponse,
- error,
+const getClusterInsightsComponentStatus = (
+ responses: {
+ response: PrometheusResponse;
+ error: any;
+ }[],
): SubsystemHealth => {
- if (error) {
+ const [
+ { response: metricsResponse, error: metricsError },
+ { response: operatorStatusResponse, error: operatorStatusError },
+ ] = responses;
+ const operatorDisabled = isDisabled(operatorStatusResponse);
+
+ // Unexpected error
+ if (metricsError || operatorStatusError) {
return {
state: HealthState.NOT_AVAILABLE,
message: i18next.t('insights-plugin~Not available'),
};
}
- if (!response) {
- return { state: HealthState.LOADING };
+ // Insights Operator is disabled
+ if (operatorDisabled) {
+ return {
+ state: HealthState.WARNING,
+ message: i18next.t('insights-plugin~Disabled'),
+ };
}
- const values = mapMetrics(response);
-
+ // Initializing Insights Operator
+ if (!metricsResponse || !operatorStatusResponse) {
+ return {
+ state: HealthState.PROGRESS,
+ message: i18next.t('insights-plugin~Issues pending'),
+ };
+ }
+ const values = mapMetrics(metricsResponse);
+ // Malformed metrics values
if (isError(values)) {
- return { state: HealthState.ERROR, message: i18next.t('insights-plugin~Not available') };
+ return {
+ state: HealthState.NOT_AVAILABLE,
+ message: i18next.t('insights-plugin~Not available'),
+ };
}
-
- if (!isError(values) && isWaitingOrDisabled(values)) {
- return { state: HealthState.UNKNOWN, message: i18next.t('insights-plugin~Not available') };
+ // Waiting for the first results
+ if (!isError(values) && isWaiting(values)) {
+ return {
+ state: HealthState.PROGRESS,
+ message: i18next.t('insights-plugin~Issues pending'),
+ };
}
-
// Insights Operator has sent rules results
const issuesNumber = Object.values(values).reduce((acc, cur) => acc + cur, 0);
const issueStr =
@@ -44,13 +69,11 @@ export const getClusterInsightsComponentStatus = (
};
export const getClusterInsightsStatus: PrometheusHealthHandler = (responses, t, cluster) => {
- const componentHealth = getClusterInsightsComponentStatus(
- responses[0].response,
- responses[0].error,
- );
- if (componentHealth.state === HealthState.LOADING || !_.get(cluster, 'loaded')) {
- return { state: HealthState.LOADING };
+ // Extra state for not yet loaded cluster
+ if (!_.get(cluster, 'loaded')) {
+ return {
+ state: HealthState.LOADING,
+ };
}
-
- return componentHealth;
+ return getClusterInsightsComponentStatus(responses);
};
diff --git a/frontend/packages/insights-plugin/src/plugin.tsx b/frontend/packages/insights-plugin/src/plugin.tsx
index 272e4edcf6d..3a28fdc8f63 100644
--- a/frontend/packages/insights-plugin/src/plugin.tsx
+++ b/frontend/packages/insights-plugin/src/plugin.tsx
@@ -12,8 +12,8 @@ const plugin: Plugin = [
// t('insights-plugin~Insights')
title: '%insights-plugin~Insights%',
queries: [
- "health_statuses_insights{metric=~'low|moderate|important|critical'}",
- 'insightsclient_request_send_total',
+ 'health_statuses_insights{metric=~"low|moderate|important|critical"}',
+ 'cluster_operator_conditions{name="insights", condition="Disabled"}',
],
healthHandler: getClusterInsightsStatus,
additionalResource: {