+ {i18n.translate('xpack.enterpriseSearch.versionMismatch.title', {
+ defaultMessage: 'Incompatible version error',
+ })}
+
+ }
+ titleSize="l"
+ body={
+ <>
+ {i18n.translate('xpack.enterpriseSearch.versionMismatch.body', {
+ defaultMessage:
+ 'Your Kibana and Enterprise Search versions do not match. To access Enterprise Search, use the same major and minor version for each service.',
+ })}
+
+
+ {i18n.translate('xpack.enterpriseSearch.versionMismatch.enterpriseSearchVersionText', {
+ defaultMessage: 'Enterprise Search version: {enterpriseSearchVersion}',
+ values: { enterpriseSearchVersion },
+ })}
+
+
+ {i18n.translate('xpack.enterpriseSearch.versionMismatch.kibanaVersionText', {
+ defaultMessage: 'Kibana version: {kibanaVersion}',
+ values: { kibanaVersion },
+ })}
+
+ >
+ }
+ />
+ );
+};
diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/version_mismatch/version_mismatch_page.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/version_mismatch/version_mismatch_page.test.tsx
new file mode 100644
index 0000000000000..d86a1187bd4b9
--- /dev/null
+++ b/x-pack/plugins/enterprise_search/public/applications/shared/version_mismatch/version_mismatch_page.test.tsx
@@ -0,0 +1,26 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import React from 'react';
+
+import { shallow } from 'enzyme';
+
+import { VersionMismatchError } from './version_mismatch_error';
+import { VersionMismatchPage } from './version_mismatch_page';
+
+describe('VersionMismatchPage', () => {
+ it('renders', () => {
+ const wrapper = shallow(
+
+ );
+ expect(wrapper.find(VersionMismatchError).exists()).toBe(true);
+ expect(wrapper.find(VersionMismatchError).props()).toEqual({
+ kibanaVersion: '8.1.0',
+ enterpriseSearchVersion: '8.0.0',
+ });
+ });
+});
diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/version_mismatch/version_mismatch_page.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/version_mismatch/version_mismatch_page.tsx
new file mode 100644
index 0000000000000..f60ccf2d19e50
--- /dev/null
+++ b/x-pack/plugins/enterprise_search/public/applications/shared/version_mismatch/version_mismatch_page.tsx
@@ -0,0 +1,23 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import React from 'react';
+
+import { KibanaPageTemplate } from '../../../../../../../src/plugins/kibana_react/public';
+
+import { VersionMismatchError } from './version_mismatch_error';
+
+interface Props {
+ enterpriseSearchVersion?: string;
+ kibanaVersion?: string;
+}
+
+export const VersionMismatchPage: React.FC = (props) => (
+
+
+
+);
diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx
index 3ddccde6abd33..7274ee8855705 100644
--- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx
@@ -15,6 +15,8 @@ import { Redirect } from 'react-router-dom';
import { shallow } from 'enzyme';
+import { VersionMismatchPage } from '../shared/version_mismatch';
+
import { WorkplaceSearchHeaderActions } from './components/layout';
import { SourceAdded } from './views/content_sources/components/source_added';
import { ErrorState } from './views/error_state';
@@ -24,6 +26,14 @@ import { SetupGuide } from './views/setup_guide';
import { WorkplaceSearch, WorkplaceSearchUnconfigured, WorkplaceSearchConfigured } from './';
describe('WorkplaceSearch', () => {
+ it('renders VersionMismatchPage when there are mismatching versions', () => {
+ const wrapper = shallow(
+
+ );
+
+ expect(wrapper.find(VersionMismatchPage)).toHaveLength(1);
+ });
+
it('renders WorkplaceSearchUnconfigured when config.host is not set', () => {
setMockValues({ config: { host: '' } });
const wrapper = shallow();
diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx
index 1ed77ea0fb1fd..2b24e09f96315 100644
--- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx
+++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx
@@ -10,9 +10,11 @@ import { Route, Redirect, Switch, useRouteMatch } from 'react-router-dom';
import { useActions, useValues } from 'kea';
+import { isVersionMismatch } from '../../../common/is_version_mismatch';
import { InitialAppData } from '../../../common/types';
import { HttpLogic } from '../shared/http';
import { KibanaLogic } from '../shared/kibana';
+import { VersionMismatchPage } from '../shared/version_mismatch';
import { AppLogic } from './app_logic';
import { WorkplaceSearchHeaderActions } from './components/layout';
@@ -47,13 +49,23 @@ import { SetupGuide } from './views/setup_guide';
export const WorkplaceSearch: React.FC = (props) => {
const { config } = useValues(KibanaLogic);
const { errorConnecting } = useValues(HttpLogic);
- return !config.host ? (
-
- ) : errorConnecting ? (
-
- ) : (
-
- );
+ const { enterpriseSearchVersion, kibanaVersion } = props;
+ const incompatibleVersions = isVersionMismatch(enterpriseSearchVersion, kibanaVersion);
+
+ if (!config.host) {
+ return ;
+ } else if (incompatibleVersions) {
+ return (
+
+ );
+ } else if (errorConnecting) {
+ return ;
+ }
+
+ return ;
};
export const WorkplaceSearchConfigured: React.FC = (props) => {
diff --git a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts
index ba600de298976..f6e3280a8abb2 100644
--- a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts
+++ b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts
@@ -41,7 +41,7 @@ describe('callEnterpriseSearchConfigAPI', () => {
const mockResponse = {
version: {
- number: '1.0.0',
+ number: '7.16.0',
},
settings: {
external_url: 'http://some.vanity.url/',
@@ -120,6 +120,7 @@ describe('callEnterpriseSearchConfigAPI', () => {
expect(await callEnterpriseSearchConfigAPI(mockDependencies)).toEqual({
...DEFAULT_INITIAL_APP_DATA,
+ kibanaVersion: '1.0.0',
access: {
hasAppSearchAccess: true,
hasWorkplaceSearchAccess: false,
@@ -132,6 +133,7 @@ describe('callEnterpriseSearchConfigAPI', () => {
(fetch as unknown as jest.Mock).mockReturnValueOnce(Promise.resolve(new Response('{}')));
expect(await callEnterpriseSearchConfigAPI(mockDependencies)).toEqual({
+ kibanaVersion: '1.0.0',
access: {
hasAppSearchAccess: false,
hasWorkplaceSearchAccess: false,
diff --git a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts
index d652d56c28efe..a427beb6769c9 100644
--- a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts
+++ b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts
@@ -12,6 +12,7 @@ import { kibanaPackageJson } from '@kbn/utils';
import { KibanaRequest, Logger } from 'src/core/server';
+import { isVersionMismatch } from '../../common/is_version_mismatch';
import { stripTrailingSlash } from '../../common/strip_slashes';
import { InitialAppData } from '../../common/types';
import { ConfigType } from '../index';
@@ -68,6 +69,8 @@ export const callEnterpriseSearchConfigAPI = async ({
warnMismatchedVersions(data?.version?.number, log);
return {
+ enterpriseSearchVersion: data?.version?.number,
+ kibanaVersion: kibanaPackageJson.version,
access: {
hasAppSearchAccess: !!data?.current_user?.access?.app_search,
hasWorkplaceSearchAccess: !!data?.current_user?.access?.workplace_search,
@@ -147,7 +150,7 @@ export const callEnterpriseSearchConfigAPI = async ({
export const warnMismatchedVersions = (enterpriseSearchVersion: string, log: Logger) => {
const kibanaVersion = kibanaPackageJson.version;
- if (enterpriseSearchVersion !== kibanaVersion) {
+ if (isVersionMismatch(enterpriseSearchVersion, kibanaVersion)) {
log.warn(
`Your Kibana instance (v${kibanaVersion}) is not the same version as your Enterprise Search instance (v${enterpriseSearchVersion}), which may cause unexpected behavior. Use matching versions for the best experience.`
);