Skip to content

Commit

Permalink
[Security Solution] Unify app mount on plugin start (#182863)
Browse files Browse the repository at this point in the history
## Summary

- Removes unnecessary calls from the UI assistant management mount
handler. Namely, `registerActions` and
`registerAlertsTableConfiguration`.
- Duplicated code in application mount functions extracted to the new
`async mountDependencies` function.
- Translation extracted.
- Code reorganized.
  • Loading branch information
semd authored May 8, 2024
1 parent e9c3164 commit 71784ad
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ export const SOLUTION_NAME = i18n.translate('xpack.securitySolution.pages.common
defaultMessage: 'Security',
});

export const ASSISTANT_MANAGEMENT_TITLE = i18n.translate(
'xpack.securitySolution.securityAiAssistantManagement.app.title',
{
defaultMessage: 'AI Assistant for Security',
}
);

export const BETA = i18n.translate('xpack.securitySolution.pages.common.beta', {
defaultMessage: 'Beta',
});
Expand Down
150 changes: 65 additions & 85 deletions x-pack/plugins/security_solution/public/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import type {
CoreStart,
PluginInitializerContext,
Plugin as IPlugin,
AppMount,
} from '@kbn/core/public';
import { DEFAULT_APP_CATEGORIES } from '@kbn/core/public';
import { Storage } from '@kbn/kibana-utils-plugin/public';
Expand All @@ -33,7 +32,7 @@ import type {
StartedSubPlugins,
StartPluginsDependencies,
} from './types';
import { SOLUTION_NAME } from './common/translations';
import { SOLUTION_NAME, ASSISTANT_MANAGEMENT_TITLE } from './common/translations';

import { APP_ID, APP_UI_ID, APP_PATH, APP_ICON_SOLUTION } from '../common/constants';

Expand Down Expand Up @@ -94,93 +93,18 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S
): PluginSetup {
this.services.setup(core, plugins);

const { home, triggersActionsUi, usageCollection, management } = plugins;
const { home, triggersActionsUi, usageCollection, management, cases } = plugins;

const assistantManagementTitle = i18n.translate(
'xpack.securitySolution.securityAiAssistantManagement.app.title',
{
defaultMessage: 'AI Assistant for Security',
}
);

if (home) {
home.featureCatalogue.registerSolution({
id: APP_ID,
title: SOLUTION_NAME,
description: i18n.translate('xpack.securitySolution.featureCatalogueDescription', {
defaultMessage:
'Prevent, collect, detect, and respond to threats for unified protection across your infrastructure.',
}),
icon: 'logoSecurity',
path: APP_PATH,
order: 300,
});

home.featureCatalogue.register({
id: 'ai_assistant_security',
title: assistantManagementTitle,
description: i18n.translate(
'xpack.securitySolution.securityAiAssistantManagement.app.description',
{
defaultMessage: 'Manage your AI Assistant for Security.',
}
),
icon: 'sparkles',
path: '/app/management/kibana/securityAiAssistantManagement',
showOnHomePage: false,
category: 'admin',
});

if (management) {
management.sections.section.kibana.registerApp({
id: 'securityAiAssistantManagement',
title: assistantManagementTitle,
hideFromSidebar: true,
order: 1,
mount: async (params) => {
// required to show the alert table inside cases
const { alertsTableConfigurationRegistry } = plugins.triggersActionsUi;
const { registerAlertsTableConfiguration } =
await this.lazyRegisterAlertsTableConfiguration();
registerAlertsTableConfiguration(alertsTableConfigurationRegistry, this.storage);

const [coreStart, startPlugins] = await core.getStartServices();
const subPlugins = await this.startSubPlugins(this.storage, coreStart, startPlugins);
const store = await this.store(coreStart, startPlugins, subPlugins);
const services = await this.services.generateServices(coreStart, startPlugins);
await this.registerActions(store, params.history, core, services);

const { renderApp } = await this.lazyApplicationDependencies();
const { ManagementSettings } = await this.lazyAssistantSettingsManagement();

return renderApp({
...params,
services,
store,
usageCollection: plugins.usageCollection,
children: <ManagementSettings />,
});
},
});
}
}

const mount: AppMount = async (params) => {
// Lazily instantiate subPlugins and initialize services
const mountDependencies = async (params?: AppMountParameters) => {
const { renderApp } = await this.lazyApplicationDependencies();
const [coreStart, startPlugins] = await core.getStartServices();
const services = await this.services.generateServices(coreStart, startPlugins, params);

const subPlugins = await this.startSubPlugins(this.storage, coreStart, startPlugins);
const store = await this.store(coreStart, startPlugins, subPlugins);

const { renderApp } = await this.lazyApplicationDependencies();
const { getSubPluginRoutesByCapabilities } = await this.lazyHelpersForRoutes();

await this.registerActions(store, params.history, core, services);
await this.registerAlertsTableConfiguration(triggersActionsUi);

const subPluginRoutes = getSubPluginRoutesByCapabilities(subPlugins, services);

return renderApp({ ...params, services, store, usageCollection, subPluginRoutes });
const services = await this.services.generateServices(coreStart, startPlugins, params);
return { renderApp, subPlugins, store, services };
};

// Register main Security Solution plugin
Expand All @@ -192,7 +116,17 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S
updater$: this.appUpdater$,
visibleIn: ['globalSearch', 'home', 'kibanaOverview'],
euiIconType: APP_ICON_SOLUTION,
mount,
mount: async (params) => {
const { renderApp, services, store, subPlugins } = await mountDependencies(params);
const { getSubPluginRoutesByCapabilities } = await this.lazyHelpersForRoutes();

await this.registerActions(store, params.history, core, services);
await this.registerAlertsTableConfiguration(triggersActionsUi);

const subPluginRoutes = getSubPluginRoutesByCapabilities(subPlugins, services);

return renderApp({ ...params, services, store, usageCollection, subPluginRoutes });
},
});

// Register legacy SIEM app for backward compatibility
Expand All @@ -215,7 +149,53 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S
},
});

plugins.cases?.attachmentFramework.registerExternalReference(
home?.featureCatalogue.registerSolution({
id: APP_ID,
title: SOLUTION_NAME,
description: i18n.translate('xpack.securitySolution.featureCatalogueDescription', {
defaultMessage:
'Prevent, collect, detect, and respond to threats for unified protection across your infrastructure.',
}),
icon: 'logoSecurity',
path: APP_PATH,
order: 300,
});

home?.featureCatalogue.register({
id: 'ai_assistant_security',
title: ASSISTANT_MANAGEMENT_TITLE,
description: i18n.translate(
'xpack.securitySolution.securityAiAssistantManagement.app.description',
{
defaultMessage: 'Manage your AI Assistant for Security.',
}
),
icon: 'sparkles',
path: '/app/management/kibana/securityAiAssistantManagement',
showOnHomePage: false,
category: 'admin',
});

management?.sections.section.kibana.registerApp({
id: 'securityAiAssistantManagement',
title: ASSISTANT_MANAGEMENT_TITLE,
hideFromSidebar: true,
order: 1,
mount: async (params) => {
const { renderApp, services, store } = await mountDependencies();
const { ManagementSettings } = await this.lazyAssistantSettingsManagement();

return renderApp({
...params,
services,
store,
usageCollection,
children: <ManagementSettings />,
});
},
});

cases?.attachmentFramework.registerExternalReference(
getExternalReferenceAttachmentEndpointRegular()
);

Expand Down
6 changes: 4 additions & 2 deletions x-pack/plugins/security_solution/public/plugin_services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,19 @@ export class PluginServices {
apm,
configSettings: this.configSettings,
savedObjectsTagging: savedObjectsTaggingOss.getTaggingApi(),
...(params?.setHeaderActionMenu ? { setHeaderActionMenu: params.setHeaderActionMenu } : {}),
storage: this.storage,
sessionStorage: this.sessionStorage,
security: startPlugins.security,
...(params?.onAppLeave ? { onAppLeave: params.onAppLeave } : {}),
securityLayout: { getPluginWrapper: () => SecuritySolutionTemplateWrapper },
contentManagement: startPlugins.contentManagement,
telemetry: this.telemetry.start(),
customDataService,
timelineDataService,
topValuesPopover: new TopValuesPopoverService(),
...(params && {
onAppLeave: params.onAppLeave,
setHeaderActionMenu: params.setHeaderActionMenu,
}),
};
}

Expand Down

0 comments on commit 71784ad

Please sign in to comment.