alicloud/service_alicloud_ddos_coo_v2.go (502 lines of code) (raw):

package alicloud import ( "encoding/json" "fmt" "strconv" "strings" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/tidwall/sjson" ) type DdosCooServiceV2 struct { client *connectivity.AliyunClient } // DescribeDdosCooPort <<< Encapsulated get interface for DdosCoo Port. func (s *DdosCooServiceV2) DescribeDdosCooPort(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} parts := strings.Split(id, ":") if len(parts) != 3 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 3, len(parts))) } action := "DescribePort" request = make(map[string]interface{}) query = make(map[string]interface{}) query["FrontendPort"] = parts[1] query["FrontendProtocol"] = parts[2] query["InstanceId"] = parts[0] wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"anycast_controller3006"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.NetworkRules[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NetworkRules[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Port", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DescribeDescribeNetworkRuleAttributes(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} parts := strings.Split(id, ":") if len(parts) != 3 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 3, len(parts))) } action := "DescribeNetworkRuleAttributes" request = make(map[string]interface{}) query = make(map[string]interface{}) jsonString := "{}" frontendPort, _ := strconv.ParseInt(parts[1], 10, 64) jsonString, _ = sjson.Set(jsonString, "NetworkRules.0.FrontendPort", frontendPort) jsonString, _ = sjson.Set(jsonString, "NetworkRules.0.Protocol", parts[2]) jsonString, _ = sjson.Set(jsonString, "NetworkRules.0.InstanceId", parts[0]) err = json.Unmarshal([]byte(jsonString), &request) if err != nil { return object, WrapError(err) } request["NetworkRules"] = convertObjectToJsonString(request["NetworkRules"]) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"anycast_controller3006"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.NetworkRuleAttributes[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NetworkRuleAttributes[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Port", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DdosCooPortStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeDdosCooPort(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeDdosCooPort >>> Encapsulated. // DescribeDdosCooDomainResource <<< Encapsulated get interface for DdosCoo DomainResource. func (s *DdosCooServiceV2) DescribeDdosCooDomainResource(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["Domain"] = id action := "DescribeDomainResource" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.WebRules[*]", response) if err != nil { return object, WrapErrorf(NotFoundErr("DomainResource", id), NotFoundMsg, response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("DomainResource", id), NotFoundMsg, response) } currentStatus := v.([]interface{})[0].(map[string]interface{})["Domain"] if currentStatus == nil { return object, WrapErrorf(NotFoundErr("DomainResource", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DescribeDomainResourceDescribeWebRules(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["Domain"] = id action := "DescribeWebRules" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.WebRules[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.WebRules[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("DomainResource", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DdosCooDomainResourceStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeDdosCooDomainResource(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeDdosCooDomainResource >>> Encapsulated. // DescribeDdosCooInstance <<< Encapsulated get interface for DdosCoo Instance. func (s *DdosCooServiceV2) DescribeDdosCooInstance(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceIds.1"] = id request["PageSize"] = PageSizeSmall request["PageNumber"] = 1 action := "DescribeInstances" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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{"InstanceNotFound"}) { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Instances[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Instances[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DescribeInstanceDescribeInstanceSpecs(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceIds.1"] = id action := "DescribeInstanceSpecs" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"InvalidInstanceId"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"InstanceNotFound", "ddos_coop3301"}) || NotFoundError(err) { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.InstanceSpecs[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.InstanceSpecs[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DescribeInstanceDescribeInstanceExt(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = id action := "DescribeInstanceExt" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.InstanceExtSpecs[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.InstanceExtSpecs[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *DdosCooServiceV2) DescribeInstanceDescribeTagResources(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceIds.1"] = id request["RegionId"] = client.RegionId request["ResourceType"] = "INSTANCE" action := "DescribeTagResources" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *DdosCooServiceV2) ModifyDdosCooInstance(schemaName string, specName string, d *schema.ResourceData) (err error) { client := s.client var response map[string]interface{} action := "ModifyInstance" request := map[string]interface{}{ "InstanceId": d.Id(), "ProductType": "ddoscoo", "ModifyType": "UPGRADE", } if v, ok := d.GetOk("product_type"); ok { request["ProductType"] = v } o, n := d.GetChange(schemaName) oi, _ := strconv.Atoi(o.(string)) ni, _ := strconv.Atoi(n.(string)) if ni < oi { request["ModifyType"] = "DOWNGRADE" } if v, ok := d.GetOk(schemaName); ok { request[specName] = v } if v, ok := d.GetOk("modify_type"); ok { request["ModifyType"] = v } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", action, nil, 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) } return nil } func (s *DdosCooServiceV2) DdosCooInstanceStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeDdosCooInstance(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeDdosCooInstance >>> Encapsulated. // SetResourceTags <<< Encapsulated tag function for DdosCoo. func (s *DdosCooServiceV2) SetResourceTags(d *schema.ResourceData, resourceType string) error { if d.HasChange("tags") { var action string var err error client := s.client var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) added, removed := parsingTags(d) removedTagKeys := make([]string, 0) for _, v := range removed { if !ignoredTags(v, "") { removedTagKeys = append(removedTagKeys, v) } } if len(removedTagKeys) > 0 { action = "DeleteTagResources" request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceIds.1"] = d.Id() request["RegionId"] = client.RegionId request["ResourceType"] = resourceType for i, key := range removedTagKeys { request[fmt.Sprintf("TagKey.%d", i+1)] = key } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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 len(added) > 0 { action = "CreateTagResources" request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceIds.1"] = d.Id() request["RegionId"] = client.RegionId request["ResourceType"] = resourceType count := 1 for key, value := range added { request[fmt.Sprintf("Tags.%d.Key", count)] = key request[fmt.Sprintf("Tags.%d.Value", count)] = value count++ } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("ddoscoo", "2020-01-01", 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) } } } return nil } // SetResourceTags >>> tag function encapsulated.