
# 创建执行计划
#### 功能介绍
创建执行计划（CreateExecutionPlan）
此API用于在指定的资源栈下生成一个执行计划，执行计划描述了当前资源栈中记录的资源状态和模板描述的目的资源状态之间的区别（如，资源A将以以下配置文件生成，资源B将以下参数从XXX修改成YYY）
调用此API触发创建执行计划之后，可以通过GetExecutionPlanMetadata来跟踪执行计划的状态
当执行计划状态为*AVAILABLE*时，可以通过GetExecutionPlan获取本次执行计划的结果
执行计划不会做过多深层的检查和校验，如用户是否有权限生成、修改资源等
**注意：**
- 创建执行计划时，指定的资源栈必须存在。如果指定的资源栈不存在，则返回404，用户可通过调用创建资源栈（CreateStack）API来创建资源栈。
  
- 如果请求中不含有template_body，template_uri或private_template，则返回400
  
- 如果资源栈进行了某次部署操作，则在该次部署操作前生成的执行计划将全部失效
  
- 执行计划只代表生成时刻的结果，如果执行计划生成后，用户手动修改资源状态，则执行计划不会自动更新
  
- 如果资源栈状态处于*DEPLOYMENT_IN_PROGRESS* 、*ROLLBACK_IN_PROGRESS* 、*DELETION_IN_PROGRESS*等状态时，则不允许创建执行计划，并返回403
  
- 若指定 encrypt_kms_key_id 启用模板加密功能，请确保资源栈委托角色（如已配置）或当前账号身份拥有该主密钥的 kms:dek:create（创建数据密钥） 和 kms:dek:decrypt（解密数据密钥） 访问权限。
  
 
#### 调试
您可以在[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/AOS/doc?api=CreateExecutionPlan)中调试该接口，支持自动认证鉴权。API Explorer可以自动生成SDK代码示例，并提供SDK代码示例调试功能。
#### URI
POST /v1/{project_id}/stacks/{stack_name}/execution-plans
表1路径参数 
| 参数         | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| project_id | 是    | String | 项目ID，可以从调用API处获取，也可以从控制台获取。 [项目ID获取方式](https://support.huaweicloud.com/api-ticket/ticket_api_20002.html) 最小长度：**3** 最大长度：**64** |
| stack_name | 是    | String | 资源栈的名称。此名字在domain_id+区域+project_id下应唯一，可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文，区分大小写。 最小长度：**1** 最大长度：**128**                                                                                                    |
   
#### 请求参数
表2请求Header参数 
| 参数                | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                    |
|:---|:---|:---|:---|
| Client-Request-Id | 是    | String | 用户指定的，对于此请求的唯一ID，用于定位某个请求，推荐使用UUID 最小长度：**36** 最大长度：**128** |
   
表3请求Body参数 
| 参数                  | 是否必选 | 参数类型                                                                                                                | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| stack_id            | 否    | String                                                                                                              | 资源栈（stack）的唯一ID。 此Id由资源编排服务在生成资源栈的时候生成，为UUID。 由于资源栈名仅仅在同一时间下唯一，即用户允许先生成一个叫HelloWorld的资源栈，删除，再重新创建一个同名资源栈。 对于团队并行开发，用户可能希望确保，当前我操作的资源栈就是我认为的那个，而不是其他队友删除后创建的同名资源栈。因此，使用ID就可以做到强匹配。 资源编排服务保证每次创建的资源栈所对应的ID都不相同，更新不会影响ID。如果给予的stack_id和当前资源栈的ID不一致，则返回400 最小长度：**36** 最大长度：**36**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| template_body       | 否    | String                                                                                                              | HCL模板，描述了资源的目标状态。资源编排服务将比较此模板与当前远程资源的状态之间的区别。 template_body，template_uri和private_template必须有且只有一个存在 在CreateStack API中，template_body，template_uri和private_template可以都不给予 **注意：** - template_body中默认不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的template_body。如为敏感信息，建议在模板中抽取变量并声明为sensitive，将敏感信息通过vars_structure参数化，并设置encryption字段开启加密    （如果变量variable在模板中被标记为sensitive，则在 GetStackMetadata 和 GetExecutionPlanMetadata 接口返回的 vars_structure、vars_uri_content、vars_body 中，该变量的值将被脱敏） 最小长度：**0** 最大长度：**51200**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| template_uri        | 否    | String                                                                                                              | HCL模板的OBS地址，该模板描述了资源的目标状态。资源编排服务将比较此模板与当前远程资源的状态之间的区别。 请确保OBS地址所在局点与使用RFS服务局点一致。 对应的文件应该是纯tf文件或zip压缩包 纯tf文件需要以.tf或者.tf.json结尾，并遵守HCL语法 压缩包目前只支持zip格式，文件需要以.zip结尾。解压后的文件不得包含.tfvars文件且必须是UTF8编码（其中.tf.json不能包含BOM头），zip压缩包当前支持的子文件数量最大为100 template_body，template_uri和private_template必须有且只有一个存在 在CreateStack API中，template_body，template_uri和private_template可以都不给予 **注意：** - template_uri对应的模板文件中默认不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的模板文件内容。如为敏感信息，建议在模板中抽取变量并声明为sensitive，将敏感信息通过vars_structure参数化，并设置encryption字段开启加密   - template_uri对应的模板文件如果为zip类型，则内部的文件或文件夹名称长度不得超过255个字节，最深路径长度不得超过2048字节，zip包大小不得超过1MB    （如果变量variable在模板中被标记为sensitive，则在 GetStackMetadata 和 GetExecutionPlanMetadata 接口返回的 vars_structure、vars_uri_content、vars_body 中，该变量的值将被脱敏） 最小长度：**0** 最大长度：**2048** |
| execution_plan_name | 是    | String                                                                                                              | 执行计划的名称。此名字在domain_id+区域+project_id+stack_id下应唯一，可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文，区分大小写。 最小长度：**1** 最大长度：**128**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| description         | 否    | String                                                                                                              | 执行计划的描述。可用于客户识别自己的执行计划。 最小长度：**0** 最大长度：**1024**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| vars_structure      | 否    | Array of [VarsStructure] objects | HCL参数结构。HCL模板支持参数传入，即，同一个模板可以给予不同的参数而达到不同的效果。 - var_structure可以允许客户提交最简单的字符串类型的参数   - 资源编排服务支持vars_structure，vars_body和vars_uri，如果以上三种方式中声明了同一个变量，将报错400   - vars_structure中的值只支持简单的字符串类型，如果需要使用其他类型，需要用户自己在HCL引用时转换，   - vars_structure最多允许100项，如果vars_structure过大，可以使用vars_uri   - 注意：vars_structure中默认不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的vars。如为敏感信息，建议设置encryption字段开启加密    或者用户可以使用vars_uri、vars_body，vars_uri和vars_body中支持HCL支持的各种类型以及复杂结构 数组长度：**0 - 100**                                                                                              |
| vars_body           | 否    | String                                                                                                              | HCL参数文件的内容。HCL模板支持参数传入，即，同一个模板可以给予不同的参数而达到不同的效果。 - vars_body使用HCL的tfvars格式，用户可以将".tfvars"中的内容提交到vars_body中。   - 资源编排服务支持vars_structure，vars_body和vars_uri，如果以上三种方式中声明了同一个变量，将报错400   - vars_body最大长度为51200字节，如果vars_body过大，可以使用vars_uri   - 如果vars中都是简单的字符串格式，可以使用var_structure   - 注意：vars_body中不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的vars。如为敏感信息，建议通过vars_structure并设置encryption字段传递    最小长度：**0** 最大长度：**51200**                                                                                                                                               |
| vars_uri            | 否    | String                                                                                                              | HCL参数文件的OBS地址。HCL模板支持参数传入，即，同一个模板可以给予不同的参数而达到不同的效果。 请确保OBS地址所在局点与使用RFS服务局点一致。 - vars_uri最大长度为2048字节，vars_uri所指向的HCL参数文件大小最大长度为1MB。   - 资源编排服务支持vars_structure，vars_body和vars_uri，如果以上三种方式中声明了同一个变量，将报错400   - vars_uri中的内容使用HCL的tfvars格式，用户可以将".tfvars"中的内容保存到文件并上传到OBS中，并将OBS pre-signed URL传递给vars_uri。   - 注意：vars_uri的内容不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的vars。如为敏感信息，建议通过vars_structure并设置encryption字段传递    最小长度：**0** 最大长度：**2048**                                                                                                                                                                                                                                                                                                                              |
| encrypt_kms_key_id  | 否    | String                                                                                                              | 用于加密模板的KMS主密钥ID，当前仅支持 AES_256 算法的密钥。设置后，RFS将使用该密钥对Terraform模板进行加密存储。请注意，使用此密钥会产生相应的KMS服务费用。重要：该密钥一旦被用于加密，请谨慎删除。若密钥被删除，将导致相关堆栈无法访问，操作风险由您自行承担。 最小长度：**36** 最大长度：**36**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| private_template    | 否    | [PrivateTemplate] object       |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   
 表4VarsStructure 
| 参数         | 是否必选 | 参数类型                                                                                                                  | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| var_key    | 是    | String                                                                                                                | 参数的名字 最小长度：**1** 最大长度：**32**                                                                                                                                                                                                                                              |
| var_value  | 是    | String                                                                                                                | 参数的值。 注意，参数需要以字符串形式存在，如果是数字，也需要以字符串形式存在，如'10'。 如果需要支持不同类型，或者复杂结构，请使用vars_uri或vars_body 最小长度：**0** 最大长度：**2048** |
| encryption | 否    | [EncryptionStructure] object | 如果用户传递的var_value是已经加密过的，可以通过声明此项以要求资源编排服务在使用前进行解密，目前暂时只支持KMS加解密                                                                                                                                                                                                                                                                                                                                                                     |
   
 表5EncryptionStructure 
| 参数  | 是否必选 | 参数类型                                                                                                    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| kms | 是    | [KmsStructure] object | 如果用户给予的var_value是经过KMS加密的，可以通过传递相关加密信息，资源编排服务在使用的时候会帮助用户进行KMS解密 更多关于KMS加密以及KMS加密的样例代码请见：[KMS加密使用场景介绍](https://support.huaweicloud.com/productdesc-dew/dew_01_0006.html) **注意：** - 请确保用户给予资源编排服务的委托中包含对指定密钥ID的操作权限   - KMS每个月有免费试用的额度，如果超过，则KMS需要收费，此费用不是资源编排服务收取，具体标准见：<https://www.huaweicloud.com/pricing.html?tab=detail#/dew>   - KMS加密只代表资源编排服务在存储和传输的时候传递的是密文，但是在stack-events中依然是明文，如果希望在log中以密文形式对待，请在模板中声明sensitive，更多关于sensitive的介绍见：<https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables>    |
   
 表6KmsStructure 
| 参数          | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| id          | 是    | String | 解密时，资源编排服务应该使用的KMS密钥的ID，通常是加密时所使用的密钥ID 最小长度：**36** 最大长度：**36** |
| cipher_text | 是    | String | 数据加密密钥所对应的密文 最小长度：**2** 最大长度：**2048**                          |
   
 表7PrivateTemplate 
| 参数               | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| template_id      | 是    | String | 私有模板（PrivateTemplate）的Id。 最小长度：**36** 最大长度：**36** |
| template_version | 是    | String | 模板版本Id，以大写V开头。 最小长度：**2** 最大长度：**11**             |
   
#### 响应参数
**状态码：202**
表8响应Body参数 
| 参数                | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|
| execution_plan_id | String | 执行计划（execution_plan）的唯一ID。 此Id由资源编排服务在生成执行计划的时候生成，为UUID。 由于执行计划名仅仅在同一时间下唯一，即用户允许先生成一个叫HelloWorld的执行计划，删除，再重新创建一个同名执行计划。 对于团队并行开发，用户可能希望确保，当前我操作的执行计划就是我认为的那个，而不是其他队友删除后创建的同名执行计划。因此，使用ID就可以做到强匹配。 资源编排服务保证每次创建的执行计划所对应的ID都不相同，更新不会影响ID。如果给予的execution_plan_id和当前执行计划的ID不一致，则返回400 **注意：** - 创建执行计划后，资源编排服务持久化请求并立即返回，客户端不等待请求最终处理完成，用户无法实时感知请求处理结果   - 资源编排服务最终会将异步部署请求排队，在服务端空闲的情况下逐个处理。用户最大等待时长为1小时    最小长度：**36** 最大长度：**36** |
   
**状态码：400**
表9响应Body参数 
| 参数                            | 参数类型                                                                                                   | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                 | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                 | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                 | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表10Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：401**
表11响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表12Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：403**
表13响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表14Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：409**
表15响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表16Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：429**
表17响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表18Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：500**
表19响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表20Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
#### 请求示例
- 使用模板的uri在指定资源栈下创建执行计划
  ```
  POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans
  {
    "execution_plan_name" : "my_first_execution_plan",
    "template_uri" : "https://my_hello_world_bucket.{region}.myhuaweicloud.com/vpc.tf"
  }
  ```
  
- 使用模板内容在指定资源栈下创建执行计划。RFS模板支持HCL语法，同时规定required_providers模块下用于声明provider路径的source字段，需按照huawei.com/provider/{provider_name}的形式拼接，例如huawei.com/provider/huaweicloud
  ```
  POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans
  {
    "execution_plan_name" : "my_second_execution_plan",
    "template_body" : "terraform {\n    required_providers {\n      huaweicloud = {\n        source = \"huawei.com/provider/huaweicloud\"\n        version = \"1.41.0\"\n        }\n    }\n}\nprovider \"huaweicloud\"{\n    insecure = true\n    cloud = \"{cloud_name}\"\n    region = \"{region}\"\n    endpoints = {\n        iam = \"{iam_endpoint}\"\n    }\n}\n\nresource \"huaweicloud_vpc\" \"vpc\" {\n  cidr = \"172.16.0.0/16\"\n  name = \"my_vpc\"\n}"
  }
  ```
  
- 使用私有模板在指定资源栈下创建执行计划
  ```
  POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/execution-plans
  {
    "execution_plan_name" : "my_third_execution_plan",
    "private_template" : {
      "template_id" : "69f8d5ea-eaa4-4a3b-a96d-bae9230e97c9",
      "template_version" : "V1"
    }
  }
  ```
  
 
#### 响应示例
**状态码：202**
请求接受，异步处理
```
{
  "execution_plan_id" : "fb5e781e-a27d-46e2-9954-242753857a9f"
}
```
#### 状态码
| 状态码 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|
| 202 | 请求接受，异步处理                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 400 | 用户请求非法                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 401 | 用户身份认证失败                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 403 | 1. 用户无权限调用此API   2. 执行计划数量达到上限    |
| 409 | 创建冲突，同名的执行计划已经存在                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 429 | 请求数量过多                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 500 | 服务器内部错误                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
