alibabacloudstack/service_apsarastack_kvstore.go (416 lines of code) (raw):
package alibabacloudstack
import (
"log"
"regexp"
"strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
r_kvstore "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
)
type KvstoreService struct {
client *connectivity.AlibabacloudStackClient
}
var KVstoreInstanceStatusCatcher = Catcher{"OperationDenied.KVstoreInstanceStatus", 60, 5}
func (s *KvstoreService) DoR_KvstoreDescribeinstanceattributeRequest(id string) (*r_kvstore.DBInstanceAttribute, error) {
return s.DescribeKVstoreInstance(id)
}
func (s *KvstoreService) DescribeKVstoreInstance(id string) (*r_kvstore.DBInstanceAttribute, error) {
instance := &r_kvstore.DBInstanceAttribute{}
request := r_kvstore.CreateDescribeInstanceAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.DescribeInstanceAttribute(request)
})
bresponse, ok := raw.(*r_kvstore.DescribeInstanceAttributeResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidInstanceId.NotFound"}) {
return instance, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KVstoreInstance", id)), 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.Instances.DBInstanceAttribute) <= 0 {
return instance, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KVstoreInstance", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return &bresponse.Instances.DBInstanceAttribute[0], nil
}
func (s *KvstoreService) DescribeKVstoreBackupPolicy(id string) (*r_kvstore.DescribeBackupPolicyResponse, error) {
response := &r_kvstore.DescribeBackupPolicyResponse{}
request := r_kvstore.CreateDescribeBackupPolicyRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.DescribeBackupPolicy(request)
})
bresponse, ok := raw.(*r_kvstore.DescribeBackupPolicyResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidInstanceId.NotFound"}) {
return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KVstoreBackupPolicy", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse, nil
}
func (s *KvstoreService) WaitForKVstoreInstance(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeKVstoreInstance(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.InstanceStatus == string(status) {
break
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.InstanceStatus, status, errmsgs.ProviderERROR)
}
}
return nil
}
func (s *KvstoreService) RdsKvstoreInstanceStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeKVstoreInstance(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.InstanceStatus == failState {
return object, object.InstanceStatus, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.InstanceStatus))
}
}
return object, object.InstanceStatus, nil
}
}
func (s *KvstoreService) WaitForKVstoreInstanceVpcAuthMode(id string, status string, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeKVstoreInstance(id)
if err != nil && !errmsgs.NotFoundError(err) {
return err
}
if object.VpcAuthMode == string(status) {
break
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.VpcAuthMode, status, errmsgs.ProviderERROR)
}
}
return nil
}
func (s *KvstoreService) DescribeParameters(id string) (*r_kvstore.DescribeParametersResponse, error) {
response := &r_kvstore.DescribeParametersResponse{}
request := r_kvstore.CreateDescribeParametersRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DBInstanceId = id
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.DescribeParameters(request)
})
bresponse, ok := raw.(*r_kvstore.DescribeParametersResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidDBInstanceId.NotFound"}) {
return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Parameters", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse, nil
}
func (s *KvstoreService) ModifyInstanceConfig(id string, config string) error {
request := r_kvstore.CreateModifyInstanceConfigRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
request.Config = config
if err := s.WaitForKVstoreInstance(id, Normal, DefaultLongTimeout); err != nil {
return errmsgs.WrapError(err)
}
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.ModifyInstanceConfig(request)
})
bresponse, ok := raw.(*r_kvstore.ModifyInstanceConfigResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
}
func (s *KvstoreService) setInstanceTags(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 := r_kvstore.CreateUntagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = strings.ToUpper(string(TagResourceInstance))
request.TagKey = &tagKey
raw, err := s.client.WithRkvClient(func(client *r_kvstore.Client) (interface{}, error) {
return client.UntagResources(request)
})
bresponse, ok := raw.(*r_kvstore.UntagResourcesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
if len(create) > 0 {
request := r_kvstore.CreateTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.Tag = &create
request.ResourceType = strings.ToUpper(string(TagResourceInstance))
raw, err := s.client.WithRkvClient(func(client *r_kvstore.Client) (interface{}, error) {
return client.TagResources(request)
})
bresponse, ok := raw.(*r_kvstore.TagResourcesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
//d.SetPartial("tags")
}
return nil
}
func (s *KvstoreService) tagsToMap(tags []r_kvstore.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 *KvstoreService) tagsFromMap(m map[string]interface{}) []r_kvstore.TagResourcesTag {
result := make([]r_kvstore.TagResourcesTag, 0, len(m))
for k, v := range m {
result = append(result, r_kvstore.TagResourcesTag{
Key: k,
Value: v.(string),
})
}
return result
}
func (s *KvstoreService) ignoreTag(t r_kvstore.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 *KvstoreService) diffTags(oldTags, newTags []r_kvstore.TagResourcesTag) ([]r_kvstore.TagResourcesTag, []r_kvstore.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 []r_kvstore.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 *KvstoreService) DescribeTags(resourceId string, resourceType TagResourceType) (tags []r_kvstore.TagResource, err error) {
request := r_kvstore.CreateListTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceType = strings.ToUpper(string(resourceType))
request.ResourceId = &[]string{resourceId}
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.ListTagResources(request)
})
bresponse, ok := raw.(*r_kvstore.ListTagResourcesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, resourceId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse.TagResources.TagResource, nil
}
func (s *KvstoreService) WaitForKVstoreAccount(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeKVstoreAccount(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object != nil && 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)
}
}
return nil
}
func (s *KvstoreService) DoR_KvstoreDescribeaccountsRequest(id string) (*r_kvstore.Account, error) {
return s.DescribeKVstoreAccount(id)
}
func (s *KvstoreService) DescribeKVstoreAccount(id string) (*r_kvstore.Account, error) {
ds := &r_kvstore.Account{}
parts, err := ParseResourceId(id, 2)
if err != nil {
return ds, errmsgs.WrapError(err)
}
request := r_kvstore.CreateDescribeAccountsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = parts[0]
request.AccountName = parts[1]
invoker := NewInvoker()
invoker.AddCatcher(KVstoreInstanceStatusCatcher)
var raw interface{}
err = invoker.Run(func() error {
raw, err = s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.DescribeAccounts(request)
})
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return err
})
response, ok := raw.(*r_kvstore.DescribeAccountsResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidInstanceId.NotFound"}) {
return ds, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return ds, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if len(response.Accounts.Account) < 1 {
return ds, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KVstoreAccount", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return &response.Accounts.Account[0], nil
}
func (s *KvstoreService) DescribeKVstoreSecurityGroupId(id string) (*r_kvstore.DescribeSecurityGroupConfigurationResponse, error) {
response := &r_kvstore.DescribeSecurityGroupConfigurationResponse{}
request := r_kvstore.CreateDescribeSecurityGroupConfigurationRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
if err := s.WaitForKVstoreInstance(id, Normal, DefaultLongTimeout); err != nil {
return response, errmsgs.WrapError(err)
}
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.DescribeSecurityGroupConfiguration(request)
})
bresponse, ok := raw.(*r_kvstore.DescribeSecurityGroupConfigurationResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return bresponse, nil
}
func (s *KvstoreService) DescribeDBInstanceNetInfo(id string) (*r_kvstore.NetInfoItemsInDescribeDBInstanceNetInfo, error) {
response := &r_kvstore.DescribeDBInstanceNetInfoResponse{}
request := r_kvstore.CreateDescribeDBInstanceNetInfoRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
if err := s.WaitForKVstoreInstance(id, Normal, DefaultLongTimeout); err != nil {
return &response.NetInfoItems, errmsgs.WrapError(err)
}
raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) {
return rkvClient.DescribeDBInstanceNetInfo(request)
})
bresponse, ok := raw.(*r_kvstore.DescribeDBInstanceNetInfoResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return &response.NetInfoItems, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return &bresponse.NetInfoItems, nil
}
func (s *KvstoreService) DoR_KvstoreDescribedbinstancenetinfoRequest(id string) (object []r_kvstore.InstanceNetInfo, err error) {
return s.DescribeKvstoreConnection(id)
}
func (s *KvstoreService) DescribeKvstoreConnection(id string) (object []r_kvstore.InstanceNetInfo, err error) {
request := r_kvstore.CreateDescribeDBInstanceNetInfoRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
raw, err := s.client.WithRkvClient(func(r_kvstoreClient *r_kvstore.Client) (interface{}, error) {
return r_kvstoreClient.DescribeDBInstanceNetInfo(request)
})
bresponse, ok := raw.(*r_kvstore.DescribeDBInstanceNetInfoResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidInstanceId.NotFound"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KvstoreConnection", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.NetInfoItems.InstanceNetInfo) < 1 {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KvstoreConnection", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, bresponse.RequestId)
return
}
return bresponse.NetInfoItems.InstanceNetInfo, nil
}