Skip to content

Commit

Permalink
[FTR] Use importExport for saved_object/basic archive (elastic#100244)
Browse files Browse the repository at this point in the history
Signed-off-by: Tyler Smalley <tyler.smalley@elastic.co>
  • Loading branch information
Tyler Smalley committed Jun 11, 2021
1 parent 52f2eef commit bf94530
Show file tree
Hide file tree
Showing 43 changed files with 2,228 additions and 6,958 deletions.
11 changes: 7 additions & 4 deletions packages/kbn-test/src/kbn_client/kbn_client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@

import { ToolingLog } from '@kbn/dev-utils';

import { KbnClientRequester, ReqOptions } from './kbn_client_requester';
import { KbnClientStatus } from './kbn_client_status';
import { KbnClientImportExport } from './kbn_client_import_export';
import { KbnClientPlugins } from './kbn_client_plugins';
import { KbnClientVersion } from './kbn_client_version';
import { KbnClientRequester, ReqOptions } from './kbn_client_requester';
import { KbnClientSavedObjects } from './kbn_client_saved_objects';
import { KbnClientSpaces } from './kbn_client_spaces';
import { KbnClientStatus } from './kbn_client_status';
import { KbnClientUiSettings, UiSettingValues } from './kbn_client_ui_settings';
import { KbnClientImportExport } from './kbn_client_import_export';
import { KbnClientVersion } from './kbn_client_version';

export interface KbnClientOptions {
url: string;
Expand All @@ -29,6 +30,7 @@ export class KbnClient {
readonly plugins: KbnClientPlugins;
readonly version: KbnClientVersion;
readonly savedObjects: KbnClientSavedObjects;
readonly spaces: KbnClientSpaces;
readonly uiSettings: KbnClientUiSettings;
readonly importExport: KbnClientImportExport;

Expand Down Expand Up @@ -59,6 +61,7 @@ export class KbnClient {
this.plugins = new KbnClientPlugins(this.status);
this.version = new KbnClientVersion(this.status);
this.savedObjects = new KbnClientSavedObjects(this.log, this.requester);
this.spaces = new KbnClientSpaces(this.requester);
this.uiSettings = new KbnClientUiSettings(this.log, this.requester, this.uiSettingDefaults);
this.importExport = new KbnClientImportExport(
this.log,
Expand Down
2 changes: 2 additions & 0 deletions packages/kbn-test/src/kbn_client/kbn_client_requester.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ export class KbnClientRequester {
responseType: options.responseType,
// work around https://github.com/axios/axios/issues/2791
transformResponse: options.responseType === 'text' ? [(x) => x] : undefined,
maxContentLength: 30000000,
maxBodyLength: 30000000,
paramsSerializer: (params) => Qs.stringify(params),
});

Expand Down
67 changes: 67 additions & 0 deletions packages/kbn-test/src/kbn_client/kbn_client_spaces.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import { KbnClientRequester, uriencode } from './kbn_client_requester';

interface UpdateBody {
name: string;
description?: string;
disabledFeatures?: string | string[];
initials?: string;
color?: string;
imageUrl?: string;
}

interface CreateBody extends UpdateBody {
id: string;
}

export class KbnClientSpaces {
constructor(private readonly requester: KbnClientRequester) {}

async create(body: CreateBody) {
await this.requester.request({
method: 'POST',
path: '/api/spaces/space',
body,
});
}

async update(id: string, body: UpdateBody) {
await this.requester.request({
method: 'PUT',
path: uriencode`/api/spaces/space/${id}`,
body,
});
}

async get(id: string) {
const { data } = await this.requester.request({
method: 'GET',
path: uriencode`/api/spaces/space/${id}`,
});

return data;
}

async list() {
const { data } = await this.requester.request({
method: 'GET',
path: '/api/spaces/space',
});

return data;
}

async delete(id: string) {
await this.requester.request({
method: 'DELETE',
path: uriencode`/api/spaces/space/${id}`,
});
}
}
4 changes: 1 addition & 3 deletions src/dev/precommit_hook/casing_check_config.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export const IGNORE_FILE_GLOBS = [
'.ci/pipeline-library/**/*',
'packages/kbn-test/jest-preset.js',
'test/package/Vagrantfile',
'**/test/**/fixtures/**/*',

// filename must match language code which requires capital letters
'**/translations/*.json',
Expand All @@ -60,8 +61,6 @@ export const IGNORE_FILE_GLOBS = [
'x-pack/plugins/apm/e2e/**/*',

'x-pack/plugins/maps/server/fonts/**/*',
// packages for the ingest manager's api integration tests could be valid semver which has dashes
'x-pack/test/fleet_api_integration/apis/fixtures/test_packages/**/*',

// Bazel default files
'**/WORKSPACE.bazel',
Expand Down Expand Up @@ -97,7 +96,6 @@ export const IGNORE_DIRECTORY_GLOBS = [
...KEBAB_CASE_DIRECTORY_GLOBS,
'src/babel-*',
'packages/*',
'test/functional/fixtures/es_archiver/visualize_source-filters',
'packages/kbn-pm/src/utils/__fixtures__/*',
'x-pack/dev-tools',
'packages/kbn-optimizer/src/__fixtures__/mock_repo/x-pack',
Expand Down
6 changes: 3 additions & 3 deletions test/api_integration/apis/kql_telemetry/kql_telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import { FtrProviderContext } from '../../ftr_provider_context';

export default function ({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const kibanaServer = getService('kibanaServer');
const es = getService('es');

describe('telemetry API', () => {
before(() => esArchiver.load('test/api_integration/fixtures/es_archiver/saved_objects/basic'));
after(() => esArchiver.unload('test/api_integration/fixtures/es_archiver/saved_objects/basic'));
before(() => kibanaServer.importExport.load('saved_objects/basic'));
after(() => kibanaServer.importExport.unload('saved_objects/basic'));

it('should increment the opt *in* counter in the .kibana/kql-telemetry document', async () => {
await supertest
Expand Down
141 changes: 48 additions & 93 deletions test/api_integration/apis/saved_objects/bulk_create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import { getKibanaVersion } from './lib/saved_objects_test_utils';

export default function ({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const esDeleteAllIndices = getService('esDeleteAllIndices');
const kibanaServer = getService('kibanaServer');
const SPACE_ID = 'ftr-so-bulk-create';

const BULK_REQUESTS = [
{
Expand All @@ -38,103 +38,58 @@ export default function ({ getService }: FtrProviderContext) {

before(async () => {
KIBANA_VERSION = await getKibanaVersion(getService);
await kibanaServer.spaces.create({ id: SPACE_ID, name: SPACE_ID });
await kibanaServer.importExport.load('saved_objects/basic', { space: SPACE_ID });
});

describe('with kibana index', () => {
before(() =>
esArchiver.load('test/api_integration/fixtures/es_archiver/saved_objects/basic')
);
after(() =>
esArchiver.unload('test/api_integration/fixtures/es_archiver/saved_objects/basic')
);
after(() => kibanaServer.spaces.delete(SPACE_ID));

it('should return 200 with individual responses', async () =>
await supertest
.post(`/api/saved_objects/_bulk_create`)
.send(BULK_REQUESTS)
.expect(200)
.then((resp) => {
expect(resp.body).to.eql({
saved_objects: [
{
type: 'visualization',
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
error: {
error: 'Conflict',
message:
'Saved object [visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab] conflict',
statusCode: 409,
},
it('should return 200 with individual responses', async () =>
await supertest
.post(`/s/${SPACE_ID}/api/saved_objects/_bulk_create`)
.send(BULK_REQUESTS)
.expect(200)
.then((resp) => {
expect(resp.body).to.eql({
saved_objects: [
{
type: 'visualization',
id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab',
error: {
error: 'Conflict',
message:
'Saved object [visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab] conflict',
statusCode: 409,
},
{
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',
},
migrationVersion: {
dashboard: resp.body.saved_objects[1].migrationVersion.dashboard,
},
coreMigrationVersion: KIBANA_VERSION,
references: [],
namespaces: ['default'],
},
{
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',
},
],
});
}));

it('should not return raw id when object id is unspecified', async () =>
await supertest
.post(`/api/saved_objects/_bulk_create`)
.send(BULK_REQUESTS.map(({ id, ...rest }) => rest))
.expect(200)
.then((resp) => {
resp.body.saved_objects.map(({ id }: { id: string }) =>
expect(id).not.match(/visualization|dashboard/)
);
}));
});

describe('without kibana index', () => {
before(
async () =>
// just in case the kibana server has recreated it
await esDeleteAllIndices('.kibana*')
);

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)
.expect(200)
.then((resp) => {
expect(resp.body).to.eql({
saved_objects: [
{
id: BULK_REQUESTS[0].id,
type: BULK_REQUESTS[0].type,
error: {
error: 'Internal Server Error',
message: 'An internal server error occurred',
statusCode: 500,
},
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,
references: [],
namespaces: [SPACE_ID],
},
],
});
});
});
}));

it('should not return raw id when object id is unspecified', async () =>
await supertest
.post(`/s/${SPACE_ID}/api/saved_objects/_bulk_create`)
.send(BULK_REQUESTS.map(({ id, ...rest }) => rest))
.expect(200)
.then((resp) => {
resp.body.saved_objects.map(({ id }: { id: string }) =>
expect(id).not.match(/visualization|dashboard/)
);
}));
});
}
Loading

0 comments on commit bf94530

Please sign in to comment.