mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 09:19:04 -04:00
# Backport This will backport the following commits from `main` to `8.7`: - [[Saved Objects] Logs warning when deprecated SO APIs are called (#150775)](https://github.com/elastic/kibana/pull/150775) <!--- Backport version: 8.9.7 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Christiane (Tina) Heiligers","email":"christiane.heiligers@elastic.co"},"sourceCommit":{"committedDate":"2023-02-13T16:32:08Z","message":"[Saved Objects] Logs warning when deprecated SO APIs are called (#150775)\n\nCo-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>","sha":"8f4e5c53ff57e7b32d7d52d9ed9528ea216aafd1","branchLabelMapping":{"^v8.8.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Team:Core","Feature:Saved Objects","release_note:skip","backport:prev-minor","v8.8.0"],"number":150775,"url":"https://github.com/elastic/kibana/pull/150775","mergeCommit":{"message":"[Saved Objects] Logs warning when deprecated SO APIs are called (#150775)\n\nCo-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>","sha":"8f4e5c53ff57e7b32d7d52d9ed9528ea216aafd1"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v8.8.0","labelRegex":"^v8.8.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/150775","number":150775,"mergeCommit":{"message":"[Saved Objects] Logs warning when deprecated SO APIs are called (#150775)\n\nCo-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>","sha":"8f4e5c53ff57e7b32d7d52d9ed9528ea216aafd1"}}]}] BACKPORT--> Co-authored-by: Christiane (Tina) Heiligers <christiane.heiligers@elastic.co>
This commit is contained in:
parent
fc14852070
commit
fbf1f0e0cf
23 changed files with 247 additions and 33 deletions
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfAnyTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerBulkCreateRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.post(
|
||||
{
|
||||
|
@ -49,6 +51,9 @@ export const registerBulkCreateRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn(
|
||||
"The bulk create saved object API '/api/saved_objects/_bulk_create' is deprecated."
|
||||
);
|
||||
const { overwrite } = req.query;
|
||||
|
||||
const usageStatsClient = coreUsageData.getClient();
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfAnyTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerBulkDeleteRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.post(
|
||||
{
|
||||
|
@ -35,6 +37,9 @@ export const registerBulkDeleteRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn(
|
||||
"The bulk update saved object API '/api/saved_objects/_bulk_update' is deprecated."
|
||||
);
|
||||
const { force } = req.query;
|
||||
const usageStatsClient = coreUsageData.getClient();
|
||||
usageStatsClient.incrementSavedObjectsBulkDelete({ request: req }).catch(() => {});
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfAnyTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerBulkGetRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.post(
|
||||
{
|
||||
|
@ -34,6 +36,7 @@ export const registerBulkGetRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn("The bulk get saved object API '/api/saved_objects/_bulk_get' is deprecated.");
|
||||
const usageStatsClient = coreUsageData.getClient();
|
||||
usageStatsClient.incrementSavedObjectsBulkGet({ request: req }).catch(() => {});
|
||||
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfAnyTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerBulkResolveRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.post(
|
||||
{
|
||||
|
@ -32,6 +34,9 @@ export const registerBulkResolveRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn(
|
||||
"The bulk resolve saved object API '/api/saved_objects/_bulk_resolve' is deprecated."
|
||||
);
|
||||
const usageStatsClient = coreUsageData.getClient();
|
||||
usageStatsClient.incrementSavedObjectsBulkResolve({ request: req }).catch(() => {});
|
||||
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfAnyTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerBulkUpdateRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.put(
|
||||
{
|
||||
|
@ -44,6 +46,9 @@ export const registerBulkUpdateRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn(
|
||||
"The bulk update saved object API '/api/saved_objects/_bulk_update' is deprecated."
|
||||
);
|
||||
const usageStatsClient = coreUsageData.getClient();
|
||||
usageStatsClient.incrementSavedObjectsBulkUpdate({ request: req }).catch(() => {});
|
||||
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerCreateRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.post(
|
||||
{
|
||||
|
@ -48,6 +50,7 @@ export const registerCreateRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn("The create saved object API '/api/saved_objects/{type}/{id}' is deprecated.");
|
||||
const { type, id } = req.params;
|
||||
const { overwrite } = req.query;
|
||||
const { attributes, migrationVersion, coreMigrationVersion, references, initialNamespaces } =
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerDeleteRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.delete(
|
||||
{
|
||||
|
@ -33,6 +35,7 @@ export const registerDeleteRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn("The delete saved object API '/api/saved_objects/{type}/{id}' is deprecated.");
|
||||
const { type, id } = req.params;
|
||||
const { force } = req.query;
|
||||
const { getClient, typeRegistry } = (await context.core).savedObjects;
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwOnHttpHiddenTypes } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerFindRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
const referenceSchema = schema.object({
|
||||
type: schema.string(),
|
||||
|
@ -59,6 +61,7 @@ export const registerFindRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn("The find saved object API '/api/saved_objects/_find' is deprecated.");
|
||||
const query = req.query;
|
||||
|
||||
const namespaces =
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerGetRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.get(
|
||||
{
|
||||
|
@ -30,6 +32,7 @@ export const registerGetRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn("The get saved object API '/api/saved_objects/{type}/{id}' is deprecated.");
|
||||
const { type, id } = req.params;
|
||||
|
||||
const usageStatsClient = coreUsageData.getClient();
|
||||
|
|
|
@ -53,17 +53,17 @@ export function registerRoutes({
|
|||
const router =
|
||||
http.createRouter<InternalSavedObjectsRequestHandlerContext>('/api/saved_objects/');
|
||||
|
||||
registerGetRoute(router, { coreUsageData });
|
||||
registerResolveRoute(router, { coreUsageData });
|
||||
registerCreateRoute(router, { coreUsageData });
|
||||
registerDeleteRoute(router, { coreUsageData });
|
||||
registerFindRoute(router, { coreUsageData });
|
||||
registerUpdateRoute(router, { coreUsageData });
|
||||
registerBulkGetRoute(router, { coreUsageData });
|
||||
registerBulkCreateRoute(router, { coreUsageData });
|
||||
registerBulkResolveRoute(router, { coreUsageData });
|
||||
registerBulkUpdateRoute(router, { coreUsageData });
|
||||
registerBulkDeleteRoute(router, { coreUsageData });
|
||||
registerGetRoute(router, { coreUsageData, logger });
|
||||
registerResolveRoute(router, { coreUsageData, logger });
|
||||
registerCreateRoute(router, { coreUsageData, logger });
|
||||
registerDeleteRoute(router, { coreUsageData, logger });
|
||||
registerFindRoute(router, { coreUsageData, logger });
|
||||
registerUpdateRoute(router, { coreUsageData, logger });
|
||||
registerBulkGetRoute(router, { coreUsageData, logger });
|
||||
registerBulkCreateRoute(router, { coreUsageData, logger });
|
||||
registerBulkResolveRoute(router, { coreUsageData, logger });
|
||||
registerBulkUpdateRoute(router, { coreUsageData, logger });
|
||||
registerBulkDeleteRoute(router, { coreUsageData, logger });
|
||||
registerExportRoute(router, { config, coreUsageData });
|
||||
registerImportRoute(router, { config, coreUsageData });
|
||||
registerResolveImportErrorsRoute(router, { config, coreUsageData });
|
||||
|
|
|
@ -8,16 +8,18 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { throwIfTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerResolveRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.get(
|
||||
{
|
||||
|
@ -30,6 +32,9 @@ export const registerResolveRoute = (
|
|||
},
|
||||
},
|
||||
router.handleLegacyErrors(async (context, req, res) => {
|
||||
logger.warn(
|
||||
"The resolve saved object API '/api/saved_objects/resolve/{type}/{id}' is deprecated."
|
||||
);
|
||||
const { type, id } = req.params;
|
||||
const { savedObjects } = await context.core;
|
||||
|
||||
|
|
|
@ -8,17 +8,19 @@
|
|||
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import type { SavedObjectsUpdateOptions } from '@kbn/core-saved-objects-api-server';
|
||||
import type { Logger } from '@kbn/logging';
|
||||
import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal';
|
||||
import type { InternalSavedObjectRouter } from '../internal_types';
|
||||
import { catchAndReturnBoomErrors, throwIfTypeNotVisibleByAPI } from './utils';
|
||||
|
||||
interface RouteDependencies {
|
||||
coreUsageData: InternalCoreUsageDataSetup;
|
||||
logger: Logger;
|
||||
}
|
||||
|
||||
export const registerUpdateRoute = (
|
||||
router: InternalSavedObjectRouter,
|
||||
{ coreUsageData }: RouteDependencies
|
||||
{ coreUsageData, logger }: RouteDependencies
|
||||
) => {
|
||||
router.put(
|
||||
{
|
||||
|
@ -45,6 +47,7 @@ export const registerUpdateRoute = (
|
|||
},
|
||||
},
|
||||
catchAndReturnBoomErrors(async (context, req, res) => {
|
||||
logger.warn("The update saved object API '/api/saved_objects/{type}/{id}' is deprecated.");
|
||||
const { type, id } = req.params;
|
||||
const { attributes, version, references, upsert } = req.body;
|
||||
const options: SavedObjectsUpdateOptions = { version, references, upsert };
|
||||
|
|
|
@ -19,6 +19,7 @@ import {
|
|||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -33,6 +34,7 @@ describe('POST /api/saved_objects/_bulk_create', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
({ server, httpSetup, handlerContext } = await setupServer());
|
||||
|
@ -50,7 +52,9 @@ describe('POST /api/saved_objects/_bulk_create', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsBulkCreate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerBulkCreateRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerBulkCreateRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -161,4 +165,21 @@ describe('POST /api/saved_objects/_bulk_create', () => {
|
|||
'Unsupported saved object type(s): hidden-from-http: Bad Request'
|
||||
);
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.post('/api/saved_objects/_bulk_create')
|
||||
.send([
|
||||
{
|
||||
id: 'abc1234',
|
||||
type: 'index-pattern',
|
||||
attributes: {
|
||||
title: 'foo',
|
||||
},
|
||||
references: [],
|
||||
},
|
||||
])
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerBulkDeleteRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -32,6 +33,7 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
({ server, httpSetup, handlerContext } = await setupServer());
|
||||
|
@ -52,7 +54,9 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsBulkDelete.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerBulkDeleteRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerBulkDeleteRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -133,4 +137,17 @@ describe('POST /api/saved_objects/_bulk_delete', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain('Unsupported saved object type(s):');
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.post('/api/saved_objects/_bulk_delete')
|
||||
.send([
|
||||
{
|
||||
id: 'hiddenID',
|
||||
type: 'hidden-from-http',
|
||||
},
|
||||
])
|
||||
.expect(400);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerBulkGetRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -32,6 +33,7 @@ describe('POST /api/saved_objects/_bulk_get', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
({ server, httpSetup, handlerContext } = await setupServer());
|
||||
|
@ -51,7 +53,9 @@ describe('POST /api/saved_objects/_bulk_get', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsBulkGet.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerBulkGetRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerBulkGetRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -120,4 +124,17 @@ describe('POST /api/saved_objects/_bulk_get', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain('Unsupported saved object type(s):');
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.post('/api/saved_objects/_bulk_get')
|
||||
.send([
|
||||
{
|
||||
id: 'abc123',
|
||||
type: 'index-pattern',
|
||||
},
|
||||
])
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerBulkResolveRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -32,6 +33,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
({ server, httpSetup, handlerContext } = await setupServer());
|
||||
|
@ -52,7 +54,9 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsBulkResolve.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerBulkResolveRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerBulkResolveRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -124,4 +128,17 @@ describe('POST /api/saved_objects/_bulk_resolve', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain('Unsupported saved object type(s):');
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.post('/api/saved_objects/_bulk_resolve')
|
||||
.send([
|
||||
{
|
||||
id: 'abc123',
|
||||
type: 'index-pattern',
|
||||
},
|
||||
])
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerBulkUpdateRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -34,6 +35,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
({ server, httpSetup, handlerContext } = await setupServer());
|
||||
|
@ -51,7 +53,9 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsBulkUpdate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerBulkUpdateRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerBulkUpdateRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -169,4 +173,27 @@ describe('PUT /api/saved_objects/_bulk_update', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain('Unsupported saved object type(s):');
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.put('/api/saved_objects/_bulk_update')
|
||||
.send([
|
||||
{
|
||||
type: 'visualization',
|
||||
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
|
||||
attributes: {
|
||||
title: 'An existing visualization',
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'dashboard',
|
||||
id: 'be3733a0-9efe-11e7-acb3-3dab96693fab',
|
||||
attributes: {
|
||||
title: 'An existing dashboard',
|
||||
},
|
||||
},
|
||||
])
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerCreateRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -32,6 +33,7 @@ describe('POST /api/saved_objects/{type}', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
const clientResponse = {
|
||||
id: 'logstash-*',
|
||||
|
@ -52,7 +54,9 @@ describe('POST /api/saved_objects/{type}', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsCreate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerCreateRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerCreateRoute(router, { coreUsageData, logger });
|
||||
|
||||
handlerContext.savedObjects.typeRegistry.getType.mockImplementation((typename: string) => {
|
||||
return testTypes
|
||||
|
@ -145,4 +149,16 @@ describe('POST /api/saved_objects/{type}', () => {
|
|||
|
||||
expect(result.body.message).toContain("Unsupported saved object type: 'hidden-from-http'");
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.post('/api/saved_objects/index-pattern')
|
||||
.send({
|
||||
attributes: {
|
||||
title: 'Logging test',
|
||||
},
|
||||
})
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerDeleteRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -33,6 +34,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
({ server, httpSetup, handlerContext } = await setupServer());
|
||||
|
@ -49,7 +51,9 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsDelete.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerDeleteRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerDeleteRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -104,4 +108,11 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain("Unsupported saved object type: 'hidden-from-http'");
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.delete('/api/saved_objects/index-pattern/logstash-*')
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -16,6 +16,7 @@ import {
|
|||
coreUsageDataServiceMock,
|
||||
} from '@kbn/core-usage-data-server-mocks';
|
||||
import { createHiddenTypeVariants, setupServer } from '@kbn/core-test-helpers-test-utils';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
import {
|
||||
registerFindRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
|
@ -38,6 +39,7 @@ describe('GET /api/saved_objects/_find', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
const clientResponse = {
|
||||
total: 0,
|
||||
|
@ -64,7 +66,9 @@ describe('GET /api/saved_objects/_find', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsFind.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerFindRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerFindRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -428,4 +432,11 @@ describe('GET /api/saved_objects/_find', () => {
|
|||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.get('/api/saved_objects/_find?type=foo&type=bar')
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -23,6 +23,7 @@ import {
|
|||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
const coreId = Symbol('core');
|
||||
|
||||
|
@ -38,6 +39,7 @@ describe('GET /api/saved_objects/{type}/{id}', () => {
|
|||
let handlerContext: ReturnType<typeof coreMock.createRequestHandlerContext>;
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
const coreContext = createCoreContext({ coreId });
|
||||
|
@ -72,7 +74,9 @@ describe('GET /api/saved_objects/{type}/{id}', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsGet.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerGetRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerGetRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -121,4 +125,11 @@ describe('GET /api/saved_objects/{type}/{id}', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain("Unsupported saved object type: 'hidden-from-http'");
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.get('/api/saved_objects/index-pattern/logstash-*')
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -23,6 +23,7 @@ import {
|
|||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { createHiddenTypeVariants } from '@kbn/core-test-helpers-test-utils';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
const coreId = Symbol('core');
|
||||
|
||||
|
@ -38,6 +39,7 @@ describe('GET /api/saved_objects/resolve/{type}/{id}', () => {
|
|||
let handlerContext: ReturnType<typeof coreMock.createRequestHandlerContext>;
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
const coreContext = createCoreContext({ coreId });
|
||||
|
@ -73,7 +75,9 @@ describe('GET /api/saved_objects/resolve/{type}/{id}', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsResolve.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerResolveRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerResolveRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -122,4 +126,11 @@ describe('GET /api/saved_objects/resolve/{type}/{id}', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain("Unsupported saved object type: 'hidden-from-http'");
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.get('/api/saved_objects/resolve/index-pattern/logstash-*')
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
registerUpdateRoute,
|
||||
type InternalSavedObjectsRequestHandlerContext,
|
||||
} from '@kbn/core-saved-objects-server-internal';
|
||||
import { loggerMock } from '@kbn/logging-mocks';
|
||||
|
||||
type SetupServerReturn = Awaited<ReturnType<typeof setupServer>>;
|
||||
|
||||
|
@ -33,6 +34,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
|
|||
let handlerContext: SetupServerReturn['handlerContext'];
|
||||
let savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
||||
let coreUsageStatsClient: jest.Mocked<ICoreUsageStatsClient>;
|
||||
let loggerWarnSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(async () => {
|
||||
const clientResponse = {
|
||||
|
@ -60,7 +62,9 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
|
|||
coreUsageStatsClient = coreUsageStatsClientMock.create();
|
||||
coreUsageStatsClient.incrementSavedObjectsUpdate.mockRejectedValue(new Error('Oh no!')); // intentionally throw this error, which is swallowed, so we can assert that the operation does not fail
|
||||
const coreUsageData = coreUsageDataServiceMock.createSetupContract(coreUsageStatsClient);
|
||||
registerUpdateRoute(router, { coreUsageData });
|
||||
const logger = loggerMock.create();
|
||||
loggerWarnSpy = jest.spyOn(logger, 'warn').mockImplementation();
|
||||
registerUpdateRoute(router, { coreUsageData, logger });
|
||||
|
||||
await server.start();
|
||||
});
|
||||
|
@ -123,4 +127,12 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => {
|
|||
.expect(400);
|
||||
expect(result.body.message).toContain("Unsupported saved object type: 'hidden-from-http'");
|
||||
});
|
||||
|
||||
it('logs a warning message when called', async () => {
|
||||
await supertest(httpSetup.server.listener)
|
||||
.put('/api/saved_objects/index-pattern/logstash-*')
|
||||
.send({ attributes: { title: 'Logging test' }, version: 'log' })
|
||||
.expect(200);
|
||||
expect(loggerWarnSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue