Skip to content

Commit

Permalink
ui: show alert on DB Console overview when upgrade is not finalized
Browse files Browse the repository at this point in the history
Display a warning on the DB Console overview page when all
the nodes are running on the new version, but the cluster
is not finalized.

Fixes #66987

Release note (ui change): Add warning to DB Console overview page
when all nodes are running on the new version, but the cluster
upgrade is not finalized.
  • Loading branch information
maryliag committed Jun 9, 2023
1 parent 89d3f29 commit 8c90351
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 6 deletions.
70 changes: 68 additions & 2 deletions pkg/ui/workspaces/db-console/src/redux/alerts.ts
Expand Up @@ -38,12 +38,16 @@ import {
} from "./apiReducers";
import {
singleVersionSelector,
numNodesByVersionsTagSelector,
numNodesByVersionsSelector,
} from "src/redux/nodes";
import { AdminUIState, AppDispatch } from "./state";
import * as docsURL from "src/util/docs";
import { getDataFromServer } from "../util/dataFromServer";
import { selectClusterSettings } from "./clusterSettings";
import {
selectClusterSettings,
selectClusterSettingVersion,
} from "./clusterSettings";
import { longToInt } from "src/util/fixLong";

export enum AlertLevel {
Expand Down Expand Up @@ -141,7 +145,7 @@ export const staggeredVersionDismissedSetting = new LocalSetting(
* This excludes decommissioned nodes.
*/
export const staggeredVersionWarningSelector = createSelector(
numNodesByVersionsSelector,
numNodesByVersionsTagSelector,
staggeredVersionDismissedSetting.selector,
(versionsMap, versionMismatchDismissed): Alert => {
if (versionMismatchDismissed) {
Expand Down Expand Up @@ -562,6 +566,67 @@ export const clusterPreserveDowngradeOptionOvertimeSelector = createSelector(
},
);

////////////////////////////////////////
// Upgrade not finalized.
////////////////////////////////////////
export const upgradeNotFinalizedDismissedSetting = new LocalSetting(
"upgrade_not_finalized_dismissed",
localSettingsSelector,
false,
);

/**
* Warning when all the nodes are running on the new version, but the cluster is not finalized.
*/
export const upgradeNotFinalizedWarningSelector = createSelector(
selectClusterSettings,
numNodesByVersionsSelector,
selectClusterSettingVersion,
upgradeNotFinalizedDismissedSetting.selector,
(
settings,
versionsMap,
clusterVersion,
upgradeNotFinalizedDismissed,
): Alert => {
if (upgradeNotFinalizedDismissed) {
return undefined;
}
// Don't show this warning if nodes are on different versions, since there is
// already an alert for that (staggeredVersionWarningSelector).
if (!versionsMap || versionsMap.size !== 1 || !clusterVersion) {
return undefined;
}
// Don't show this warning if cluster.preserve_downgrade_option is set,
// because it's expected for the upgrade not be finalized on that case and there is
// an alert for that (clusterPreserveDowngradeOptionOvertimeSelector)
const clusterPreserveDowngradeOption =
settings["cluster.preserve_downgrade_option"];
const value = clusterPreserveDowngradeOption?.value;
const lastUpdated = clusterPreserveDowngradeOption?.last_updated;
if (value && lastUpdated) {
return undefined;
}

const nodesVersion = versionsMap.keys().next().value;
// Prod: node version is 23.1 and cluster version is 23.1.
// Dev: node version is 23.1 and cluster version is 23.1-2.
if (clusterVersion.startsWith(nodesVersion)) {
return undefined;
}

return {
level: AlertLevel.WARNING,
title: "Upgrade not finalized.",
text: `All nodes are running on version ${nodesVersion}, but the cluster is on version ${clusterVersion}.`,
dismiss: (dispatch: AppDispatch) => {
dispatch(upgradeNotFinalizedDismissedSetting.set(true));
return Promise.resolve();
},
};
},
);

/**
* Selector which returns an array of all active alerts which should be
* displayed in the overview list page, these should be non-critical alerts.
Expand All @@ -570,6 +635,7 @@ export const clusterPreserveDowngradeOptionOvertimeSelector = createSelector(
export const overviewListAlertsSelector = createSelector(
staggeredVersionWarningSelector,
clusterPreserveDowngradeOptionOvertimeSelector,
upgradeNotFinalizedWarningSelector,
(...alerts: Alert[]): Alert[] => {
return _.without(alerts, null, undefined);
},
Expand Down
Expand Up @@ -84,3 +84,13 @@ export const selectIndexRecommendationsEnabled = createSelector(
return util.greaterOrEqualThanVersion(value, [22, 2, 0]);
},
);

export const selectClusterSettingVersion = createSelector(
selectClusterSettings,
(settings): string => {
if (!settings) {
return "";
}
return settings["version"].value;
},
);
6 changes: 3 additions & 3 deletions pkg/ui/workspaces/db-console/src/redux/nodes.spec.ts
Expand Up @@ -19,7 +19,7 @@ import {
selectStoreIDsByNodeID,
LivenessStatus,
sumNodeStats,
numNodesByVersionsSelector,
numNodesByVersionsTagSelector,
} from "./nodes";
import { nodesReducerObj, livenessReducerObj } from "./apiReducers";
import { createAdminUIStore } from "./state";
Expand Down Expand Up @@ -185,7 +185,7 @@ describe("node data selectors", function () {
});
});

describe("numNodesByVersionsSelector", () => {
describe("numNodesByVersionsTagSelector", () => {
it("correctly returns the different binary versions and the number of associated nodes", () => {
const data = [
{
Expand Down Expand Up @@ -214,7 +214,7 @@ describe("node data selectors", function () {
["v22.1", 2],
["v21.1.7", 1],
]);
expect(numNodesByVersionsSelector(state)).toEqual(expectedResult);
expect(numNodesByVersionsTagSelector(state)).toEqual(expectedResult);
});
});
});
Expand Down
22 changes: 21 additions & 1 deletion pkg/ui/workspaces/db-console/src/redux/nodes.ts
Expand Up @@ -515,7 +515,7 @@ export const versionsSelector = createSelector(validateNodesSelector, nodes =>
.value(),
);

export const numNodesByVersionsSelector = createSelector(
export const numNodesByVersionsTagSelector = createSelector(
validateNodesSelector,
nodes => {
if (!nodes) {
Expand All @@ -527,6 +527,26 @@ export const numNodesByVersionsSelector = createSelector(
},
);

export const numNodesByVersionsSelector = createSelector(
validateNodesSelector,
nodes => {
if (!nodes) {
return new Map();
}
return new Map(
Object.entries(
_.countBy(nodes, node => {
const serverVersion = node?.desc?.ServerVersion;
if (serverVersion) {
return `${serverVersion.major_val}.${serverVersion.minor_val}`;
}
return "";
}),
),
);
},
);

// Select the current build version of the cluster, returning undefined if the
// cluster's version is currently staggered.
export const singleVersionSelector = createSelector(
Expand Down

0 comments on commit 8c90351

Please sign in to comment.