[UA] Show different interstital text when cluster is upgraded (#34762) (#34798)

This commit is contained in:
Josh Dover 2019-04-09 11:00:06 -05:00 committed by GitHub
parent 978c717cc8
commit 84ef0ff251
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 15 deletions

View file

@ -25,13 +25,19 @@ import { CheckupTab } from './tabs/checkup';
import { OverviewTab } from './tabs/overview';
import { LoadingState, TelemetryState, UpgradeAssistantTabProps } from './types';
enum ClusterUpgradeState {
needsUpgrade,
partiallyUpgraded,
upgraded,
}
interface TabsState {
loadingState: LoadingState;
loadingError?: Error;
checkupData?: UpgradeAssistantStatus;
selectedTabIndex: number;
telemetryState: TelemetryState;
upgradeableCluster: boolean;
clusterUpgradeState: ClusterUpgradeState;
}
export class UpgradeAssistantTabsUI extends React.Component<
@ -43,7 +49,7 @@ export class UpgradeAssistantTabsUI extends React.Component<
this.state = {
loadingState: LoadingState.Loading,
upgradeableCluster: true,
clusterUpgradeState: ClusterUpgradeState.needsUpgrade,
selectedTabIndex: 0,
telemetryState: TelemetryState.Complete,
};
@ -57,10 +63,10 @@ export class UpgradeAssistantTabsUI extends React.Component<
}
public render() {
const { selectedTabIndex, telemetryState, upgradeableCluster } = this.state;
const { selectedTabIndex, telemetryState, clusterUpgradeState } = this.state;
const tabs = this.tabs;
if (!upgradeableCluster) {
if (clusterUpgradeState === ClusterUpgradeState.partiallyUpgraded) {
return (
<EuiPageContent>
<EuiPageContentBody>
@ -79,7 +85,33 @@ export class UpgradeAssistantTabsUI extends React.Component<
<FormattedMessage
id="xpack.upgradeAssistant.tabs.upgradingInterstitial.upgradingDescription"
defaultMessage="One or more Elasticsearch nodes have a newer version of
Elasticsearch than Kibana. Once all your nodes are upgraded, install the latest version of Kibana."
Elasticsearch than Kibana. Once all your nodes are upgraded, upgrade Kibana."
/>
</p>
}
/>
</EuiPageContentBody>
</EuiPageContent>
);
} else if (clusterUpgradeState === ClusterUpgradeState.upgraded) {
return (
<EuiPageContent>
<EuiPageContentBody>
<EuiEmptyPrompt
iconType="logoElasticsearch"
title={
<h2>
<FormattedMessage
id="xpack.upgradeAssistant.tabs.upgradingInterstitial.upgradeCompleteTitle"
defaultMessage="Your cluster has been upgraded"
/>
</h2>
}
body={
<p>
<FormattedMessage
id="xpack.upgradeAssistant.tabs.upgradingInterstitial.upgradeCompleteDescription"
defaultMessage="All Elasticsearch nodes have been upgraded. You may now upgrade Kibana."
/>
</p>
}
@ -133,7 +165,9 @@ export class UpgradeAssistantTabsUI extends React.Component<
if (get(e, 'response.status') === 426) {
this.setState({
loadingState: LoadingState.Success,
upgradeableCluster: false,
clusterUpgradeState: get(e, 'response.data.attributes.allNodesUpgraded', false)
? ClusterUpgradeState.upgraded
: ClusterUpgradeState.partiallyUpgraded,
});
} else {
this.setState({ loadingState: LoadingState.Error, loadingError: e });

View file

@ -71,11 +71,11 @@ describe('EsVersionPrecheck', () => {
);
});
it('throws a 426 message when nodes are not on same version', async () => {
it('throws a 426 message w/ allNodesUpgraded = false when nodes are not on same version', async () => {
const fakeCallWithRequest = jest.fn().mockResolvedValue({
nodes: {
node1: { version: CURRENT_VERSION.raw },
node2: { version: CURRENT_VERSION.inc('major').raw },
node2: { version: new SemVer(CURRENT_VERSION.raw).inc('major').raw },
},
});
const fakeGetCluster = jest.fn(() => ({ callWithRequest: fakeCallWithRequest }));
@ -83,12 +83,31 @@ describe('EsVersionPrecheck', () => {
server: { plugins: { elasticsearch: { getCluster: fakeGetCluster } } },
} as any;
await expect(EsVersionPrecheck.method(fakeRequest, {} as any)).rejects.toHaveProperty(
'output.statusCode',
426
const result = EsVersionPrecheck.method(fakeRequest, {} as any);
await expect(result).rejects.toHaveProperty('output.statusCode', 426);
await expect(result).rejects.toHaveProperty(
'output.payload.attributes.allNodesUpgraded',
false
);
});
it('throws a 426 message w/ allNodesUpgraded = true when nodes are on next version', async () => {
const fakeCallWithRequest = jest.fn().mockResolvedValue({
nodes: {
node1: { version: new SemVer(CURRENT_VERSION.raw).inc('major').raw },
node2: { version: new SemVer(CURRENT_VERSION.raw).inc('major').raw },
},
});
const fakeGetCluster = jest.fn(() => ({ callWithRequest: fakeCallWithRequest }));
const fakeRequest = {
server: { plugins: { elasticsearch: { getCluster: fakeGetCluster } } },
} as any;
const result = EsVersionPrecheck.method(fakeRequest, {} as any);
await expect(result).rejects.toHaveProperty('output.statusCode', 426);
await expect(result).rejects.toHaveProperty('output.payload.attributes.allNodesUpgraded', true);
});
it('returns true when nodes are on same version', async () => {
const fakeCallWithRequest = jest.fn().mockResolvedValue({
nodes: {

View file

@ -31,15 +31,21 @@ export const getAllNodeVersions = async (callCluster: CallCluster) => {
export const verifyAllMatchKibanaVersion = (allNodeVersions: SemVer[]) => {
// Determine if all nodes in the cluster are running the same major version as Kibana.
const anyDifferentEsNodes = !!allNodeVersions.find(
const numDifferentVersion = allNodeVersions.filter(
esNodeVersion => esNodeVersion.major !== CURRENT_VERSION.major
);
).length;
const numSameVersion = allNodeVersions.filter(
esNodeVersion => esNodeVersion.major === CURRENT_VERSION.major
).length;
if (anyDifferentEsNodes) {
throw new Boom(`There are some nodes running a different version of Elasticsearch`, {
if (numDifferentVersion) {
const error = new Boom(`There are some nodes running a different version of Elasticsearch`, {
// 426 means "Upgrade Required" and is used when semver compatibility is not met.
statusCode: 426,
});
error.output.payload.attributes = { allNodesUpgraded: !numSameVersion };
throw error;
}
};