alibabacloudstack/resource_apsarastack_edas_namespace.go (166 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"log"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func resourceAlibabacloudStackEdasNamespace() *schema.Resource {
resource := &schema.Resource{
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(1 * time.Minute),
Update: schema.DefaultTimeout(1 * time.Minute),
Delete: schema.DefaultTimeout(1 * time.Minute),
},
Schema: map[string]*schema.Schema{
// FIXME: edas缺少查询接口
// "debug_enable": {
// Type: schema.TypeBool,
// Optional: true,
// Computed: true,
// },
"description": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringLenBetween(1, 128),
},
"namespace_logical_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"namespace_name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringLenBetween(1, 63),
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackEdasNamespaceCreate, resourceAlibabacloudStackEdasNamespaceRead, resourceAlibabacloudStackEdasNamespaceUpdate, resourceAlibabacloudStackEdasNamespaceDelete)
return resource
}
func resourceAlibabacloudStackEdasNamespaceCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
var response map[string]interface{}
request := make(map[string]interface{})
action := "InsertOrUpdateRegion"
var err error
// if v, ok := d.GetOkExists("debug_enable"); ok {
// request["DebugEnable"] = StringPointer(strconv.FormatBool(v.(bool)))
// }
if v, ok := d.GetOk("description"); ok {
request["Description"] = StringPointer(v.(string))
}
request["RegionTag"] = StringPointer(d.Get("namespace_logical_id").(string))
request["RegionName"] = StringPointer(d.Get("namespace_name").(string))
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
response, err = client.DoTeaRequest("POST", "Edas", "2017-08-01", action, "/pop/v5/user_region_def", nil, request, nil)
log.Printf("[DEBUG] ================= %s ================= \n%v ================= error =================\n%v", action, response, err)
if err != nil {
if errmsgs.NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
if code, ok := response["Code"]; !ok {
return resource.NonRetryableError(errmsgs.Error("No Code in body of InsertOrUpdateRegion"))
} else if v, ok := code.(string); ok && v != "200" {
return resource.NonRetryableError(errmsgs.Error(response["Message"].(string)))
} else if vv, ok := code.(json.Number); !ok {
return resource.NonRetryableError(errmsgs.Error("Unknow Code type in body of InsertOrUpdateRegion"))
} else if string(vv) != "200" {
return resource.NonRetryableError(errmsgs.Error(response["Message"].(string)))
}
return nil
})
addDebug(action, response, request)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_edas_namespace", action, errmsgs.AlibabacloudStackSdkGoERROR)
}
responseUserDefineRegionEntity := response["UserDefineRegionEntity"].(map[string]interface{})
d.SetId(fmt.Sprint(responseUserDefineRegionEntity["Id"]))
return nil
}
func resourceAlibabacloudStackEdasNamespaceRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
edasService := EdasService{client}
object, err := edasService.DescribeEdasNamespace(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
log.Printf("[DEBUG] Resource alibabacloudstack_edas_namespace edasService.DescribeEdasNamespace Failed!!! %s", err)
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
// d.Set("debug_enable", object["DebugEnable"])
d.Set("description", object["Description"])
d.Set("namespace_logical_id", object["RegionId"])
d.Set("namespace_name", object["RegionName"])
return nil
}
func resourceAlibabacloudStackEdasNamespaceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
var err error
var response map[string]interface{}
update := false
request := map[string]interface{}{
"Id": StringPointer(d.Id()),
}
request["RegionTag"] = StringPointer(d.Get("namespace_logical_id").(string))
if d.HasChange("namespace_name") {
update = true
}
request["RegionName"] = StringPointer(d.Get("namespace_name").(string))
// if v, ok := d.GetOkExists("debug_enable"); ok {
// request["DebugEnable"] = StringPointer(strconv.FormatBool(v.(bool)))
// }
// if d.HasChange("debug_enable") || d.IsNewResource() {
// update = true
// }
if v, ok := d.GetOk("description"); ok {
request["Description"] = StringPointer(v.(string))
}
if d.HasChange("description") {
update = true
}
if update {
action := "/pop/v5/user_region_def"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.DoTeaRequest("POST", "Edas", "2017-08-01", "InsertOrUpdateRegion", "/pop/v5/user_region_def", nil, request, nil)
log.Printf("[DEBUG] ================= %s ================= \n%v ================= error =================\n%v", "InsertOrUpdateRegion", response, err)
if err != nil {
if errmsgs.NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), action, errmsgs.AlibabacloudStackSdkGoERROR)
}
}
return nil
}
func resourceAlibabacloudStackEdasNamespaceDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
action := "/pop/v5/user_region_def"
var response map[string]interface{}
var err error
request := map[string]interface{}{
"Id": StringPointer(d.Id()),
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
response, err = client.DoTeaRequest("DELETE", "Edas", "2017-08-01", "DeleteUserDefineRegion", "/pop/v5/user_region_def", nil, request, nil)
log.Printf("[DEBUG] ================= %s ================= \n%v ================= error =================\n%v", "DeleteUserDefineRegion", response, err)
if err != nil {
if errmsgs.NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), action, errmsgs.AlibabacloudStackSdkGoERROR)
}
return nil
}