alicloud/resource_alicloud_eflo_experiment_plan.go (233 lines of code) (raw):
// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you!
package alicloud
import (
"fmt"
"log"
"time"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)
func resourceAliCloudEfloExperimentPlan() *schema.Resource {
return &schema.Resource{
Create: resourceAliCloudEfloExperimentPlanCreate,
Read: resourceAliCloudEfloExperimentPlanRead,
Update: resourceAliCloudEfloExperimentPlanUpdate,
Delete: resourceAliCloudEfloExperimentPlanDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(5 * time.Minute),
Delete: schema.DefaultTimeout(5 * time.Minute),
},
Schema: map[string]*schema.Schema{
"create_time": {
Type: schema.TypeString,
Computed: true,
},
"external_params": {
Type: schema.TypeMap,
Optional: true,
},
"plan_name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"resource_group_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"resource_id": {
Type: schema.TypeInt,
Required: true,
ForceNew: true,
},
"tags": tagsSchema(),
"template_id": {
Type: schema.TypeInt,
Required: true,
ForceNew: true,
},
},
}
}
func resourceAliCloudEfloExperimentPlanCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "CreateExperimentPlan"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
var err error
request = make(map[string]interface{})
request["RegionId"] = client.RegionId
if v, ok := d.GetOk("external_params"); ok {
request["ExternalParams"] = v
}
request["TemplateId"] = d.Get("template_id")
if v, ok := d.GetOk("resource_group_id"); ok {
request["ResourceGroupId"] = v
}
if v, ok := d.GetOk("tags"); ok {
tagsMap := ConvertTags(v.(map[string]interface{}))
request = expandTagsToMap(request, tagsMap)
}
request["ResourceId"] = d.Get("resource_id")
if v, ok := d.GetOk("plan_name"); ok {
request["PlanTemplateName"] = v
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
response, err = client.RpcPost("eflo-cnp", "2023-08-28", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_eflo_experiment_plan", action, AlibabaCloudSdkGoERROR)
}
d.SetId(fmt.Sprint(response["Data"]))
return resourceAliCloudEfloExperimentPlanRead(d, meta)
}
func resourceAliCloudEfloExperimentPlanRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
efloServiceV2 := EfloServiceV2{client}
objectRaw, err := efloServiceV2.DescribeEfloExperimentPlan(d.Id())
if err != nil {
if !d.IsNewResource() && NotFoundError(err) {
log.Printf("[DEBUG] Resource alicloud_eflo_experiment_plan DescribeEfloExperimentPlan Failed!!! %s", err)
d.SetId("")
return nil
}
return WrapError(err)
}
d.Set("create_time", objectRaw["CreateTime"])
d.Set("plan_name", objectRaw["TemplateName"])
d.Set("resource_group_id", objectRaw["ResourceGroupId"])
d.Set("resource_id", objectRaw["ResourceId"])
d.Set("template_id", objectRaw["TemplateId"])
tagsMaps := objectRaw["Tags"]
d.Set("tags", tagsToMap(tagsMaps))
return nil
}
func resourceAliCloudEfloExperimentPlanUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
update := false
d.Partial(true)
var err error
action := "ChangeResourceGroup"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ResourceId"] = d.Id()
request["RegionId"] = client.RegionId
if d.HasChange("resource_group_id") {
update = true
}
if v, ok := d.GetOk("resource_group_id"); ok {
request["ResourceGroupId"] = v
}
request["ResourceType"] = "ExperimentPlan"
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("eflo-cnp", "2023-08-28", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
efloServiceV2 := EfloServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{fmt.Sprint(d.Get("resource_group_id"))}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, efloServiceV2.EfloExperimentPlanStateRefreshFunc(d.Id(), "ResourceGroupId", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
action = "UpdateExperimentPlan"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["PlanId"] = d.Id()
request["RegionId"] = client.RegionId
if d.HasChange("plan_name") {
update = true
}
if v, ok := d.GetOk("plan_name"); ok {
request["PlanTemplateName"] = v
}
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("eflo-cnp", "2023-08-28", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
}
if d.HasChange("tags") {
efloServiceV2 := EfloServiceV2{client}
if err := efloServiceV2.SetResourceTags(d, "ExperimentPlan"); err != nil {
return WrapError(err)
}
}
d.Partial(false)
return resourceAliCloudEfloExperimentPlanRead(d, meta)
}
func resourceAliCloudEfloExperimentPlanDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "DeleteExperimentPlan"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
var err error
request = make(map[string]interface{})
request["PlanId"] = d.Id()
request["RegionId"] = client.RegionId
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
response, err = client.RpcPost("eflo-cnp", "2023-08-28", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
if IsExpectedErrors(err, []string{"NotFound"}) || NotFoundError(err) {
return nil
}
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
return nil
}