将保存的对象复制到空间 API

编辑

将保存的对象复制到空间 API编辑

[预览] 此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 的约束。 在空间之间复制保存的对象。

它还允许您自动复制相关对象,因此当您复制一个 dashboard 时,这可以根据需要自动复制相关的可视化、数据视图和保存的搜索。

如果目标空间中已存在具有相同 ID 的对象,您可以请求覆盖这些对象,或者您可以使用 解决将保存的对象复制到空间冲突 API 来逐个对象地执行此操作。

请求编辑

POST <kibana 主机>:<端口>/api/spaces/_copy_saved_objects

POST <kibana 主机>:<端口>/s/<空间 ID>/api/spaces/_copy_saved_objects

路径参数编辑

space_id
(可选,字符串) 包含要复制的保存对象的空格的 ID。当 URL 中未指定 space_id 时,将使用默认空间。

请求正文编辑

spaces
(必需,字符串数组) 要将指定对象复制到的空间的 ID。
objects

(必需,对象数组) 要复制的保存的对象。

objects 的属性
type
(必需,字符串) 保存的对象类型。
id
(必需,字符串) 保存的对象 ID。
includeReferences
(可选,布尔值) 当设置为 true 时,与指定保存的对象相关的所有保存的对象也将被复制到目标空间。默认值为 false
createNewCopies

(可选,布尔值) 创建保存对象的副本,重新生成每个对象 ID 并重置来源。使用时,可以避免潜在的冲突错误。默认值为 true

此选项不能与 overwritecompatibilityMode 选项一起使用。

overwrite

(可选,布尔值) 当设置为 true 时,所有冲突将自动覆盖。当目标空间中存在具有匹配 typeid 的保存对象时,该版本将被源空间中的版本替换。默认值为 false

此选项不能与 createNewCopies 选项一起使用。

compatibilityMode

(可选,布尔值) 对正在复制的保存的对象应用各种调整,以保持不同 Kibana 版本之间的兼容性。仅当您遇到复制的保存对象问题时才使用此选项。

此选项不能与 createNewCopies 选项一起使用。

响应代码编辑

200
表示成功调用。
404
表示请求失败,因为无法找到一个或多个指定的对象。404 响应属性中包含未解析对象的列表。

响应正文编辑

<space_id>

(对象) 描述空间复制操作结果的对象。包括响应中的动态键。

<space_id> 的属性
success
(布尔值) 复制操作成功。当设置为 false 时,一些对象可能已被复制。有关更多信息,请参阅 errorssuccessResults 属性。
successCount
(数字) 成功复制的对象数量。
errors

(可选,数组) 复制操作期间发生的错误。当报告错误时,success 标志将设置为 false

一个对象可能会导致多个错误,这需要单独的步骤来解决。例如,missing_references 错误和 conflict 错误。

errors 的属性
id
(字符串) 无法复制的保存对象的 ID。
type
(字符串) 无法复制的保存对象的类型。
error

(对象) 导致复制操作失败的错误。

error 的属性
type
(字符串) 错误类型。例如,conflictambiguous_conflictmissing_referencesunsupported_typeunknown。标记为 conflictambiguous_conflict 的错误可以通过使用 解决将保存的对象复制到空间冲突 API 来解决。
destinationId
(可选,字符串) 复制尝试期间使用的目标 ID。这仅在 conflict 错误类型中存在。
destinations
(可选,数组) 包含 idtitleupdatedAt 字段的可能对象目标列表,以描述每个目标。这仅在 ambiguous_conflict 错误类型中存在。
successResults

(可选,数组) 指示成功复制的对象,以及任何适用的元数据。

当所有可解决的错误(包括冲突和缺少引用错误)得到解决时,将创建对象。有关更多信息,请参阅 示例

示例编辑

成功复制(启用 createNewCopies编辑

将具有 my-dashboard ID 的仪表板(包括所有引用)从 default 空间复制到 marketing 空间。在此示例中,仪表板引用了一个可视化,而可视化引用了一个数据视图

$ curl -X POST api/spaces/_copy_saved_objects
{
  "objects": [{
    "type": "dashboard",
    "id": "my-dashboard"
  }],
  "spaces": ["marketing"],
  "includeReferences": true
}

API 返回以下内容

{
  "marketing": {
    "success": true,
    "successCount": 3,
    "successResults": [
      {
        "id": "my-dashboard",
        "type": "dashboard",
        "destinationId": "1e127098-5b80-417f-b0f1-c60c8395358f",
        "meta": {
          "icon": "dashboardApp",
          "title": "Look at my dashboard"
        }
      },
      {
        "id": "my-vis",
        "type": "visualization",
        "destinationId": "a610ed80-1c73-4507-9e13-d3af736c8e04",
        "meta": {
          "icon": "visualizeApp",
          "title": "Look at my visualization"
        }
      },
      {
        "id": "my-index-pattern",
        "type": "index-pattern",
        "destinationId": "bc3c9c70-bf6f-4bec-b4ce-f4189aa9e26b",
        "meta": {
          "icon": "indexPatternApp",
          "title": "my-pattern-*"
        }
      }
    ]
  }
}

结果表明复制成功,所有三个对象都已创建。由于这些对象是作为新副本创建的,因此 successResults 数组中的每个条目都包含一个 destinationId 属性。

成功复制(禁用 createNewCopies编辑

将具有 my-dashboard ID 的仪表板(包括所有引用)从 default 空间复制到 marketing 空间。在此示例中,仪表板引用了一个可视化,而可视化引用了一个数据视图

$ curl -X POST api/spaces/_copy_saved_objects
{
  "objects": [{
    "type": "dashboard",
    "id": "my-dashboard"
  }],
  "spaces": ["marketing"],
  "includeReferences": true,
  "createNewCopies": false
}

API 返回以下内容

{
  "marketing": {
    "success": true,
    "successCount": 3,
    "successResults": [
      {
        "id": "my-dashboard",
        "type": "dashboard",
        "meta": {
          "icon": "dashboardApp",
          "title": "Look at my dashboard"
        }
      },
      {
        "id": "my-vis",
        "type": "visualization",
        "meta": {
          "icon": "visualizeApp",
          "title": "Look at my visualization"
        }
      },
      {
        "id": "my-index-pattern",
        "type": "index-pattern",
        "meta": {
          "icon": "indexPatternApp",
          "title": "my-pattern-*"
        }
      }
    ]
  }
}

结果表明复制成功,所有三个对象都已创建。

复制失败(存在冲突错误)编辑

将具有 my-dashboard ID 的仪表板(包括所有引用)从 default 空间复制到 marketingsales 空间。在此示例中,仪表板引用了一个可视化和一个 Canvas 工作区,而可视化引用了一个索引模式

$ curl -X POST api/spaces/_copy_saved_objects
{
  "objects": [{
    "type": "dashboard",
    "id": "my-dashboard"
  }],
  "spaces": ["marketing", "sales"],
  "includeReferences": true,
  "createNewCopies": false
}

API 返回以下内容

{
  "marketing": {
    "success": true,
    "successCount": 4,
    "successResults": [
      {
        "id": "my-dashboard",
        "type": "dashboard",
        "meta": {
          "icon": "dashboardApp",
          "title": "Look at my dashboard"
        }
      },
      {
        "id": "my-vis",
        "type": "visualization",
        "meta": {
          "icon": "visualizeApp",
          "title": "Look at my visualization"
        }
      },
      {
        "id": "my-canvas",
        "type": "canvas-workpad",
        "meta": {
          "icon": "canvasApp",
          "title": "Look at my canvas"
        }
      },
      {
        "id": "my-index-pattern",
        "type": "index-pattern",
        "meta": {
          "icon": "indexPatternApp",
          "title": "my-pattern-*"
        }
      }
    ]
  },
  "sales": {
    "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"
        }
      }
    ]
  }
}

结果表明 marketing 空间的复制成功,而 sales 空间的复制失败,因为数据视图、可视化和 Canvas 工作区都导致了冲突错误

  • 具有相同 ID 的数据视图已存在,这导致了冲突错误。要解决此错误,请覆盖现有对象或跳过该对象。
  • 具有不同 ID 但相同来源的可视化已存在,这导致了冲突错误。 destinationId 字段包含导致冲突的另一个可视化的 id。添加此行为是为了确保可以在空间之间共享的新对象的行为与旧的不可共享对象类似。当可共享对象被复制到新空间时,它会保留其来源,以便按预期遇到冲突。要解决此问题,请覆盖指定的目标对象或跳过该对象。
  • 两个具有不同 ID 但相同来源的 Canvas 工作区已存在,这导致了冲突错误。 destinations 数组描述了导致冲突的其他工作区。当可共享对象被复制到新空间,然后共享到另一个存在相同来源对象的空格时,就会发生冲突错误。要解决此问题,请选择要覆盖的目标对象或跳过该对象。

当使用 解决复制冲突 API 解决错误时,将创建对象。

复制失败(存在缺少引用错误)编辑

复制一个 ID 为 my-dashboard 的仪表盘,包括从 default 空间到 marketing 空间的所有引用。在这个例子中,仪表盘引用了一个可视化和一个 画布 工作簿,而可视化引用了一个数据视图。

$ curl -X POST api/spaces/_copy_saved_objects
{
  "objects": [{
    "type": "dashboard",
    "id": "my-dashboard"
  }],
  "spaces": ["marketing"],
  "includeReferences": true,
  "createNewCopies": false
}

API 返回以下内容

{
  "marketing": {
    "success": false,
    "successCount": 2,
    "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"
        }
      },
    ]
    "successResults": [
      {
        "id": "my-dashboard",
        "type": "dashboard",
        "meta": {
          "icon": "dashboardApp",
          "title": "Look at my dashboard"
        }
      },
      {
        "id": "my-canvas",
        "type": "canvas-workpad",
        "meta": {
          "icon": "canvasApp",
          "title": "Look at my canvas"
        }
      }
    ],
  }
}

结果表明复制失败,因为可视化导致了引用丢失错误。

使用 解决复制冲突 API 解决错误后,将创建对象。