mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
393 lines
13 KiB
Text
393 lines
13 KiB
Text
[[saved-objects-api-import]]
|
|
=== Import objects API
|
|
++++
|
|
<titleabbrev>Import objects</titleabbrev>
|
|
++++
|
|
|
|
experimental[] Create sets of {kib} saved objects from a file created by the export API.
|
|
|
|
==== Compatibility across versions
|
|
Saved objects can only be imported into the same version, a newer minor on the same major, or the next major. Exported saved objects are not backwards compatible and cannot be imported into an older version of {kib}. See the table below for compatibility examples:
|
|
|
|
|=======
|
|
| Exporting version | Importing version | Compatible?
|
|
| 6.7.x | 6.8.x | Yes
|
|
| 6.x.x | 7.x.x | Yes
|
|
| 7.x.x | 8.x.x | Yes
|
|
| 7.1.x | 7.15.x | Yes
|
|
| 7.x.x | 6.x.x | No
|
|
| 7.15.x | 7.1.x | No
|
|
| 6.x.x | 8.x.x | No
|
|
|=======
|
|
|
|
[[saved-objects-api-import-request]]
|
|
==== Request
|
|
|
|
`POST <kibana host>:<port>/api/saved_objects/_import`
|
|
|
|
`POST <kibana host>:<port>/s/<space_id>/api/saved_objects/_import`
|
|
|
|
[[saved-objects-api-import-path-params]]
|
|
==== Path parameters
|
|
|
|
`space_id`::
|
|
(Optional, string) An identifier for the <<xpack-spaces,space>>. If `space_id` is not provided in the URL, the default space is used.
|
|
|
|
[[saved-objects-api-import-query-params]]
|
|
==== Query parameters
|
|
|
|
`createNewCopies`::
|
|
(Optional, boolean) Creates copies of saved objects, regenerates each object ID, and resets the origin. When used, potential conflict
|
|
errors are avoided.
|
|
+
|
|
NOTE: This option cannot be used with the `overwrite` and `compatibilityMode` options.
|
|
|
|
`overwrite`::
|
|
(Optional, boolean) Overwrites saved objects when they already exist. When used, potential conflict errors are automatically resolved by
|
|
overwriting the destination object.
|
|
+
|
|
NOTE: This option cannot be used with the `createNewCopies` option.
|
|
|
|
`compatibilityMode`::
|
|
(Optional, boolean) Applies various adjustments to the saved objects that are being imported to maintain compatibility between different {kib}
|
|
versions. Use this option only if you encounter issues with imported saved objects.
|
|
+
|
|
NOTE: This option cannot be used with the `createNewCopies` option.
|
|
|
|
[[saved-objects-api-import-request-body]]
|
|
==== Request body
|
|
|
|
The request body must include the multipart/form-data type.
|
|
|
|
`file`::
|
|
A file exported using the export API.
|
|
+
|
|
NOTE: The <<savedObjects-maxImportExportSize, `savedObjects.maxImportExportSize`>> configuration setting
|
|
limits the number of saved objects which may be included in this file. Similarly, the
|
|
<<savedObjects-maxImportPayloadBytes, `savedObjects.maxImportPayloadBytes`>> setting limits the overall
|
|
size of the file that can be imported.
|
|
|
|
[[saved-objects-api-import-response-body]]
|
|
==== Response body
|
|
|
|
`success`::
|
|
(boolean) Indicates when the import was successfully completed. When set to `false`, some objects may not have been created. For
|
|
additional information, refer to the `errors` and `successResults` properties.
|
|
|
|
`successCount`::
|
|
(number) Indicates the number of successfully imported records.
|
|
|
|
`errors`::
|
|
(Optional, array) Indicates the import was unsuccessful and specifies the objects that failed to import.
|
|
+
|
|
NOTE: One object may result in multiple errors, which requires separate steps to resolve. For instance, a `missing_references` error and
|
|
`conflict` error).
|
|
|
|
`successResults`::
|
|
(Optional, array) Indicates the objects that are successfully imported, with any metadata if applicable.
|
|
+
|
|
NOTE: Objects are only created when all resolvable errors are addressed, including conflicts and missing references. For information on how
|
|
to resolve errors, refer to the <<saved-objects-api-import-example,examples>>.
|
|
|
|
[[saved-objects-api-import-codes]]
|
|
==== Response code
|
|
|
|
`200`::
|
|
Indicates a successful call.
|
|
|
|
[[saved-objects-api-import-example]]
|
|
==== Examples
|
|
|
|
[[saved-objects-api-import-example-1]]
|
|
===== Successful import with `createNewCopies` enabled
|
|
|
|
Import {a-data-source} and dashboard:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
$ curl -X POST api/saved_objects/_import?createNewCopies=true -H "kbn-xsrf: true" --form file=@file.ndjson
|
|
--------------------------------------------------
|
|
// KIBANA
|
|
|
|
The `file.ndjson` file contains the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{"type":"index-pattern","id":"my-pattern","attributes":{"title":"my-pattern-*"}}
|
|
{"type":"dashboard","id":"my-dashboard","attributes":{"title":"Look at my dashboard"}}
|
|
--------------------------------------------------
|
|
|
|
The API returns the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{
|
|
"success": true,
|
|
"successCount": 2,
|
|
"successResults": [
|
|
{
|
|
"id": "my-pattern",
|
|
"type": "index-pattern",
|
|
"destinationId": "4aba3770-0d04-45e1-9e34-4cf0fd2165ae",
|
|
"meta": {
|
|
"icon": "indexPatternApp",
|
|
"title": "my-pattern-*"
|
|
}
|
|
},
|
|
{
|
|
"id": "my-dashboard",
|
|
"type": "dashboard",
|
|
"destinationId": "c31d1eca-9bc0-4a81-b5f9-30c442824c48",
|
|
"meta": {
|
|
"icon": "dashboardApp",
|
|
"title": "Look at my dashboard"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
--------------------------------------------------
|
|
|
|
The result indicates a successful import, and both objects are created. Since these objects are created as new copies, each entry in the
|
|
`successResults` array includes a `destinationId` attribute.
|
|
|
|
[[saved-objects-api-import-example-2]]
|
|
===== Successful import with `createNewCopies` disabled
|
|
|
|
Import {a-data-source} and dashboard:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
$ curl -X POST api/saved_objects/_import -H "kbn-xsrf: true" --form file=@file.ndjson
|
|
--------------------------------------------------
|
|
// KIBANA
|
|
|
|
The `file.ndjson` file contains the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{"type":"index-pattern","id":"my-pattern","attributes":{"title":"my-pattern-*"}}
|
|
{"type":"dashboard","id":"my-dashboard","attributes":{"title":"Look at my dashboard"}}
|
|
--------------------------------------------------
|
|
|
|
The API returns the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{
|
|
"success": true,
|
|
"successCount": 2,
|
|
"successResults": [
|
|
{
|
|
"id": "my-pattern",
|
|
"type": "index-pattern",
|
|
"meta": {
|
|
"icon": "indexPatternApp",
|
|
"title": "my-pattern-*"
|
|
}
|
|
},
|
|
{
|
|
"id": "my-dashboard",
|
|
"type": "dashboard",
|
|
"meta": {
|
|
"icon": "dashboardApp",
|
|
"title": "Look at my dashboard"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
--------------------------------------------------
|
|
|
|
The result indicates a successful import, and both objects are created.
|
|
|
|
[[saved-objects-api-import-example-3]]
|
|
===== Failed import with conflict errors
|
|
|
|
Import {a-data-source}, visualization, *Canvas* workpad, and dashboard that include saved objects:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
$ curl -X POST api/saved_objects/_import -H "kbn-xsrf: true" --form file=@file.ndjson
|
|
--------------------------------------------------
|
|
// KIBANA
|
|
|
|
The `file.ndjson` file contains the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{"type":"index-pattern","id":"my-pattern","attributes":{"title":"my-pattern-*"}}
|
|
{"type":"visualization","id":"my-vis","attributes":{"title":"Look at my visualization"}}
|
|
{"type":"canvas-workpad","id":"my-canvas","attributes":{"name":"Look at my canvas"}}
|
|
{"type":"dashboard","id":"my-dashboard","attributes":{"title":"Look at my dashboard"}}
|
|
--------------------------------------------------
|
|
|
|
The API returns the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{
|
|
"success": false,
|
|
"successCount": 1,
|
|
"errors": [
|
|
{
|
|
"id": "my-pattern",
|
|
"type": "index-pattern",
|
|
"title": "my-pattern-*",
|
|
"error": {
|
|
"type": "conflict"
|
|
},
|
|
"meta": {
|
|
"icon": "indexPatternApp",
|
|
"title": "my-pattern-*"
|
|
}
|
|
},
|
|
{
|
|
"id": "my-visualization",
|
|
"type": "my-vis",
|
|
"title": "Look at my visualization",
|
|
"error": {
|
|
"type": "conflict",
|
|
"destinationId": "another-vis"
|
|
},
|
|
"meta": {
|
|
"icon": "visualizeApp",
|
|
"title": "Look at my visualization"
|
|
}
|
|
},
|
|
{
|
|
"id": "my-canvas",
|
|
"type": "canvas-workpad",
|
|
"title": "Look at my canvas",
|
|
"error": {
|
|
"type": "ambiguous_conflict",
|
|
"destinations": [
|
|
{
|
|
"id": "another-canvas",
|
|
"title": "Look at another canvas",
|
|
"updatedAt": "2020-07-08T16:36:32.377Z"
|
|
},
|
|
{
|
|
"id": "yet-another-canvas",
|
|
"title": "Look at yet another canvas",
|
|
"updatedAt": "2020-07-05T12:29:54.849Z"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"icon": "canvasApp",
|
|
"title": "Look at my canvas"
|
|
}
|
|
}
|
|
],
|
|
"successResults": [
|
|
{
|
|
"id": "my-dashboard",
|
|
"type": "dashboard",
|
|
"meta": {
|
|
"icon": "dashboardApp",
|
|
"title": "Look at my dashboard"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
--------------------------------------------------
|
|
|
|
The result indicates an unsuccessful import because the {data-source}, visualization, *Canvas* workpad, and dashboard resulted in a conflict
|
|
error:
|
|
|
|
* A {data-source} with the same ID already exists, which resulted in a conflict error. To resolve the error, overwrite the existing object,
|
|
or skip the object.
|
|
|
|
* A visualization with a different ID, but the same origin already exists, which resulted in a conflict error. The `destinationId` field
|
|
contains the `id` of the other visualization, which caused the conflict. The behavior is added to make sure that new objects that can be
|
|
shared between <<xpack-spaces,spaces>> behave in a similar way as legacy non-shareable objects. When a shareable object is exported and then
|
|
imported into a new space, it retains its origin so that the conflicts are encountered as expected. To resolve, overwrite the specified
|
|
destination object, or skip the object.
|
|
|
|
* Two *Canvas* workpads with different IDs, but the same origin, already exist, which resulted in a conflict error. The `destinations` array
|
|
describes the other workpads which caused the conflict. When a shareable object is exported, imported into a new space, then shared to
|
|
another space where an object of the same origin exists, the conflict error occurs. To resolve, pick a destination object to overwrite, or
|
|
skip the object.
|
|
|
|
Objects are created when the error is resolved using the <<saved-objects-api-resolve-import-errors-example-1,Resolve import errors API>>.
|
|
|
|
[[saved-objects-api-import-example-4]]
|
|
===== Failed import with missing reference errors
|
|
|
|
Import a visualization and dashboard when the {data-source} for the visualization doesn't exist:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
$ curl -X POST api/saved_objects/_import -H "kbn-xsrf: true" --form file=@file.ndjson
|
|
--------------------------------------------------
|
|
// KIBANA
|
|
|
|
The `file.ndjson` file contains the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{"type":"visualization","id":"my-vis","attributes":{"title":"Look at my visualization"},"references":[{"name":"ref_0","type":"index-pattern","id":"my-pattern-*"}]}
|
|
{"type":"search","id":"my-search","attributes":{"title":"Look at my search"},"references":[{"name":"ref_0","type":"index-pattern","id":"another-pattern-*"}]}
|
|
{"type":"dashboard","id":"my-dashboard","attributes":{"title":"Look at my dashboard"},"references":[{"name":"ref_0","type":"visualization","id":"my-vis"},{"name":"ref_1","type":"search","id":"my-search"}]}
|
|
--------------------------------------------------
|
|
|
|
The API returns the following:
|
|
|
|
[source,sh]
|
|
--------------------------------------------------
|
|
{
|
|
"success": false,
|
|
"successCount": 1,
|
|
"errors": [
|
|
{
|
|
"id": "my-vis",
|
|
"type": "visualization",
|
|
"title": "Look at my visualization",
|
|
"error": {
|
|
"type": "missing_references",
|
|
"references": [
|
|
{
|
|
"type": "index-pattern",
|
|
"id": "my-pattern-*"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"icon": "visualizeApp",
|
|
"title": "Look at my visualization"
|
|
}
|
|
},
|
|
{
|
|
"id": "my-search",
|
|
"type": "search",
|
|
"title": "Look at my search",
|
|
"error": {
|
|
"type": "missing_references",
|
|
"references": [
|
|
{
|
|
"type": "index-pattern",
|
|
"id": "another-pattern-*"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"icon": "searchApp",
|
|
"title": "Look at my search"
|
|
}
|
|
}
|
|
],
|
|
"successResults": [
|
|
{
|
|
"id": "my-dashboard",
|
|
"type": "dashboard",
|
|
"meta": {
|
|
"icon": "dashboardApp",
|
|
"title": "Look at my dashboard"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
--------------------------------------------------
|
|
|
|
The result indicates an unsuccessful import because the visualization and search resulted in a missing references error.
|
|
|
|
Objects are created when the errors are resolved using the <<saved-objects-api-resolve-import-errors-example-2,Resolve import errors API>>.
|