diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createindexaliasnotfounderror.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createindexaliasnotfounderror.md
new file mode 100644
index 00000000000000..2b897db7bba4c3
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createindexaliasnotfounderror.md
@@ -0,0 +1,22 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) > [createIndexAliasNotFoundError](./kibana-plugin-core-server.savedobjectserrorhelpers.createindexaliasnotfounderror.md)
+
+## SavedObjectsErrorHelpers.createIndexAliasNotFoundError() method
+
+Signature:
+
+```typescript
+static createIndexAliasNotFoundError(alias: string): DecoratedError;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| alias | string
| |
+
+Returns:
+
+`DecoratedError`
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.decorateindexaliasnotfounderror.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.decorateindexaliasnotfounderror.md
new file mode 100644
index 00000000000000..c7e10fc42ead19
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.decorateindexaliasnotfounderror.md
@@ -0,0 +1,23 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) > [decorateIndexAliasNotFoundError](./kibana-plugin-core-server.savedobjectserrorhelpers.decorateindexaliasnotfounderror.md)
+
+## SavedObjectsErrorHelpers.decorateIndexAliasNotFoundError() method
+
+Signature:
+
+```typescript
+static decorateIndexAliasNotFoundError(error: Error, alias: string): DecoratedError;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| error | Error
| |
+| alias | string
| |
+
+Returns:
+
+`DecoratedError`
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isgeneralerror.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isgeneralerror.md
new file mode 100644
index 00000000000000..4b4ede2f77a7e2
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isgeneralerror.md
@@ -0,0 +1,22 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) > [isGeneralError](./kibana-plugin-core-server.savedobjectserrorhelpers.isgeneralerror.md)
+
+## SavedObjectsErrorHelpers.isGeneralError() method
+
+Signature:
+
+```typescript
+static isGeneralError(error: Error | DecoratedError): boolean;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| error | Error | DecoratedError
| |
+
+Returns:
+
+`boolean`
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md
index 9b69012ed5f123..2dc78f2df3a833 100644
--- a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md
@@ -18,6 +18,7 @@ export declare class SavedObjectsErrorHelpers
| [createBadRequestError(reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.createbadrequesterror.md) | static
| |
| [createConflictError(type, id, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.createconflicterror.md) | static
| |
| [createGenericNotFoundError(type, id)](./kibana-plugin-core-server.savedobjectserrorhelpers.creategenericnotfounderror.md) | static
| |
+| [createIndexAliasNotFoundError(alias)](./kibana-plugin-core-server.savedobjectserrorhelpers.createindexaliasnotfounderror.md) | static
| |
| [createInvalidVersionError(versionInput)](./kibana-plugin-core-server.savedobjectserrorhelpers.createinvalidversionerror.md) | static
| |
| [createTooManyRequestsError(type, id)](./kibana-plugin-core-server.savedobjectserrorhelpers.createtoomanyrequestserror.md) | static
| |
| [createUnsupportedTypeError(type)](./kibana-plugin-core-server.savedobjectserrorhelpers.createunsupportedtypeerror.md) | static
| |
@@ -27,6 +28,7 @@ export declare class SavedObjectsErrorHelpers
| [decorateEsUnavailableError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decorateesunavailableerror.md) | static
| |
| [decorateForbiddenError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decorateforbiddenerror.md) | static
| |
| [decorateGeneralError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decorategeneralerror.md) | static
| |
+| [decorateIndexAliasNotFoundError(error, alias)](./kibana-plugin-core-server.savedobjectserrorhelpers.decorateindexaliasnotfounderror.md) | static
| |
| [decorateNotAuthorizedError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decoratenotauthorizederror.md) | static
| |
| [decorateRequestEntityTooLargeError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decoraterequestentitytoolargeerror.md) | static
| |
| [decorateTooManyRequestsError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decoratetoomanyrequestserror.md) | static
| |
@@ -35,6 +37,7 @@ export declare class SavedObjectsErrorHelpers
| [isEsCannotExecuteScriptError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isescannotexecutescripterror.md) | static
| |
| [isEsUnavailableError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isesunavailableerror.md) | static
| |
| [isForbiddenError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isforbiddenerror.md) | static
| |
+| [isGeneralError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isgeneralerror.md) | static
| |
| [isInvalidVersionError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isinvalidversionerror.md) | static
| |
| [isNotAuthorizedError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isnotauthorizederror.md) | static
| |
| [isNotFoundError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isnotfounderror.md) | static
| |
diff --git a/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts b/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts
index d3494512d055a4..f86865ffa66704 100644
--- a/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts
+++ b/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts
@@ -25,5 +25,6 @@ export async function emptyKibanaIndexAction({
await cleanKibanaIndices({ client, stats, log, kibanaPluginIds });
await migrateKibanaIndex({ client, kbnClient });
- return stats;
+ stats.createdIndex('.kibana');
+ return stats.toJSON();
}
diff --git a/packages/kbn-es-archiver/src/es_archiver.ts b/packages/kbn-es-archiver/src/es_archiver.ts
index 70dc5370c5a269..b00b9fb8b3f25f 100644
--- a/packages/kbn-es-archiver/src/es_archiver.ts
+++ b/packages/kbn-es-archiver/src/es_archiver.ts
@@ -155,7 +155,7 @@ export class EsArchiver {
* @return Promise
*/
async emptyKibanaIndex() {
- await emptyKibanaIndexAction({
+ return await emptyKibanaIndexAction({
client: this.client,
log: this.log,
kbnClient: this.kbnClient,
diff --git a/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts b/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts
index 6d48c0b2bbaead..64e5626c94c8bb 100644
--- a/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts
+++ b/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts
@@ -82,7 +82,9 @@ export async function migrateKibanaIndex({
*/
async function fetchKibanaIndices(client: Client) {
const resp = await client.cat.indices({ index: '.kibana*', format: 'json' });
- const isKibanaIndex = (index: string) => /^\.kibana(:?_\d*)?$/.test(index);
+ const isKibanaIndex = (index: string) =>
+ /^\.kibana(:?_\d*)?$/.test(index) ||
+ /^\.kibana(_task_manager)?_(pre)?\d+\.\d+\.\d+/.test(index);
if (!Array.isArray(resp.body)) {
throw new Error(`expected response to be an array ${inspect(resp.body)}`);
@@ -115,7 +117,7 @@ export async function cleanKibanaIndices({
while (true) {
const resp = await client.deleteByQuery(
{
- index: `.kibana`,
+ index: `.kibana,.kibana_task_manager`,
body: {
query: {
bool: {
@@ -129,7 +131,7 @@ export async function cleanKibanaIndices({
},
},
{
- ignore: [409],
+ ignore: [404, 409],
}
);
diff --git a/src/core/server/saved_objects/migrationsv2/actions/index.ts b/src/core/server/saved_objects/migrationsv2/actions/index.ts
index fe2ce76446cb99..b22c326061f662 100644
--- a/src/core/server/saved_objects/migrationsv2/actions/index.ts
+++ b/src/core/server/saved_objects/migrationsv2/actions/index.ts
@@ -150,12 +150,23 @@ export const removeWriteBlock = (
.catch(catchRetryableEsClientErrors);
};
-const waitForIndexStatusGreen = (
+/**
+ * A yellow index status means the index's primary shard is allocated and the
+ * index is ready for searching/indexing documents, but ES wasn't able to
+ * allocate the replicas. When migrations proceed with a yellow index it means
+ * we don't have as much data-redundancy as we could have, but waiting for
+ * replicas would mean that v2 migrations fail where v1 migrations would have
+ * succeeded. It doesn't feel like it's Kibana's job to force users to keep
+ * their clusters green and even if it's green when we migrate it can turn
+ * yellow at any point in the future. So ultimately data-redundancy is up to
+ * users to maintain.
+ */
+const waitForIndexStatusYellow = (
client: ElasticsearchClient,
index: string
): TaskEither.TaskEither => () => {
return client.cluster
- .health({ index, wait_for_status: 'green', timeout: '30s' })
+ .health({ index, wait_for_status: 'yellow', timeout: '30s' })
.then(() => {
return Either.right({});
})
@@ -259,7 +270,7 @@ export const cloneIndex = (
} else {
// Otherwise, wait until the target index has a 'green' status.
return pipe(
- waitForIndexStatusGreen(client, target),
+ waitForIndexStatusYellow(client, target),
TaskEither.map((value) => {
/** When the index status is 'green' we know that all shards were started */
return { acknowledged: true, shardsAcknowledged: true };
@@ -687,7 +698,7 @@ export const createIndex = (
} else {
// Otherwise, wait until the target index has a 'green' status.
return pipe(
- waitForIndexStatusGreen(client, indexName),
+ waitForIndexStatusYellow(client, indexName),
TaskEither.map(() => {
/** When the index status is 'green' we know that all shards were started */
return 'create_index_succeeded';
diff --git a/src/core/server/saved_objects/migrationsv2/integration_tests/actions.test.ts b/src/core/server/saved_objects/migrationsv2/integration_tests/actions.test.ts
index 1bb4e57b0ac299..46cfd935f429b3 100644
--- a/src/core/server/saved_objects/migrationsv2/integration_tests/actions.test.ts
+++ b/src/core/server/saved_objects/migrationsv2/integration_tests/actions.test.ts
@@ -213,12 +213,8 @@ describe('migration actions', () => {
}
});
it('resolves right if cloning into a new target index', async () => {
+ const task = cloneIndex(client, 'existing_index_with_write_block', 'clone_target_1');
expect.assertions(1);
- const task = cloneIndex(
- client,
- 'existing_index_with_write_block',
- 'clone_yellow_then_green_index_1'
- );
await expect(task()).resolves.toMatchInlineSnapshot(`
Object {
"_tag": "Right",
@@ -229,42 +225,48 @@ describe('migration actions', () => {
}
`);
});
- it('resolves right after waiting for index status to be green if clone target already existed', async () => {
+ it('resolves right after waiting for index status to be yellow if clone target already existed', async () => {
expect.assertions(2);
+
// Create a yellow index
- await client.indices.create({
- index: 'clone_yellow_then_green_index_2',
- body: {
- mappings: { properties: {} },
- settings: {
- // Allocate 1 replica so that this index stays yellow
- number_of_replicas: '1',
+ await client.indices
+ .create({
+ index: 'clone_red_then_yellow_index',
+ timeout: '5s',
+ body: {
+ mappings: { properties: {} },
+ settings: {
+ // Allocate 1 replica so that this index stays yellow
+ number_of_replicas: '1',
+ // Disable all shard allocation so that the index status is red
+ 'index.routing.allocation.enable': 'none',
+ },
},
- },
- });
+ })
+ .catch((e) => {});
// Call clone even though the index already exists
const cloneIndexPromise = cloneIndex(
client,
'existing_index_with_write_block',
- 'clone_yellow_then_green_index_2'
+ 'clone_red_then_yellow_index'
)();
- let indexGreen = false;
+ let indexYellow = false;
setTimeout(() => {
client.indices.putSettings({
+ index: 'clone_red_then_yellow_index',
body: {
- index: {
- number_of_replicas: 0,
- },
+ // Enable all shard allocation so that the index status goes yellow
+ 'index.routing.allocation.enable': 'all',
},
});
- indexGreen = true;
+ indexYellow = true;
}, 10);
await cloneIndexPromise.then((res) => {
// Assert that the promise didn't resolve before the index became green
- expect(indexGreen).toBe(true);
+ expect(indexYellow).toBe(true);
expect(res).toMatchInlineSnapshot(`
Object {
"_tag": "Right",
@@ -278,7 +280,7 @@ describe('migration actions', () => {
});
it('resolves left index_not_found_exception if the source index does not exist', async () => {
expect.assertions(1);
- const task = cloneIndex(client, 'no_such_index', 'clone_yellow_then_green_index_3');
+ const task = cloneIndex(client, 'no_such_index', 'clone_target_3');
await expect(task()).resolves.toMatchInlineSnapshot(`
Object {
"_tag": "Left",
@@ -674,7 +676,6 @@ describe('migration actions', () => {
describe('waitForPickupUpdatedMappingsTask', () => {
it('rejects if there are failures', async () => {
- expect.assertions(1);
const res = (await pickupUpdatedMappings(
client,
'existing_index_with_write_block'
@@ -689,7 +690,6 @@ describe('migration actions', () => {
});
});
it('rejects if there is an error', async () => {
- expect.assertions(1);
const res = (await pickupUpdatedMappings(
client,
'no_such_index'
@@ -703,7 +703,6 @@ describe('migration actions', () => {
`);
});
it('resolves right when successful', async () => {
- expect.assertions(1);
const res = (await pickupUpdatedMappings(
client,
'existing_index_with_docs'
@@ -722,7 +721,6 @@ describe('migration actions', () => {
describe('updateAndPickupMappings', () => {
it('resolves right when mappings were updated and picked up', async () => {
- expect.assertions(3);
// Create an index without any mappings and insert documents into it
await createIndex(client, 'existing_index_without_mappings', {
dynamic: false as any,
@@ -771,7 +769,6 @@ describe('migration actions', () => {
describe('updateAliases', () => {
describe('remove', () => {
it('resolves left index_not_found_exception when the index does not exist', async () => {
- expect.assertions(1);
const task = updateAliases(client, [
{
remove: {
@@ -793,7 +790,6 @@ describe('migration actions', () => {
});
describe('with must_exist=false', () => {
it('resolves left alias_not_found_exception when alias does not exist', async () => {
- expect.assertions(1);
const task = updateAliases(client, [
{
remove: {
@@ -815,7 +811,6 @@ describe('migration actions', () => {
});
describe('with must_exist=true', () => {
it('resolves left alias_not_found_exception when alias does not exist on specified index', async () => {
- expect.assertions(1);
const task = updateAliases(client, [
{
remove: {
@@ -835,7 +830,6 @@ describe('migration actions', () => {
`);
});
it('resolves left alias_not_found_exception when alias does not exist', async () => {
- expect.assertions(1);
const task = updateAliases(client, [
{
remove: {
@@ -858,7 +852,6 @@ describe('migration actions', () => {
});
describe('remove_index', () => {
it('left index_not_found_exception if index does not exist', async () => {
- expect.assertions(1);
const task = updateAliases(client, [
{
remove_index: {
@@ -877,7 +870,6 @@ describe('migration actions', () => {
`);
});
it('left remove_index_not_a_concrete_index when remove_index targets an alias', async () => {
- expect.assertions(1);
const task = updateAliases(client, [
{
remove_index: {
@@ -899,44 +891,50 @@ describe('migration actions', () => {
describe('createIndex', () => {
afterAll(async () => {
- await client.indices.delete({ index: 'yellow_then_green_index' });
+ await client.indices.delete({ index: 'red_then_yellow_index' });
});
- it('resolves right after waiting for an index status to be green if the index already existed', async () => {
+ it('resolves right after waiting for an index status to be yellow if the index already existed', async () => {
expect.assertions(2);
- // Create a yellow index
- await client.indices.create(
- {
- index: 'yellow_then_green_index',
- body: {
- mappings: { properties: {} },
- settings: {
- // Allocate 1 replica so that this index stays yellow
- number_of_replicas: '1',
+ // Create a red index
+ await client.indices
+ .create(
+ {
+ index: 'red_then_yellow_index',
+ timeout: '5s',
+ body: {
+ mappings: { properties: {} },
+ settings: {
+ // Allocate 1 replica so that this index stays yellow
+ number_of_replicas: '1',
+ // Disable all shard allocation so that the index status is red
+ 'index.routing.allocation.enable': 'none',
+ },
},
},
- },
- { maxRetries: 0 /** handle retry ourselves for now */ }
- );
+ { maxRetries: 0 /** handle retry ourselves for now */ }
+ )
+ .catch((e) => {
+ /** ignore */
+ });
// Call createIndex even though the index already exists
- const createIndexPromise = createIndex(client, 'yellow_then_green_index', undefined as any)();
- let indexGreen = false;
+ const createIndexPromise = createIndex(client, 'red_then_yellow_index', undefined as any)();
+ let indexYellow = false;
setTimeout(() => {
client.indices.putSettings({
- index: 'yellow_then_green_index',
+ index: 'red_then_yellow_index',
body: {
- index: {
- number_of_replicas: 0,
- },
+ // Disable all shard allocation so that the index status is red
+ 'index.routing.allocation.enable': 'all',
},
});
- indexGreen = true;
+ indexYellow = true;
}, 10);
await createIndexPromise.then((res) => {
// Assert that the promise didn't resolve before the index became green
- expect(indexGreen).toBe(true);
+ expect(indexYellow).toBe(true);
expect(res).toMatchInlineSnapshot(`
Object {
"_tag": "Right",
@@ -946,7 +944,6 @@ describe('migration actions', () => {
});
});
it('rejects when there is an unexpected error creating the index', async () => {
- expect.assertions(1);
// Creating an index with the same name as an existing alias to induce
// failure
await expect(
@@ -957,7 +954,6 @@ describe('migration actions', () => {
describe('bulkOverwriteTransformedDocuments', () => {
it('resolves right when documents do not yet exist in the index', async () => {
- expect.assertions(1);
const newDocs = ([
{ _source: { title: 'doc 5' } },
{ _source: { title: 'doc 6' } },
@@ -972,7 +968,6 @@ describe('migration actions', () => {
`);
});
it('resolves right even if there were some version_conflict_engine_exception', async () => {
- expect.assertions(1);
const existingDocs = ((await searchForOutdatedDocuments(
client,
'existing_index_with_docs',
@@ -991,7 +986,6 @@ describe('migration actions', () => {
`);
});
it('rejects if there are errors', async () => {
- expect.assertions(1);
const newDocs = ([
{ _source: { title: 'doc 5' } },
{ _source: { title: 'doc 6' } },
diff --git a/src/core/server/saved_objects/migrationsv2/model.test.ts b/src/core/server/saved_objects/migrationsv2/model.test.ts
index 895db80983fc17..5531f847f8bb41 100644
--- a/src/core/server/saved_objects/migrationsv2/model.test.ts
+++ b/src/core/server/saved_objects/migrationsv2/model.test.ts
@@ -182,6 +182,21 @@ describe('migrations v2 model', () => {
versionAlias: '.kibana_7.11.0',
versionIndex: '.kibana_7.11.0_001',
};
+ const mappingsWithUnknownType = {
+ properties: {
+ disabled_saved_object_type: {
+ properties: {
+ value: { type: 'keyword' },
+ },
+ },
+ },
+ _meta: {
+ migrationMappingPropertyHashes: {
+ disabled_saved_object_type: '7997cf5a56cc02bdc9c93361bde732b0',
+ },
+ },
+ };
+
test('INIT -> OUTDATED_DOCUMENTS_SEARCH if .kibana is already pointing to the target index', () => {
const res: ResponseType<'INIT'> = Either.right({
'.kibana_7.11.0_001': {
@@ -189,38 +204,27 @@ describe('migrations v2 model', () => {
'.kibana': {},
'.kibana_7.11.0': {},
},
- mappings: {
- properties: {
- disabled_saved_object_type: {
- properties: {
- value: { type: 'keyword' },
- },
- },
- },
- _meta: {
- migrationMappingPropertyHashes: {
- disabled_saved_object_type: '7997cf5a56cc02bdc9c93361bde732b0',
- },
- },
- },
+ mappings: mappingsWithUnknownType,
settings: {},
},
});
const newState = model(initState, res);
expect(newState.controlState).toEqual('OUTDATED_DOCUMENTS_SEARCH');
+ // This snapshot asserts that we merge the
+ // migrationMappingPropertyHashes of the existing index, but we leave
+ // the mappings for the disabled_saved_object_type untouched. There
+ // might be another Kibana instance that knows about this type and
+ // needs these mappings in place.
expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
Object {
"_meta": Object {
"migrationMappingPropertyHashes": Object {
+ "disabled_saved_object_type": "7997cf5a56cc02bdc9c93361bde732b0",
"new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
},
},
"properties": Object {
- "disabled_saved_object_type": Object {
- "dynamic": false,
- "properties": Object {},
- },
"new_saved_object_type": Object {
"properties": Object {
"value": Object {
@@ -271,7 +275,7 @@ describe('migrations v2 model', () => {
'.kibana': {},
'.kibana_7.12.0': {},
},
- mappings: { properties: {}, _meta: { migrationMappingPropertyHashes: {} } },
+ mappings: mappingsWithUnknownType,
settings: {},
},
'.kibana_7.11.0_001': {
@@ -288,12 +292,37 @@ describe('migrations v2 model', () => {
sourceIndex: Option.some('.kibana_7.invalid.0_001'),
targetIndex: '.kibana_7.11.0_001',
});
+ // This snapshot asserts that we disable the unknown saved object
+ // type. Because it's mappings are disabled, we also don't copy the
+ // `_meta.migrationMappingPropertyHashes` for the disabled type.
+ expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
+ Object {
+ "_meta": Object {
+ "migrationMappingPropertyHashes": Object {
+ "new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
+ },
+ },
+ "properties": Object {
+ "disabled_saved_object_type": Object {
+ "dynamic": false,
+ "properties": Object {},
+ },
+ "new_saved_object_type": Object {
+ "properties": Object {
+ "value": Object {
+ "type": "text",
+ },
+ },
+ },
+ },
+ }
+ `);
});
test('INIT -> SET_SOURCE_WRITE_BLOCK when migrating from a v2 migrations index (>= 7.11.0)', () => {
const res: ResponseType<'INIT'> = Either.right({
'.kibana_7.11.0_001': {
aliases: { '.kibana': {}, '.kibana_7.11.0': {} },
- mappings: { properties: {}, _meta: { migrationMappingPropertyHashes: {} } },
+ mappings: mappingsWithUnknownType,
settings: {},
},
'.kibana_3': {
@@ -319,6 +348,31 @@ describe('migrations v2 model', () => {
sourceIndex: Option.some('.kibana_7.11.0_001'),
targetIndex: '.kibana_7.12.0_001',
});
+ // This snapshot asserts that we disable the unknown saved object
+ // type. Because it's mappings are disabled, we also don't copy the
+ // `_meta.migrationMappingPropertyHashes` for the disabled type.
+ expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
+ Object {
+ "_meta": Object {
+ "migrationMappingPropertyHashes": Object {
+ "new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
+ },
+ },
+ "properties": Object {
+ "disabled_saved_object_type": Object {
+ "dynamic": false,
+ "properties": Object {},
+ },
+ "new_saved_object_type": Object {
+ "properties": Object {
+ "value": Object {
+ "type": "text",
+ },
+ },
+ },
+ },
+ }
+ `);
expect(newState.retryCount).toEqual(0);
expect(newState.retryDelay).toEqual(0);
});
@@ -328,7 +382,7 @@ describe('migrations v2 model', () => {
aliases: {
'.kibana': {},
},
- mappings: { properties: {}, _meta: { migrationMappingPropertyHashes: {} } },
+ mappings: mappingsWithUnknownType,
settings: {},
},
});
@@ -339,6 +393,31 @@ describe('migrations v2 model', () => {
sourceIndex: Option.some('.kibana_3'),
targetIndex: '.kibana_7.11.0_001',
});
+ // This snapshot asserts that we disable the unknown saved object
+ // type. Because it's mappings are disabled, we also don't copy the
+ // `_meta.migrationMappingPropertyHashes` for the disabled type.
+ expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
+ Object {
+ "_meta": Object {
+ "migrationMappingPropertyHashes": Object {
+ "new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
+ },
+ },
+ "properties": Object {
+ "disabled_saved_object_type": Object {
+ "dynamic": false,
+ "properties": Object {},
+ },
+ "new_saved_object_type": Object {
+ "properties": Object {
+ "value": Object {
+ "type": "text",
+ },
+ },
+ },
+ },
+ }
+ `);
expect(newState.retryCount).toEqual(0);
expect(newState.retryDelay).toEqual(0);
});
@@ -346,7 +425,7 @@ describe('migrations v2 model', () => {
const res: ResponseType<'INIT'> = Either.right({
'.kibana': {
aliases: {},
- mappings: { properties: {}, _meta: {} },
+ mappings: mappingsWithUnknownType,
settings: {},
},
});
@@ -357,6 +436,31 @@ describe('migrations v2 model', () => {
sourceIndex: Option.some('.kibana_pre6.5.0_001'),
targetIndex: '.kibana_7.11.0_001',
});
+ // This snapshot asserts that we disable the unknown saved object
+ // type. Because it's mappings are disabled, we also don't copy the
+ // `_meta.migrationMappingPropertyHashes` for the disabled type.
+ expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
+ Object {
+ "_meta": Object {
+ "migrationMappingPropertyHashes": Object {
+ "new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
+ },
+ },
+ "properties": Object {
+ "disabled_saved_object_type": Object {
+ "dynamic": false,
+ "properties": Object {},
+ },
+ "new_saved_object_type": Object {
+ "properties": Object {
+ "value": Object {
+ "type": "text",
+ },
+ },
+ },
+ },
+ }
+ `);
expect(newState.retryCount).toEqual(0);
expect(newState.retryDelay).toEqual(0);
});
@@ -366,7 +470,7 @@ describe('migrations v2 model', () => {
aliases: {
'my-saved-objects': {},
},
- mappings: { properties: {}, _meta: { migrationMappingPropertyHashes: {} } },
+ mappings: mappingsWithUnknownType,
settings: {},
},
});
@@ -386,6 +490,31 @@ describe('migrations v2 model', () => {
sourceIndex: Option.some('my-saved-objects_3'),
targetIndex: 'my-saved-objects_7.11.0_001',
});
+ // This snapshot asserts that we disable the unknown saved object
+ // type. Because it's mappings are disabled, we also don't copy the
+ // `_meta.migrationMappingPropertyHashes` for the disabled type.
+ expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
+ Object {
+ "_meta": Object {
+ "migrationMappingPropertyHashes": Object {
+ "new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
+ },
+ },
+ "properties": Object {
+ "disabled_saved_object_type": Object {
+ "dynamic": false,
+ "properties": Object {},
+ },
+ "new_saved_object_type": Object {
+ "properties": Object {
+ "value": Object {
+ "type": "text",
+ },
+ },
+ },
+ },
+ }
+ `);
expect(newState.retryCount).toEqual(0);
expect(newState.retryDelay).toEqual(0);
});
@@ -395,7 +524,7 @@ describe('migrations v2 model', () => {
aliases: {
'my-saved-objects': {},
},
- mappings: { properties: {}, _meta: { migrationMappingPropertyHashes: {} } },
+ mappings: mappingsWithUnknownType,
settings: {},
},
});
@@ -416,6 +545,31 @@ describe('migrations v2 model', () => {
sourceIndex: Option.some('my-saved-objects_7.11.0'),
targetIndex: 'my-saved-objects_7.12.0_001',
});
+ // This snapshot asserts that we disable the unknown saved object
+ // type. Because it's mappings are disabled, we also don't copy the
+ // `_meta.migrationMappingPropertyHashes` for the disabled type.
+ expect(newState.targetIndexMappings).toMatchInlineSnapshot(`
+ Object {
+ "_meta": Object {
+ "migrationMappingPropertyHashes": Object {
+ "new_saved_object_type": "4a11183eee21e6fbad864f7a30b39ad0",
+ },
+ },
+ "properties": Object {
+ "disabled_saved_object_type": Object {
+ "dynamic": false,
+ "properties": Object {},
+ },
+ "new_saved_object_type": Object {
+ "properties": Object {
+ "value": Object {
+ "type": "text",
+ },
+ },
+ },
+ },
+ }
+ `);
expect(newState.retryCount).toEqual(0);
expect(newState.retryDelay).toEqual(0);
});
diff --git a/src/core/server/saved_objects/migrationsv2/model.ts b/src/core/server/saved_objects/migrationsv2/model.ts
index c9a3aa25db4c15..6f915df9dd9588 100644
--- a/src/core/server/saved_objects/migrationsv2/model.ts
+++ b/src/core/server/saved_objects/migrationsv2/model.ts
@@ -60,13 +60,13 @@ function throwBadResponse(state: State, res: any): never {
* Merge the _meta.migrationMappingPropertyHashes mappings of an index with
* the given target mappings.
*
- * @remarks Mapping updates are commutative (deeply merged) by Elasticsearch,
- * except for the _meta key. The source index we're migrating from might
- * contain documents created by a plugin that is disabled in the Kibana
- * instance performing this migration. We merge the
- * _meta.migrationMappingPropertyHashes mappings from the source index into
- * the targetMappings to ensure that any `migrationPropertyHashes` for
- * disabled plugins aren't lost.
+ * @remarks When another instance already completed a migration, the existing
+ * target index might contain documents and mappings created by a plugin that
+ * is disabled in the current Kibana instance performing this migration.
+ * Mapping updates are commutative (deeply merged) by Elasticsearch, except
+ * for the `_meta` key. By merging the `_meta.migrationMappingPropertyHashes`
+ * mappings from the existing target index index into the targetMappings we
+ * ensure that any `migrationPropertyHashes` for disabled plugins aren't lost.
*
* Right now we don't use these `migrationPropertyHashes` but it could be used
* in the future to detect if mappings were changed. If mappings weren't
@@ -209,7 +209,7 @@ export const model = (currentState: State, resW: ResponseType):
// index
sourceIndex: Option.none,
targetIndex: `${stateP.indexPrefix}_${stateP.kibanaVersion}_001`,
- targetIndexMappings: disableUnknownTypeMappingFields(
+ targetIndexMappings: mergeMigrationMappingPropertyHashes(
stateP.targetIndexMappings,
indices[aliases[stateP.currentAlias]].mappings
),
@@ -242,7 +242,7 @@ export const model = (currentState: State, resW: ResponseType):
controlState: 'SET_SOURCE_WRITE_BLOCK',
sourceIndex: Option.some(source) as Option.Some,
targetIndex: target,
- targetIndexMappings: mergeMigrationMappingPropertyHashes(
+ targetIndexMappings: disableUnknownTypeMappingFields(
stateP.targetIndexMappings,
indices[source].mappings
),
@@ -279,7 +279,7 @@ export const model = (currentState: State, resW: ResponseType):
controlState: 'LEGACY_SET_WRITE_BLOCK',
sourceIndex: Option.some(legacyReindexTarget) as Option.Some,
targetIndex: target,
- targetIndexMappings: mergeMigrationMappingPropertyHashes(
+ targetIndexMappings: disableUnknownTypeMappingFields(
stateP.targetIndexMappings,
indices[stateP.legacyIndex].mappings
),
diff --git a/src/core/server/saved_objects/routes/bulk_create.ts b/src/core/server/saved_objects/routes/bulk_create.ts
index 7574f26979ab1e..344a0d151cfb9e 100644
--- a/src/core/server/saved_objects/routes/bulk_create.ts
+++ b/src/core/server/saved_objects/routes/bulk_create.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -44,7 +45,7 @@ export const registerBulkCreateRoute = (router: IRouter, { coreUsageData }: Rout
),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { overwrite } = req.query;
const usageStatsClient = coreUsageData.getClient();
diff --git a/src/core/server/saved_objects/routes/bulk_get.ts b/src/core/server/saved_objects/routes/bulk_get.ts
index 2484daf2ea8754..3838e4d3b3c8e7 100644
--- a/src/core/server/saved_objects/routes/bulk_get.ts
+++ b/src/core/server/saved_objects/routes/bulk_get.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -28,7 +29,7 @@ export const registerBulkGetRoute = (router: IRouter, { coreUsageData }: RouteDe
),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const usageStatsClient = coreUsageData.getClient();
usageStatsClient.incrementSavedObjectsBulkGet({ request: req }).catch(() => {});
diff --git a/src/core/server/saved_objects/routes/bulk_update.ts b/src/core/server/saved_objects/routes/bulk_update.ts
index 1a717f330d4c25..de47ab9c596114 100644
--- a/src/core/server/saved_objects/routes/bulk_update.ts
+++ b/src/core/server/saved_objects/routes/bulk_update.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -39,7 +40,7 @@ export const registerBulkUpdateRoute = (router: IRouter, { coreUsageData }: Rout
),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const usageStatsClient = coreUsageData.getClient();
usageStatsClient.incrementSavedObjectsBulkUpdate({ request: req }).catch(() => {});
diff --git a/src/core/server/saved_objects/routes/create.ts b/src/core/server/saved_objects/routes/create.ts
index db68b2f87d5772..2fa7acfb6cab62 100644
--- a/src/core/server/saved_objects/routes/create.ts
+++ b/src/core/server/saved_objects/routes/create.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -43,7 +44,7 @@ export const registerCreateRoute = (router: IRouter, { coreUsageData }: RouteDep
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { type, id } = req.params;
const { overwrite } = req.query;
const {
diff --git a/src/core/server/saved_objects/routes/delete.ts b/src/core/server/saved_objects/routes/delete.ts
index dbbb0faf35c31f..609ce2692c7770 100644
--- a/src/core/server/saved_objects/routes/delete.ts
+++ b/src/core/server/saved_objects/routes/delete.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -28,7 +29,7 @@ export const registerDeleteRoute = (router: IRouter, { coreUsageData }: RouteDep
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { type, id } = req.params;
const { force } = req.query;
diff --git a/src/core/server/saved_objects/routes/export.ts b/src/core/server/saved_objects/routes/export.ts
index 76e422d24732e4..fa5517303f18f2 100644
--- a/src/core/server/saved_objects/routes/export.ts
+++ b/src/core/server/saved_objects/routes/export.ts
@@ -18,7 +18,7 @@ import {
SavedObjectsExportByObjectOptions,
SavedObjectsExportError,
} from '../export';
-import { validateTypes, validateObjects } from './utils';
+import { validateTypes, validateObjects, catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
config: SavedObjectConfig;
@@ -163,7 +163,7 @@ export const registerExportRoute = (
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const cleaned = cleanOptions(req.body);
const supportedTypes = context.core.savedObjects.typeRegistry
.getImportableAndExportableTypes()
diff --git a/src/core/server/saved_objects/routes/find.ts b/src/core/server/saved_objects/routes/find.ts
index b9ad6ce15df2be..6ba23747cf3745 100644
--- a/src/core/server/saved_objects/routes/find.ts
+++ b/src/core/server/saved_objects/routes/find.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -49,7 +50,7 @@ export const registerFindRoute = (router: IRouter, { coreUsageData }: RouteDepen
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const query = req.query;
const namespaces =
diff --git a/src/core/server/saved_objects/routes/get.ts b/src/core/server/saved_objects/routes/get.ts
index 121cb82155b6ec..f28822d95d8142 100644
--- a/src/core/server/saved_objects/routes/get.ts
+++ b/src/core/server/saved_objects/routes/get.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -25,7 +26,7 @@ export const registerGetRoute = (router: IRouter, { coreUsageData }: RouteDepend
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { type, id } = req.params;
const usageStatsClient = coreUsageData.getClient();
diff --git a/src/core/server/saved_objects/routes/import.ts b/src/core/server/saved_objects/routes/import.ts
index 81220f897f36ba..e84c638d3ec999 100644
--- a/src/core/server/saved_objects/routes/import.ts
+++ b/src/core/server/saved_objects/routes/import.ts
@@ -13,7 +13,7 @@ import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
import { SavedObjectConfig } from '../saved_objects_config';
import { SavedObjectsImportError } from '../import';
-import { createSavedObjectsStreamFromNdJson } from './utils';
+import { catchAndReturnBoomErrors, createSavedObjectsStreamFromNdJson } from './utils';
interface RouteDependencies {
config: SavedObjectConfig;
@@ -61,7 +61,7 @@ export const registerImportRoute = (
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { overwrite, createNewCopies } = req.query;
const usageStatsClient = coreUsageData.getClient();
diff --git a/src/core/server/saved_objects/routes/migrate.ts b/src/core/server/saved_objects/routes/migrate.ts
index 19c6e3d99d6c21..404074124c92b7 100644
--- a/src/core/server/saved_objects/routes/migrate.ts
+++ b/src/core/server/saved_objects/routes/migrate.ts
@@ -8,6 +8,7 @@
import { IRouter } from '../../http';
import { IKibanaMigrator } from '../migrations';
+import { catchAndReturnBoomErrors } from './utils';
export const registerMigrateRoute = (
router: IRouter,
@@ -21,7 +22,7 @@ export const registerMigrateRoute = (
tags: ['access:migrateSavedObjects'],
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const migrator = await migratorPromise;
await migrator.runMigrations({ rerun: true });
return res.ok({
diff --git a/src/core/server/saved_objects/routes/resolve_import_errors.ts b/src/core/server/saved_objects/routes/resolve_import_errors.ts
index 682b583f6a791f..2a664328d4df29 100644
--- a/src/core/server/saved_objects/routes/resolve_import_errors.ts
+++ b/src/core/server/saved_objects/routes/resolve_import_errors.ts
@@ -13,8 +13,7 @@ import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
import { SavedObjectConfig } from '../saved_objects_config';
import { SavedObjectsImportError } from '../import';
-import { createSavedObjectsStreamFromNdJson } from './utils';
-
+import { catchAndReturnBoomErrors, createSavedObjectsStreamFromNdJson } from './utils';
interface RouteDependencies {
config: SavedObjectConfig;
coreUsageData: CoreUsageDataSetup;
@@ -69,7 +68,7 @@ export const registerResolveImportErrorsRoute = (
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { createNewCopies } = req.query;
const usageStatsClient = coreUsageData.getClient();
diff --git a/src/core/server/saved_objects/routes/update.ts b/src/core/server/saved_objects/routes/update.ts
index 857973c5ae0068..cb605dac567772 100644
--- a/src/core/server/saved_objects/routes/update.ts
+++ b/src/core/server/saved_objects/routes/update.ts
@@ -9,6 +9,7 @@
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { CoreUsageDataSetup } from '../../core_usage_data';
+import { catchAndReturnBoomErrors } from './utils';
interface RouteDependencies {
coreUsageData: CoreUsageDataSetup;
@@ -38,7 +39,7 @@ export const registerUpdateRoute = (router: IRouter, { coreUsageData }: RouteDep
}),
},
},
- router.handleLegacyErrors(async (context, req, res) => {
+ catchAndReturnBoomErrors(async (context, req, res) => {
const { type, id } = req.params;
const { attributes, version, references } = req.body;
const options = { version, references };
diff --git a/src/core/server/saved_objects/routes/utils.test.ts b/src/core/server/saved_objects/routes/utils.test.ts
index a24a4a1b51f6a5..623d2dcc71faca 100644
--- a/src/core/server/saved_objects/routes/utils.test.ts
+++ b/src/core/server/saved_objects/routes/utils.test.ts
@@ -9,6 +9,15 @@
import { createSavedObjectsStreamFromNdJson, validateTypes, validateObjects } from './utils';
import { Readable } from 'stream';
import { createPromiseFromStreams, createConcatStream } from '@kbn/utils';
+import { catchAndReturnBoomErrors } from './utils';
+import Boom from '@hapi/boom';
+import {
+ KibanaRequest,
+ RequestHandler,
+ RequestHandlerContext,
+ KibanaResponseFactory,
+ kibanaResponseFactory,
+} from '../../';
async function readStreamToCompletion(stream: Readable) {
return createPromiseFromStreams([stream, createConcatStream([])]);
@@ -143,3 +152,69 @@ describe('validateObjects', () => {
).toBeUndefined();
});
});
+
+describe('catchAndReturnBoomErrors', () => {
+ let context: RequestHandlerContext;
+ let request: KibanaRequest;
+ let response: KibanaResponseFactory;
+
+ const createHandler = (handler: () => any): RequestHandler => () => {
+ return handler();
+ };
+
+ beforeEach(() => {
+ context = {} as any;
+ request = {} as any;
+ response = kibanaResponseFactory;
+ });
+
+ it('should pass-though call parameters to the handler', async () => {
+ const handler = jest.fn();
+ const wrapped = catchAndReturnBoomErrors(handler);
+ await wrapped(context, request, response);
+ expect(handler).toHaveBeenCalledWith(context, request, response);
+ });
+
+ it('should pass-though result from the handler', async () => {
+ const handler = createHandler(() => {
+ return 'handler-response';
+ });
+ const wrapped = catchAndReturnBoomErrors(handler);
+ const result = await wrapped(context, request, response);
+ expect(result).toBe('handler-response');
+ });
+
+ it('should intercept and convert thrown Boom errors', async () => {
+ const handler = createHandler(() => {
+ throw Boom.notFound('not there');
+ });
+ const wrapped = catchAndReturnBoomErrors(handler);
+ const result = await wrapped(context, request, response);
+ expect(result.status).toBe(404);
+ expect(result.payload).toEqual({
+ error: 'Not Found',
+ message: 'not there',
+ statusCode: 404,
+ });
+ });
+
+ it('should re-throw non-Boom errors', async () => {
+ const handler = createHandler(() => {
+ throw new Error('something went bad');
+ });
+ const wrapped = catchAndReturnBoomErrors(handler);
+ await expect(wrapped(context, request, response)).rejects.toMatchInlineSnapshot(
+ `[Error: something went bad]`
+ );
+ });
+
+ it('should re-throw Boom internal/500 errors', async () => {
+ const handler = createHandler(() => {
+ throw Boom.internal();
+ });
+ const wrapped = catchAndReturnBoomErrors(handler);
+ await expect(wrapped(context, request, response)).rejects.toMatchInlineSnapshot(
+ `[Error: Internal Server Error]`
+ );
+ });
+});
diff --git a/src/core/server/saved_objects/routes/utils.ts b/src/core/server/saved_objects/routes/utils.ts
index fc784ac80ed8d2..e933badfe80feb 100644
--- a/src/core/server/saved_objects/routes/utils.ts
+++ b/src/core/server/saved_objects/routes/utils.ts
@@ -7,7 +7,11 @@
*/
import { Readable } from 'stream';
-import { SavedObject, SavedObjectsExportResultDetails } from 'src/core/server';
+import {
+ RequestHandlerWrapper,
+ SavedObject,
+ SavedObjectsExportResultDetails,
+} from 'src/core/server';
import {
createSplitStream,
createMapStream,
@@ -16,6 +20,7 @@ import {
createListStream,
createConcatStream,
} from '@kbn/utils';
+import Boom from '@hapi/boom';
export async function createSavedObjectsStreamFromNdJson(ndJsonStream: Readable) {
const savedObjects = await createPromiseFromStreams([
@@ -52,3 +57,30 @@ export function validateObjects(
.join(', ')}`;
}
}
+
+/**
+ * Catches errors thrown by saved object route handlers and returns an error
+ * with the payload and statusCode of the boom error.
+ *
+ * This is very close to the core `router.handleLegacyErrors` except that it
+ * throws internal errors (statusCode: 500) so that the internal error's
+ * message get logged by Core.
+ *
+ * TODO: Remove once https://github.com/elastic/kibana/issues/65291 is fixed.
+ */
+export const catchAndReturnBoomErrors: RequestHandlerWrapper = (handler) => {
+ return async (context, request, response) => {
+ try {
+ return await handler(context, request, response);
+ } catch (e) {
+ if (Boom.isBoom(e) && e.output.statusCode !== 500) {
+ return response.customError({
+ body: e.output.payload,
+ statusCode: e.output.statusCode,
+ headers: e.output.headers as { [key: string]: string },
+ });
+ }
+ throw e;
+ }
+ };
+};
diff --git a/src/core/server/saved_objects/service/lib/decorate_es_error.test.ts b/src/core/server/saved_objects/service/lib/decorate_es_error.test.ts
index 717fd5fc5ab929..32f12193306e72 100644
--- a/src/core/server/saved_objects/service/lib/decorate_es_error.test.ts
+++ b/src/core/server/saved_objects/service/lib/decorate_es_error.test.ts
@@ -109,6 +109,27 @@ describe('savedObjectsClient/decorateEsError', () => {
expect(SavedObjectsErrorHelpers.isNotFoundError(genericError)).toBe(true);
});
+ it('if saved objects index does not exist makes NotFound a SavedObjectsClient/generalError', () => {
+ const error = new esErrors.ResponseError(
+ elasticsearchClientMock.createApiResponse({
+ statusCode: 404,
+ body: {
+ error: {
+ reason:
+ 'no such index [.kibana_8.0.0] and [require_alias] request flag is [true] and [.kibana_8.0.0] is not an alias',
+ },
+ },
+ })
+ );
+ expect(SavedObjectsErrorHelpers.isGeneralError(error)).toBe(false);
+ const genericError = decorateEsError(error);
+ expect(genericError.message).toEqual(
+ `Saved object index alias [.kibana_8.0.0] not found: Response Error`
+ );
+ expect(genericError.output.statusCode).toBe(500);
+ expect(SavedObjectsErrorHelpers.isGeneralError(error)).toBe(true);
+ });
+
it('makes BadRequest a SavedObjectsClient/BadRequest error', () => {
const error = new esErrors.ResponseError(
elasticsearchClientMock.createApiResponse({ statusCode: 400 })
diff --git a/src/core/server/saved_objects/service/lib/decorate_es_error.ts b/src/core/server/saved_objects/service/lib/decorate_es_error.ts
index 59a9210ff51306..e1aa1ab2f956da 100644
--- a/src/core/server/saved_objects/service/lib/decorate_es_error.ts
+++ b/src/core/server/saved_objects/service/lib/decorate_es_error.ts
@@ -63,6 +63,12 @@ export function decorateEsError(error: EsErrors) {
}
if (responseErrors.isNotFound(error.statusCode)) {
+ const match = error?.meta?.body?.error?.reason?.match(
+ /no such index \[(.+)\] and \[require_alias\] request flag is \[true\] and \[.+\] is not an alias/
+ );
+ if (match?.length > 0) {
+ return SavedObjectsErrorHelpers.decorateIndexAliasNotFoundError(error, match[1]);
+ }
return SavedObjectsErrorHelpers.createGenericNotFoundError();
}
diff --git a/src/core/server/saved_objects/service/lib/errors.ts b/src/core/server/saved_objects/service/lib/errors.ts
index 2495679a2f8c2d..581145c7c09d1b 100644
--- a/src/core/server/saved_objects/service/lib/errors.ts
+++ b/src/core/server/saved_objects/service/lib/errors.ts
@@ -135,6 +135,19 @@ export class SavedObjectsErrorHelpers {
return decorate(Boom.notFound(), CODE_NOT_FOUND, 404);
}
+ public static createIndexAliasNotFoundError(alias: string) {
+ return SavedObjectsErrorHelpers.decorateIndexAliasNotFoundError(Boom.internal(), alias);
+ }
+
+ public static decorateIndexAliasNotFoundError(error: Error, alias: string) {
+ return decorate(
+ error,
+ CODE_GENERAL_ERROR,
+ 500,
+ `Saved object index alias [${alias}] not found`
+ );
+ }
+
public static isNotFoundError(error: Error | DecoratedError) {
return isSavedObjectsClientError(error) && error[code] === CODE_NOT_FOUND;
}
@@ -185,4 +198,8 @@ export class SavedObjectsErrorHelpers {
public static decorateGeneralError(error: Error, reason?: string) {
return decorate(error, CODE_GENERAL_ERROR, 500, reason);
}
+
+ public static isGeneralError(error: Error | DecoratedError) {
+ return isSavedObjectsClientError(error) && error[code] === CODE_GENERAL_ERROR;
+ }
}
diff --git a/src/core/server/saved_objects/service/lib/repository.test.js b/src/core/server/saved_objects/service/lib/repository.test.js
index 0a1c18c01ad82d..aac508fb5b909c 100644
--- a/src/core/server/saved_objects/service/lib/repository.test.js
+++ b/src/core/server/saved_objects/service/lib/repository.test.js
@@ -18,6 +18,7 @@ import { DocumentMigrator } from '../../migrations/core/document_migrator';
import { mockKibanaMigrator } from '../../migrations/kibana/kibana_migrator.mock';
import { elasticsearchClientMock } from '../../../elasticsearch/client/mocks';
import { esKuery } from '../../es_query';
+import { errors as EsErrors } from '@elastic/elasticsearch';
const { nodeTypes } = esKuery;
jest.mock('./search_dsl/search_dsl', () => ({ getSearchDsl: jest.fn() }));
@@ -4341,8 +4342,14 @@ describe('SavedObjectsRepository', () => {
});
it(`throws when ES is unable to find the document during update`, async () => {
+ const notFoundError = new EsErrors.ResponseError(
+ elasticsearchClientMock.createApiResponse({
+ statusCode: 404,
+ body: { error: { type: 'es_type', reason: 'es_reason' } },
+ })
+ );
client.update.mockResolvedValueOnce(
- elasticsearchClientMock.createSuccessTransportRequestPromise({}, { statusCode: 404 })
+ elasticsearchClientMock.createErrorTransportRequestPromise(notFoundError)
);
await expectNotFoundError(type, id);
expect(client.update).toHaveBeenCalledTimes(1);
diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts
index a662a374b063ef..fcd72aa4326a20 100644
--- a/src/core/server/saved_objects/service/lib/repository.ts
+++ b/src/core/server/saved_objects/service/lib/repository.ts
@@ -299,6 +299,7 @@ export class SavedObjectsRepository {
refresh,
body: raw._source,
...(overwrite && version ? decodeRequestVersion(version) : {}),
+ require_alias: true,
};
const { body } =
@@ -469,6 +470,7 @@ export class SavedObjectsRepository {
const bulkResponse = bulkCreateParams.length
? await this.client.bulk({
refresh,
+ require_alias: true,
body: bulkCreateParams,
})
: undefined;
@@ -1117,8 +1119,8 @@ export class SavedObjectsRepository {
...(Array.isArray(references) && { references }),
};
- const { body, statusCode } = await this.client.update(
- {
+ const { body } = await this.client
+ .update({
id: this._serializer.generateRawId(namespace, type, id),
index: this.getIndexForType(type),
...getExpectedVersionProperties(version, preflightResult),
@@ -1128,14 +1130,15 @@ export class SavedObjectsRepository {
doc,
},
_source_includes: ['namespace', 'namespaces', 'originId'],
- },
- { ignore: [404] }
- );
-
- if (statusCode === 404) {
- // see "404s from missing index" above
- throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id);
- }
+ require_alias: true,
+ })
+ .catch((err) => {
+ if (SavedObjectsErrorHelpers.isNotFoundError(err)) {
+ // see "404s from missing index" above
+ throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id);
+ }
+ throw err;
+ });
const { originId } = body.get._source;
let namespaces = [];
@@ -1496,6 +1499,7 @@ export class SavedObjectsRepository {
refresh,
body: bulkUpdateParams,
_source_includes: ['originId'],
+ require_alias: true,
})
: undefined;
@@ -1712,6 +1716,7 @@ export class SavedObjectsRepository {
id: raw._id,
index: this.getIndexForType(type),
refresh,
+ require_alias: true,
_source: 'true',
body: {
script: {
@@ -1933,12 +1938,18 @@ export class SavedObjectsRepository {
}
}
-function getBulkOperationError(error: { type: string; reason?: string }, type: string, id: string) {
+function getBulkOperationError(
+ error: { type: string; reason?: string; index?: string },
+ type: string,
+ id: string
+) {
switch (error.type) {
case 'version_conflict_engine_exception':
return errorContent(SavedObjectsErrorHelpers.createConflictError(type, id));
case 'document_missing_exception':
return errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id));
+ case 'index_not_found_exception':
+ return errorContent(SavedObjectsErrorHelpers.createIndexAliasNotFoundError(error.index!));
default:
return {
message: error.reason || JSON.stringify(error),
diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md
index 40a12290be31b8..f3191c5625f8d9 100644
--- a/src/core/server/server.api.md
+++ b/src/core/server/server.api.md
@@ -2335,6 +2335,8 @@ export class SavedObjectsErrorHelpers {
// (undocumented)
static createGenericNotFoundError(type?: string | null, id?: string | null): DecoratedError;
// (undocumented)
+ static createIndexAliasNotFoundError(alias: string): DecoratedError;
+ // (undocumented)
static createInvalidVersionError(versionInput?: string): DecoratedError;
// (undocumented)
static createTooManyRequestsError(type: string, id: string): DecoratedError;
@@ -2353,6 +2355,8 @@ export class SavedObjectsErrorHelpers {
// (undocumented)
static decorateGeneralError(error: Error, reason?: string): DecoratedError;
// (undocumented)
+ static decorateIndexAliasNotFoundError(error: Error, alias: string): DecoratedError;
+ // (undocumented)
static decorateNotAuthorizedError(error: Error, reason?: string): DecoratedError;
// (undocumented)
static decorateRequestEntityTooLargeError(error: Error, reason?: string): DecoratedError;
@@ -2369,6 +2373,8 @@ export class SavedObjectsErrorHelpers {
// (undocumented)
static isForbiddenError(error: Error | DecoratedError): boolean;
// (undocumented)
+ static isGeneralError(error: Error | DecoratedError): boolean;
+ // (undocumented)
static isInvalidVersionError(error: Error | DecoratedError): boolean;
// (undocumented)
static isNotAuthorizedError(error: Error | DecoratedError): boolean;
diff --git a/src/core/server/ui_settings/integration_tests/doc_exists.ts b/src/core/server/ui_settings/integration_tests/doc_exists.ts
index b02f2ec9c76105..86a9a24fab6de6 100644
--- a/src/core/server/ui_settings/integration_tests/doc_exists.ts
+++ b/src/core/server/ui_settings/integration_tests/doc_exists.ts
@@ -8,7 +8,7 @@
import { getServices, chance } from './lib';
-export function docExistsSuite() {
+export const docExistsSuite = (savedObjectsIndex: string) => () => {
async function setup(options: any = {}) {
const { initialSettings } = options;
@@ -16,7 +16,7 @@ export function docExistsSuite() {
// delete the kibana index to ensure we start fresh
await callCluster('deleteByQuery', {
- index: kbnServer.config.get('kibana.index'),
+ index: savedObjectsIndex,
body: {
conflicts: 'proceed',
query: { match_all: {} },
@@ -212,4 +212,4 @@ export function docExistsSuite() {
});
});
});
-}
+};
diff --git a/src/core/server/ui_settings/integration_tests/doc_missing.ts b/src/core/server/ui_settings/integration_tests/doc_missing.ts
index ef3b3928e0d9cd..9fa3e4c1cfe78a 100644
--- a/src/core/server/ui_settings/integration_tests/doc_missing.ts
+++ b/src/core/server/ui_settings/integration_tests/doc_missing.ts
@@ -8,7 +8,7 @@
import { getServices, chance } from './lib';
-export function docMissingSuite() {
+export const docMissingSuite = (savedObjectsIndex: string) => () => {
// ensure the kibana index has no documents
beforeEach(async () => {
const { kbnServer, callCluster } = getServices();
@@ -22,7 +22,7 @@ export function docMissingSuite() {
// delete all docs from kibana index to ensure savedConfig is not found
await callCluster('deleteByQuery', {
- index: kbnServer.config.get('kibana.index'),
+ index: savedObjectsIndex,
body: {
query: { match_all: {} },
},
@@ -136,4 +136,4 @@ export function docMissingSuite() {
});
});
});
-}
+};
diff --git a/src/core/server/ui_settings/integration_tests/doc_missing_and_index_read_only.ts b/src/core/server/ui_settings/integration_tests/doc_missing_and_index_read_only.ts
index f3a02cfe176e92..78fdab7eb8c5d3 100644
--- a/src/core/server/ui_settings/integration_tests/doc_missing_and_index_read_only.ts
+++ b/src/core/server/ui_settings/integration_tests/doc_missing_and_index_read_only.ts
@@ -8,7 +8,7 @@
import { getServices, chance } from './lib';
-export function docMissingAndIndexReadOnlySuite() {
+export const docMissingAndIndexReadOnlySuite = (savedObjectsIndex: string) => () => {
// ensure the kibana index has no documents
beforeEach(async () => {
const { kbnServer, callCluster } = getServices();
@@ -22,7 +22,7 @@ export function docMissingAndIndexReadOnlySuite() {
// delete all docs from kibana index to ensure savedConfig is not found
await callCluster('deleteByQuery', {
- index: kbnServer.config.get('kibana.index'),
+ index: savedObjectsIndex,
body: {
query: { match_all: {} },
},
@@ -30,7 +30,7 @@ export function docMissingAndIndexReadOnlySuite() {
// set the index to read only
await callCluster('indices.putSettings', {
- index: kbnServer.config.get('kibana.index'),
+ index: savedObjectsIndex,
body: {
index: {
blocks: {
@@ -42,11 +42,11 @@ export function docMissingAndIndexReadOnlySuite() {
});
afterEach(async () => {
- const { kbnServer, callCluster } = getServices();
+ const { callCluster } = getServices();
// disable the read only block
await callCluster('indices.putSettings', {
- index: kbnServer.config.get('kibana.index'),
+ index: savedObjectsIndex,
body: {
index: {
blocks: {
@@ -142,4 +142,4 @@ export function docMissingAndIndexReadOnlySuite() {
});
});
});
-}
+};
diff --git a/src/core/server/ui_settings/integration_tests/index.test.ts b/src/core/server/ui_settings/integration_tests/index.test.ts
index 184c75d88f3b8c..6e6c357e6cccc6 100644
--- a/src/core/server/ui_settings/integration_tests/index.test.ts
+++ b/src/core/server/ui_settings/integration_tests/index.test.ts
@@ -6,20 +6,25 @@
* Side Public License, v 1.
*/
+import { Env } from '@kbn/config';
+import { REPO_ROOT } from '@kbn/dev-utils';
+import { getEnvOptions } from '@kbn/config/target/mocks';
import { startServers, stopServers } from './lib';
-
import { docExistsSuite } from './doc_exists';
import { docMissingSuite } from './doc_missing';
import { docMissingAndIndexReadOnlySuite } from './doc_missing_and_index_read_only';
+const kibanaVersion = Env.createDefault(REPO_ROOT, getEnvOptions()).packageInfo.version;
+const savedObjectIndex = `.kibana_${kibanaVersion}_001`;
+
describe('uiSettings/routes', function () {
jest.setTimeout(10000);
beforeAll(startServers);
/* eslint-disable jest/valid-describe */
- describe('doc missing', docMissingSuite);
- describe('doc missing and index readonly', docMissingAndIndexReadOnlySuite);
- describe('doc exists', docExistsSuite);
+ describe('doc missing', docMissingSuite(savedObjectIndex));
+ describe('doc missing and index readonly', docMissingAndIndexReadOnlySuite(savedObjectIndex));
+ describe('doc exists', docExistsSuite(savedObjectIndex));
/* eslint-enable jest/valid-describe */
afterAll(stopServers);
});
diff --git a/src/core/server/ui_settings/integration_tests/lib/servers.ts b/src/core/server/ui_settings/integration_tests/lib/servers.ts
index 1bea45da51af90..87176bed5de114 100644
--- a/src/core/server/ui_settings/integration_tests/lib/servers.ts
+++ b/src/core/server/ui_settings/integration_tests/lib/servers.ts
@@ -37,9 +37,6 @@ export async function startServers() {
adjustTimeout: (t) => jest.setTimeout(t),
settings: {
kbn: {
- migrations: {
- enableV2: false,
- },
uiSettings: {
overrides: {
foo: 'bar',
diff --git a/src/core/test_helpers/kbn_server.ts b/src/core/test_helpers/kbn_server.ts
index cf5589fecdf438..011ba67a055121 100644
--- a/src/core/test_helpers/kbn_server.ts
+++ b/src/core/test_helpers/kbn_server.ts
@@ -40,7 +40,7 @@ const DEFAULTS_SETTINGS = {
},
logging: { silent: true },
plugins: {},
- migrations: { skip: true },
+ migrations: { skip: false },
};
const DEFAULT_SETTINGS_WITH_CORE_PLUGINS = {
diff --git a/test/accessibility/apps/kibana_overview.ts b/test/accessibility/apps/kibana_overview.ts
index a6ecd491f169f4..8481e2bf334aa6 100644
--- a/test/accessibility/apps/kibana_overview.ts
+++ b/test/accessibility/apps/kibana_overview.ts
@@ -16,7 +16,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const esArchiver = getService('esArchiver');
before(async () => {
- await esArchiver.load('empty_kibana');
+ await esArchiver.emptyKibanaIndex();
await PageObjects.common.navigateToApp('kibanaOverview');
});
@@ -25,7 +25,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
useActualUrl: true,
});
await PageObjects.home.removeSampleDataSet('flights');
- await esArchiver.unload('empty_kibana');
});
it('Getting started view', async () => {
diff --git a/test/api_integration/apis/home/sample_data.ts b/test/api_integration/apis/home/sample_data.ts
index 64ef11167b3338..b889b59fdaf329 100644
--- a/test/api_integration/apis/home/sample_data.ts
+++ b/test/api_integration/apis/home/sample_data.ts
@@ -11,11 +11,15 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
+ const esArchiver = getService('esArchiver');
const es = getService('es');
const MILLISECOND_IN_WEEK = 1000 * 60 * 60 * 24 * 7;
describe('sample data apis', () => {
+ before(async () => {
+ await esArchiver.emptyKibanaIndex();
+ });
describe('list', () => {
it('should return list of sample data sets with installed status', async () => {
const resp = await supertest.get(`/api/sample_data`).set('kbn-xsrf', 'kibana').expect(200);
diff --git a/test/api_integration/apis/saved_objects/bulk_create.ts b/test/api_integration/apis/saved_objects/bulk_create.ts
index 6239b930434aff..57b7ff0935f587 100644
--- a/test/api_integration/apis/saved_objects/bulk_create.ts
+++ b/test/api_integration/apis/saved_objects/bulk_create.ts
@@ -97,10 +97,11 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
- it('should return 200 with individual responses', async () =>
+ it('should return 200 with errors', async () => {
+ await new Promise((resolve) => setTimeout(resolve, 2000));
await supertest
.post('/api/saved_objects/_bulk_create')
.send(BULK_REQUESTS)
@@ -109,38 +110,27 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.body).to.eql({
saved_objects: [
{
- type: 'visualization',
- id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
- updated_at: resp.body.saved_objects[0].updated_at,
- version: resp.body.saved_objects[0].version,
- attributes: {
- title: 'An existing visualization',
- },
- references: [],
- namespaces: ['default'],
- migrationVersion: {
- visualization: resp.body.saved_objects[0].migrationVersion.visualization,
+ id: BULK_REQUESTS[0].id,
+ type: BULK_REQUESTS[0].type,
+ error: {
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
+ statusCode: 500,
},
- coreMigrationVersion: KIBANA_VERSION, // updated from 1.2.3 to the latest kibana version
},
{
- type: 'dashboard',
- id: 'a01b2f57-fcfd-4864-b735-09e28f0d815e',
- updated_at: resp.body.saved_objects[1].updated_at,
- version: resp.body.saved_objects[1].version,
- attributes: {
- title: 'A great new dashboard',
- },
- references: [],
- namespaces: ['default'],
- migrationVersion: {
- dashboard: resp.body.saved_objects[1].migrationVersion.dashboard,
+ id: BULK_REQUESTS[1].id,
+ type: BULK_REQUESTS[1].type,
+ error: {
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
+ statusCode: 500,
},
- coreMigrationVersion: KIBANA_VERSION,
},
],
});
- }));
+ });
+ });
});
});
}
diff --git a/test/api_integration/apis/saved_objects/bulk_get.ts b/test/api_integration/apis/saved_objects/bulk_get.ts
index e9514d7d55457a..77f84dee25ded1 100644
--- a/test/api_integration/apis/saved_objects/bulk_get.ts
+++ b/test/api_integration/apis/saved_objects/bulk_get.ts
@@ -108,7 +108,7 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('should return 200 with individual responses', async () =>
diff --git a/test/api_integration/apis/saved_objects/bulk_update.ts b/test/api_integration/apis/saved_objects/bulk_update.ts
index d9e3c278695910..a5f5262196346e 100644
--- a/test/api_integration/apis/saved_objects/bulk_update.ts
+++ b/test/api_integration/apis/saved_objects/bulk_update.ts
@@ -235,10 +235,10 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
- it('should return generic 404', async () => {
+ it('should return 200 with errors', async () => {
const response = await supertest
.put(`/api/saved_objects/_bulk_update`)
.send([
@@ -267,9 +267,9 @@ export default function ({ getService }: FtrProviderContext) {
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
type: 'visualization',
error: {
- statusCode: 404,
- error: 'Not Found',
- message: 'Saved object [visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab] not found',
+ statusCode: 500,
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
},
});
@@ -277,9 +277,9 @@ export default function ({ getService }: FtrProviderContext) {
id: 'be3733a0-9efe-11e7-acb3-3dab96693fab',
type: 'dashboard',
error: {
- statusCode: 404,
- error: 'Not Found',
- message: 'Saved object [dashboard/be3733a0-9efe-11e7-acb3-3dab96693fab] not found',
+ statusCode: 500,
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
},
});
});
diff --git a/test/api_integration/apis/saved_objects/create.ts b/test/api_integration/apis/saved_objects/create.ts
index 355e5df1f18958..de31b621a64803 100644
--- a/test/api_integration/apis/saved_objects/create.ts
+++ b/test/api_integration/apis/saved_objects/create.ts
@@ -83,10 +83,10 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
- it('should return 200 and create kibana index', async () => {
+ it('should return 500 and not auto-create saved objects index', async () => {
await supertest
.post(`/api/saved_objects/visualization`)
.send({
@@ -94,50 +94,16 @@ export default function ({ getService }: FtrProviderContext) {
title: 'My favorite vis',
},
})
- .expect(200)
+ .expect(500)
.then((resp) => {
- // loose uuid validation
- expect(resp.body)
- .to.have.property('id')
- .match(/^[0-9a-f-]{36}$/);
-
- // loose ISO8601 UTC time with milliseconds validation
- expect(resp.body)
- .to.have.property('updated_at')
- .match(/^[\d-]{10}T[\d:\.]{12}Z$/);
-
expect(resp.body).to.eql({
- id: resp.body.id,
- type: 'visualization',
- migrationVersion: resp.body.migrationVersion,
- coreMigrationVersion: KIBANA_VERSION,
- updated_at: resp.body.updated_at,
- version: resp.body.version,
- attributes: {
- title: 'My favorite vis',
- },
- references: [],
- namespaces: ['default'],
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred.',
+ statusCode: 500,
});
- expect(resp.body.migrationVersion).to.be.ok();
});
- expect((await es.indices.exists({ index: '.kibana' })).body).to.be(true);
- });
-
- it('result should have the latest coreMigrationVersion', async () => {
- await supertest
- .post(`/api/saved_objects/visualization`)
- .send({
- attributes: {
- title: 'My favorite vis',
- },
- coreMigrationVersion: '1.2.3',
- })
- .expect(200)
- .then((resp) => {
- expect(resp.body.coreMigrationVersion).to.eql(KIBANA_VERSION);
- });
+ expect((await es.indices.exists({ index: '.kibana' })).body).to.be(false);
});
});
});
diff --git a/test/api_integration/apis/saved_objects/delete.ts b/test/api_integration/apis/saved_objects/delete.ts
index 5247bc74131d43..0dfece825d3a10 100644
--- a/test/api_integration/apis/saved_objects/delete.ts
+++ b/test/api_integration/apis/saved_objects/delete.ts
@@ -44,7 +44,7 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('returns generic 404 when kibana index is missing', async () =>
diff --git a/test/api_integration/apis/saved_objects/export.ts b/test/api_integration/apis/saved_objects/export.ts
index 32a72f374cbe17..5206d51054745c 100644
--- a/test/api_integration/apis/saved_objects/export.ts
+++ b/test/api_integration/apis/saved_objects/export.ts
@@ -534,7 +534,7 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('should return empty response', async () => {
diff --git a/test/api_integration/apis/saved_objects/find.ts b/test/api_integration/apis/saved_objects/find.ts
index be31e0faf1e467..66c2a083c79e51 100644
--- a/test/api_integration/apis/saved_objects/find.ts
+++ b/test/api_integration/apis/saved_objects/find.ts
@@ -40,7 +40,7 @@ export default function ({ getService }: FtrProviderContext) {
{
type: 'visualization',
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
- version: 'WzIsMV0=',
+ version: 'WzE4LDJd',
attributes: {
title: 'Count of requests',
},
@@ -137,7 +137,7 @@ export default function ({ getService }: FtrProviderContext) {
{
type: 'visualization',
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
- version: 'WzIsMV0=',
+ version: 'WzE4LDJd',
attributes: {
title: 'Count of requests',
},
@@ -174,7 +174,7 @@ export default function ({ getService }: FtrProviderContext) {
{
type: 'visualization',
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
- version: 'WzIsMV0=',
+ version: 'WzE4LDJd',
attributes: {
title: 'Count of requests',
},
@@ -209,7 +209,7 @@ export default function ({ getService }: FtrProviderContext) {
score: 0,
type: 'visualization',
updated_at: '2017-09-21T18:51:23.794Z',
- version: 'WzYsMV0=',
+ version: 'WzIyLDJd',
},
],
});
@@ -256,7 +256,7 @@ export default function ({ getService }: FtrProviderContext) {
migrationVersion: resp.body.saved_objects[0].migrationVersion,
coreMigrationVersion: KIBANA_VERSION,
updated_at: '2017-09-21T18:51:23.794Z',
- version: 'WzIsMV0=',
+ version: 'WzE4LDJd',
},
],
});
@@ -426,11 +426,11 @@ export default function ({ getService }: FtrProviderContext) {
}));
});
- describe.skip('without kibana index', () => {
+ describe('without kibana index', () => {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('should return 200 with empty response', async () =>
diff --git a/test/api_integration/apis/saved_objects/get.ts b/test/api_integration/apis/saved_objects/get.ts
index f912a2efcf0d9c..84ab6e36956d5d 100644
--- a/test/api_integration/apis/saved_objects/get.ts
+++ b/test/api_integration/apis/saved_objects/get.ts
@@ -78,7 +78,7 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('should return basic 404 without mentioning index', async () =>
diff --git a/test/api_integration/apis/saved_objects/resolve_import_errors.ts b/test/api_integration/apis/saved_objects/resolve_import_errors.ts
index 4fcce29905beb1..b203a2c7b7071b 100644
--- a/test/api_integration/apis/saved_objects/resolve_import_errors.ts
+++ b/test/api_integration/apis/saved_objects/resolve_import_errors.ts
@@ -13,6 +13,7 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
+ const esDeleteAllIndices = getService('esDeleteAllIndices');
describe('resolve_import_errors', () => {
// mock success results including metadata
@@ -34,7 +35,11 @@ export default function ({ getService }: FtrProviderContext) {
describe('without kibana index', () => {
// Cleanup data that got created in import
- after(() => esArchiver.unload('saved_objects/basic'));
+ before(
+ async () =>
+ // just in case the kibana server has recreated it
+ await esDeleteAllIndices('.kibana*')
+ );
it('should return 200 and import nothing when empty parameters are passed in', async () => {
await supertest
@@ -51,7 +56,7 @@ export default function ({ getService }: FtrProviderContext) {
});
});
- it('should return 200 and import everything when overwrite parameters contains all objects', async () => {
+ it('should return 200 with internal server errors', async () => {
await supertest
.post('/api/saved_objects/_resolve_import_errors')
.field(
@@ -78,12 +83,42 @@ export default function ({ getService }: FtrProviderContext) {
.expect(200)
.then((resp) => {
expect(resp.body).to.eql({
- success: true,
- successCount: 3,
- successResults: [
- { ...indexPattern, overwrite: true },
- { ...visualization, overwrite: true },
- { ...dashboard, overwrite: true },
+ successCount: 0,
+ success: false,
+ errors: [
+ {
+ ...indexPattern,
+ ...{ title: indexPattern.meta.title },
+ overwrite: true,
+ error: {
+ statusCode: 500,
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
+ type: 'unknown',
+ },
+ },
+ {
+ ...visualization,
+ ...{ title: visualization.meta.title },
+ overwrite: true,
+ error: {
+ statusCode: 500,
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
+ type: 'unknown',
+ },
+ },
+ {
+ ...dashboard,
+ ...{ title: dashboard.meta.title },
+ overwrite: true,
+ error: {
+ statusCode: 500,
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred',
+ type: 'unknown',
+ },
+ },
],
warnings: [],
});
diff --git a/test/api_integration/apis/saved_objects/update.ts b/test/api_integration/apis/saved_objects/update.ts
index ce14e9cea7b13f..631046a0564a36 100644
--- a/test/api_integration/apis/saved_objects/update.ts
+++ b/test/api_integration/apis/saved_objects/update.ts
@@ -121,10 +121,10 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
- it('should return generic 404', async () =>
+ it('should return 500', async () =>
await supertest
.put(`/api/saved_objects/visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab`)
.send({
@@ -132,13 +132,12 @@ export default function ({ getService }: FtrProviderContext) {
title: 'My second favorite vis',
},
})
- .expect(404)
+ .expect(500)
.then((resp) => {
expect(resp.body).eql({
- statusCode: 404,
- error: 'Not Found',
- message:
- 'Saved object [visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab] not found',
+ statusCode: 500,
+ error: 'Internal Server Error',
+ message: 'An internal server error occurred.',
});
}));
});
diff --git a/test/api_integration/apis/saved_objects_management/find.ts b/test/api_integration/apis/saved_objects_management/find.ts
index 87de59a94fd249..6ab2352ebb05f6 100644
--- a/test/api_integration/apis/saved_objects_management/find.ts
+++ b/test/api_integration/apis/saved_objects_management/find.ts
@@ -42,7 +42,7 @@ export default function ({ getService }: FtrProviderContext) {
{
type: 'visualization',
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
- version: 'WzIsMV0=',
+ version: 'WzE4LDJd',
attributes: {
title: 'Count of requests',
},
@@ -184,7 +184,7 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('should return 200 with empty response', async () =>
diff --git a/test/api_integration/apis/saved_objects_management/get.ts b/test/api_integration/apis/saved_objects_management/get.ts
index 69c85428d06247..4dfd06a61eecf5 100644
--- a/test/api_integration/apis/saved_objects_management/get.ts
+++ b/test/api_integration/apis/saved_objects_management/get.ts
@@ -45,7 +45,7 @@ export default function ({ getService }: FtrProviderContext) {
before(
async () =>
// just in case the kibana server has recreated it
- await esDeleteAllIndices('.kibana')
+ await esDeleteAllIndices('.kibana*')
);
it('should return 404 for object that no longer exists', async () =>
diff --git a/test/api_integration/apis/search/search.ts b/test/api_integration/apis/search/search.ts
index 2b61ed7586384d..bc092dd3889bb8 100644
--- a/test/api_integration/apis/search/search.ts
+++ b/test/api_integration/apis/search/search.ts
@@ -17,6 +17,7 @@ export default function ({ getService }: FtrProviderContext) {
describe('search', () => {
before(async () => {
+ await esArchiver.emptyKibanaIndex();
await esArchiver.loadIfNeeded('../../../functional/fixtures/es_archiver/logstash_functional');
});
diff --git a/test/api_integration/apis/telemetry/opt_in.ts b/test/api_integration/apis/telemetry/opt_in.ts
index 2e42fbfc6ac60a..7e0564ac44a43b 100644
--- a/test/api_integration/apis/telemetry/opt_in.ts
+++ b/test/api_integration/apis/telemetry/opt_in.ts
@@ -14,10 +14,13 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default function optInTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const kibanaServer = getService('kibanaServer');
+ const esArchiver = getService('esArchiver');
+
describe('/api/telemetry/v2/optIn API', () => {
let defaultAttributes: TelemetrySavedObjectAttributes;
let kibanaVersion: any;
before(async () => {
+ await esArchiver.emptyKibanaIndex();
const kibanaVersionAccessor = kibanaServer.version;
kibanaVersion = await kibanaVersionAccessor.get();
defaultAttributes =
diff --git a/test/api_integration/apis/telemetry/telemetry_local.ts b/test/api_integration/apis/telemetry/telemetry_local.ts
index 23a0d3fb2cd3cc..b424cab9ff45b2 100644
--- a/test/api_integration/apis/telemetry/telemetry_local.ts
+++ b/test/api_integration/apis/telemetry/telemetry_local.ts
@@ -177,6 +177,7 @@ export default function ({ getService }: FtrProviderContext) {
describe('basic behaviour', () => {
let savedObjectIds: string[] = [];
before('create application usage entries', async () => {
+ await esArchiver.emptyKibanaIndex();
savedObjectIds = await Promise.all([
createSavedObject(),
createSavedObject('appView1'),
diff --git a/test/api_integration/apis/ui_counters/ui_counters.ts b/test/api_integration/apis/ui_counters/ui_counters.ts
index c2286f8ea3dce6..c287e73e3ace9c 100644
--- a/test/api_integration/apis/ui_counters/ui_counters.ts
+++ b/test/api_integration/apis/ui_counters/ui_counters.ts
@@ -13,6 +13,7 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
+ const esArchiver = getService('esArchiver');
const es = getService('es');
const createUiCounterEvent = (eventName: string, type: UiCounterMetricType, count = 1) => ({
@@ -24,6 +25,9 @@ export default function ({ getService }: FtrProviderContext) {
// FLAKY: https://github.com/elastic/kibana/issues/85086
describe.skip('UI Counters API', () => {
+ before(async () => {
+ await esArchiver.emptyKibanaIndex();
+ });
const dayDate = moment().format('DDMMYYYY');
it('stores ui counter events in savedObjects', async () => {
diff --git a/test/api_integration/apis/ui_metric/ui_metric.ts b/test/api_integration/apis/ui_metric/ui_metric.ts
index 1e80487da551a3..99007376e1ea49 100644
--- a/test/api_integration/apis/ui_metric/ui_metric.ts
+++ b/test/api_integration/apis/ui_metric/ui_metric.ts
@@ -13,6 +13,7 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
+ const esArchiver = getService('esArchiver');
const es = getService('es');
const createStatsMetric = (
@@ -34,6 +35,10 @@ export default function ({ getService }: FtrProviderContext) {
});
describe('ui_metric savedObject data', () => {
+ before(async () => {
+ await esArchiver.emptyKibanaIndex();
+ });
+
it('increments the count field in the document defined by the {app}/{action_type} path', async () => {
const reportManager = new ReportManager();
const uiStatsMetric = createStatsMetric('myEvent');
diff --git a/test/common/config.js b/test/common/config.js
index 451324d46f62de..9d108f05fd1fca 100644
--- a/test/common/config.js
+++ b/test/common/config.js
@@ -61,8 +61,6 @@ export default function () {
...(!!process.env.CODE_COVERAGE
? [`--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'coverage')}`]
: []),
- // Disable v2 migrations in tests for now
- '--migrations.enableV2=false',
],
},
services,
diff --git a/test/common/services/kibana_server/extend_es_archiver.js b/test/common/services/kibana_server/extend_es_archiver.js
index c2d01eef267bc8..9a06dd7b749699 100644
--- a/test/common/services/kibana_server/extend_es_archiver.js
+++ b/test/common/services/kibana_server/extend_es_archiver.js
@@ -6,7 +6,7 @@
* Side Public License, v 1.
*/
-const ES_ARCHIVER_LOAD_METHODS = ['load', 'loadIfNeeded', 'unload'];
+const ES_ARCHIVER_LOAD_METHODS = ['load', 'loadIfNeeded', 'unload', 'emptyKibanaIndex'];
const KIBANA_INDEX = '.kibana';
export function extendEsArchiver({ esArchiver, kibanaServer, retry, defaults }) {
@@ -25,7 +25,7 @@ export function extendEsArchiver({ esArchiver, kibanaServer, retry, defaults })
const statsKeys = Object.keys(stats);
const kibanaKeys = statsKeys.filter(
// this also matches stats keys like '.kibana_1' and '.kibana_2,.kibana_1'
- (key) => key.includes(KIBANA_INDEX) && (stats[key].created || stats[key].deleted)
+ (key) => key.includes(KIBANA_INDEX) && stats[key].created
);
// if the kibana index was created by the esArchiver then update the uiSettings
diff --git a/test/functional/apps/management/_import_objects.ts b/test/functional/apps/management/_import_objects.ts
index d13ba0114a598a..e2a056359b48e2 100644
--- a/test/functional/apps/management/_import_objects.ts
+++ b/test/functional/apps/management/_import_objects.ts
@@ -27,9 +27,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
describe.skip('import objects', function describeIndexTests() {
describe('.ndjson file', () => {
beforeEach(async function () {
+ await esArchiver.load('management');
await kibanaServer.uiSettings.replace({});
await PageObjects.settings.navigateTo();
- await esArchiver.load('management');
await PageObjects.settings.clickKibanaSavedObjects();
});
@@ -213,10 +213,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
describe('.json file', () => {
beforeEach(async function () {
- // delete .kibana index and then wait for Kibana to re-create it
+ await esArchiver.load('saved_objects_imports');
await kibanaServer.uiSettings.replace({});
await PageObjects.settings.navigateTo();
- await esArchiver.load('saved_objects_imports');
await PageObjects.settings.clickKibanaSavedObjects();
});
diff --git a/test/functional/apps/management/_index_pattern_filter.js b/test/functional/apps/management/_index_pattern_filter.js
index b2d27002f690c5..eeb0b224d5f0ca 100644
--- a/test/functional/apps/management/_index_pattern_filter.js
+++ b/test/functional/apps/management/_index_pattern_filter.js
@@ -12,10 +12,11 @@ export default function ({ getService, getPageObjects }) {
const kibanaServer = getService('kibanaServer');
const retry = getService('retry');
const PageObjects = getPageObjects(['settings']);
+ const esArchiver = getService('esArchiver');
describe('index pattern filter', function describeIndexTests() {
before(async function () {
- // delete .kibana index and then wait for Kibana to re-create it
+ await esArchiver.emptyKibanaIndex();
await kibanaServer.uiSettings.replace({});
await PageObjects.settings.navigateTo();
await PageObjects.settings.clickKibanaIndexPatterns();
diff --git a/test/functional/apps/management/_index_patterns_empty.ts b/test/functional/apps/management/_index_patterns_empty.ts
index a58c1298104709..90dd8cdc35c300 100644
--- a/test/functional/apps/management/_index_patterns_empty.ts
+++ b/test/functional/apps/management/_index_patterns_empty.ts
@@ -19,7 +19,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
describe('index pattern empty view', () => {
before(async () => {
- await esArchiver.load('empty_kibana');
+ await esArchiver.emptyKibanaIndex();
await esArchiver.unload('logstash_functional');
await esArchiver.unload('makelogs');
await kibanaServer.uiSettings.replace({});
@@ -27,7 +27,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
});
after(async () => {
- await esArchiver.unload('empty_kibana');
await esArchiver.loadIfNeeded('makelogs');
// @ts-expect-error
await es.transport.request({
diff --git a/test/functional/apps/management/_mgmt_import_saved_objects.js b/test/functional/apps/management/_mgmt_import_saved_objects.js
index 27745654f495f9..8697dc49de46a9 100644
--- a/test/functional/apps/management/_mgmt_import_saved_objects.js
+++ b/test/functional/apps/management/_mgmt_import_saved_objects.js
@@ -18,14 +18,13 @@ export default function ({ getService, getPageObjects }) {
describe('mgmt saved objects', function describeIndexTests() {
beforeEach(async function () {
- await esArchiver.load('empty_kibana');
+ await esArchiver.emptyKibanaIndex();
await esArchiver.load('discover');
await PageObjects.settings.navigateTo();
});
afterEach(async function () {
await esArchiver.unload('discover');
- await esArchiver.load('empty_kibana');
});
it('should import saved objects mgmt', async function () {
diff --git a/test/functional/apps/management/_test_huge_fields.js b/test/functional/apps/management/_test_huge_fields.js
index 7ccce2c10c7b1e..3102becbe181f6 100644
--- a/test/functional/apps/management/_test_huge_fields.js
+++ b/test/functional/apps/management/_test_huge_fields.js
@@ -20,6 +20,7 @@ export default function ({ getService, getPageObjects }) {
const EXPECTED_FIELD_COUNT = '10006';
before(async function () {
await security.testUser.setRoles(['kibana_admin', 'test_testhuge_reader']);
+ await esArchiver.emptyKibanaIndex();
await esArchiver.loadIfNeeded('large_fields');
await PageObjects.settings.createIndexPattern('testhuge', 'date');
});
diff --git a/test/functional/apps/management/index.ts b/test/functional/apps/management/index.ts
index 15828295b190f0..d31245b5492d1c 100644
--- a/test/functional/apps/management/index.ts
+++ b/test/functional/apps/management/index.ts
@@ -14,13 +14,11 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) {
describe('management', function () {
before(async () => {
await esArchiver.unload('logstash_functional');
- await esArchiver.load('empty_kibana');
await esArchiver.loadIfNeeded('makelogs');
});
after(async () => {
await esArchiver.unload('makelogs');
- await esArchiver.unload('empty_kibana');
});
describe('', function () {
diff --git a/test/functional/apps/visualize/input_control_vis/input_control_range.ts b/test/functional/apps/visualize/input_control_vis/input_control_range.ts
index 4f4e6d6655be51..caa008080b2a30 100644
--- a/test/functional/apps/visualize/input_control_vis/input_control_range.ts
+++ b/test/functional/apps/visualize/input_control_vis/input_control_range.ts
@@ -12,7 +12,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context';
export default function ({ getService, getPageObjects }: FtrProviderContext) {
const esArchiver = getService('esArchiver');
- const kibanaServer = getService('kibanaServer');
const find = getService('find');
const security = getService('security');
const { visualize, visEditor } = getPageObjects(['visualize', 'visEditor']);
@@ -53,7 +52,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await esArchiver.loadIfNeeded('logstash_functional');
await esArchiver.loadIfNeeded('long_window_logstash');
await esArchiver.load('visualize');
- await kibanaServer.uiSettings.replace({ defaultIndex: 'logstash-*' });
await security.testUser.restoreDefaults();
});
});
diff --git a/test/plugin_functional/test_suites/core_plugins/applications.ts b/test/plugin_functional/test_suites/core_plugins/applications.ts
index 6c600aa996a33a..0e52b536410e4e 100644
--- a/test/plugin_functional/test_suites/core_plugins/applications.ts
+++ b/test/plugin_functional/test_suites/core_plugins/applications.ts
@@ -19,6 +19,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide
const find = getService('find');
const retry = getService('retry');
const deployment = getService('deployment');
+ const esArchiver = getService('esArchiver');
const loadingScreenNotShown = async () =>
expect(await testSubjects.exists('kbnLoadingMessage')).to.be(false);
@@ -50,6 +51,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide
describe('ui applications', function describeIndexTests() {
before(async () => {
+ await esArchiver.emptyKibanaIndex();
await PageObjects.common.navigateToApp('foo');
});
diff --git a/test/plugin_functional/test_suites/data_plugin/index_patterns.ts b/test/plugin_functional/test_suites/data_plugin/index_patterns.ts
index 918e9f16c5dae7..7947616ac65684 100644
--- a/test/plugin_functional/test_suites/data_plugin/index_patterns.ts
+++ b/test/plugin_functional/test_suites/data_plugin/index_patterns.ts
@@ -12,8 +12,12 @@ import '../../plugins/core_provider_plugin/types';
export default function ({ getService }: PluginFunctionalProviderContext) {
const supertest = getService('supertest');
+ const esArchiver = getService('esArchiver');
describe('index patterns', function () {
+ before(async () => {
+ await esArchiver.emptyKibanaIndex();
+ });
let indexPatternId = '';
it('can create an index pattern', async () => {
diff --git a/test/plugin_functional/test_suites/saved_objects_management/import_warnings.ts b/test/plugin_functional/test_suites/saved_objects_management/import_warnings.ts
index 10a088426c8fdd..da4c785342733b 100644
--- a/test/plugin_functional/test_suites/saved_objects_management/import_warnings.ts
+++ b/test/plugin_functional/test_suites/saved_objects_management/import_warnings.ts
@@ -10,10 +10,15 @@ import path from 'path';
import expect from '@kbn/expect';
import { PluginFunctionalProviderContext } from '../../services';
-export default function ({ getPageObjects }: PluginFunctionalProviderContext) {
+export default function ({ getPageObjects, getService }: PluginFunctionalProviderContext) {
const PageObjects = getPageObjects(['common', 'settings', 'header', 'savedObjects']);
+ const esArchiver = getService('esArchiver');
describe('import warnings', () => {
+ before(async () => {
+ await esArchiver.emptyKibanaIndex();
+ });
+
beforeEach(async () => {
await PageObjects.settings.navigateTo();
await PageObjects.settings.clickKibanaSavedObjects();
diff --git a/test/security_functional/insecure_cluster_warning.ts b/test/security_functional/insecure_cluster_warning.ts
index 229dac20390a29..44a0e2eb0e1212 100644
--- a/test/security_functional/insecure_cluster_warning.ts
+++ b/test/security_functional/insecure_cluster_warning.ts
@@ -31,6 +31,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
before(async () => {
await browser.setLocalStorageItem('insecureClusterWarningVisibility', '');
await esArchiver.unload('hamlet');
+ await esArchiver.emptyKibanaIndex();
});
it('should not warn when the cluster contains no user data', async () => {
diff --git a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts
index 55474bd5a76884..5b2632ef710e4d 100644
--- a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts
+++ b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts
@@ -13,6 +13,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const retry = getService('retry');
const browser = getService('browser');
const kibanaServer = getService('kibanaServer');
+ const esArchiver = getService('esArchiver');
const log = getService('log');
const pieChart = getService('pieChart');
const find = getService('find');
@@ -30,6 +31,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
describe('sample data dashboard', function describeIndexTests() {
before(async () => {
+ await esArchiver.emptyKibanaIndex();
await PageObjects.common.sleep(5000);
await PageObjects.common.navigateToUrl('home', '/tutorial_directory/sampleData', {
useActualUrl: true,
diff --git a/x-pack/test/functional/apps/saved_objects_management/feature_controls/saved_objects_management_security.ts b/x-pack/test/functional/apps/saved_objects_management/feature_controls/saved_objects_management_security.ts
index bb60de86aef82b..95ebc7b2ff5d57 100644
--- a/x-pack/test/functional/apps/saved_objects_management/feature_controls/saved_objects_management_security.ts
+++ b/x-pack/test/functional/apps/saved_objects_management/feature_controls/saved_objects_management_security.ts
@@ -70,7 +70,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
it('shows all saved objects', async () => {
const objects = await PageObjects.savedObjects.getRowTitles();
expect(objects).to.eql([
- 'Advanced Settings [6.0.0]',
`Advanced Settings [${version}]`,
'A Dashboard',
'logstash-*',
@@ -81,10 +80,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
it('can view all saved objects in applications', async () => {
const bools = await PageObjects.savedObjects.getTableSummary();
expect(bools).to.eql([
- {
- title: 'Advanced Settings [6.0.0]',
- canViewInApp: false,
- },
{
title: `Advanced Settings [${version}]`,
canViewInApp: false,
@@ -189,7 +184,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
it('shows all saved objects', async () => {
const objects = await PageObjects.savedObjects.getRowTitles();
expect(objects).to.eql([
- 'Advanced Settings [6.0.0]',
`Advanced Settings [${version}]`,
'A Dashboard',
'logstash-*',
@@ -200,10 +194,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
it('cannot view any saved objects in applications', async () => {
const bools = await PageObjects.savedObjects.getTableSummary();
expect(bools).to.eql([
- {
- title: 'Advanced Settings [6.0.0]',
- canViewInApp: false,
- },
{
title: `Advanced Settings [${version}]`,
canViewInApp: false,
diff --git a/x-pack/test/functional/es_archives/saved_objects_management/feature_controls/security/data.json b/x-pack/test/functional/es_archives/saved_objects_management/feature_controls/security/data.json
index f085bad4c507ec..b63ae2295f70b5 100644
--- a/x-pack/test/functional/es_archives/saved_objects_management/feature_controls/security/data.json
+++ b/x-pack/test/functional/es_archives/saved_objects_management/feature_controls/security/data.json
@@ -66,20 +66,3 @@
}
}
}
-
-{
- "type": "doc",
- "value": {
- "index": ".kibana",
- "type": "doc",
- "id": "config:6.0.0",
- "source": {
- "config": {
- "buildNum": 9007199254740991,
- "defaultIndex": "logstash-*"
- },
- "type": "config",
- "updated_at": "2019-01-22T19:32:02.235Z"
- }
- }
-}
diff --git a/x-pack/test/functional/es_archives/visualize/default/data.json b/x-pack/test/functional/es_archives/visualize/default/data.json
index fe29bad0fa3814..26b033e28b4da7 100644
--- a/x-pack/test/functional/es_archives/visualize/default/data.json
+++ b/x-pack/test/functional/es_archives/visualize/default/data.json
@@ -125,26 +125,8 @@
{
"type": "doc",
"value": {
- "id": "custom-space:index-pattern:metricbeat-*",
- "index": ".kibana_1",
- "source": {
- "index-pattern": {
- "fieldFormatMap": "{\"aerospike.namespace.device.available.pct\":{\"id\":\"percent\",\"params\":{}},\"aerospike.namespace.device.free.pct\":{\"id\":\"percent\",\"params\":{}},\"aerospike.namespace.device.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aerospike.namespace.device.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aerospike.namespace.memory.free.pct\":{\"id\":\"percent\",\"params\":{}},\"aerospike.namespace.memory.used.data.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aerospike.namespace.memory.used.index.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aerospike.namespace.memory.used.sindex.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aerospike.namespace.memory.used.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.ec2.diskio.read.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.ec2.diskio.write.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.ec2.network.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.ec2.network.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.rds.cpu.total.pct\":{\"id\":\"percent\",\"params\":{}},\"aws.rds.disk_usage.bin_log.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.rds.free_local_storage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.rds.free_storage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.rds.freeable_memory.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.rds.latency.commit\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.ddl\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.dml\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.insert\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.read\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.select\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.update\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.latency.write\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.replica_lag.sec\":{\"id\":\"duration\",\"params\":{}},\"aws.rds.swap_usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.rds.volume_used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.s3_daily_storage.bucket.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.s3_request.downloaded.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.s3_request.latency.first_byte.ms\":{\"id\":\"duration\",\"params\":{}},\"aws.s3_request.latency.total_request.ms\":{\"id\":\"duration\",\"params\":{}},\"aws.s3_request.requests.select_returned.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.s3_request.requests.select_scanned.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.s3_request.uploaded.bytes\":{\"id\":\"bytes\",\"params\":{}},\"aws.sqs.oldest_message_age.sec\":{\"id\":\"duration\",\"params\":{}},\"aws.sqs.sent_message_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_disk.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_disk.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_disk.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_status.degraded.ratio\":{\"id\":\"percent\",\"params\":{}},\"ceph.cluster_status.misplace.ratio\":{\"id\":\"percent\",\"params\":{}},\"ceph.cluster_status.pg.avail_bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_status.pg.data_bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_status.pg.total_bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_status.pg.used_bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_status.traffic.read_bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.cluster_status.traffic.write_bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.monitor_health.store_stats.log.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.monitor_health.store_stats.misc.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.monitor_health.store_stats.sst.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.monitor_health.store_stats.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.osd_df.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.osd_df.total.byte\":{\"id\":\"bytes\",\"params\":{}},\"ceph.osd_df.used.byte\":{\"id\":\"bytes\",\"params\":{}},\"ceph.osd_df.used.pct\":{\"id\":\"percent\",\"params\":{}},\"ceph.pool_disk.stats.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"ceph.pool_disk.stats.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"client.bytes\":{\"id\":\"bytes\",\"params\":{}},\"client.nat.port\":{\"id\":\"string\",\"params\":{}},\"client.port\":{\"id\":\"string\",\"params\":{}},\"coredns.stats.dns.request.duration.ns.sum\":{\"id\":\"duration\",\"params\":{}},\"couchbase.bucket.data.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.bucket.disk.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.bucket.memory.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.bucket.quota.ram.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.bucket.quota.use.pct\":{\"id\":\"percent\",\"params\":{}},\"couchbase.cluster.hdd.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.hdd.quota.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.hdd.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.hdd.used.by_data.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.hdd.used.value.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.quota.total.per_node.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.quota.total.value.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.quota.used.per_node.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.quota.used.value.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.used.by_data.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.cluster.ram.used.value.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.node.couch.docs.data_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.node.couch.docs.disk_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"couchbase.node.mcd_memory.allocated.bytes\":{\"id\":\"bytes\",\"params\":{}},\"destination.bytes\":{\"id\":\"bytes\",\"params\":{}},\"destination.nat.port\":{\"id\":\"string\",\"params\":{}},\"destination.port\":{\"id\":\"string\",\"params\":{}},\"docker.cpu.core.*.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.cpu.kernel.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.cpu.system.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.cpu.total.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.cpu.user.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.diskio.read.bytes\":{\"id\":\"bytes\",\"params\":{}},\"docker.diskio.summary.bytes\":{\"id\":\"bytes\",\"params\":{}},\"docker.diskio.write.bytes\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.commit.peak\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.commit.total\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.limit\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.private_working_set.total\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.rss.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.memory.rss.total\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.usage.max\":{\"id\":\"bytes\",\"params\":{}},\"docker.memory.usage.pct\":{\"id\":\"percent\",\"params\":{}},\"docker.memory.usage.total\":{\"id\":\"bytes\",\"params\":{}},\"docker.network.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"docker.network.inbound.bytes\":{\"id\":\"bytes\",\"params\":{}},\"docker.network.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"docker.network.outbound.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.index.summary.primaries.segments.memory.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.index.summary.primaries.store.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.index.summary.total.segments.memory.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.index.summary.total.store.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.index.total.segments.memory.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.index.total.store.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.jvm.memory.heap.init.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.jvm.memory.heap.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.jvm.memory.nonheap.init.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.jvm.memory.nonheap.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.fs.summary.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.fs.summary.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.fs.summary.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.indices.segments.memory.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.old.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.old.peak.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.old.peak_max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.old.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.survivor.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.survivor.peak.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.survivor.peak_max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.survivor.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.young.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.young.peak.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.young.peak_max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"elasticsearch.node.stats.jvm.mem.pools.young.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"etcd.disk.mvcc_db_total_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"etcd.memory.go_memstats_alloc.bytes\":{\"id\":\"bytes\",\"params\":{}},\"etcd.network.client_grpc_received.bytes\":{\"id\":\"bytes\",\"params\":{}},\"etcd.network.client_grpc_sent.bytes\":{\"id\":\"bytes\",\"params\":{}},\"event.duration\":{\"id\":\"duration\",\"params\":{\"inputFormat\":\"nanoseconds\",\"outputFormat\":\"asMilliseconds\",\"outputPrecision\":1}},\"event.sequence\":{\"id\":\"string\",\"params\":{}},\"event.severity\":{\"id\":\"string\",\"params\":{}},\"golang.heap.allocations.active\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.allocations.allocated\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.allocations.idle\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.allocations.total\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.gc.next_gc_limit\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.system.obtained\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.system.released\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.system.stack\":{\"id\":\"bytes\",\"params\":{}},\"golang.heap.system.total\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.info.idle.pct\":{\"id\":\"percent\",\"params\":{}},\"haproxy.info.memory.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.info.ssl.frontend.session_reuse.pct\":{\"id\":\"percent\",\"params\":{}},\"haproxy.stat.compressor.bypassed.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.stat.compressor.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.stat.compressor.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.stat.compressor.response.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.stat.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.stat.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"haproxy.stat.throttle.pct\":{\"id\":\"percent\",\"params\":{}},\"http.request.body.bytes\":{\"id\":\"bytes\",\"params\":{}},\"http.request.bytes\":{\"id\":\"bytes\",\"params\":{}},\"http.response.body.bytes\":{\"id\":\"bytes\",\"params\":{}},\"http.response.bytes\":{\"id\":\"bytes\",\"params\":{}},\"http.response.status_code\":{\"id\":\"string\",\"params\":{}},\"kibana.stats.process.memory.heap.size_limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kibana.stats.process.memory.heap.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kibana.stats.process.memory.heap.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.apiserver.http.request.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.apiserver.http.response.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.apiserver.process.memory.resident.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.apiserver.process.memory.virtual.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.cpu.usage.limit.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.container.cpu.usage.node.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.container.logs.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.logs.capacity.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.logs.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.memory.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.memory.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.memory.request.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.memory.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.memory.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.memory.usage.limit.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.container.memory.usage.node.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.container.memory.workingset.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.rootfs.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.rootfs.capacity.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.container.rootfs.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.controllermanager.http.request.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.controllermanager.http.response.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.controllermanager.process.memory.resident.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.controllermanager.process.memory.virtual.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.fs.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.fs.capacity.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.fs.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.memory.allocatable.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.memory.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.memory.capacity.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.memory.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.memory.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.memory.workingset.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.network.rx.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.network.tx.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.runtime.imagefs.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.runtime.imagefs.capacity.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.node.runtime.imagefs.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.pod.cpu.usage.limit.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.pod.cpu.usage.node.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.pod.memory.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.pod.memory.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.pod.memory.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.pod.memory.usage.limit.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.pod.memory.usage.node.pct\":{\"id\":\"percent\",\"params\":{}},\"kubernetes.pod.memory.working_set.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.pod.network.rx.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.pod.network.tx.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.proxy.http.request.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.proxy.http.response.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.proxy.process.memory.resident.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.proxy.process.memory.virtual.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.scheduler.http.request.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.scheduler.http.response.size.bytes.sum\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.scheduler.process.memory.resident.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.scheduler.process.memory.virtual.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.system.memory.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.system.memory.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.system.memory.workingset.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.volume.fs.available.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.volume.fs.capacity.bytes\":{\"id\":\"bytes\",\"params\":{}},\"kubernetes.volume.fs.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.dbstats.avg_obj_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.dbstats.data_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.dbstats.extent_free_list.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.dbstats.file_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.dbstats.index_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.dbstats.storage_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.replstatus.headroom.max\":{\"id\":\"duration\",\"params\":{}},\"mongodb.replstatus.headroom.min\":{\"id\":\"duration\",\"params\":{}},\"mongodb.replstatus.lag.max\":{\"id\":\"duration\",\"params\":{}},\"mongodb.replstatus.lag.min\":{\"id\":\"duration\",\"params\":{}},\"mongodb.replstatus.oplog.size.allocated\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.replstatus.oplog.size.used\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.extra_info.heap_usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.network.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.network.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.wired_tiger.cache.dirty.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.wired_tiger.cache.maximum.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.wired_tiger.cache.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.wired_tiger.log.max_file_size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.wired_tiger.log.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mongodb.status.wired_tiger.log.write.bytes\":{\"id\":\"bytes\",\"params\":{}},\"mysql.status.bytes.received\":{\"id\":\"bytes\",\"params\":{}},\"mysql.status.bytes.sent\":{\"id\":\"bytes\",\"params\":{}},\"nats.stats.cpu\":{\"id\":\"percent\",\"params\":{}},\"nats.stats.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"nats.stats.mem.bytes\":{\"id\":\"bytes\",\"params\":{}},\"nats.stats.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"nats.stats.uptime\":{\"id\":\"duration\",\"params\":{}},\"nats.subscriptions.cache.hit_rate\":{\"id\":\"percent\",\"params\":{}},\"network.bytes\":{\"id\":\"bytes\",\"params\":{}},\"oracle.tablespace.data_file.size.bytes\":{\"id\":\"bytes\",\"params\":{}},\"oracle.tablespace.data_file.size.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"oracle.tablespace.data_file.size.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"oracle.tablespace.space.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"oracle.tablespace.space.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"oracle.tablespace.space.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"process.pgid\":{\"id\":\"string\",\"params\":{}},\"process.pid\":{\"id\":\"string\",\"params\":{}},\"process.ppid\":{\"id\":\"string\",\"params\":{}},\"process.thread.id\":{\"id\":\"string\",\"params\":{}},\"rabbitmq.connection.frame_max\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.node.disk.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.node.disk.free.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.node.gc.reclaimed.bytes\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.node.io.read.bytes\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.node.io.write.bytes\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.node.mem.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"rabbitmq.queue.consumers.utilisation.pct\":{\"id\":\"percent\",\"params\":{}},\"rabbitmq.queue.memory.bytes\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.allocator_stats.active\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.allocator_stats.allocated\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.allocator_stats.fragmentation.bytes\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.allocator_stats.resident\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.allocator_stats.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.fragmentation.bytes\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.max.value\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.used.dataset\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.used.lua\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.used.peak\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.used.rss\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.memory.used.value\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.persistence.aof.buffer.size\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.persistence.aof.copy_on_write.last_size\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.persistence.aof.rewrite.buffer.size\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.persistence.aof.rewrite.current_time.sec\":{\"id\":\"duration\",\"params\":{}},\"redis.info.persistence.aof.rewrite.last_time.sec\":{\"id\":\"duration\",\"params\":{}},\"redis.info.persistence.aof.size.base\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.persistence.aof.size.current\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.persistence.rdb.bgsave.current_time.sec\":{\"id\":\"duration\",\"params\":{}},\"redis.info.persistence.rdb.bgsave.last_time.sec\":{\"id\":\"duration\",\"params\":{}},\"redis.info.persistence.rdb.copy_on_write.last_size\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.replication.backlog.size\":{\"id\":\"bytes\",\"params\":{}},\"redis.info.replication.master.last_io_seconds_ago\":{\"id\":\"duration\",\"params\":{}},\"redis.info.replication.master.sync.last_io_seconds_ago\":{\"id\":\"duration\",\"params\":{}},\"redis.info.replication.master.sync.left_bytes\":{\"id\":\"bytes\",\"params\":{}},\"server.bytes\":{\"id\":\"bytes\",\"params\":{}},\"server.nat.port\":{\"id\":\"string\",\"params\":{}},\"server.port\":{\"id\":\"string\",\"params\":{}},\"source.bytes\":{\"id\":\"bytes\",\"params\":{}},\"source.nat.port\":{\"id\":\"string\",\"params\":{}},\"source.port\":{\"id\":\"string\",\"params\":{}},\"system.core.idle.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.iowait.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.irq.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.nice.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.softirq.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.steal.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.system.pct\":{\"id\":\"percent\",\"params\":{}},\"system.core.user.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.idle.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.idle.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.iowait.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.iowait.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.irq.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.irq.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.nice.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.nice.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.softirq.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.softirq.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.steal.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.steal.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.system.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.system.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.total.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.total.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.user.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.cpu.user.pct\":{\"id\":\"percent\",\"params\":{}},\"system.diskio.iostat.read.per_sec.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.diskio.iostat.write.per_sec.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.diskio.read.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.diskio.write.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.entropy.pct\":{\"id\":\"percent\",\"params\":{}},\"system.filesystem.available\":{\"id\":\"bytes\",\"params\":{}},\"system.filesystem.free\":{\"id\":\"bytes\",\"params\":{}},\"system.filesystem.total\":{\"id\":\"bytes\",\"params\":{}},\"system.filesystem.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.filesystem.used.pct\":{\"id\":\"percent\",\"params\":{}},\"system.fsstat.total_size.free\":{\"id\":\"bytes\",\"params\":{}},\"system.fsstat.total_size.total\":{\"id\":\"bytes\",\"params\":{}},\"system.fsstat.total_size.used\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.actual.free\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.actual.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.actual.used.pct\":{\"id\":\"percent\",\"params\":{}},\"system.memory.free\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.hugepages.default_size\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.hugepages.free\":{\"id\":\"number\",\"params\":{}},\"system.memory.hugepages.reserved\":{\"id\":\"number\",\"params\":{}},\"system.memory.hugepages.surplus\":{\"id\":\"number\",\"params\":{}},\"system.memory.hugepages.total\":{\"id\":\"number\",\"params\":{}},\"system.memory.hugepages.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.hugepages.used.pct\":{\"id\":\"percent\",\"params\":{}},\"system.memory.swap.free\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.swap.total\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.swap.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.swap.used.pct\":{\"id\":\"percent\",\"params\":{}},\"system.memory.total\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.memory.used.pct\":{\"id\":\"percent\",\"params\":{}},\"system.network.in.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.network.out.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.blkio.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.kmem.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.kmem.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.kmem.usage.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.kmem_tcp.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.kmem_tcp.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.kmem_tcp.usage.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.mem.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.mem.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.mem.usage.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.memsw.limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.memsw.usage.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.memsw.usage.max.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.active_anon.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.active_file.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.cache.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.hierarchical_memory_limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.hierarchical_memsw_limit.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.inactive_anon.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.inactive_file.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.mapped_file.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.rss_huge.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.swap.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cgroup.memory.stats.unevictable.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.cpu.total.norm.pct\":{\"id\":\"percent\",\"params\":{}},\"system.process.cpu.total.pct\":{\"id\":\"percent\",\"params\":{}},\"system.process.memory.rss.bytes\":{\"id\":\"bytes\",\"params\":{}},\"system.process.memory.rss.pct\":{\"id\":\"percent\",\"params\":{}},\"system.process.memory.share\":{\"id\":\"bytes\",\"params\":{}},\"system.process.memory.size\":{\"id\":\"bytes\",\"params\":{}},\"system.socket.summary.tcp.memory\":{\"id\":\"bytes\",\"params\":{}},\"system.socket.summary.udp.memory\":{\"id\":\"bytes\",\"params\":{}},\"system.uptime.duration.ms\":{\"id\":\"duration\",\"params\":{\"inputFormat\":\"milliseconds\"}},\"url.port\":{\"id\":\"string\",\"params\":{}},\"vsphere.datastore.capacity.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.datastore.capacity.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.datastore.capacity.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.datastore.capacity.used.pct\":{\"id\":\"percent\",\"params\":{}},\"vsphere.host.memory.free.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.host.memory.total.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.host.memory.used.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.virtualmachine.memory.free.guest.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.virtualmachine.memory.total.guest.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.virtualmachine.memory.used.guest.bytes\":{\"id\":\"bytes\",\"params\":{}},\"vsphere.virtualmachine.memory.used.host.bytes\":{\"id\":\"bytes\",\"params\":{}},\"windows.service.uptime.ms\":{\"id\":\"duration\",\"params\":{\"inputFormat\":\"milliseconds\"}}}",
- "timeFieldName": "@timestamp",
- "title": "metricbeat-*"
- },
- "migrationVersion": {
- "index-pattern": "7.6.0"
- },
- "type": "index-pattern",
- "updated_at": "2020-01-22T15:34:59.061Z"
- }
- }
-}
-
-{
- "type": "doc",
- "value": {
+ "index": ".kibana",
+ "type": "doc",
"id": "index-pattern:logstash-*",
"index": ".kibana_1",
"source": {
@@ -297,4 +279,4 @@
"updated_at": "2019-07-17T17:54:26.378Z"
}
}
-}
\ No newline at end of file
+}
diff --git a/x-pack/test/reporting_api_integration/reporting_without_security.config.ts b/x-pack/test/reporting_api_integration/reporting_without_security.config.ts
index 5946a502a4ce37..59d6074d9d8caf 100644
--- a/x-pack/test/reporting_api_integration/reporting_without_security.config.ts
+++ b/x-pack/test/reporting_api_integration/reporting_without_security.config.ts
@@ -33,7 +33,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
kbnTestServer: {
...apiConfig.get('kbnTestServer'),
serverArgs: [
- `--migrations.enableV2=false`,
`--elasticsearch.hosts=${formatUrl(esTestConfig.getUrlParts())}`,
`--logging.json=false`,
`--server.maxPayloadBytes=1679958`,