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: {