diff --git a/examples/guided_onboarding_example/public/components/app.tsx b/examples/guided_onboarding_example/public/components/app.tsx index 1a1083a10f1f..2812697f37c5 100755 --- a/examples/guided_onboarding_example/public/components/app.tsx +++ b/examples/guided_onboarding_example/public/components/app.tsx @@ -11,13 +11,7 @@ import { FormattedMessage, I18nProvider } from '@kbn/i18n-react'; import { Router, Switch } from 'react-router-dom'; import { Route } from '@kbn/shared-ux-router'; -import { - EuiPage, - EuiPageBody, - EuiPageContent_Deprecated as EuiPageContent, - EuiPageHeader, - EuiTitle, -} from '@elastic/eui'; +import { EuiPageTemplate } from '@elastic/eui'; import { CoreStart, ScopedHistory } from '@kbn/core/public'; @@ -39,19 +33,17 @@ export const GuidedOnboardingExampleApp = (props: GuidedOnboardingExampleAppDeps return ( - - - - -

- -

-
-
- + + + } + /> + {guidedOnboarding.guidedOnboardingApi?.isEnabled ? ( + @@ -75,9 +67,31 @@ export const GuidedOnboardingExampleApp = (props: GuidedOnboardingExampleAppDeps /> - -
-
+ + ) : ( + + + + } + body={ +

+ +

+ } + /> + )} +
); }; diff --git a/src/plugins/guided_onboarding/common/constants.ts b/src/plugins/guided_onboarding/common/constants.ts index 1ab45d3659d7..899666bc757c 100755 --- a/src/plugins/guided_onboarding/common/constants.ts +++ b/src/plugins/guided_onboarding/common/constants.ts @@ -9,4 +9,6 @@ export const PLUGIN_ID = 'guidedOnboarding'; export const PLUGIN_NAME = 'guidedOnboarding'; +export const PLUGIN_FEATURE = 'guidedOnboardingFeature'; + export const API_BASE_PATH = '/internal/guided_onboarding'; diff --git a/src/plugins/guided_onboarding/kibana.jsonc b/src/plugins/guided_onboarding/kibana.jsonc index e816f0e027fe..300df79253da 100644 --- a/src/plugins/guided_onboarding/kibana.jsonc +++ b/src/plugins/guided_onboarding/kibana.jsonc @@ -8,7 +8,8 @@ "server": true, "browser": true, "optionalPlugins": [ - "cloud" + "cloud", + "features" ], "requiredBundles": [ "kibanaReact" diff --git a/src/plugins/guided_onboarding/public/mocks.ts b/src/plugins/guided_onboarding/public/mocks.ts index e190ddbcc219..a6fb3ae40da9 100644 --- a/src/plugins/guided_onboarding/public/mocks.ts +++ b/src/plugins/guided_onboarding/public/mocks.ts @@ -28,6 +28,7 @@ const apiServiceMock: jest.Mocked = { isGuidePanelOpen$: new BehaviorSubject(false), isLoading$: new BehaviorSubject(false), getGuideConfig: jest.fn(), + isEnabled: true, }, }; diff --git a/src/plugins/guided_onboarding/public/plugin.tsx b/src/plugins/guided_onboarding/public/plugin.tsx index 97eac765c5dd..8f37552ae53d 100755 --- a/src/plugins/guided_onboarding/public/plugin.tsx +++ b/src/plugins/guided_onboarding/public/plugin.tsx @@ -21,6 +21,8 @@ import { } from '@kbn/core/public'; import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; + +import { PLUGIN_FEATURE } from '../common/constants'; import type { AppPluginStartDependencies, GuidedOnboardingPluginSetup, @@ -43,11 +45,12 @@ export class GuidedOnboardingPlugin ): GuidedOnboardingPluginStart { const { chrome, http, theme, application, notifications, uiSettings } = core; + // Guided onboarding UI is only available on cloud and if the access to the Kibana feature is granted + const isEnabled = !!(cloud?.isCloudEnabled && application.capabilities[PLUGIN_FEATURE].enabled); // Initialize services - apiService.setup(http, !!cloud?.isCloudEnabled); + apiService.setup(http, isEnabled); - // Guided onboarding UI is only available on cloud - if (cloud?.isCloudEnabled) { + if (isEnabled) { chrome.navControls.registerExtension({ order: 1000, mount: (target) => diff --git a/src/plugins/guided_onboarding/public/services/api.service.ts b/src/plugins/guided_onboarding/public/services/api.service.ts index d3d20143f600..271a9afa9b56 100644 --- a/src/plugins/guided_onboarding/public/services/api.service.ts +++ b/src/plugins/guided_onboarding/public/services/api.service.ts @@ -41,15 +41,15 @@ import { import { ConfigService } from './config.service'; export class ApiService implements GuidedOnboardingApi { - private isCloudEnabled: boolean | undefined; + private _isEnabled: boolean = false; private client: HttpSetup | undefined; private pluginState$!: BehaviorSubject; public isLoading$ = new BehaviorSubject(false); public isGuidePanelOpen$: BehaviorSubject = new BehaviorSubject(false); private configService = new ConfigService(); - public setup(httpClient: HttpSetup, isCloudEnabled: boolean) { - this.isCloudEnabled = isCloudEnabled; + public setup(httpClient: HttpSetup, isEnabled: boolean) { + this._isEnabled = isEnabled; this.client = httpClient; this.pluginState$ = new BehaviorSubject(undefined); this.isGuidePanelOpen$ = new BehaviorSubject(false); @@ -94,7 +94,7 @@ export class ApiService implements GuidedOnboardingApi { * Subsequently, the observable is updated automatically, when the state changes. */ public fetchPluginState$(): Observable { - if (!this.isCloudEnabled) { + if (!this._isEnabled) { return of(undefined); } if (!this.client) { @@ -118,7 +118,7 @@ export class ApiService implements GuidedOnboardingApi { * where all guides are displayed with their corresponding status. */ public async fetchAllGuidesState(): Promise<{ state: GuideState[] } | undefined> { - if (!this.isCloudEnabled) { + if (!this._isEnabled) { return undefined; } if (!this.client) { @@ -143,7 +143,7 @@ export class ApiService implements GuidedOnboardingApi { state: { status?: PluginStatus; guide?: GuideState }, panelState: boolean ): Promise<{ pluginState: PluginState } | undefined> { - if (!this.isCloudEnabled) { + if (!this._isEnabled) { return undefined; } if (!this.client) { @@ -467,7 +467,7 @@ export class ApiService implements GuidedOnboardingApi { * @return {Promise} a promise with the guide config or undefined if the config is not found */ public async getGuideConfig(guideId: GuideId): Promise { - if (!this.isCloudEnabled) { + if (!this._isEnabled) { return undefined; } if (!this.client) { @@ -478,6 +478,10 @@ export class ApiService implements GuidedOnboardingApi { this.isLoading$.next(false); return config; } + + public get isEnabled() { + return this._isEnabled; + } } export const apiService = new ApiService(); diff --git a/src/plugins/guided_onboarding/public/types.ts b/src/plugins/guided_onboarding/public/types.ts index 1103c2ee350d..9f348b991095 100755 --- a/src/plugins/guided_onboarding/public/types.ts +++ b/src/plugins/guided_onboarding/public/types.ts @@ -62,4 +62,5 @@ export interface GuidedOnboardingApi { isGuidePanelOpen$: Observable; isLoading$: Observable; getGuideConfig: (guideId: GuideId) => Promise; + readonly isEnabled: boolean; } diff --git a/src/plugins/guided_onboarding/server/feature.ts b/src/plugins/guided_onboarding/server/feature.ts new file mode 100644 index 000000000000..fce2cb9033b9 --- /dev/null +++ b/src/plugins/guided_onboarding/server/feature.ts @@ -0,0 +1,42 @@ +/* + * 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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { KibanaFeatureConfig } from '@kbn/features-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; +import { PLUGIN_FEATURE, PLUGIN_ID } from '../common/constants'; +import { guideStateSavedObjectsType, pluginStateSavedObjectsType } from './saved_objects'; + +export const GUIDED_ONBOARDING_FEATURE: KibanaFeatureConfig = { + id: PLUGIN_FEATURE, + name: i18n.translate('guidedOnboarding.featureRegistry.featureName', { + defaultMessage: 'Setup guides', + }), + category: DEFAULT_APP_CATEGORIES.management, + app: [PLUGIN_ID], + privileges: { + all: { + app: [PLUGIN_ID], + savedObject: { + all: [guideStateSavedObjectsType, pluginStateSavedObjectsType], + read: [], + }, + ui: ['enabled'], + }, + read: { + // we haven't implemented "read-only" access yet, so this feature can only be granted + // as "all" or "none" + disabled: true, + savedObject: { + all: [], + read: [], + }, + ui: [], + }, + }, +}; diff --git a/src/plugins/guided_onboarding/server/plugin.ts b/src/plugins/guided_onboarding/server/plugin.ts index f264771d780e..3a5138d20133 100755 --- a/src/plugins/guided_onboarding/server/plugin.ts +++ b/src/plugins/guided_onboarding/server/plugin.ts @@ -9,6 +9,8 @@ import { PluginInitializerContext, CoreSetup, Plugin, Logger } from '@kbn/core/server'; import type { GuideId, GuideConfig } from '@kbn/guided-onboarding'; +import { PluginSetupContract as FeaturesPluginSetup } from '@kbn/features-plugin/server'; +import { GUIDED_ONBOARDING_FEATURE } from './feature'; import { GuidedOnboardingPluginSetup, GuidedOnboardingPluginStart } from './types'; import { defineRoutes } from './routes'; import { guideStateSavedObjects, pluginStateSavedObjects } from './saved_objects'; @@ -25,7 +27,7 @@ export class GuidedOnboardingPlugin this.guidesConfig = {} as GuidesConfig; } - public setup(core: CoreSetup) { + public setup(core: CoreSetup, plugins: { features?: FeaturesPluginSetup }) { this.logger.debug('guidedOnboarding: Setup'); const router = core.http.createRouter(); @@ -36,6 +38,8 @@ export class GuidedOnboardingPlugin core.savedObjects.registerType(guideStateSavedObjects); core.savedObjects.registerType(pluginStateSavedObjects); + plugins.features?.registerKibanaFeature(GUIDED_ONBOARDING_FEATURE); + return { registerGuideConfig: (guideId: GuideId, guideConfig: GuideConfig) => { if (this.guidesConfig[guideId]) { diff --git a/src/plugins/guided_onboarding/tsconfig.json b/src/plugins/guided_onboarding/tsconfig.json index 42026215e18f..88569a7a4323 100644 --- a/src/plugins/guided_onboarding/tsconfig.json +++ b/src/plugins/guided_onboarding/tsconfig.json @@ -18,6 +18,7 @@ "@kbn/core-http-browser", "@kbn/core-http-browser-mocks", "@kbn/config-schema", + "@kbn/features-plugin", ], "exclude": [ "target/**/*", diff --git a/src/plugins/home/public/application/components/__snapshots__/home.test.tsx.snap b/src/plugins/home/public/application/components/__snapshots__/home.test.tsx.snap index 53df35833013..03dfb3820429 100644 --- a/src/plugins/home/public/application/components/__snapshots__/home.test.tsx.snap +++ b/src/plugins/home/public/application/components/__snapshots__/home.test.tsx.snap @@ -308,12 +308,19 @@ exports[`home isNewKibanaInstance should safely handle exceptions 1`] = ` Array [ "./home#/getting_started", ], + Array [ + "./home#/getting_started", + ], ], "results": Array [ Object { "type": "return", "value": undefined, }, + Object { + "type": "return", + "value": undefined, + }, ], }, } @@ -335,12 +342,19 @@ exports[`home isNewKibanaInstance should safely handle exceptions 1`] = ` Array [ "./home#/getting_started", ], + Array [ + "./home#/getting_started", + ], ], "results": Array [ Object { "type": "return", "value": undefined, }, + Object { + "type": "return", + "value": undefined, + }, ], }, } @@ -389,12 +403,19 @@ exports[`home isNewKibanaInstance should set isNewKibanaInstance to false when t Array [ "./home#/getting_started", ], + Array [ + "./home#/getting_started", + ], ], "results": Array [ Object { "type": "return", "value": undefined, }, + Object { + "type": "return", + "value": undefined, + }, ], }, } @@ -416,12 +437,19 @@ exports[`home isNewKibanaInstance should set isNewKibanaInstance to false when t Array [ "./home#/getting_started", ], + Array [ + "./home#/getting_started", + ], ], "results": Array [ Object { "type": "return", "value": undefined, }, + Object { + "type": "return", + "value": undefined, + }, ], }, } @@ -437,12 +465,7 @@ exports[`home isNewKibanaInstance should set isNewKibanaInstance to false when t `; -exports[`home isNewKibanaInstance should set isNewKibanaInstance to true when there are no index patterns 1`] = ` - -`; +exports[`home isNewKibanaInstance should set isNewKibanaInstance to true when there are no index patterns 1`] = `""`; exports[`home should render home component 1`] = ` <_KibanaPageTemplate diff --git a/src/plugins/home/public/application/components/add_data/add_data.tsx b/src/plugins/home/public/application/components/add_data/add_data.tsx index 086e28cbb1f8..5440ad09d2c1 100644 --- a/src/plugins/home/public/application/components/add_data/add_data.tsx +++ b/src/plugins/home/public/application/components/add_data/add_data.tsx @@ -35,7 +35,7 @@ interface Props { } export const AddData: FC = ({ addBasePath, application, isDarkMode, isCloudEnabled }) => { - const { trackUiMetric } = getServices(); + const { trackUiMetric, guidedOnboardingService } = getServices(); const canAccessIntegrations = application.capabilities.navLinks.integrations; if (canAccessIntegrations) { return ( @@ -70,7 +70,7 @@ export const AddData: FC = ({ addBasePath, application, isDarkMode, isClo - {isCloudEnabled && ( + {guidedOnboardingService?.isEnabled && ( {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} = ({ addBasePath, application, isDarkMode, isClo {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} { diff --git a/src/plugins/home/public/application/components/home.test.tsx b/src/plugins/home/public/application/components/home.test.tsx index 806ceed7d759..c7240d430907 100644 --- a/src/plugins/home/public/application/components/home.test.tsx +++ b/src/plugins/home/public/application/components/home.test.tsx @@ -15,6 +15,8 @@ import { Welcome } from './welcome'; let mockHasIntegrationsPermission = true; const mockNavigateToUrl = jest.fn(); +let mockIsEnabled = false; + jest.mock('../kibana_services', () => ({ getServices: () => ({ getBasePath: () => 'path', @@ -31,6 +33,9 @@ jest.mock('../kibana_services', () => ({ }, }, }, + guidedOnboardingService: { + isEnabled: mockIsEnabled, + }, }), })); @@ -234,7 +239,8 @@ describe('home', () => { expect(component.find(Welcome).exists()).toBe(false); }); - test('should redirect to guided onboarding on Cloud instead of welcome screen', async () => { + test('should redirect to guided onboarding on Cloud instead of welcome screen if guided onboarding is enabled', async () => { + mockIsEnabled = true; const isCloudEnabled = true; const hasUserDataView = jest.fn(async () => false); diff --git a/src/plugins/home/public/application/components/home.tsx b/src/plugins/home/public/application/components/home.tsx index 7a65c48807a3..176b620430a5 100644 --- a/src/plugins/home/public/application/components/home.tsx +++ b/src/plugins/home/public/application/components/home.tsx @@ -188,15 +188,14 @@ export class Home extends Component { public render() { const { isLoading, isWelcomeEnabled, isNewKibanaInstance } = this.state; - const { isCloudEnabled } = this.props; - const { application } = getServices(); + const { application, guidedOnboardingService } = getServices(); if (isWelcomeEnabled) { if (isLoading) { return this.renderLoading(); } if (isNewKibanaInstance) { - if (isCloudEnabled) { + if (guidedOnboardingService?.isEnabled) { application.navigateToUrl('./home#/getting_started'); return null; } diff --git a/src/plugins/home/public/application/components/home_app.js b/src/plugins/home/public/application/components/home_app.js index 58d9c2a0f3fc..f800a26c787b 100644 --- a/src/plugins/home/public/application/components/home_app.js +++ b/src/plugins/home/public/application/components/home_app.js @@ -29,6 +29,7 @@ export function HomeApp({ directories, solutions }) { addBasePath, environmentService, dataViewsService, + guidedOnboardingService, } = getServices(); const environment = environmentService.getEnvironment(); const isCloudEnabled = environment.cloud; @@ -69,9 +70,11 @@ export function HomeApp({ directories, solutions }) { - - - + {guidedOnboardingService.isEnabled && ( + + + + )} { let plugin: CloudLinksPlugin; @@ -32,26 +33,46 @@ describe('Cloud Links Plugin - public', () => { }); describe('Onboarding Setup Guide link registration', () => { - test('registers the Onboarding Setup Guide link when cloud is enabled and it is an authenticated page', () => { + describe('guided onboarding is enabled', () => { + const guidedOnboarding = guidedOnboardingMock.createStart(); + test('registers the Onboarding Setup Guide link when cloud and guided onboarding is enabled and it is an authenticated page', () => { + const coreStart = coreMock.createStart(); + coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false); + const cloud = { ...cloudMock.createStart(), isCloudEnabled: true }; + + plugin.start(coreStart, { cloud, guidedOnboarding }); + expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).toHaveBeenCalledTimes(1); + }); + + test('does not register the Onboarding Setup Guide link when cloud is enabled but it is an unauthenticated page', () => { + const coreStart = coreMock.createStart(); + coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(true); + const cloud = { ...cloudMock.createStart(), isCloudEnabled: true }; + plugin.start(coreStart, { cloud, guidedOnboarding }); + expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled(); + }); + + test('does not register the Onboarding Setup Guide link when cloud is not enabled', () => { + const coreStart = coreMock.createStart(); + const cloud = { ...cloudMock.createStart(), isCloudEnabled: false }; + plugin.start(coreStart, { cloud, guidedOnboarding }); + expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled(); + }); + }); + + test('do not register the Onboarding Setup Guide link when guided onboarding is disabled', () => { + let { guidedOnboardingApi } = guidedOnboardingMock.createStart(); + guidedOnboardingApi = { + ...guidedOnboardingApi!, + isEnabled: false, + }; + const guidedOnboarding = { guidedOnboardingApi }; + const coreStart = coreMock.createStart(); coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(false); const cloud = { ...cloudMock.createStart(), isCloudEnabled: true }; - plugin.start(coreStart, { cloud }); - expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).toHaveBeenCalledTimes(1); - }); - test('does not register the Onboarding Setup Guide link when cloud is enabled but it is an unauthenticated page', () => { - const coreStart = coreMock.createStart(); - coreStart.http.anonymousPaths.isAnonymous.mockReturnValue(true); - const cloud = { ...cloudMock.createStart(), isCloudEnabled: true }; - plugin.start(coreStart, { cloud }); - expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled(); - }); - - test('does not register the Onboarding Setup Guide link when cloud is not enabled', () => { - const coreStart = coreMock.createStart(); - const cloud = { ...cloudMock.createStart(), isCloudEnabled: false }; - plugin.start(coreStart, { cloud }); + plugin.start(coreStart, { cloud, guidedOnboarding }); expect(coreStart.chrome.registerGlobalHelpExtensionMenuLink).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx b/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx index b5c3c4aeeb55..a2f8af345ac0 100755 --- a/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx +++ b/x-pack/plugins/cloud_integrations/cloud_links/public/plugin.tsx @@ -10,6 +10,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { CoreStart, Plugin } from '@kbn/core/public'; import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public'; import type { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/public'; +import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; import { maybeAddCloudLinks } from './maybe_add_cloud_links'; interface CloudLinksDepsSetup { @@ -20,6 +21,7 @@ interface CloudLinksDepsSetup { interface CloudLinksDepsStart { cloud?: CloudStart; security?: SecurityPluginStart; + guidedOnboarding?: GuidedOnboardingPluginStart; } export class CloudLinksPlugin @@ -27,18 +29,19 @@ export class CloudLinksPlugin { public setup() {} - public start(core: CoreStart, { cloud, security }: CloudLinksDepsStart) { + public start(core: CoreStart, { cloud, security, guidedOnboarding }: CloudLinksDepsStart) { if (cloud?.isCloudEnabled && !core.http.anonymousPaths.isAnonymous(window.location.pathname)) { - core.chrome.registerGlobalHelpExtensionMenuLink({ - linkType: 'custom', - href: core.http.basePath.prepend('/app/home#/getting_started'), - content: ( - - ), - 'data-test-subj': 'cloudOnboardingSetupGuideLink', - priority: 1000, // We want this link to be at the very top. - }); - + if (guidedOnboarding?.guidedOnboardingApi?.isEnabled) { + core.chrome.registerGlobalHelpExtensionMenuLink({ + linkType: 'custom', + href: core.http.basePath.prepend('/app/home#/getting_started'), + content: ( + + ), + 'data-test-subj': 'cloudOnboardingSetupGuideLink', + priority: 1000, // We want this link to be at the very top. + }); + } if (security) { maybeAddCloudLinks({ security, chrome: core.chrome, cloud }); } diff --git a/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json b/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json index 2354df693cb9..ab4f52a34759 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json +++ b/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json @@ -16,6 +16,7 @@ "@kbn/security-plugin", "@kbn/i18n", "@kbn/i18n-react", + "@kbn/guided-onboarding-plugin", ], "exclude": [ "target/**/*", diff --git a/x-pack/test/api_integration/apis/features/features/features.ts b/x-pack/test/api_integration/apis/features/features/features.ts index 538782b272df..d5038a7c51de 100644 --- a/x-pack/test/api_integration/apis/features/features/features.ts +++ b/x-pack/test/api_integration/apis/features/features/features.ts @@ -105,6 +105,7 @@ export default function ({ getService }: FtrProviderContext) { 'advancedSettings', 'indexPatterns', 'graph', + 'guidedOnboardingFeature', 'monitoring', 'observabilityCases', 'savedObjectsManagement', diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts index d22b46b58f42..c03f9fb91db6 100644 --- a/x-pack/test/api_integration/apis/security/privileges.ts +++ b/x-pack/test/api_integration/apis/security/privileges.ts @@ -104,6 +104,7 @@ export default function ({ getService }: FtrProviderContext) { 'readFlappingSettings', ], maintenanceWindow: ['all', 'read', 'minimal_all', 'minimal_read'], + guidedOnboardingFeature: ['all', 'read', 'minimal_all', 'minimal_read'], }, reserved: ['fleet-setup', 'ml_user', 'ml_admin', 'ml_apm_user', 'monitoring'], }; diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts index 3f083b0bd522..201590cdcaf5 100644 --- a/x-pack/test/api_integration/apis/security/privileges_basic.ts +++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts @@ -50,6 +50,7 @@ export default function ({ getService }: FtrProviderContext) { filesSharedImage: ['all', 'read', 'minimal_all', 'minimal_read'], rulesSettings: ['all', 'read', 'minimal_all', 'minimal_read'], maintenanceWindow: ['all', 'read', 'minimal_all', 'minimal_read'], + guidedOnboardingFeature: ['all', 'read', 'minimal_all', 'minimal_read'], }, global: ['all', 'read'], space: ['all', 'read'], @@ -176,6 +177,7 @@ export default function ({ getService }: FtrProviderContext) { 'readFlappingSettings', ], maintenanceWindow: ['all', 'read', 'minimal_all', 'minimal_read'], + guidedOnboardingFeature: ['all', 'read', 'minimal_all', 'minimal_read'], }, reserved: ['fleet-setup', 'ml_user', 'ml_admin', 'ml_apm_user', 'monitoring'], }; diff --git a/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts b/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts index 5167b611de2b..f72a9a467b26 100644 --- a/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts +++ b/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts @@ -45,6 +45,19 @@ export default function navLinksTests({ getService }: FtrProviderContext) { expect(uiCapabilities.value!.navLinks).to.eql(navLinksBuilder.except('monitoring')); break; case 'everything_space_all at everything_space': + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('navLinks'); + expect(uiCapabilities.value!.navLinks).to.eql( + navLinksBuilder.except( + 'monitoring', + 'enterpriseSearch', + 'enterpriseSearchContent', + 'enterpriseSearchAnalytics', + 'appSearch', + 'workplaceSearch' + ) + ); + break; case 'global_read at everything_space': case 'dual_privileges_read at everything_space': case 'everything_space_read at everything_space': @@ -57,7 +70,8 @@ export default function navLinksTests({ getService }: FtrProviderContext) { 'enterpriseSearchContent', 'enterpriseSearchAnalytics', 'appSearch', - 'workplaceSearch' + 'workplaceSearch', + 'guidedOnboardingFeature' ) ); break;