alicloud/service_alicloud_gpdb.go (839 lines of code) (raw):
package alicloud
import (
"fmt"
"log"
"regexp"
"strings"
"time"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/alibaba-cloud-sdk-go/services/gpdb"
"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 GpdbService struct {
client *connectivity.AliyunClient
}
func (s *GpdbService) DescribeGpdbInstance(id string) (instanceAttribute gpdb.DBInstance, err error) {
request := gpdb.CreateDescribeDBInstancesRequest()
request.RegionId = s.client.RegionId
request.DBInstanceIds = id
var response *gpdb.DescribeDBInstancesResponse
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(3*time.Minute, func() *resource.RetryError {
raw, err := s.client.WithGpdbClient(func(client *gpdb.Client) (interface{}, error) {
return client.DescribeDBInstances(request)
})
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), response, request.RpcRequest, request)
response, _ = raw.(*gpdb.DescribeDBInstancesResponse)
return nil
})
if err != nil {
// convert error code
if IsExpectedErrors(err, []string{"InvalidDBInstanceId.NotFound"}) {
err = WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR)
} else {
err = WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
return
}
if len(response.Items.DBInstance) == 0 {
return instanceAttribute, WrapErrorf(NotFoundErr("Gpdb Instance", id), NotFoundMsg, ProviderERROR)
}
return response.Items.DBInstance[0], nil
}
func (s *GpdbService) DescribeDBInstanceAttribute(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeDBInstanceAttribute"
request := map[string]interface{}{
"DBInstanceId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:DBInstance", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Items.DBInstanceAttribute", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBInstanceAttribute", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("GPDB", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["DBInstanceId"]) != id {
return object, WrapErrorf(NotFoundErr("GPDB", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *GpdbService) DescribeGpdbElasticInstance(id string) (object map[string]interface{}, err error) {
client := s.client
action := "DescribeDBInstanceOnECSAttribute"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"DBInstanceId": id,
"SourceIp": s.client.SourceIp,
}
var response map[string]interface{}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(3*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
if IsExpectedErrors(err, []string{"InvalidDBInstanceId.NotFound", ServiceUnavailable}) {
return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR)
}
return nil, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Items.DBInstanceAttribute", response)
if err != nil {
return nil, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBInstanceAttribute", response)
}
if len(v.([]interface{})) < 1 {
return nil, WrapErrorf(NotFoundErr("Gpdb elastic instance", id), NotFoundMsg, ProviderERROR)
}
return v.([]interface{})[0].(map[string]interface{}), nil
}
func (s *GpdbService) DescribeGpdbSecurityIps(id string) (ips []string, err error) {
request := gpdb.CreateDescribeDBInstanceIPArrayListRequest()
request.RegionId = s.client.RegionId
request.DBInstanceId = id
raw, err := s.client.WithGpdbClient(func(client *gpdb.Client) (interface{}, error) {
return client.DescribeDBInstanceIPArrayList(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"InvalidDBInstanceId.NotFound"}) {
err = WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR)
} else {
err = WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
return
}
response, _ := raw.(*gpdb.DescribeDBInstanceIPArrayListResponse)
addDebug(request.GetActionName(), response, request.RpcRequest, request)
var ipstr, separator string
ipsMap := make(map[string]string)
for _, ip := range response.Items.DBInstanceIPArray {
if ip.DBInstanceIPArrayAttribute == "hidden" {
continue
}
ipstr += separator + ip.SecurityIPList
separator = COMMA_SEPARATED
}
for _, ip := range strings.Split(ipstr, COMMA_SEPARATED) {
if ip == LOCAL_HOST_IP {
continue
}
ipsMap[ip] = ip
}
var finalIps []string
if len(ipsMap) > 0 {
for key := range ipsMap {
finalIps = append(finalIps, key)
}
}
return finalIps, nil
}
func (s *GpdbService) ModifyGpdbSecurityIps(id, ips string) error {
request := gpdb.CreateModifySecurityIpsRequest()
request.RegionId = s.client.RegionId
request.DBInstanceId = id
request.SecurityIPList = ips
raw, err := s.client.WithGpdbClient(func(client *gpdb.Client) (interface{}, error) {
return client.ModifySecurityIps(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
response := raw.(*gpdb.ModifySecurityIpsResponse)
addDebug(request.GetActionName(), response, request.RpcRequest, request)
return nil
}
func (s *GpdbService) DescribeGpdbConnection(id string) (*gpdb.DBInstanceNetInfo, error) {
info := &gpdb.DBInstanceNetInfo{}
parts, err := ParseResourceId(id, 2)
if err != nil {
return info, WrapError(err)
}
// Describe DB Instance Net Info
request := gpdb.CreateDescribeDBInstanceNetInfoRequest()
request.RegionId = s.client.RegionId
request.DBInstanceId = parts[0]
raw, err := s.client.WithGpdbClient(func(gpdbClient *gpdb.Client) (interface{}, error) {
return gpdbClient.DescribeDBInstanceNetInfo(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"InvalidDBInstanceId.NotFound"}) {
return info, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR)
}
return info, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*gpdb.DescribeDBInstanceNetInfoResponse)
if response.DBInstanceNetInfos.DBInstanceNetInfo != nil {
for _, o := range response.DBInstanceNetInfos.DBInstanceNetInfo {
if strings.HasPrefix(o.ConnectionString, parts[1]) {
return &o, nil
}
}
}
return info, WrapErrorf(NotFoundErr("GpdbConnection", id), NotFoundMsg, ProviderERROR)
}
func (s *GpdbService) GpdbInstanceStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeGpdbInstance(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.DBInstanceStatus == failState {
return object, object.DBInstanceStatus, WrapError(Error(FailedToReachTargetStatus, object.DBInstanceStatus))
}
}
return object, object.DBInstanceStatus, nil
}
}
func (s *GpdbService) GpdbElasticInstanceStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
instance, err := s.DescribeGpdbElasticInstance(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 instance["DBInstanceStatus"] == failState {
return instance, instance["DBInstanceStatus"].(string), WrapError(Error(FailedToReachTargetStatus, instance["DBInstanceStatus"]))
}
}
return instance, instance["DBInstanceStatus"].(string), nil
}
}
func (s *GpdbService) WaitForGpdbConnection(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeGpdbConnection(id)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
if object.ConnectionString != "" && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.ConnectionString, id, ProviderERROR)
}
}
}
func (s *GpdbService) setInstanceTags(d *schema.ResourceData) error {
oraw, nraw := d.GetChange("tags")
o := oraw.(map[string]interface{})
n := nraw.(map[string]interface{})
create, remove := diffGpdbTags(gpdbTagsFromMap(o), gpdbTagsFromMap(n))
if len(remove) > 0 {
var tagKey []string
for _, v := range remove {
tagKey = append(tagKey, v.Key)
}
request := gpdb.CreateUntagResourcesRequest()
request.ResourceId = &[]string{d.Id()}
request.ResourceType = string(TagResourceInstance)
request.TagKey = &tagKey
request.RegionId = s.client.RegionId
raw, err := s.client.WithGpdbClient(func(client *gpdb.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 := gpdb.CreateTagResourcesRequest()
request.ResourceId = &[]string{d.Id()}
request.Tag = &create
request.ResourceType = string(TagResourceInstance)
request.RegionId = s.client.RegionId
raw, err := s.client.WithGpdbClient(func(client *gpdb.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 *GpdbService) tagsToMap(tags []gpdb.Tag) map[string]string {
result := make(map[string]string)
for _, t := range tags {
if !s.ignoreTag(t) {
result[t.Key] = t.Value
}
}
return result
}
func (s *GpdbService) ignoreTag(t gpdb.Tag) bool {
filter := []string{"^aliyun", "^acs:", "^http://", "^https://"}
for _, v := range filter {
log.Printf("[DEBUG] Matching prefix %v with %v\n", v, t.Key)
ok, _ := regexp.MatchString(v, t.Key)
if ok {
log.Printf("[DEBUG] Found Alibaba Cloud specific t %s (val: %s), ignoring.\n", t.Key, t.Value)
return true
}
}
return false
}
func (s *GpdbService) DescribeGpdbAccount(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeAccounts"
parts, err := ParseResourceId(id, 2)
if err != nil {
err = WrapError(err)
return
}
request := map[string]interface{}{
"AccountName": parts[1],
"DBInstanceId": parts[0],
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:Account", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Accounts.DBInstanceAccount", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Accounts.DBInstanceAccount", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("GPDB", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["AccountName"]) != parts[1] {
return object, WrapErrorf(NotFoundErr("GPDB", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *GpdbService) GpdbAccountStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeGpdbAccount(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 fmt.Sprint(object["AccountStatus"]) == failState {
return object, fmt.Sprint(object["AccountStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["AccountStatus"])))
}
}
return object, fmt.Sprint(object["AccountStatus"]), nil
}
}
func (s *GpdbService) ListTagResources(id string, resourceType string) (object interface{}, err error) {
client := s.client
action := "ListTagResources"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"ResourceType": resourceType,
"ResourceId.1": id,
}
tags := make([]interface{}, 0)
var response map[string]interface{}
for {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err := client.RpcPost("gpdb", "2016-05-03", action, nil, request, false)
if err != nil {
if IsExpectedErrors(err, []string{Throttling}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.TagResources", response)
if err != nil {
return resource.NonRetryableError(WrapErrorf(err, FailedGetAttributeMsg, id, "$.TagResources", response))
}
if v != nil {
tags = append(tags, v.([]interface{})...)
}
return nil
})
if err != nil {
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return
}
if response["NextToken"] == nil {
break
}
request["NextToken"] = response["NextToken"]
}
return tags, nil
}
func (s *GpdbService) SetResourceTags(d *schema.ResourceData, resourceType string) error {
if d.HasChange("tags") {
added, removed := parsingTags(d)
client := s.client
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 := client.RpcPost("gpdb", "2016-05-03", 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 := client.RpcPost("gpdb", "2016-05-03", 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 *GpdbService) DescribeDBInstanceIPArrayList(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeDBInstanceIPArrayList"
request := map[string]interface{}{
"DBInstanceId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:DBInstance", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
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 *GpdbService) DescribeDBInstanceSSL(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeDBInstanceSSL"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"DBInstanceId": id,
}
client := s.client
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:DBInstance", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
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 *GpdbService) DescribeDBResourceManagementMode(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeDBResourceManagementMode"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"DBInstanceId": id,
}
client := s.client
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:DBInstance", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
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 *GpdbService) DescribeParameters(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeParameters"
request := map[string]interface{}{
"DBInstanceId": id,
}
client := s.client
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:DBInstance", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
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 *GpdbService) DBInstanceSSLStateRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeDBInstanceSSL(d.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)
}
sslEnabled := convertGpdbDbInstanceSSLEnabledResponse(object["SSLEnabled"])
for _, failState := range failStates {
if fmt.Sprint(sslEnabled) == failState {
return object, fmt.Sprint(sslEnabled), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(sslEnabled)))
}
}
return object, fmt.Sprint(sslEnabled), nil
}
}
func (s *GpdbService) DescribeGpdbDbInstance(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeDBInstanceAttribute"
request := map[string]interface{}{
"DBInstanceId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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{"InvalidDBInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("GPDB:DBInstance", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Items.DBInstanceAttribute", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBInstanceAttribute", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("GPDB", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["DBInstanceId"]) != id {
return object, WrapErrorf(NotFoundErr("GPDB", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *GpdbService) GpdbDbInstanceStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeGpdbDbInstance(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 fmt.Sprint(object[field]) == failState {
return object, fmt.Sprint(object[field]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object[field])))
}
}
return object, fmt.Sprint(object[field]), nil
}
}
func (s *GpdbService) DescribeGpdbDbInstancePlan(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeDBInstancePlans"
client := s.client
parts, err := ParseResourceId(id, 2)
if err != nil {
return object, WrapError(err)
}
request := map[string]interface{}{
"DBInstanceId": parts[0],
"PlanId": parts[1],
}
idExist := false
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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)
}
resp, err := jsonpath.Get("$.Items.PlanList", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.PlanList", response)
}
if v, ok := resp.([]interface{}); !ok || len(v) < 1 {
return object, WrapErrorf(NotFoundErr("Gpdb:DbInstancePlan", id), NotFoundWithResponse, response)
}
for _, v := range resp.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["DBInstanceId"]) == parts[0] && fmt.Sprint(v.(map[string]interface{})["PlanId"]) == parts[1] {
idExist = true
return v.(map[string]interface{}), nil
}
}
if !idExist {
return object, WrapErrorf(NotFoundErr("Gpdb:DbInstancePlan", id), NotFoundWithResponse, response)
}
return object, nil
}
func (s *GpdbService) GpdbDbInstancePlanStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeGpdbDbInstancePlan(id)
if err != nil {
if NotFoundError(err) {
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["PlanStatus"]) == failState {
return object, fmt.Sprint(object["PlanStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["PlanStatus"])))
}
}
return object, fmt.Sprint(object["PlanStatus"]), nil
}
}
func (s *GpdbService) DescribeGpdbDbInstanceDataShareStatus(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeDataShareInstances"
client := s.client
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"SearchValue": id,
"PageSize": PageSizeLarge,
"PageNumber": 1,
}
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", 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)
}
resp, err := jsonpath.Get("$.Items.DBInstance", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Items.DBInstance", response)
}
if v, ok := resp.([]interface{}); !ok || len(v) < 1 {
return object, nil
}
for _, v := range resp.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["DBInstanceId"]) == id {
return v.(map[string]interface{}), nil
}
}
if len(resp.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
return object, nil
}
func (s *GpdbService) GpdbDbInstanceDataShareStatusStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeGpdbDbInstanceDataShareStatus(id)
if err != nil {
if NotFoundError(err) {
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["DataShareStatus"]) == failState {
return object, fmt.Sprint(object["DataShareStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["DataShareStatus"])))
}
}
return object, fmt.Sprint(object["DataShareStatus"]), nil
}
}