[8.7] [Saved Objects] Logs warning when deprecated SO APIs are called (#150775) (#151037)

# 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:
Kibana Machine 2023-02-13 12:41:51 -05:00 committed by GitHub
parent fc14852070
commit fbf1f0e0cf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 247 additions and 33 deletions

View file

@ -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();

View file

@ -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(() => {});

View file

@ -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(() => {});

View file

@ -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(() => {});

View file

@ -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(() => {});

View file

@ -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 } =

View file

@ -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;

View file

@ -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 =

View file

@ -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();

View file

@ -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 });

View file

@ -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;

View file

@ -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 };

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});

View file

@ -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);
});
});