mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
Create the "Asset Inventory" Kibana Plugin (#202291)
## Summary Closes https://github.com/elastic/kibana/issues/201704. Create an empty "Asset Inventory" plugin with the minimal boilerplate required to set it up, install it and run it on Kibana with a blank slate. I generated the files using the `node scripts/generate_plugin <NAME>` script as per [this documentation page](https://docs.elastic.dev/kibana-dev-docs/getting-started/hello-world-app#2-option-2---use-the-automatic-plugin-generator). ### Screenshots <details><summary>Main page (Sample page)</summary> <img width="2498" alt="Screenshot 2024-11-29 at 14 20 57" src="https://github.com/user-attachments/assets/9d8a3751-519b-4661-bc90-cbb1e836b111"> </details> ### Implementation details - [x] Generated a new Kibana plugin with minimal boilerplate and zero dependencies - [x] Use [Cloud Security Posture](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture) plugin as configuration reference - [x] Render "Inventory" title on the main page - [x] Ensure the plugin is properly integrated into Kibana's build and can be loaded without errors - [x] Place the plugin under the `x-pack/plugins` directory - [x] Include Readme file - [x] Introduce placeholders for initialization of pipelines and transforms following [Cloud Security Posture](https://github.com/elastic/kibana/blob/main/x-pack/plugins/cloud_security_posture/server/plugin.ts) plugin initialize function. ### PR Checklist - [ ] No docs for now ~~[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials~~ - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Risks No risks at all since this is totally green-field and will be hidden by a feature toggle. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Paulo Silva <paulo.henrique@elastic.co>
This commit is contained in:
parent
a3496c9ca6
commit
e5b1773971
21 changed files with 462 additions and 0 deletions
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
|
@ -867,6 +867,7 @@ x-pack/plugins/ai_infra/llm_tasks @elastic/appex-ai-infra
|
|||
x-pack/plugins/ai_infra/product_doc_base @elastic/appex-ai-infra
|
||||
x-pack/plugins/aiops @elastic/ml-ui
|
||||
x-pack/plugins/alerting @elastic/response-ops
|
||||
x-pack/plugins/asset_inventory @elastic/kibana-cloud-security-posture
|
||||
x-pack/plugins/banners @elastic/appex-sharedux
|
||||
x-pack/plugins/canvas @elastic/kibana-presentation
|
||||
x-pack/plugins/cases @elastic/response-ops
|
||||
|
|
|
@ -470,6 +470,10 @@ The plugin exposes the static DefaultEditorController class to consume.
|
|||
|WARNING: Missing README.
|
||||
|
||||
|
||||
|{kib-repo}blob/{branch}/x-pack/plugins/asset_inventory/README.md[assetInventory]
|
||||
|Centralized asset inventory experience within the Elastic Security solution. A central place for users to view and manage all their assets from different environments.
|
||||
|
||||
|
||||
|{kib-repo}blob/{branch}/x-pack/plugins/banners/README.md[banners]
|
||||
|Allow to add a header banner that will be displayed on every page of the Kibana application
|
||||
|
||||
|
|
|
@ -191,6 +191,7 @@
|
|||
"@kbn/apm-utils": "link:packages/kbn-apm-utils",
|
||||
"@kbn/app-link-test-plugin": "link:test/plugin_functional/plugins/app_link_test",
|
||||
"@kbn/application-usage-test-plugin": "link:x-pack/test/usage_collection/plugins/application_usage_test",
|
||||
"@kbn/asset-inventory-plugin": "link:x-pack/plugins/asset_inventory",
|
||||
"@kbn/audit-log-plugin": "link:x-pack/test/security_api_integration/plugins/audit_log",
|
||||
"@kbn/avc-banner": "link:packages/kbn-avc-banner",
|
||||
"@kbn/banners-plugin": "link:x-pack/plugins/banners",
|
||||
|
|
|
@ -5,6 +5,7 @@ pageLoadAssetSize:
|
|||
aiops: 17680
|
||||
alerting: 106936
|
||||
apm: 64385
|
||||
assetInventory: 18478
|
||||
banners: 17946
|
||||
bfetch: 22837
|
||||
canvas: 29355
|
||||
|
|
|
@ -96,6 +96,8 @@
|
|||
"@kbn/app-link-test-plugin/*": ["test/plugin_functional/plugins/app_link_test/*"],
|
||||
"@kbn/application-usage-test-plugin": ["x-pack/test/usage_collection/plugins/application_usage_test"],
|
||||
"@kbn/application-usage-test-plugin/*": ["x-pack/test/usage_collection/plugins/application_usage_test/*"],
|
||||
"@kbn/asset-inventory-plugin": ["x-pack/plugins/asset_inventory"],
|
||||
"@kbn/asset-inventory-plugin/*": ["x-pack/plugins/asset_inventory/*"],
|
||||
"@kbn/audit-log-plugin": ["x-pack/test/security_api_integration/plugins/audit_log"],
|
||||
"@kbn/audit-log-plugin/*": ["x-pack/test/security_api_integration/plugins/audit_log/*"],
|
||||
"@kbn/avc-banner": ["packages/kbn-avc-banner"],
|
||||
|
|
13
x-pack/plugins/asset_inventory/README.md
Executable file
13
x-pack/plugins/asset_inventory/README.md
Executable file
|
@ -0,0 +1,13 @@
|
|||
# Asset Inventory Kibana Plugin
|
||||
|
||||
Centralized asset inventory experience within the Elastic Security solution. A central place for users to view and manage all their assets from different environments.
|
||||
|
||||
---
|
||||
|
||||
## Development
|
||||
|
||||
See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment.
|
||||
|
||||
## Testing
|
||||
|
||||
For general guidelines, read [Kibana Testing Guide](https://www.elastic.co/guide/en/kibana/current/development-tests.html) for more details
|
8
x-pack/plugins/asset_inventory/common/index.ts
Normal file
8
x-pack/plugins/asset_inventory/common/index.ts
Normal file
|
@ -0,0 +1,8 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
export const PLUGIN_ID = 'assetInventory';
|
||||
export const PLUGIN_NAME = 'assetInventory';
|
17
x-pack/plugins/asset_inventory/kibana.jsonc
Normal file
17
x-pack/plugins/asset_inventory/kibana.jsonc
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"type": "plugin",
|
||||
"id": "@kbn/asset-inventory-plugin",
|
||||
"owner": ["@elastic/kibana-cloud-security-posture"],
|
||||
"group": "security",
|
||||
"visibility": "private",
|
||||
"description": "Centralized asset inventory experience within the Elastic Security solution. A central place for users to view and manage all their assets from different environments",
|
||||
"plugin": {
|
||||
"id": "assetInventory",
|
||||
"browser": true,
|
||||
"server": true,
|
||||
"configPath": ["xpack", "assetInventory"],
|
||||
"requiredPlugins": [],
|
||||
"requiredBundles": [],
|
||||
"optionalPlugins": []
|
||||
}
|
||||
}
|
7
x-pack/plugins/asset_inventory/package.json
Normal file
7
x-pack/plugins/asset_inventory/package.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"author": "Elastic",
|
||||
"name": "@kbn/asset-inventory-plugin",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"license": "Elastic License 2.0"
|
||||
}
|
24
x-pack/plugins/asset_inventory/public/application.tsx
Normal file
24
x-pack/plugins/asset_inventory/public/application.tsx
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* 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 ReactDOM from 'react-dom';
|
||||
import type { AppMountParameters, CoreStart } from '@kbn/core/public';
|
||||
import type { AppPluginStartDependencies } from './types';
|
||||
import { AssetInventoryApp } from './components/app';
|
||||
|
||||
export const renderApp = (
|
||||
{ notifications, http }: CoreStart,
|
||||
{}: AppPluginStartDependencies,
|
||||
{ appBasePath, element }: AppMountParameters
|
||||
) => {
|
||||
ReactDOM.render(
|
||||
<AssetInventoryApp basename={appBasePath} notifications={notifications} http={http} />,
|
||||
element
|
||||
);
|
||||
|
||||
return () => ReactDOM.unmountComponentAtNode(element);
|
||||
};
|
38
x-pack/plugins/asset_inventory/public/components/app.tsx
Normal file
38
x-pack/plugins/asset_inventory/public/components/app.tsx
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* 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 { FormattedMessage, I18nProvider } from '@kbn/i18n-react';
|
||||
import { BrowserRouter as Router } from '@kbn/shared-ux-router';
|
||||
import { EuiPageTemplate, EuiTitle } from '@elastic/eui';
|
||||
import type { CoreStart } from '@kbn/core/public';
|
||||
|
||||
interface AssetInventoryAppDeps {
|
||||
basename: string;
|
||||
notifications: CoreStart['notifications'];
|
||||
http: CoreStart['http'];
|
||||
}
|
||||
|
||||
export const AssetInventoryApp = ({ basename }: AssetInventoryAppDeps) => {
|
||||
return (
|
||||
<Router basename={basename}>
|
||||
<I18nProvider>
|
||||
<>
|
||||
<EuiPageTemplate restrictWidth="1000px">
|
||||
<EuiPageTemplate.Header>
|
||||
<EuiTitle size="l">
|
||||
<h1>
|
||||
<FormattedMessage id="assetInventory.helloWorldText" defaultMessage="Inventory" />
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
</EuiPageTemplate.Header>
|
||||
<EuiPageTemplate.Section />
|
||||
</EuiPageTemplate>
|
||||
</>
|
||||
</I18nProvider>
|
||||
</Router>
|
||||
);
|
||||
};
|
14
x-pack/plugins/asset_inventory/public/index.ts
Normal file
14
x-pack/plugins/asset_inventory/public/index.ts
Normal file
|
@ -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 { AssetInventoryPlugin } from './plugin';
|
||||
|
||||
// This exports static code and TypeScript types,
|
||||
// as well as, Kibana Platform `plugin()` initializer.
|
||||
export function plugin() {
|
||||
return new AssetInventoryPlugin();
|
||||
}
|
||||
export type { AssetInventoryPluginSetup, AssetInventoryPluginStart } from './types';
|
35
x-pack/plugins/asset_inventory/public/plugin.ts
Normal file
35
x-pack/plugins/asset_inventory/public/plugin.ts
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* 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 { AppMountParameters, CoreSetup, CoreStart, Plugin } from '@kbn/core/public';
|
||||
import type {
|
||||
AssetInventoryPluginSetup,
|
||||
AssetInventoryPluginStart,
|
||||
AppPluginStartDependencies,
|
||||
} from './types';
|
||||
|
||||
export class AssetInventoryPlugin
|
||||
implements Plugin<AssetInventoryPluginSetup, AssetInventoryPluginStart>
|
||||
{
|
||||
public setup(core: CoreSetup): AssetInventoryPluginSetup {
|
||||
return {};
|
||||
}
|
||||
public start(
|
||||
coreStart: CoreStart,
|
||||
depsStart: AppPluginStartDependencies
|
||||
): AssetInventoryPluginStart {
|
||||
return {
|
||||
getAssetInventoryPage: async (params: AppMountParameters) => {
|
||||
// Load application bundle
|
||||
const { renderApp } = await import('./application');
|
||||
// Render the application
|
||||
return renderApp(coreStart, depsStart as AppPluginStartDependencies, params);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public stop() {}
|
||||
}
|
15
x-pack/plugins/asset_inventory/public/types.ts
Normal file
15
x-pack/plugins/asset_inventory/public/types.ts
Normal file
|
@ -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.
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface AssetInventoryPluginSetup {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface AssetInventoryPluginStart {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface AppPluginStartDependencies {}
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* 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 { transformError } from '@kbn/securitysolution-es-utils';
|
||||
import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types';
|
||||
import type { ElasticsearchClient, Logger } from '@kbn/core/server';
|
||||
import { errors } from '@elastic/elasticsearch';
|
||||
|
||||
// TODO: Move transforms to integration package
|
||||
export const initializeTransforms = async (
|
||||
esClient: ElasticsearchClient,
|
||||
logger: Logger
|
||||
): Promise<void> => {
|
||||
// Deletes old assets from previous versions as part of upgrade process
|
||||
await deletePreviousTransformsVersions(esClient, logger);
|
||||
// TODO initialize transforms here
|
||||
// await initializeTransform(esClient, <TRANSFORM_HERE>, logger);
|
||||
};
|
||||
|
||||
export const initializeTransform = async (
|
||||
esClient: ElasticsearchClient,
|
||||
transform: TransformPutTransformRequest,
|
||||
logger: Logger
|
||||
) => {
|
||||
const success = await createTransformIfNotExists(esClient, transform, logger);
|
||||
|
||||
if (success) {
|
||||
await startTransformIfNotStarted(esClient, transform.transform_id, logger);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if a transform exists, And if not creates it
|
||||
*
|
||||
* @param transform - the transform to create. If a transform with the same transform_id already exists, nothing is created or updated.
|
||||
*
|
||||
* @return true if the transform exits or created, false otherwise.
|
||||
*/
|
||||
export const createTransformIfNotExists = async (
|
||||
esClient: ElasticsearchClient,
|
||||
transform: TransformPutTransformRequest,
|
||||
logger: Logger
|
||||
) => {
|
||||
try {
|
||||
await esClient.transform.getTransform({
|
||||
transform_id: transform.transform_id,
|
||||
});
|
||||
return true;
|
||||
} catch (existErr) {
|
||||
const existError = transformError(existErr);
|
||||
if (existError.statusCode === 404) {
|
||||
try {
|
||||
await esClient.transform.putTransform(transform);
|
||||
return true;
|
||||
} catch (createErr) {
|
||||
const createError = transformError(createErr);
|
||||
logger.error(
|
||||
`Failed to create transform ${transform.transform_id}: ${createError.message}`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
logger.error(
|
||||
`Failed to check if transform ${transform.transform_id} exists: ${existError.message}`
|
||||
);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
export const startTransformIfNotStarted = async (
|
||||
esClient: ElasticsearchClient,
|
||||
transformId: string,
|
||||
logger: Logger
|
||||
) => {
|
||||
try {
|
||||
const transformStats = await esClient.transform.getTransformStats({
|
||||
transform_id: transformId,
|
||||
});
|
||||
|
||||
if (transformStats.count <= 0) {
|
||||
logger.error(`Failed starting transform ${transformId}: couldn't find transform`);
|
||||
return;
|
||||
}
|
||||
|
||||
const fetchedTransformStats = transformStats.transforms[0];
|
||||
|
||||
// trying to restart the transform in case it comes to a full stop or failure
|
||||
if (fetchedTransformStats.state === 'stopped' || fetchedTransformStats.state === 'failed') {
|
||||
try {
|
||||
return await esClient.transform.startTransform({ transform_id: transformId });
|
||||
} catch (startErr) {
|
||||
const startError = transformError(startErr);
|
||||
logger.error(
|
||||
`Failed to start transform ${transformId}. Transform State: Transform State: ${fetchedTransformStats.state}. Error: ${startError.message}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (fetchedTransformStats.state === 'stopping' || fetchedTransformStats.state === 'aborting') {
|
||||
logger.error(
|
||||
`Not starting transform ${transformId} since it's state is: ${fetchedTransformStats.state}`
|
||||
);
|
||||
}
|
||||
} catch (statsErr) {
|
||||
const statsError = transformError(statsErr);
|
||||
logger.error(`Failed to check if transform ${transformId} is started: ${statsError.message}`);
|
||||
}
|
||||
};
|
||||
|
||||
const deletePreviousTransformsVersions = async (esClient: ElasticsearchClient, logger: Logger) => {
|
||||
// TODO Concat all deprecated transforms versions
|
||||
const deprecatedTransforms: string[] = [];
|
||||
|
||||
for (const transform of deprecatedTransforms) {
|
||||
const response = await deleteTransformSafe(esClient, logger, transform);
|
||||
if (response) return;
|
||||
}
|
||||
};
|
||||
|
||||
const deleteTransformSafe = async (
|
||||
esClient: ElasticsearchClient,
|
||||
logger: Logger,
|
||||
name: string
|
||||
): Promise<boolean> => {
|
||||
try {
|
||||
await esClient.transform.deleteTransform({ transform_id: name, force: true });
|
||||
logger.info(`Deleted transform successfully [Name: ${name}]`);
|
||||
return true;
|
||||
} catch (e) {
|
||||
if (e instanceof errors.ResponseError && e.statusCode === 404) {
|
||||
logger.trace(`Transform not exists [Name: ${name}]`);
|
||||
return false;
|
||||
} else {
|
||||
logger.error(`Failed to delete transform [Name: ${name}]`);
|
||||
logger.error(e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
17
x-pack/plugins/asset_inventory/server/index.ts
Normal file
17
x-pack/plugins/asset_inventory/server/index.ts
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* 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 { PluginInitializerContext } from '@kbn/core/server';
|
||||
|
||||
// This exports static code and TypeScript types,
|
||||
// as well as, Kibana Platform `plugin()` initializer.
|
||||
|
||||
export async function plugin(initializerContext: PluginInitializerContext) {
|
||||
const { AssetInventoryPlugin } = await import('./plugin');
|
||||
return new AssetInventoryPlugin(initializerContext);
|
||||
}
|
||||
|
||||
export type { AssetInventoryPluginSetup, AssetInventoryPluginStart } from './types';
|
63
x-pack/plugins/asset_inventory/server/plugin.ts
Normal file
63
x-pack/plugins/asset_inventory/server/plugin.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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 {
|
||||
PluginInitializerContext,
|
||||
CoreSetup,
|
||||
CoreStart,
|
||||
Plugin,
|
||||
Logger,
|
||||
} from '@kbn/core/server';
|
||||
|
||||
import type { AssetInventoryPluginSetup, AssetInventoryPluginStart } from './types';
|
||||
import { defineRoutes } from './routes';
|
||||
// TODO Uncomment this line when initialize() is enabled
|
||||
// import { initializeTransforms } from './create_transforms/create_transforms';
|
||||
|
||||
export class AssetInventoryPlugin
|
||||
implements Plugin<AssetInventoryPluginSetup, AssetInventoryPluginStart>
|
||||
{
|
||||
private readonly logger: Logger;
|
||||
|
||||
// TODO Uncomment this line when initialize() is enabled
|
||||
// private isInitialized: boolean = false;
|
||||
|
||||
constructor(initializerContext: PluginInitializerContext) {
|
||||
this.logger = initializerContext.logger.get();
|
||||
}
|
||||
|
||||
public setup(core: CoreSetup) {
|
||||
this.logger.debug('assetInventory: Setup');
|
||||
const router = core.http.createRouter();
|
||||
|
||||
// Register server side APIs
|
||||
defineRoutes(router);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
public start(core: CoreStart) {
|
||||
this.logger.debug('assetInventory: Started');
|
||||
|
||||
// TODO Invoke initialize() when it's due
|
||||
// this.initialize(core).catch(() => {});
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
public stop() {}
|
||||
|
||||
/**
|
||||
* Initialization is idempotent and required for (re)creating indices and transforms.
|
||||
*/
|
||||
// TODO Uncomment these lines when initialize() is enabled
|
||||
// async initialize(core: CoreStart): Promise<void> {
|
||||
// this.logger.debug('initialize');
|
||||
// const esClient = core.elasticsearch.client.asInternalUser;
|
||||
// await initializeTransforms(esClient, this.logger);
|
||||
// this.isInitialized = true;
|
||||
// }
|
||||
}
|
23
x-pack/plugins/asset_inventory/server/routes/index.ts
Normal file
23
x-pack/plugins/asset_inventory/server/routes/index.ts
Normal file
|
@ -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 type { IRouter } from '@kbn/core/server';
|
||||
|
||||
export function defineRoutes(router: IRouter) {
|
||||
router.get(
|
||||
{
|
||||
path: '/api/asset_inventory/example',
|
||||
validate: false,
|
||||
},
|
||||
async (context, request, response) => {
|
||||
return response.ok({
|
||||
body: {
|
||||
time: new Date().toISOString(),
|
||||
},
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
10
x-pack/plugins/asset_inventory/server/types.ts
Normal file
10
x-pack/plugins/asset_inventory/server/types.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface AssetInventoryPluginSetup {}
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface AssetInventoryPluginStart {}
|
23
x-pack/plugins/asset_inventory/tsconfig.json
Normal file
23
x-pack/plugins/asset_inventory/tsconfig.json
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"extends": "../../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "target/types"
|
||||
},
|
||||
"include": [
|
||||
"common/**/*.ts",
|
||||
"common/**/*.json",
|
||||
"public/**/*.ts",
|
||||
"public/**/*.tsx",
|
||||
"public/**/*.json",
|
||||
"server/**/*.ts",
|
||||
"server/**/*.json",
|
||||
"../../../typings/**/*"
|
||||
],
|
||||
"exclude": ["target/**/*"],
|
||||
"kbn_references": [
|
||||
"@kbn/core",
|
||||
"@kbn/i18n-react",
|
||||
"@kbn/shared-ux-router",
|
||||
"@kbn/securitysolution-es-utils"
|
||||
]
|
||||
}
|
|
@ -4000,6 +4000,10 @@
|
|||
version "0.0.0"
|
||||
uid ""
|
||||
|
||||
"@kbn/asset-inventory-plugin@link:x-pack/plugins/asset_inventory":
|
||||
version "0.0.0"
|
||||
uid ""
|
||||
|
||||
"@kbn/audit-log-plugin@link:x-pack/test/security_api_integration/plugins/audit_log":
|
||||
version "0.0.0"
|
||||
uid ""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue