Expose savedObject import / export utility methods (#58882) (#59295)

* add getImportExportObjectLimit to so setup

* expose static method for so import / export

* improve functions naming

* fix mocked reference
This commit is contained in:
Pierre Gayvallet 2020-03-04 14:50:25 +01:00 committed by GitHub
parent 42bf1222b6
commit e1b8938f1f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 236 additions and 77 deletions

View file

@ -0,0 +1,24 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [exportSavedObjectsToStream](./kibana-plugin-server.exportsavedobjectstostream.md)
## exportSavedObjectsToStream() function
Generates sorted saved object stream to be used for export. See the [options](./kibana-plugin-server.savedobjectsexportoptions.md) for more detailed information.
<b>Signature:</b>
```typescript
export declare function exportSavedObjectsToStream({ types, objects, search, savedObjectsClient, exportSizeLimit, includeReferencesDeep, excludeExportDetails, namespace, }: SavedObjectsExportOptions): Promise<import("stream").Readable>;
```
## Parameters
| Parameter | Type | Description |
| --- | --- | --- |
| { types, objects, search, savedObjectsClient, exportSizeLimit, includeReferencesDeep, excludeExportDetails, namespace, } | <code>SavedObjectsExportOptions</code> | |
<b>Returns:</b>
`Promise<import("stream").Readable>`

View file

@ -0,0 +1,24 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [importSavedObjectsFromStream](./kibana-plugin-server.importsavedobjectsfromstream.md)
## importSavedObjectsFromStream() function
Import saved objects from given stream. See the [options](./kibana-plugin-server.savedobjectsimportoptions.md) for more detailed information.
<b>Signature:</b>
```typescript
export declare function importSavedObjectsFromStream({ readStream, objectLimit, overwrite, savedObjectsClient, supportedTypes, namespace, }: SavedObjectsImportOptions): Promise<SavedObjectsImportResponse>;
```
## Parameters
| Parameter | Type | Description |
| --- | --- | --- |
| { readStream, objectLimit, overwrite, savedObjectsClient, supportedTypes, namespace, } | <code>SavedObjectsImportOptions</code> | |
<b>Returns:</b>
`Promise<SavedObjectsImportResponse>`

View file

@ -37,6 +37,14 @@ The plugin integrates with the core system via lifecycle events: `setup`<!-- -->
| [AuthResultType](./kibana-plugin-server.authresulttype.md) | |
| [AuthStatus](./kibana-plugin-server.authstatus.md) | Status indicating an outcome of the authentication. |
## Functions
| Function | Description |
| --- | --- |
| [exportSavedObjectsToStream({ types, objects, search, savedObjectsClient, exportSizeLimit, includeReferencesDeep, excludeExportDetails, namespace, })](./kibana-plugin-server.exportsavedobjectstostream.md) | Generates sorted saved object stream to be used for export. See the [options](./kibana-plugin-server.savedobjectsexportoptions.md) for more detailed information. |
| [importSavedObjectsFromStream({ readStream, objectLimit, overwrite, savedObjectsClient, supportedTypes, namespace, })](./kibana-plugin-server.importsavedobjectsfromstream.md) | Import saved objects from given stream. See the [options](./kibana-plugin-server.savedobjectsimportoptions.md) for more detailed information. |
| [resolveSavedObjectsImportErrors({ readStream, objectLimit, retries, savedObjectsClient, supportedTypes, namespace, })](./kibana-plugin-server.resolvesavedobjectsimporterrors.md) | Resolve and return saved object import errors. See the [options](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.md) for more detailed informations. |
## Interfaces
| Interface | Description |

View file

@ -0,0 +1,24 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [resolveSavedObjectsImportErrors](./kibana-plugin-server.resolvesavedobjectsimporterrors.md)
## resolveSavedObjectsImportErrors() function
Resolve and return saved object import errors. See the [options](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.md) for more detailed informations.
<b>Signature:</b>
```typescript
export declare function resolveSavedObjectsImportErrors({ readStream, objectLimit, retries, savedObjectsClient, supportedTypes, namespace, }: SavedObjectsResolveImportErrorsOptions): Promise<SavedObjectsImportResponse>;
```
## Parameters
| Parameter | Type | Description |
| --- | --- | --- |
| { readStream, objectLimit, retries, savedObjectsClient, supportedTypes, namespace, } | <code>SavedObjectsResolveImportErrorsOptions</code> | |
<b>Returns:</b>
`Promise<SavedObjectsImportResponse>`

View file

@ -16,10 +16,10 @@ export interface SavedObjectsImportOptions
| Property | Type | Description |
| --- | --- | --- |
| [namespace](./kibana-plugin-server.savedobjectsimportoptions.namespace.md) | <code>string</code> | |
| [objectLimit](./kibana-plugin-server.savedobjectsimportoptions.objectlimit.md) | <code>number</code> | |
| [overwrite](./kibana-plugin-server.savedobjectsimportoptions.overwrite.md) | <code>boolean</code> | |
| [readStream](./kibana-plugin-server.savedobjectsimportoptions.readstream.md) | <code>Readable</code> | |
| [savedObjectsClient](./kibana-plugin-server.savedobjectsimportoptions.savedobjectsclient.md) | <code>SavedObjectsClientContract</code> | |
| [supportedTypes](./kibana-plugin-server.savedobjectsimportoptions.supportedtypes.md) | <code>string[]</code> | |
| [namespace](./kibana-plugin-server.savedobjectsimportoptions.namespace.md) | <code>string</code> | if specified, will import in given namespace, else will import as global object |
| [objectLimit](./kibana-plugin-server.savedobjectsimportoptions.objectlimit.md) | <code>number</code> | The maximum number of object to import |
| [overwrite](./kibana-plugin-server.savedobjectsimportoptions.overwrite.md) | <code>boolean</code> | if true, will override existing object if present |
| [readStream](./kibana-plugin-server.savedobjectsimportoptions.readstream.md) | <code>Readable</code> | The stream of [saved objects](./kibana-plugin-server.savedobject.md) to import |
| [savedObjectsClient](./kibana-plugin-server.savedobjectsimportoptions.savedobjectsclient.md) | <code>SavedObjectsClientContract</code> | [client](./kibana-plugin-server.savedobjectsclientcontract.md) to use to perform the import operation |
| [supportedTypes](./kibana-plugin-server.savedobjectsimportoptions.supportedtypes.md) | <code>string[]</code> | the list of allowed types to import |

View file

@ -4,6 +4,8 @@
## SavedObjectsImportOptions.namespace property
if specified, will import in given namespace, else will import as global object
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsImportOptions.objectLimit property
The maximum number of object to import
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsImportOptions.overwrite property
if true, will override existing object if present
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsImportOptions.readStream property
The stream of [saved objects](./kibana-plugin-server.savedobject.md) to import
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsImportOptions.savedObjectsClient property
[client](./kibana-plugin-server.savedobjectsclientcontract.md) to use to perform the import operation
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsImportOptions.supportedTypes property
the list of allowed types to import
<b>Signature:</b>
```typescript

View file

@ -16,10 +16,10 @@ export interface SavedObjectsResolveImportErrorsOptions
| Property | Type | Description |
| --- | --- | --- |
| [namespace](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.namespace.md) | <code>string</code> | |
| [objectLimit](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.objectlimit.md) | <code>number</code> | |
| [readStream](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.readstream.md) | <code>Readable</code> | |
| [retries](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.retries.md) | <code>SavedObjectsImportRetry[]</code> | |
| [savedObjectsClient](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.savedobjectsclient.md) | <code>SavedObjectsClientContract</code> | |
| [supportedTypes](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.supportedtypes.md) | <code>string[]</code> | |
| [namespace](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.namespace.md) | <code>string</code> | if specified, will import in given namespace |
| [objectLimit](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.objectlimit.md) | <code>number</code> | The maximum number of object to import |
| [readStream](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.readstream.md) | <code>Readable</code> | The stream of [saved objects](./kibana-plugin-server.savedobject.md) to resolve errors from |
| [retries](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.retries.md) | <code>SavedObjectsImportRetry[]</code> | saved object import references to retry |
| [savedObjectsClient](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.savedobjectsclient.md) | <code>SavedObjectsClientContract</code> | client to use to perform the import operation |
| [supportedTypes](./kibana-plugin-server.savedobjectsresolveimporterrorsoptions.supportedtypes.md) | <code>string[]</code> | the list of allowed types to import |

View file

@ -4,6 +4,8 @@
## SavedObjectsResolveImportErrorsOptions.namespace property
if specified, will import in given namespace
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsResolveImportErrorsOptions.objectLimit property
The maximum number of object to import
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsResolveImportErrorsOptions.readStream property
The stream of [saved objects](./kibana-plugin-server.savedobject.md) to resolve errors from
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsResolveImportErrorsOptions.retries property
saved object import references to retry
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsResolveImportErrorsOptions.savedObjectsClient property
client to use to perform the import operation
<b>Signature:</b>
```typescript

View file

@ -4,6 +4,8 @@
## SavedObjectsResolveImportErrorsOptions.supportedTypes property
the list of allowed types to import
<b>Signature:</b>
```typescript

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [SavedObjectsServiceSetup](./kibana-plugin-server.savedobjectsservicesetup.md) &gt; [getImportExportObjectLimit](./kibana-plugin-server.savedobjectsservicesetup.getimportexportobjectlimit.md)
## SavedObjectsServiceSetup.getImportExportObjectLimit property
Returns the maximum number of objects allowed for import or export operations.
<b>Signature:</b>
```typescript
getImportExportObjectLimit: () => number;
```

View file

@ -54,6 +54,7 @@ export class Plugin() {
| Property | Type | Description |
| --- | --- | --- |
| [addClientWrapper](./kibana-plugin-server.savedobjectsservicesetup.addclientwrapper.md) | <code>(priority: number, id: string, factory: SavedObjectsClientWrapperFactory) =&gt; void</code> | Add a [client wrapper factory](./kibana-plugin-server.savedobjectsclientwrapperfactory.md) with the given priority. |
| [getImportExportObjectLimit](./kibana-plugin-server.savedobjectsservicesetup.getimportexportobjectlimit.md) | <code>() =&gt; number</code> | Returns the maximum number of objects allowed for import or export operations. |
| [registerType](./kibana-plugin-server.savedobjectsservicesetup.registertype.md) | <code>(type: SavedObjectsType) =&gt; void</code> | Register a [savedObjects type](./kibana-plugin-server.savedobjectstype.md) definition.<!-- -->See the [mappings format](./kibana-plugin-server.savedobjectstypemappingdefinition.md) and [migration format](./kibana-plugin-server.savedobjectmigrationmap.md) for more details about these. |
| [setClientFactoryProvider](./kibana-plugin-server.savedobjectsservicesetup.setclientfactoryprovider.md) | <code>(clientFactoryProvider: SavedObjectsClientFactoryProvider) =&gt; void</code> | Set the default [factory provider](./kibana-plugin-server.savedobjectsclientfactoryprovider.md) for creating Saved Objects clients. Only one provider can be set, subsequent calls to this method will fail. |

View file

@ -231,6 +231,9 @@ export {
SavedObjectsType,
SavedObjectMigrationMap,
SavedObjectMigrationFn,
exportSavedObjectsToStream,
importSavedObjectsFromStream,
resolveSavedObjectsImportErrors,
} from './saved_objects';
export {

View file

@ -300,6 +300,7 @@ export class LegacyService implements CoreService {
setClientFactoryProvider: setupDeps.core.savedObjects.setClientFactoryProvider,
addClientWrapper: setupDeps.core.savedObjects.addClientWrapper,
registerType: setupDeps.core.savedObjects.registerType,
getImportExportObjectLimit: setupDeps.core.savedObjects.getImportExportObjectLimit,
},
uiSettings: {
register: setupDeps.core.uiSettings.register,

View file

@ -170,6 +170,7 @@ export function createPluginSetupContext<TPlugin, TPluginDependencies>(
setClientFactoryProvider: deps.savedObjects.setClientFactoryProvider,
addClientWrapper: deps.savedObjects.addClientWrapper,
registerType: deps.savedObjects.registerType,
getImportExportObjectLimit: deps.savedObjects.getImportExportObjectLimit,
},
uiSettings: {
register: deps.uiSettings.register,

View file

@ -17,7 +17,7 @@
* under the License.
*/
import { getSortedObjectsForExport } from './get_sorted_objects_for_export';
import { exportSavedObjectsToStream } from './get_sorted_objects_for_export';
import { savedObjectsClientMock } from '../service/saved_objects_client.mock';
import { Readable } from 'stream';
import { createPromiseFromStreams, createConcatStream } from '../../../../legacy/utils/streams';
@ -65,7 +65,7 @@ describe('getSortedObjectsForExport()', () => {
per_page: 1,
page: 0,
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
savedObjectsClient,
exportSizeLimit: 500,
types: ['index-pattern', 'search'],
@ -151,7 +151,7 @@ describe('getSortedObjectsForExport()', () => {
per_page: 1,
page: 0,
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
savedObjectsClient,
exportSizeLimit: 500,
types: ['index-pattern', 'search'],
@ -210,7 +210,7 @@ describe('getSortedObjectsForExport()', () => {
per_page: 1,
page: 0,
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
savedObjectsClient,
exportSizeLimit: 500,
types: ['index-pattern', 'search'],
@ -297,7 +297,7 @@ describe('getSortedObjectsForExport()', () => {
per_page: 1,
page: 0,
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
savedObjectsClient,
exportSizeLimit: 500,
types: ['index-pattern', 'search'],
@ -385,7 +385,7 @@ describe('getSortedObjectsForExport()', () => {
page: 0,
});
await expect(
getSortedObjectsForExport({
exportSavedObjectsToStream({
savedObjectsClient,
exportSizeLimit: 1,
types: ['index-pattern', 'search'],
@ -425,7 +425,7 @@ describe('getSortedObjectsForExport()', () => {
},
],
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
exportSizeLimit: 10000,
savedObjectsClient,
types: ['index-pattern'],
@ -489,7 +489,7 @@ describe('getSortedObjectsForExport()', () => {
},
],
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
exportSizeLimit: 10000,
savedObjectsClient,
objects: [
@ -587,7 +587,7 @@ describe('getSortedObjectsForExport()', () => {
},
],
});
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
exportSizeLimit: 10000,
savedObjectsClient,
objects: [
@ -681,7 +681,7 @@ describe('getSortedObjectsForExport()', () => {
},
],
};
await expect(getSortedObjectsForExport(exportOpts)).rejects.toThrowErrorMatchingInlineSnapshot(
await expect(exportSavedObjectsToStream(exportOpts)).rejects.toThrowErrorMatchingInlineSnapshot(
`"Can't export more than 1 objects"`
);
});
@ -694,7 +694,7 @@ describe('getSortedObjectsForExport()', () => {
objects: undefined,
};
expect(getSortedObjectsForExport(exportOpts)).rejects.toThrowErrorMatchingInlineSnapshot(
expect(exportSavedObjectsToStream(exportOpts)).rejects.toThrowErrorMatchingInlineSnapshot(
`"Either \`type\` or \`objects\` are required."`
);
});
@ -707,7 +707,7 @@ describe('getSortedObjectsForExport()', () => {
search: 'foo',
};
expect(getSortedObjectsForExport(exportOpts)).rejects.toThrowErrorMatchingInlineSnapshot(
expect(exportSavedObjectsToStream(exportOpts)).rejects.toThrowErrorMatchingInlineSnapshot(
`"Can't specify both \\"search\\" and \\"objects\\" properties when exporting"`
);
});

View file

@ -124,7 +124,13 @@ async function fetchObjectsToExport({
}
}
export async function getSortedObjectsForExport({
/**
* Generates sorted saved object stream to be used for export.
* See the {@link SavedObjectsExportOptions | options} for more detailed information.
*
* @public
*/
export async function exportSavedObjectsToStream({
types,
objects,
search,

View file

@ -18,7 +18,7 @@
*/
export {
getSortedObjectsForExport,
exportSavedObjectsToStream,
SavedObjectsExportOptions,
SavedObjectsExportResultDetails,
} from './get_sorted_objects_for_export';

View file

@ -19,7 +19,7 @@
import { Readable } from 'stream';
import { SavedObject } from '../types';
import { importSavedObjects } from './import_saved_objects';
import { importSavedObjectsFromStream } from './import_saved_objects';
import { savedObjectsClientMock } from '../../mocks';
const emptyResponse = {
@ -76,7 +76,7 @@ describe('importSavedObjects()', () => {
this.push(null);
},
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 1,
overwrite: false,
@ -103,7 +103,7 @@ describe('importSavedObjects()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects,
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 4,
overwrite: false,
@ -186,7 +186,7 @@ describe('importSavedObjects()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects,
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 4,
overwrite: false,
@ -270,7 +270,7 @@ describe('importSavedObjects()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects,
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 4,
overwrite: true,
@ -362,7 +362,7 @@ describe('importSavedObjects()', () => {
references: [],
})),
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 4,
overwrite: false,
@ -460,7 +460,7 @@ describe('importSavedObjects()', () => {
},
],
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 4,
overwrite: false,
@ -536,7 +536,7 @@ describe('importSavedObjects()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects,
});
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
readStream,
objectLimit: 5,
overwrite: false,

View file

@ -26,7 +26,13 @@ import {
} from './types';
import { validateReferences } from './validate_references';
export async function importSavedObjects({
/**
* Import saved objects from given stream. See the {@link SavedObjectsImportOptions | options} for more
* detailed information.
*
* @public
*/
export async function importSavedObjectsFromStream({
readStream,
objectLimit,
overwrite,

View file

@ -17,8 +17,8 @@
* under the License.
*/
export { importSavedObjects } from './import_saved_objects';
export { resolveImportErrors } from './resolve_import_errors';
export { importSavedObjectsFromStream } from './import_saved_objects';
export { resolveSavedObjectsImportErrors } from './resolve_import_errors';
export {
SavedObjectsImportResponse,
SavedObjectsImportError,

View file

@ -19,7 +19,7 @@
import { Readable } from 'stream';
import { SavedObject } from '../types';
import { resolveImportErrors } from './resolve_import_errors';
import { resolveSavedObjectsImportErrors } from './resolve_import_errors';
import { savedObjectsClientMock } from '../../mocks';
describe('resolveImportErrors()', () => {
@ -80,7 +80,7 @@ describe('resolveImportErrors()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: [],
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 4,
retries: [],
@ -107,7 +107,7 @@ describe('resolveImportErrors()', () => {
savedObjectsClient.bulkCreate.mockResolvedValueOnce({
saved_objects: savedObjects.filter(obj => obj.type === 'visualization' && obj.id === '3'),
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 4,
retries: [
@ -168,7 +168,7 @@ describe('resolveImportErrors()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects.filter(obj => obj.type === 'index-pattern' && obj.id === '1'),
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 4,
retries: [
@ -230,7 +230,7 @@ describe('resolveImportErrors()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects.filter(obj => obj.type === 'dashboard' && obj.id === '4'),
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 4,
retries: [
@ -312,7 +312,7 @@ describe('resolveImportErrors()', () => {
references: [],
})),
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 4,
retries: savedObjects.map(obj => ({
@ -415,7 +415,7 @@ describe('resolveImportErrors()', () => {
},
],
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 2,
retries: [
@ -503,7 +503,7 @@ describe('resolveImportErrors()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: [],
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 5,
retries: [
@ -547,7 +547,7 @@ describe('resolveImportErrors()', () => {
savedObjectsClient.bulkCreate.mockResolvedValue({
saved_objects: savedObjects.filter(obj => obj.type === 'index-pattern' && obj.id === '1'),
});
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
readStream,
objectLimit: 4,
retries: [

View file

@ -27,7 +27,13 @@ import {
} from './types';
import { validateReferences } from './validate_references';
export async function resolveImportErrors({
/**
* Resolve and return saved object import errors.
* See the {@link SavedObjectsResolveImportErrorsOptions | options} for more detailed informations.
*
* @public
*/
export async function resolveSavedObjectsImportErrors({
readStream,
objectLimit,
retries,

View file

@ -107,11 +107,17 @@ export interface SavedObjectsImportResponse {
* @public
*/
export interface SavedObjectsImportOptions {
/** The stream of {@link SavedObject | saved objects} to import */
readStream: Readable;
/** The maximum number of object to import */
objectLimit: number;
/** if true, will override existing object if present */
overwrite: boolean;
/** {@link SavedObjectsClientContract | client} to use to perform the import operation */
savedObjectsClient: SavedObjectsClientContract;
/** the list of allowed types to import */
supportedTypes: string[];
/** if specified, will import in given namespace, else will import as global object */
namespace?: string;
}
@ -120,10 +126,16 @@ export interface SavedObjectsImportOptions {
* @public
*/
export interface SavedObjectsResolveImportErrorsOptions {
/** The stream of {@link SavedObject | saved objects} to resolve errors from */
readStream: Readable;
/** The maximum number of object to import */
objectLimit: number;
/** client to use to perform the import operation */
savedObjectsClient: SavedObjectsClientContract;
/** saved object import references to retry */
retries: SavedObjectsImportRetry[];
/** the list of allowed types to import */
supportedTypes: string[];
/** if specified, will import in given namespace */
namespace?: string;
}

View file

@ -26,7 +26,7 @@ export { SavedObjectsManagement } from './management';
export * from './import';
export {
getSortedObjectsForExport,
exportSavedObjectsToStream,
SavedObjectsExportOptions,
SavedObjectsExportResultDetails,
} from './export';

View file

@ -26,7 +26,7 @@ import {
} from '../../../../legacy/utils/streams';
import { IRouter } from '../../http';
import { SavedObjectConfig } from '../saved_objects_config';
import { getSortedObjectsForExport } from '../export';
import { exportSavedObjectsToStream } from '../export';
export const registerExportRoute = (
router: IRouter,
@ -67,7 +67,7 @@ export const registerExportRoute = (
router.handleLegacyErrors(async (context, req, res) => {
const savedObjectsClient = context.core.savedObjects.client;
const { type, objects, search, excludeExportDetails, includeReferencesDeep } = req.body;
const exportStream = await getSortedObjectsForExport({
const exportStream = await exportSavedObjectsToStream({
savedObjectsClient,
types: typeof type === 'string' ? [type] : type,
search,

View file

@ -21,7 +21,7 @@ import { Readable } from 'stream';
import { extname } from 'path';
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { importSavedObjects } from '../import';
import { importSavedObjectsFromStream } from '../import';
import { SavedObjectConfig } from '../saved_objects_config';
import { createSavedObjectsStreamFromNdJson } from './utils';
@ -65,7 +65,7 @@ export const registerImportRoute = (
return res.badRequest({ body: `Invalid file extension ${fileExtension}` });
}
const result = await importSavedObjects({
const result = await importSavedObjectsFromStream({
supportedTypes,
savedObjectsClient: context.core.savedObjects.client,
readStream: createSavedObjectsStreamFromNdJson(file),

View file

@ -18,7 +18,7 @@
*/
jest.mock('../../export', () => ({
getSortedObjectsForExport: jest.fn(),
exportSavedObjectsToStream: jest.fn(),
}));
import * as exportMock from '../../export';
@ -30,7 +30,7 @@ import { registerExportRoute } from '../export';
import { setupServer } from './test_utils';
type setupServerReturn = UnwrapPromise<ReturnType<typeof setupServer>>;
const getSortedObjectsForExport = exportMock.getSortedObjectsForExport as jest.Mock;
const exportSavedObjectsToStream = exportMock.exportSavedObjectsToStream as jest.Mock;
const allowedTypes = ['index-pattern', 'search'];
const config = {
maxImportPayloadBytes: 10485760,
@ -76,7 +76,7 @@ describe('POST /api/saved_objects/_export', () => {
],
},
];
getSortedObjectsForExport.mockResolvedValueOnce(createListStream(sortedObjects));
exportSavedObjectsToStream.mockResolvedValueOnce(createListStream(sortedObjects));
const result = await supertest(httpSetup.server.listener)
.post('/api/saved_objects/_export')
@ -96,7 +96,7 @@ describe('POST /api/saved_objects/_export', () => {
const objects = (result.text as string).split('\n').map(row => JSON.parse(row));
expect(objects).toEqual(sortedObjects);
expect(getSortedObjectsForExport.mock.calls[0][0]).toEqual(
expect(exportSavedObjectsToStream.mock.calls[0][0]).toEqual(
expect.objectContaining({
excludeExportDetails: false,
exportSizeLimit: 10000,

View file

@ -21,7 +21,7 @@ import { extname } from 'path';
import { Readable } from 'stream';
import { schema } from '@kbn/config-schema';
import { IRouter } from '../../http';
import { resolveImportErrors } from '../import';
import { resolveSavedObjectsImportErrors } from '../import';
import { SavedObjectConfig } from '../saved_objects_config';
import { createSavedObjectsStreamFromNdJson } from './utils';
@ -75,7 +75,7 @@ export const registerResolveImportErrorsRoute = (
if (fileExtension !== '.ndjson') {
return res.badRequest({ body: `Invalid file extension ${fileExtension}` });
}
const result = await resolveImportErrors({
const result = await resolveSavedObjectsImportErrors({
supportedTypes,
savedObjectsClient: context.core.savedObjects.client,
readStream: createSavedObjectsStreamFromNdJson(file),

View file

@ -64,8 +64,11 @@ const createSetupContractMock = () => {
setClientFactoryProvider: jest.fn(),
addClientWrapper: jest.fn(),
registerType: jest.fn(),
getImportExportObjectLimit: jest.fn(),
};
setupContract.getImportExportObjectLimit.mockReturnValue(100);
return setupContract;
};

View file

@ -154,6 +154,11 @@ export interface SavedObjectsServiceSetup {
* This API is the single entry point to register saved object types in the new platform.
*/
registerType: (type: SavedObjectsType) => void;
/**
* Returns the maximum number of objects allowed for import or export operations.
*/
getImportExportObjectLimit: () => number;
}
/**
@ -344,6 +349,7 @@ export class SavedObjectsService
}
this.typeRegistry.registerType(type);
},
getImportExportObjectLimit: () => this.config!.maxImportExportSize,
};
}

View file

@ -62,7 +62,6 @@ export interface SavedObjectsMigrationVersion {
}
/**
*
* @public
*/
export interface SavedObject<T = unknown> {

View file

@ -766,6 +766,9 @@ export interface ErrorHttpResponseOptions {
headers?: ResponseHeaders;
}
// @public
export function exportSavedObjectsToStream({ types, objects, search, savedObjectsClient, exportSizeLimit, includeReferencesDeep, excludeExportDetails, namespace, }: SavedObjectsExportOptions): Promise<import("stream").Readable>;
// @public
export interface FakeRequest {
headers: Headers;
@ -894,6 +897,9 @@ export interface ImageValidation {
};
}
// @public
export function importSavedObjectsFromStream({ readStream, objectLimit, overwrite, savedObjectsClient, supportedTypes, namespace, }: SavedObjectsImportOptions): Promise<SavedObjectsImportResponse>;
// @public (undocumented)
export interface IndexSettingsDeprecationInfo {
// (undocumented)
@ -1434,6 +1440,9 @@ export type RequestHandlerContextContainer = IContextContainer<RequestHandler<an
// @public
export type RequestHandlerContextProvider<TContextName extends keyof RequestHandlerContext> = IContextProvider<RequestHandler<any, any, any>, TContextName>;
// @public
export function resolveSavedObjectsImportErrors({ readStream, objectLimit, retries, savedObjectsClient, supportedTypes, namespace, }: SavedObjectsResolveImportErrorsOptions): Promise<SavedObjectsImportResponse>;
// @public
export type ResponseError = string | Error | {
message: string | Error;
@ -1896,17 +1905,11 @@ export interface SavedObjectsImportMissingReferencesError {
// @public
export interface SavedObjectsImportOptions {
// (undocumented)
namespace?: string;
// (undocumented)
objectLimit: number;
// (undocumented)
overwrite: boolean;
// (undocumented)
readStream: Readable;
// (undocumented)
savedObjectsClient: SavedObjectsClientContract;
// (undocumented)
supportedTypes: string[];
}
@ -2060,17 +2063,11 @@ export interface SavedObjectsRepositoryFactory {
// @public
export interface SavedObjectsResolveImportErrorsOptions {
// (undocumented)
namespace?: string;
// (undocumented)
objectLimit: number;
// (undocumented)
readStream: Readable;
// (undocumented)
retries: SavedObjectsImportRetry[];
// (undocumented)
savedObjectsClient: SavedObjectsClientContract;
// (undocumented)
supportedTypes: string[];
}
@ -2101,6 +2098,7 @@ export class SavedObjectsSerializer {
// @public
export interface SavedObjectsServiceSetup {
addClientWrapper: (priority: number, id: string, factory: SavedObjectsClientWrapperFactory) => void;
getImportExportObjectLimit: () => number;
registerType: (type: SavedObjectsType) => void;
setClientFactoryProvider: (clientFactoryProvider: SavedObjectsClientFactoryProvider) => void;
}

View file

@ -23,9 +23,9 @@ import { SavedObjectsSchema } from '../../../core/server/saved_objects/schema';
import {
SavedObjectsClient,
SavedObjectsRepository,
getSortedObjectsForExport,
importSavedObjects,
resolveImportErrors,
exportSavedObjectsToStream,
importSavedObjectsFromStream,
resolveSavedObjectsImportErrors,
} from '../../../core/server/saved_objects';
import { getRootPropertiesObjects } from '../../../core/server/saved_objects/mappings';
import { convertTypesToLegacySchema } from '../../../core/server/saved_objects/utils';
@ -95,9 +95,9 @@ export function savedObjectsMixin(kbnServer, server) {
provider.addClientWrapperFactory(...args),
importExport: {
objectLimit: server.config().get('savedObjects.maxImportExportSize'),
importSavedObjects,
resolveImportErrors,
getSortedObjectsForExport,
importSavedObjects: importSavedObjectsFromStream,
resolveImportErrors: resolveSavedObjectsImportErrors,
getSortedObjectsForExport: exportSavedObjectsToStream,
},
schema,
};