Skip to content

Commit

Permalink
new data usage plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
neptunian committed Sep 19, 2024
1 parent 38d6143 commit a947e92
Show file tree
Hide file tree
Showing 19 changed files with 442 additions and 0 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@
"@kbn/data-search-plugin": "link:test/plugin_functional/plugins/data_search",
"@kbn/data-service": "link:packages/kbn-data-service",
"@kbn/data-stream-adapter": "link:packages/kbn-data-stream-adapter",
"@kbn/data-usage-plugin": "link:x-pack/plugins/data_usage",
"@kbn/data-view-editor-plugin": "link:src/plugins/data_view_editor",
"@kbn/data-view-field-editor-example-plugin": "link:examples/data_view_field_editor_example",
"@kbn/data-view-field-editor-plugin": "link:src/plugins/data_view_field_editor",
Expand Down
8 changes: 8 additions & 0 deletions packages/kbn-management/cards_navigation/src/consts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@ export const appDefinitions: Record<AppId, AppDefinition> = {
icon: 'documents',
},

[AppIds.DATA_USAGE]: {
category: appCategories.DATA,
description: i18n.translate('management.landing.withCardNavigation.dataUsageDescription', {
defaultMessage: 'View data usage and retention.',
}),
icon: 'documents',
},

[AppIds.RULES]: {
category: appCategories.ALERTS,
description: i18n.translate('management.landing.withCardNavigation.rulesDescription', {
Expand Down
1 change: 1 addition & 0 deletions packages/kbn-management/cards_navigation/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export enum AppIds {
API_KEYS = 'api_keys',
DATA_QUALITY = 'data_quality',
SPACES = 'spaces',
DATA_USAGE = 'data_usage',
}

// Create new type that is a union of all the appId values
Expand Down
2 changes: 2 additions & 0 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,8 @@
"@kbn/data-service/*": ["packages/kbn-data-service/*"],
"@kbn/data-stream-adapter": ["packages/kbn-data-stream-adapter"],
"@kbn/data-stream-adapter/*": ["packages/kbn-data-stream-adapter/*"],
"@kbn/data-usage-plugin": ["x-pack/plugins/data_usage"],
"@kbn/data-usage-plugin/*": ["x-pack/plugins/data_usage/*"],
"@kbn/data-view-editor-plugin": ["src/plugins/data_view_editor"],
"@kbn/data-view-editor-plugin/*": ["src/plugins/data_view_editor/*"],
"@kbn/data-view-field-editor-example-plugin": ["examples/data_view_field_editor_example"],
Expand Down
3 changes: 3 additions & 0 deletions x-pack/plugins/data_usage/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# dataUsage
Serverless only plugin for users to view data usage

13 changes: 13 additions & 0 deletions x-pack/plugins/data_usage/common/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/*
* 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 { i18n } from '@kbn/i18n';

export const PLUGIN_ID = 'data_usage';
export const PLUGIN_NAME = i18n.translate('xpack.dataUsage.name', {
defaultMessage: 'Data Usage',
});
15 changes: 15 additions & 0 deletions x-pack/plugins/data_usage/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* 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.
*/

module.exports = {
preset: '@kbn/test',
rootDir: '../../..',
roots: ['<rootDir>/x-pack/plugins/data_usage'],
coverageDirectory: '<rootDir>/target/kibana-coverage/jest/x-pack/plugins/data_usage',
coverageReporters: ['text', 'html'],
collectCoverageFrom: ['<rootDir>/x-pack/plugins/datas_usage/{common,public}/**/*.{ts,tsx}'],
};
16 changes: 16 additions & 0 deletions x-pack/plugins/data_usage/kibana.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"type": "plugin",
"id": "@kbn/data-usage-plugin",
"owner": ["@elastic/obs-ai-assistant", "@elastic/security-solution"],
"plugin": {
"id": "dataUsage",
"server": true,
"browser": true,
"configPath": ["xpack", "dataUsage"],
"requiredPlugins": ["home", "management", "features", "share"],
"optionalPlugins": [],
"requiredBundles": [
"kibanaReact",
],
}
}
83 changes: 83 additions & 0 deletions x-pack/plugins/data_usage/public/application.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* 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 { CoreStart } from '@kbn/core/public';
import { ManagementAppMountParams } from '@kbn/management-plugin/public';
import React from 'react';
import ReactDOM from 'react-dom';
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
import { Route, Router, Routes } from '@kbn/shared-ux-router';
import { useExecutionContext } from '@kbn/kibana-react-plugin/public';
import { PerformanceContextProvider } from '@kbn/ebt-tools';
import { useKibanaContextForPluginProvider } from './utils/use_kibana';
import { AppPluginStartDependencies, DataUsagePluginStart } from './types';
import { PLUGIN_ID } from '../common';

export const renderApp = (
core: CoreStart,
plugins: AppPluginStartDependencies,
pluginStart: DataUsagePluginStart,
params: ManagementAppMountParams
) => {
ReactDOM.render(
<App params={params} core={core} plugins={plugins} pluginStart={pluginStart} />,
params.element
);

return () => {
ReactDOM.unmountComponentAtNode(params.element);
};
};

const AppWithExecutionContext = ({
core,
params,
}: {
core: CoreStart;
params: ManagementAppMountParams;
}) => {
const { executionContext } = core;

useExecutionContext(executionContext, {
type: 'application',
page: PLUGIN_ID,
});

return (
<Router history={params.history}>
<PerformanceContextProvider>
<Routes>
<Route path="/" exact={true} render={() => <div>Data Usage</div>} />
</Routes>
</PerformanceContextProvider>
</Router>
);
};

interface AppProps {
core: CoreStart;
plugins: AppPluginStartDependencies;
pluginStart: DataUsagePluginStart;
params: ManagementAppMountParams;
}

const App = ({ core, plugins, pluginStart, params }: AppProps) => {
const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider(
core,
plugins,
pluginStart,
params
);

return (
<KibanaRenderContextProvider {...core} {...params}>
<KibanaContextProviderForPlugin>
<AppWithExecutionContext core={core} params={params} />
</KibanaContextProviderForPlugin>
</KibanaRenderContextProvider>
);
};
26 changes: 26 additions & 0 deletions x-pack/plugins/data_usage/public/index.ts
Original file line number Diff line number Diff line change
@@ -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 type { PluginInitializer, PluginInitializerContext } from '@kbn/core/public';
import type {
DataUsagePublicSetup,
DataUsagePublicStart,
DataUsageSetupDependencies,
DataUsageStartDependencies,
ConfigSchema,
} from './types';
import { DataUsagePlugin } from './plugin';

export type { DataUsagePublicSetup, DataUsagePublicStart } from './types';

export const plugin: PluginInitializer<
DataUsagePublicSetup,
DataUsagePublicStart,
DataUsageSetupDependencies,
DataUsageStartDependencies
> = (pluginInitializerContext: PluginInitializerContext<ConfigSchema>) =>
new DataUsagePlugin(pluginInitializerContext);
61 changes: 61 additions & 0 deletions x-pack/plugins/data_usage/public/plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* 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 { CoreSetup, CoreStart, Plugin } from '@kbn/core/public';
import { ManagementAppMountParams } from '@kbn/management-plugin/public';
import type { PluginInitializerContext } from '@kbn/core/public';
import {
DataUsagePublicSetup,
DataUsagePublicStart,
DataUsageStartDependencies,
DataUsageSetupDependencies,
} from './types';
import { PLUGIN_ID, PLUGIN_NAME } from '../common';

export class DataUsagePlugin
implements
Plugin<
DataUsagePublicSetup,
DataUsagePublicStart,
DataUsageSetupDependencies,
DataUsageStartDependencies
>
{
private isServerless: boolean = false;
constructor(initializerContext: PluginInitializerContext) {
this.isServerless = initializerContext.env.packageInfo.buildFlavor === 'serverless';
}
public setup(
core: CoreSetup<DataUsageStartDependencies, DataUsagePublicStart>,
plugins: DataUsageSetupDependencies
): DataUsagePublicSetup {
const { management } = plugins;
if (!this.isServerless) return {};
management.sections.section.data.registerApp({
id: PLUGIN_ID,
title: PLUGIN_NAME,
order: 6,
keywords: ['data usage', 'usage'],
async mount(params: ManagementAppMountParams) {
const [{ renderApp }, [coreStart, pluginsStartDeps, pluginStart]] = await Promise.all([
import('./application'),
core.getStartServices(),
]);

return renderApp(coreStart, pluginsStartDeps, pluginStart, params);
},
});

return {};
}

public start(_core: CoreStart): DataUsagePublicStart {
return {};
}

public stop() {}
}
27 changes: 27 additions & 0 deletions x-pack/plugins/data_usage/public/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* 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 { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public';
import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public';

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface DataUsagePublicSetup {}

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface DataUsagePublicStart {}

export interface DataUsageSetupDependencies {
management: ManagementSetup;
share: SharePluginSetup;
}

export interface DataUsageStartDependencies {
management: ManagementStart;
share: SharePluginStart;
}
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ConfigSchema {}
53 changes: 53 additions & 0 deletions x-pack/plugins/data_usage/public/utils/use_kibana.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* 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 { CoreStart } from '@kbn/core/public';
import {
createKibanaReactContext,
KibanaReactContextValue,
useKibana,
} from '@kbn/kibana-react-plugin/public';
import { ManagementAppMountParams } from '@kbn/management-plugin/public';
import { useMemo } from 'react';
import { AppPluginStartDependencies, DataUsagePluginStart } from '../types';

export type PluginKibanaContextValue = CoreStart &
AppPluginStartDependencies &
DataUsagePluginStart & {
appParams: ManagementAppMountParams;
};

export const createKibanaContextForPlugin = (
core: CoreStart,
plugins: AppPluginStartDependencies,
pluginStart: DataUsagePluginStart,
appParams: ManagementAppMountParams
) => {
return createKibanaReactContext<PluginKibanaContextValue>({
...core,
...plugins,
...pluginStart,
appParams,
});
};

export const useKibanaContextForPlugin =
useKibana as () => KibanaReactContextValue<PluginKibanaContextValue>;

export const useKibanaContextForPluginProvider = (
core: CoreStart,
plugins: AppPluginStartDependencies,
pluginStart: DataUsagePluginStart,
appParams: ManagementAppMountParams
) => {
const { Provider } = useMemo(
() => createKibanaContextForPlugin(core, plugins, pluginStart, appParams),
[appParams, core, pluginStart, plugins]
);

return Provider;
};
14 changes: 14 additions & 0 deletions x-pack/plugins/data_usage/server/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* 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 { schema, type TypeOf } from '@kbn/config-schema';

export const config = schema.object({
enabled: schema.boolean({ defaultValue: false }),
});

export type DataUsageConfig = TypeOf<typeof config>;
36 changes: 36 additions & 0 deletions x-pack/plugins/data_usage/server/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* 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 type {
PluginInitializer,
PluginInitializerContext,
PluginConfigDescriptor,
} from '@kbn/core/server';
import { DataUsageConfig } from './config';

import { DataUsagePlugin } from './plugin';
import type {
DataUsageServerSetup,
DataUsageServerStart,
DataUsageSetupDependencies,
DataUsageStartDependencies,
} from './types';

import { config as configSchema } from './config';

export type { DataUsageServerSetup, DataUsageServerStart };

export const config: PluginConfigDescriptor<DataUsageConfig> = {
schema: configSchema,
};

export const plugin: PluginInitializer<
DataUsageServerSetup,
DataUsageServerStart,
DataUsageSetupDependencies,
DataUsageStartDependencies
> = async (pluginInitializerContext: PluginInitializerContext<DataUsageConfig>) =>
await new DataUsagePlugin(pluginInitializerContext);
Loading

0 comments on commit a947e92

Please sign in to comment.