alibabacloudstack/service_apsarastack_adb.go (711 lines of code) (raw):
package alibabacloudstack
import (
"fmt"
"log"
"regexp"
"strings"
"time"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/adb"
"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"
)
type AdbService struct {
client *connectivity.AlibabacloudStackClient
}
func (s *AdbService) DescribeAdbCluster(id string) (instance *adb.DBClusterInDescribeDBClusters, err error) {
request := adb.CreateDescribeDBClustersRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterIds = id
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeDBClusters(request)
})
bresponse, ok := raw.(*adb.DescribeDBClustersResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.Items.DBCluster) < 1 {
return nil, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Cluster", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return &bresponse.Items.DBCluster[0], nil
}
func (s *AdbService) DescribeAdbClusterAttribute(id string) (instance *adb.DBCluster, err error) {
request := adb.CreateDescribeDBClusterAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = id
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeDBClusterAttribute(request)
})
bresponse, ok := raw.(*adb.DescribeDBClusterAttributeResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return instance, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return instance, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.Items.DBCluster) < 1 {
return nil, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Cluster", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return &bresponse.Items.DBCluster[0], nil
}
func (s *AdbService) DescribeAdbAutoRenewAttribute(id string) (instance *adb.AutoRenewAttribute, err error) {
request := adb.CreateDescribeAutoRenewAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterIds = id
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeAutoRenewAttribute(request)
})
bresponse, ok := raw.(*adb.DescribeAutoRenewAttributeResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return instance, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return instance, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.Items.AutoRenewAttribute) < 1 {
return nil, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Cluster", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return &bresponse.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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if status != Deleted && object != nil && object.ConnectionString != "" {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.ConnectionString, id, errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *AdbService) DoAdbDescribedbclusternetinfoRequest(id string) (*adb.Address, error) {
return s.DescribeAdbConnection(id)
}
func (s *AdbService) DescribeAdbConnection(id string) (*adb.Address, error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return nil, errmsgs.WrapError(err)
}
deadline := time.Now().Add(time.Duration(DefaultIntervalLong) * time.Second)
for {
object, err := s.DescribeAdbClusterNetInfo(parts[0])
if err != nil {
if errmsgs.NotFoundError(err) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return nil, errmsgs.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, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DBConnection", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
func (s *AdbService) DescribeAdbClusterNetInfo(id string) ([]adb.Address, error) {
request := adb.CreateDescribeDBClusterNetInfoRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = id
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeDBClusterNetInfo(request)
})
bresponse, ok := raw.(*adb.DescribeDBClusterNetInfoResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.Items.Address) < 1 {
return nil, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DBInstanceNetInfo", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return bresponse.Items.Address, nil
}
func (s *AdbService) DescribeAdbClusterNetInfo2(id string) (address adb.Address, err error) {
request := adb.CreateDescribeDBClusterNetInfoRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = id
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeDBClusterNetInfo(request)
})
bresponse, ok := raw.(*adb.DescribeDBClusterNetInfoResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return address, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return address, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.Items.Address) < 1 {
return address, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DBInstanceNetInfo", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return bresponse.Items.Address[0], 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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.AccountStatus == string(status) {
break
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.AccountStatus, status, errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
return nil
}
func (s *AdbService) DoAdbDescribeaccountsRequest(id string) (ds *adb.DBAccount, err error) {
return s.DescribeAdbAccount(id)
}
func (s *AdbService) DescribeAdbAccount(id string) (ds *adb.DBAccount, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
err = errmsgs.WrapError(err)
return
}
request := adb.CreateDescribeAccountsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = parts[0]
request.AccountName = parts[1]
invoker := NewInvoker()
invoker.AddCatcher(DBInstanceStatusCatcher)
var raw interface{}
err = invoker.Run(func() error {
raw, err = s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeAccounts(request)
})
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
bresponse, ok := raw.(*adb.DescribeAccountsResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if len(bresponse.AccountList.DBAccount) < 1 {
return nil, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DBAccount", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return &bresponse.AccountList.DBAccount[0], nil
}
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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if strings.ToLower(object.DBClusterStatus) == strings.ToLower(string(status)) {
break
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.DBClusterStatus, status, errmsgs.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()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = "cluster"
request.TagKey = &tagKey
raw, err := s.client.WithAdbClient(func(client *adb.Client) (interface{}, error) {
return client.UntagResources(request)
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
if len(create) > 0 {
request := adb.CreateTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.Tag = &create
request.ResourceType = "cluster"
raw, err := s.client.WithAdbClient(func(client *adb.Client) (interface{}, error) {
return client.TagResources(request)
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
}
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()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceType = string(resourceType)
request.ResourceId = &[]string{resourceId}
raw, err := s.client.WithAdbClient(func(client *adb.Client) (interface{}, error) {
return client.ListTagResources(request)
})
bresponse, ok := raw.(*adb.ListTagResourcesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, resourceId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse.TagResources.TagResource, nil
}
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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if strings.ToLower(object.DBClusterStatus) == strings.ToLower(string(status)) {
break
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.DBClusterStatus, status, errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
return nil
}
func (s *AdbService) DescribeDBSecurityIps(clusterId string) (ips []string, err error) {
request := adb.CreateDescribeDBClusterAccessWhiteListRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = clusterId
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeDBClusterAccessWhiteList(request)
})
resp, ok := raw.(*adb.DescribeDBClusterAccessWhiteListResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse)
}
return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, clusterId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
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()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = clusterId
request.SecurityIps = ips
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.ModifyDBClusterAccessWhiteList(request)
})
bresponse, ok := raw.(*adb.ModifyDBClusterAccessWhiteListResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, clusterId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if err := s.WaitForCluster(clusterId, Running, DefaultTimeoutMedium); err != nil {
return errmsgs.WrapError(err)
}
return nil
}
func (s *AdbService) DescribeAdbBackupPolicy(id string) (policy *adb.DescribeBackupPolicyResponse, err error) {
request := adb.CreateDescribeBackupPolicyRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = id
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeBackupPolicy(request)
})
bresponse, ok := raw.(*adb.DescribeBackupPolicyResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return policy, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse, nil
}
func (s *AdbService) ModifyAdbBackupPolicy(clusterId, backupTime, backupPeriod string) error {
request := adb.CreateModifyBackupPolicyRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = clusterId
request.PreferredBackupPeriod = backupPeriod
request.PreferredBackupTime = backupTime
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.ModifyBackupPolicy(request)
})
bresponse, ok := raw.(*adb.ModifyBackupPolicyResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, clusterId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if err := s.WaitForCluster(clusterId, Running, DefaultTimeoutMedium); err != nil {
return errmsgs.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 errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.DBClusterStatus == failState {
return object, object.DBClusterStatus, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.DBClusterStatus))
}
}
return object, object.DBClusterStatus, nil
}
}
func (s *AdbService) DescribeTask(id, taskId string) (*adb.DescribeTaskInfoResponse, error) {
request := adb.CreateDescribeTaskInfoRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBClusterId = id
request.TaskId = requests.Integer(taskId)
raw, err := s.client.WithAdbClient(func(adbClient *adb.Client) (interface{}, error) {
return adbClient.DescribeTaskInfo(request)
})
bresponse, ok := raw.(*adb.DescribeTaskInfoResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBClusterId.NotFound"}) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse, 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 errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
return object, object.TaskInfo.Status, nil
}
}
func (s *AdbService) DescribeAutoRenewAttribute(id string) (object map[string]interface{}, err error) {
request := make(map[string]interface{})
request["DBClusterIds"] = id
response, err := s.client.DoTeaRequest("POST", "ADB", "2019-03-15", "DescribeAutoRenewAttribute", "", nil, nil, request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return object, err
}
return object, err
}
v, err := jsonpath.Get("$.Items.AutoRenewAttribute", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Items.AutoRenewAttribute", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["DBClusterId"].(string) != id {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *AdbService) DescribeDBClusterAccessWhiteList(id string) (object map[string]interface{}, err error) {
request := make(map[string]interface{})
request["DBClusterId"] = id
response, err := s.client.DoTeaRequest("POST", "ADB", "2019-03-15", "DescribeDBClusterAccessWhiteList", "", nil, nil, request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticdbForMysql3.0DbCluster", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return object, err
}
return object, err
}
v, err := jsonpath.Get("$.Items.IPArray", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Items.IPArray", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.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 {
if d.HasChange("tags") {
added, removed := parsingTags(d)
if len(removed) > 0 {
request := make(map[string]interface{})
request["ResourceType"] = resourceType
request["ResourceId.1"] = d.Id()
for i, key := range removed {
request[fmt.Sprintf("TagKey.%d", i+1)] = key
}
_, err := s.client.DoTeaRequest("POST", "ADB", "2019-03-15", "UntagResources", "", nil, nil, request)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "UntagResources", errmsgs.AlibabacloudStackSdkGoERROR)
}
}
if len(added) > 0 {
request := make(map[string]interface{})
request["ResourceType"] = resourceType
request["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++
}
_, err := s.client.DoTeaRequest("POST", "ADB", "2019-03-15", "TagResources", "", nil, nil, request)
if err != nil {
return err
}
}
}
return nil
}
func (s *AdbService) DoAdbDescribebackuppolicyRequest(id string) (object map[string]interface{}, err error) {
return s.DescribeAdbDbCluster(id)
}
func (s *AdbService) DescribeAdbDbCluster(id string) (object map[string]interface{}, err error) {
request := make(map[string]interface{})
request["DBClusterId"] = id
response, err := s.client.DoTeaRequest("POST", "ADB", "2019-03-15", "DescribeDBClusterAttribute", "", nil, nil, request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBCluster.NotFound", "InvalidDBClusterId.NotFoundError"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AdbDbCluster", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return object, err
}
return object, err
}
v, err := jsonpath.Get("$.Items.DBCluster", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Items.DBCluster", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["DBClusterId"].(string) != id {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *AdbService) DescribeDBClusters(id string) (object map[string]interface{}, err error) {
request := make(map[string]interface{})
request["DBClusterIds"] = id
response, err := s.client.DoTeaRequest("POST", "ADB", "2019-03-15", "DescribeDBClusters", "", nil, nil, request)
if err != nil {
return object, err
}
addDebug("DescribeDBClusters", response, request)
v, err := jsonpath.Get("$.Items.DBCluster", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Items.DBCluster", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["DBClusterId"].(string) != id {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AnalyticDBForMySQL3.0", id)), errmsgs.NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *AdbService) AdbDbClusterStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeAdbDbCluster(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object["DBClusterStatus"].(string) == failState {
return object, object["DBClusterStatus"].(string), errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object["DBClusterStatus"].(string)))
}
}
return object, object["DBClusterStatus"].(string), nil
}
}