alicloud/service_alicloud_adb.go (975 lines of code) (raw):

package alicloud import ( "fmt" "log" "regexp" "strings" "time" "github.com/PaesslerAG/jsonpath" util "github.com/alibabacloud-go/tea-utils/service" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/adb" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) type AdbService struct { client *connectivity.AliyunClient } func (s *AdbService) DescribeAdbCluster(id string) (instance *adb.DBClusterInDescribeDBClusters, err error) { request := adb.CreateDescribeDBClustersRequest() request.RegionId = s.client.RegionId dbClusterIds := []string{} dbClusterIds = append(dbClusterIds, id) request.DBClusterIds = id raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeDBClusters(request) }) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return nil, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*adb.DescribeDBClustersResponse) if len(response.Items.DBCluster) < 1 { return nil, WrapErrorf(NotFoundErr("Cluster", id), NotFoundMsg, ProviderERROR) } return &response.Items.DBCluster[0], nil } func (s *AdbService) DescribeAdbClusterAttribute(id string) (instance *adb.DBCluster, err error) { request := adb.CreateDescribeDBClusterAttributeRequest() request.RegionId = s.client.RegionId request.DBClusterId = id raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeDBClusterAttribute(request) }) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return instance, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return instance, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*adb.DescribeDBClusterAttributeResponse) if len(response.Items.DBCluster) < 1 { return nil, WrapErrorf(NotFoundErr("Cluster", id), NotFoundMsg, ProviderERROR) } return &response.Items.DBCluster[0], nil } func (s *AdbService) DescribeAdbAutoRenewAttribute(id string) (instance *adb.AutoRenewAttribute, err error) { request := adb.CreateDescribeAutoRenewAttributeRequest() request.RegionId = s.client.RegionId request.DBClusterIds = id raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeAutoRenewAttribute(request) }) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return instance, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return instance, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*adb.DescribeAutoRenewAttributeResponse) if len(response.Items.AutoRenewAttribute) < 1 { return nil, WrapErrorf(NotFoundErr("Cluster", id), NotFoundMsg, ProviderERROR) } return &response.Items.AutoRenewAttribute[0], nil } func (s *AdbService) WaitForAdbConnection(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeAdbConnection(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if status != Deleted && object != nil && object.ConnectionString != "" { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.ConnectionString, id, ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } } func (s *AdbService) DescribeAdbConnection(id string) (*adb.Address, error) { parts, err := ParseResourceId(id, 2) if err != nil { return nil, WrapError(err) } deadline := time.Now().Add(time.Duration(DefaultIntervalLong) * time.Second) for { object, err := s.DescribeAdbClusterNetInfo(parts[0]) if err != nil { if NotFoundError(err) { return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return nil, WrapError(err) } if object != nil { for _, p := range object { if p.NetType == "Public" { return &p, nil } } } time.Sleep(DefaultIntervalMini * time.Second) if time.Now().After(deadline) { break } } return nil, WrapErrorf(NotFoundErr("DBConnection", id), NotFoundMsg, ProviderERROR) } func (s *AdbService) DescribeAdbClusterNetInfo(id string) ([]adb.Address, error) { request := adb.CreateDescribeDBClusterNetInfoRequest() request.RegionId = s.client.RegionId request.DBClusterId = id raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeDBClusterNetInfo(request) }) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return nil, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*adb.DescribeDBClusterNetInfoResponse) if len(response.Items.Address) < 1 { return nil, WrapErrorf(NotFoundErr("DBInstanceNetInfo", id), NotFoundMsg, ProviderERROR) } return response.Items.Address, nil } func (s *AdbService) WaitForAdbAccount(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeAdbAccount(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object != nil && object.AccountStatus == string(status) { break } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.AccountStatus, status, ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *AdbService) DescribeAdbAccount(id string) (ds *adb.DBAccount, err error) { parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := adb.CreateDescribeAccountsRequest() request.RegionId = s.client.RegionId request.DBClusterId = parts[0] request.AccountName = parts[1] invoker := NewInvoker() invoker.AddCatcher(DBInstanceStatusCatcher) var response *adb.DescribeAccountsResponse if err := invoker.Run(func() error { raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeAccounts(request) }) if err != nil { return err } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ = raw.(*adb.DescribeAccountsResponse) return nil }); err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return nil, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } if len(response.AccountList.DBAccount) < 1 { return nil, WrapErrorf(NotFoundErr("DBAccount", id), NotFoundMsg, ProviderERROR) } return &response.AccountList.DBAccount[0], nil } // WaitForInstance waits for instance to given status func (s *AdbService) WaitForAdbInstance(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeAdbCluster(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if strings.ToLower(object.DBClusterStatus) == strings.ToLower(string(status)) { break } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.DBClusterStatus, status, ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *AdbService) setClusterTags(d *schema.ResourceData) error { if d.HasChange("tags") { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) n := nraw.(map[string]interface{}) create, remove := s.diffTags(s.tagsFromMap(o), s.tagsFromMap(n)) if len(remove) > 0 { var tagKey []string for _, v := range remove { tagKey = append(tagKey, v.Key) } request := adb.CreateUntagResourcesRequest() request.ResourceId = &[]string{d.Id()} request.ResourceType = "cluster" request.TagKey = &tagKey request.RegionId = s.client.RegionId raw, err := s.client.WithAdbClient(func(client *adb.Client) (interface{}, error) { return client.UntagResources(request) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) } if len(create) > 0 { request := adb.CreateTagResourcesRequest() request.ResourceId = &[]string{d.Id()} request.Tag = &create request.ResourceType = "cluster" request.RegionId = s.client.RegionId raw, err := s.client.WithAdbClient(func(client *adb.Client) (interface{}, error) { return client.TagResources(request) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) } d.SetPartial("tags") } return nil } func (s *AdbService) diffTags(oldTags, newTags []adb.TagResourcesTag) ([]adb.TagResourcesTag, []adb.TagResourcesTag) { // First, we're creating everything we have create := make(map[string]interface{}) for _, t := range newTags { create[t.Key] = t.Value } // Build the list of what to remove var remove []adb.TagResourcesTag for _, t := range oldTags { old, ok := create[t.Key] if !ok || old != t.Value { // Delete it! remove = append(remove, t) } } return s.tagsFromMap(create), remove } func (s *AdbService) tagsToMap(tags []adb.TagResource) map[string]string { result := make(map[string]string) for _, t := range tags { if !s.ignoreTag(t) { result[t.TagKey] = t.TagValue } } return result } func (s *AdbService) tagsFromMap(m map[string]interface{}) []adb.TagResourcesTag { result := make([]adb.TagResourcesTag, 0, len(m)) for k, v := range m { result = append(result, adb.TagResourcesTag{ Key: k, Value: v.(string), }) } return result } func (s *AdbService) ignoreTag(t adb.TagResource) bool { filter := []string{"^aliyun", "^acs:", "^http://", "^https://"} for _, v := range filter { log.Printf("[DEBUG] Matching prefix %v with %v\n", v, t.TagKey) ok, _ := regexp.MatchString(v, t.TagValue) if ok { log.Printf("[DEBUG] Found Alibaba Cloud specific t %s (val: %s), ignoring.\n", t.TagKey, t.TagValue) return true } } return false } func (s *AdbService) DescribeTags(resourceId string, resourceType TagResourceType) (tags []adb.TagResource, err error) { request := adb.CreateListTagResourcesRequest() request.RegionId = s.client.RegionId request.ResourceType = string(resourceType) request.ResourceId = &[]string{resourceId} raw, err := s.client.WithAdbClient(func(client *adb.Client) (interface{}, error) { return client.ListTagResources(request) }) if err != nil { err = WrapErrorf(err, DefaultErrorMsg, resourceId, request.GetActionName(), AlibabaCloudSdkGoERROR) return } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*adb.ListTagResourcesResponse) return response.TagResources.TagResource, nil } // WaitForCluster waits for cluster to given status func (s *AdbService) WaitForCluster(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeAdbClusterAttribute(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if strings.ToLower(object.DBClusterStatus) == strings.ToLower(string(status)) { break } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.DBClusterStatus, status, ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *AdbService) DescribeDBSecurityIps(clusterId string) (ips []string, err error) { request := adb.CreateDescribeDBClusterAccessWhiteListRequest() request.RegionId = s.client.RegionId request.DBClusterId = clusterId raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeDBClusterAccessWhiteList(request) }) if err != nil { return ips, WrapErrorf(err, DefaultErrorMsg, clusterId, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) resp, _ := raw.(*adb.DescribeDBClusterAccessWhiteListResponse) var ipstr, separator string ipsMap := make(map[string]string) for _, ip := range resp.Items.IPArray { if ip.DBClusterIPArrayAttribute != "hidden" { ipstr += separator + ip.SecurityIPList separator = COMMA_SEPARATED } } for _, ip := range strings.Split(ipstr, COMMA_SEPARATED) { ipsMap[ip] = ip } var finalIps []string if len(ipsMap) > 0 { for key := range ipsMap { finalIps = append(finalIps, key) } } return finalIps, nil } func (s *AdbService) ModifyDBSecurityIps(clusterId, ips string) error { request := adb.CreateModifyDBClusterAccessWhiteListRequest() request.RegionId = s.client.RegionId request.DBClusterId = clusterId request.SecurityIps = ips raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.ModifyDBClusterAccessWhiteList(request) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, clusterId, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if err := s.WaitForCluster(clusterId, Running, DefaultTimeoutMedium); err != nil { return WrapError(err) } return nil } func (s *AdbService) DescribeAdbBackupPolicy(id string) (policy *adb.DescribeBackupPolicyResponse, err error) { request := adb.CreateDescribeBackupPolicyRequest() request.DBClusterId = id request.RegionId = s.client.RegionId raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeBackupPolicy(request) }) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return policy, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return raw.(*adb.DescribeBackupPolicyResponse), nil } func (s *AdbService) ModifyAdbBackupPolicy(clusterId, backupTime, backupPeriod string) error { request := adb.CreateModifyBackupPolicyRequest() request.RegionId = s.client.RegionId request.DBClusterId = clusterId request.PreferredBackupPeriod = backupPeriod request.PreferredBackupTime = backupTime raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.ModifyBackupPolicy(request) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, clusterId, request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if err := s.WaitForCluster(clusterId, Running, DefaultTimeoutMedium); err != nil { return WrapError(err) } return nil } func (s *AdbService) AdbClusterStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAdbClusterAttribute(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if object.DBClusterStatus == failState { return object, object.DBClusterStatus, WrapError(Error(FailedToReachTargetStatus, object.DBClusterStatus)) } } return object, object.DBClusterStatus, nil } } func (s *AdbService) DescribeTask(id, taskId string) (*adb.DescribeTaskInfoResponse, error) { request := adb.CreateDescribeTaskInfoRequest() request.RegionId = s.client.RegionId request.DBClusterId = id request.TaskId = requests.Integer(taskId) var response *adb.DescribeTaskInfoResponse wait := incrementalWait(2*time.Second, 1*time.Second) err := resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) { return adbClient.DescribeTaskInfo(request) }) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ = raw.(*adb.DescribeTaskInfoResponse) return nil }) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return nil, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) } return response, nil } func (s *AdbService) AdbTaskStateRefreshFunc(id, taskId string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeTask(id, taskId) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } return object, object.TaskInfo.Status, nil } } func (s *AdbService) DescribeAutoRenewAttribute(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeAutoRenewAttribute" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterIds": id, } runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, true) if err != nil { err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) return } addDebug(action, response, request) v, err := jsonpath.Get("$.Items.AutoRenewAttribute", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.AutoRenewAttribute", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } else { if v.([]interface{})[0].(map[string]interface{})["DBClusterId"].(string) != id { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } } object = v.([]interface{})[0].(map[string]interface{}) return object, nil } func (s *AdbService) DescribeDBClusterAccessWhiteList(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBClusterAccessWhiteList" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, true) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound"}) { err = WrapErrorf(NotFoundErr("AnalyticdbForMysql3.0DbCluster", id), NotFoundMsg, ProviderERROR) return object, err } err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) return object, err } addDebug(action, response, request) v, err := jsonpath.Get("$.Items.IPArray", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.IPArray", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } else { ipList := "" for _, item := range v.([]interface{}) { if item.(map[string]interface{})["DBClusterIPArrayAttribute"] == "hidden" { continue } ipList += item.(map[string]interface{})["SecurityIPList"].(string) + "," } v.([]interface{})[0].(map[string]interface{})["SecurityIPList"] = strings.TrimSuffix(ipList, ",") } object = v.([]interface{})[0].(map[string]interface{}) return object, nil } func (s *AdbService) SetResourceTags(d *schema.ResourceData, resourceType string) error { var response map[string]interface{} var err error if d.HasChange("tags") { added, removed := parsingTags(d) removedTagKeys := make([]string, 0) for _, v := range removed { if !ignoredTags(v, "") { removedTagKeys = append(removedTagKeys, v) } } if len(removedTagKeys) > 0 { action := "UntagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": d.Id(), } for i, key := range removedTagKeys { request[fmt.Sprintf("TagKey.%d", i+1)] = key } wait := incrementalWait(2*time.Second, 1*time.Second) err = resource.Retry(10*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } if len(added) > 0 { action := "TagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": d.Id(), } count := 1 for key, value := range added { request[fmt.Sprintf("Tag.%d.Key", count)] = key request[fmt.Sprintf("Tag.%d.Value", count)] = value count++ } wait := incrementalWait(2*time.Second, 1*time.Second) err = resource.Retry(10*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } d.SetPartial("tags") } return nil } func (s *AdbService) DescribeAdbDbCluster(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBClusterAttribute" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, true) if err != nil { if IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound", "InvalidDBClusterId.NotFoundError"}) { err = WrapErrorf(NotFoundErr("AdbDbCluster", id), NotFoundMsg, ProviderERROR) return object, err } err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) return object, err } addDebug(action, response, request) v, err := jsonpath.Get("$.Items.DBCluster", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBCluster", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } else { if v.([]interface{})[0].(map[string]interface{})["DBClusterId"].(string) != id { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } } object = v.([]interface{})[0].(map[string]interface{}) return object, nil } func (s *AdbService) DescribeDBClusters(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBClusters" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterIds": id, } response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, true) if err != nil { err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) return } addDebug(action, response, request) v, err := jsonpath.Get("$.Items.DBCluster", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBCluster", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } else { if v.([]interface{})[0].(map[string]interface{})["DBClusterId"].(string) != id { return object, WrapErrorf(NotFoundErr("AnalyticDBForMySQL3.0", id), NotFoundWithResponse, response) } } object = v.([]interface{})[0].(map[string]interface{}) return object, nil } func (s *AdbService) AdbDbClusterStateRefreshFunc(id string, stateField string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAdbDbCluster(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if object[stateField].(string) == failState { return object, object[stateField].(string), WrapError(Error(FailedToReachTargetStatus, object[stateField].(string))) } } return object, object[stateField].(string), nil } } func (s *AdbService) DescribeAdbDbClusterLakeVersion(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBClusterAttribute" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } idExist := false runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2021-12-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 { if IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound", "InvalidDBClusterId.NotFound"}) { return object, WrapErrorf(NotFoundErr("Adb:DbClusterLakeVersion", id), NotFoundWithResponse, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.Items.DBCluster", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBCluster", response) } if v, ok := resp.([]interface{}); !ok || len(v) < 1 { return object, WrapErrorf(NotFoundErr("Adb:DbClusterLakeVersion", id), NotFoundWithResponse, response) } for _, v := range resp.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["DBClusterId"]) == id { idExist = true return v.(map[string]interface{}), nil } } if !idExist { return object, WrapErrorf(NotFoundErr("Adb:DbClusterLakeVersion", id), NotFoundWithResponse, response) } return object, nil } func (s *AdbService) AdbDbClusterLakeVersionStateRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAdbDbClusterLakeVersion(d.Id()) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["DBClusterStatus"]) == failState { return object, fmt.Sprint(object["DBClusterStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["DBClusterStatus"]))) } } return object, fmt.Sprint(object["DBClusterStatus"]), nil } } func (s *AdbService) DescribeClusterAccessWhiteList(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeClusterAccessWhiteList" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2021-12-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 { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return object, WrapErrorf(NotFoundErr("DBClusterLakeVersion", id), NotFoundWithResponse, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.Items.IPArray", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.IPArray", response) } if v, ok := resp.([]interface{}); !ok || len(v) < 1 { return object, WrapErrorf(NotFoundErr("DBClusterLakeVersion", id), NotFoundWithResponse, response) } object = resp.([]interface{})[0].(map[string]interface{}) return object, nil } func (s *AdbService) DescribeAdbResourceGroup(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBResourceGroup" parts, err := ParseResourceId(id, 2) if err != nil { return object, WrapError(err) } request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": parts[0], "GroupName": parts[1], } idExist := false runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2019-03-15", 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 { if IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound", "InvalidDBClusterId.NotFound"}) { return object, WrapErrorf(NotFoundErr("Adb:ResourceGroup", id), NotFoundWithResponse, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.GroupsInfo", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.GroupsInfo", response) } if v, ok := resp.([]interface{}); !ok || len(v) < 1 { return object, WrapErrorf(NotFoundErr("Adb:ResourceGroup", id), NotFoundWithResponse, response) } for _, v := range resp.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["GroupName"]) == strings.ToUpper(parts[1]) { idExist = true return v.(map[string]interface{}), nil } } if !idExist { return object, WrapErrorf(NotFoundErr("Adb:ResourceGroup", id), NotFoundWithResponse, response) } return object, nil } func (s *AdbService) DescribeAdbDbClusterSSL(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBClusterSSL" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(10*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2019-03-15", action, nil, request, true) if err != nil { if IsExpectedErrors(err, []string{"ADBVersionNotSupport"}) || 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("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AdbService) DescribeAdbDbClusterKernelVersion(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeKernelVersion" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(10*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2019-03-15", 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AdbService) DescribeAdbDbClusterLakeVersionDBClusterSSL(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "DescribeDBClusterSSL" request := map[string]interface{}{ "RegionId": s.client.RegionId, "DBClusterId": id, } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = s.client.RpcPost("adb", "2021-12-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 { if IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) { return object, WrapErrorf(NotFoundErr("DBClusterLakeVersion", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AdbService) AdbDbClusterLakeVersionDBClusterSSLStateRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAdbDbClusterLakeVersionDBClusterSSL(d.Id()) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["SSLEnabled"]) == failState { return object, fmt.Sprint(object["SSLEnabled"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["SSLEnabled"]))) } } return object, fmt.Sprint(object["SSLEnabled"]), nil } }