更新时间:2024-11-04 GMT+08:00

获取执行计划

功能介绍

获取执行计划(GetExecutionPlan)

此API用于获取指定执行计划的详细内容(即执行计划项目),用户可通过此API得知指定执行计划在执行后,资源栈中的资源会发生何种变化

如果执行计划状态为CREATION_IN_PROGRESSCREATION_FAILED,则不返回执行计划项目列表

URI

GET /v1/{project_id}/stacks/{stack_name}/execution-plans/{execution_plan_name}

表1 路径参数

参数

是否必选

参数类型

描述

project_id

String

项目ID,可以从调用API处获取,也可以从控制台获取。

项目ID获取方式

stack_name

String

资源栈的名称。此名字在domain_id+区域+project_id下应唯一,可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文,区分大小写。

execution_plan_name

String

执行计划的名称。此名字在domain_id+区域+project_id+stack_id下应唯一,可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文,区分大小写。

表2 Query参数

参数

是否必选

参数类型

描述

stack_id

String

资源栈(stack)的唯一Id。

此Id由资源编排服务在生成资源栈的时候生成,为UUID。

由于资源栈名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的资源栈,删除,再重新创建一个同名资源栈。

对于团队并行开发,用户可能希望确保,当前我操作的资源栈就是我认为的那个,而不是其他队友删除后创建的同名资源栈。因此,使用ID就可以做到强匹配。

资源编排服务保证每次创建的资源栈所对应的ID都不相同,更新不会影响ID。如果给予的stack_id和当前资源栈的ID不一致,则返回400

execution_plan_id

String

执行计划(execution_plan)的唯一Id。

此Id由资源编排服务在生成执行计划的时候生成,为UUID。

由于执行计划名仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的执行计划,删除,再重新创建一个同名执行计划。

对于团队并行开发,用户可能希望确保,当前我操作的执行计划就是我认为的那个,而不是其他队友删除后创建的同名执行计划。因此,使用ID就可以做到强匹配。

资源编排服务保证每次创建的执行计划所对应的ID都不相同,更新不会影响ID。如果给予的execution_plan_id和当前执行计划的ID不一致,则返回400

请求参数

表3 请求Header参数

参数

是否必选

参数类型

描述

Client-Request-Id

String

用户指定的,对于此请求的唯一ID,用于定位某个请求,推荐使用UUID

响应参数

状态码: 200

表4 响应Body参数

参数

参数类型

描述

execution_plan_items

Array of ExecutionPlanItem objects

执行计划项目的列表

表5 ExecutionPlanItem

参数

参数类型

描述

resource_type

String

资源的类型

以HCL格式的模板为例,resource_type 为 huaweicloud_vpc

resource "huaweicloud_vpc" "my_hello_world_vpc" {
  name = "test_vpc"
}

以json格式的模板为例,resource_type 为 huaweicloud_vpc

{
  "resource": {
    "huaweicloud_vpc": {
      "my_hello_world_vpc": {
        "name": "test_vpc"
      }
    }
  }
}

resource_name

String

资源的名称,默认为资源的逻辑名称

以HCL格式的模板为例,resource_name 为 my_hello_world_vpc

resource "huaweicloud_vpc" "my_hello_world_vpc" {
  name = "test_vpc"
}

以json格式的模板为例,resource_name 为 my_hello_world_vpc

{
  "resource": {
    "huaweicloud_vpc": {
      "my_hello_world_vpc": {
        "name": "test_vpc"
      }
    }
  }
}

index

String

资源的索引,如果用户在模板中使用了count或for_each则会返回index。如果index出现,则resource_name + index可以作为该资源的一种标识

如果用户在模板中使用count,则index为从0开始的数字

以HCL格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc[0]huaweicloud_vpc.my_hello_world_vpc[1]标识两个资源

resource "huaweicloud_vpc" "my_hello_world_vpc" {
  count = 2
  name = "test_vpc"
}

以json格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc[0]huaweicloud_vpc.my_hello_world_vpc[1]标识两个资源

{
  "resource": {
    "huaweicloud_vpc": {
      "my_hello_world_vpc": {
        "name": "test_vpc",
        "count": 2
      }
    }
  }
}

如果用户在模板中使用for_each,则index为用户自定义的字符串

以HCL格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc["vpc1"]huaweicloud_vpc.my_hello_world_vpc["vpc2"]标识两个资源

resource "huaweicloud_vpc" "my_hello_world_vpc" {
  for_each = {
    "vpc1" = "test_vpc"
    "vpc2" = "test_vpc"
  }
  name = each.value
}

以json格式的模板为例,用户在模板中可以通过huaweicloud_vpc.my_hello_world_vpc["vpc1"]huaweicloud_vpc.my_hello_world_vpc["vpc2"]标识两个资源

{
  "resource": {
    "huaweicloud_vpc": {
      "my_hello_world_vpc": {
        "for_each": {
          "vpc1": "test_vpc",
          "vpc2": "test_vpc"
        }
        "name": "${each.value}"
      }
    }
  }
}

action

String

资源变更的类型

  • ADD - 新增资源

  • ADD_THEN_DELETE - 由不可更新的资源返回,先创建新资源,再删除旧资源

  • DELETE - 删除资源

  • DELETE_THEN_ADD - 由不可更新的资源返回,先删除旧资源,再创建新资源

  • UPDATE - 更新资源

  • NO_OPERATION - 仅变更资源的依赖关系,但是对资源本身并无修改的操作

action_reason

String

触发该项目变更的原因,例如用户更新模板;远端删除资源等等

provider_name

String

该项目所属的provider名称。

mode

String

资源模式

  • DATA - 指可以在模板解析期间运行和获取服务端数据的资源类型,不会操作基础设施组件

  • RESOURCE - 指通过模板管理的由服务定义的基础设施组件抽象,可以是物理资源也可以是逻辑资源

drifted

Boolean

当前资源的变更是否由偏差导致。

偏差,也叫漂移。指的是资源被资源编排服务创建以后,又经历过非资源编排服务触发的修改,如手动修改、调用SDK修改等,使得资源的配置与本服务所记录的资源的配置不一致。这种不一致便称为偏差。

当资源产生偏差以后:

  • 如果用户试图创建执行计划,则会提示用户产生偏差

  • 如果用户直接部署,则偏差有可能被覆盖,资源编排服务只保证资源和模板最终一致。

资源的偏差有两种类型:

  • 资源定位属性被修改:如果是定位属性被修改,常见于删除后重建,此时资源已经不属于同一个资源。资源编排服务会认为此资源已经被删除,会尝试创建一个新的资源。

  • 资源普通属性被修改:如果是普通属性被修改,则资源编排服务依然可以找到资源,但是下次部署会尝试修复偏差,即将资源保持和模板最终一致。

注:资源编排服务团队极力推荐,如果资源是通过本服务创建的,请一直使用本服务进行维护和更新以确保资源和模板保持一致。建议非紧急事件以外的情况不要手动调整。

imported

Boolean

当前资源的变更是否是导入的。

resource_id

String

资源的物理id,是唯一id,由为该资源提供服务的provider、云服务或其他服务提供方在资源部署的时候生成

attributes

Array of ExecutionPlanDiffAttribute objects

执行计划项目中变更的属性,当无属性变更时为空列表。

表6 ExecutionPlanDiffAttribute

参数

参数类型

描述

name

String

当前资源将要被修改的参数的名字。

previous_value

String

当前资源被修改的参数的原始值。

如果是资源创建的场景,则previous_value为空

如果远端资源产生了偏差,则同一个资源会返回两个ExecutionPlanItem,其中一个的drifted为true,另一个的drifted为false

  • drifted为true的previous_value为资源栈中所维持的资源属性和状态

  • drifted为false的previous_value为provider请求远端资源后,远端资源所返回的资源属性和状态

如果远端资源未产生偏差,则只会返回一个drifted为false的ExecutionPlanItem

  • drifted为false的previous_value为资源栈中所维持的资源属性和状态

target_value

String

当前资源被修改的参数的目的值。

如果是资源删除的场景,则target_value为空

如果远端资源产生了偏差,则同一个资源会返回两个ExecutionPlanItem,其中一个的drifted为true,另一个的drifted为false

  • drifted为true的target_value为provider请求远端资源后,远端资源所返回的资源属性和状态

  • drifted为false的target_value为基于用户模板更新的资源属性和状态

如果远端资源未产生偏差,则只会返回一个drifted为false的ExecutionPlanItem

  • drifted为false的target_value为基于用户模板更新的资源属性和状态

状态码: 400

表7 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表8 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 401

表9 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表10 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 403

表11 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表12 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 404

表13 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表14 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 429

表15 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表16 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 500

表17 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表18 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

请求示例

  • 获取指定执行计划的详细内容(即执行计划项目)

    GET https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan
  • 获取指定执行计划的详细内容(即执行计划项目),并提供资源栈id和执行计划id以校验是否与当前资源栈和执行计划匹配

    GET https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans/my_first_execution_plan?stack_id=ea6a4f0e-ee8a-494e-b12a-8be4a1e65af2&execution_plan_id=fb5e781e-a27d-46e2-9954-242753857a9f

响应示例

状态码: 200

获取成功

{
  "execution_plan_items" : [ {
    "resource_type" : "huaweicloud_iec_vpc_subnet",
    "resource_name" : "subnet",
    "action" : "ADD",
    "attributes" : [ {
      "name" : "cidr",
      "target_value" : "172.16.0.0/16"
    }, {
      "name" : "dhcp_enable",
      "target_value" : "true"
    }, {
      "name" : "dns_list",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "gateway_ip",
      "target_value" : "192.168.128.1"
    }, {
      "name" : "id",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "name",
      "target_value" : "subnet_demo"
    }, {
      "name" : "region"
    }, {
      "name" : "site_id",
      "target_value" : "mock_site_id"
    }, {
      "name" : "site_info",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "status",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "timeouts"
    }, {
      "name" : "vpc_id",
      "target_value" : "mock_vpc_id"
    } ],
    "mode" : "RESOURCE",
    "provider_name" : "huawei.com/provider/huaweicloud"
  }, {
    "resource_type" : "huaweicloud_vpc",
    "resource_name" : "vpc",
    "action" : "ADD",
    "attributes" : [ {
      "name" : "cidr",
      "target_value" : "172.16.0.0/16"
    }, {
      "name" : "description"
    }, {
      "name" : "enterprise_project_id",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "id",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "name",
      "target_value" : "test_name"
    }, {
      "name" : "region",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "routes",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "secondary_cidr"
    }, {
      "name" : "status",
      "target_value" : "(will be generated after apply)"
    }, {
      "name" : "tags"
    }, {
      "name" : "timeouts"
    } ],
    "mode" : "RESOURCE",
    "provider_name" : "huawei.com/provider/huaweicloud"
  } ]
}

状态码

状态码

描述

200

获取成功

400

用户请求非法

401

用户身份认证失败

403

用户无权限调用此API

404

  1. 资源栈不存在

  2. 执行计划不存在

429

请求数量过多

500

服务器内部错误