alicloud/service_alicloud_api_gateway_v2.go (336 lines of code) (raw):
package alicloud
import (
"fmt"
"time"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)
type ApiGatewayServiceV2 struct {
client *connectivity.AliyunClient
}
// DescribeApiGatewayInstance <<< Encapsulated get interface for ApiGateway Instance.
func (s *ApiGatewayServiceV2) DescribeApiGatewayInstance(id string) (object map[string]interface{}, err error) {
client := s.client
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
action := "DescribeInstances"
request = make(map[string]interface{})
query = make(map[string]interface{})
query["InstanceId"] = id
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", action, query, 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 {
addDebug(action, response, request)
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Instances.InstanceAttribute[*]", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Instances.InstanceAttribute[*]", response)
}
if len(v.([]interface{})) == 0 {
return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response)
}
return v.([]interface{})[0].(map[string]interface{}), nil
}
func (s *ApiGatewayServiceV2) ApiGatewayInstanceStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeApiGatewayInstance(id)
if err != nil {
if NotFoundError(err) {
return object, "", nil
}
return nil, "", WrapError(err)
}
v, err := jsonpath.Get(field, object)
currentStatus := fmt.Sprint(v)
for _, failState := range failStates {
if currentStatus == failState {
return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus))
}
}
return object, currentStatus, nil
}
}
// DescribeApiGatewayInstance >>> Encapsulated.
// DescribeApiGatewayPlugin <<< Encapsulated get interface for ApiGateway Plugin.
func (s *ApiGatewayServiceV2) DescribeApiGatewayPlugin(id string) (object map[string]interface{}, err error) {
client := s.client
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
action := "DescribePlugins"
request = make(map[string]interface{})
query = make(map[string]interface{})
query["PluginId"] = id
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", action, query, 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 {
addDebug(action, response, request)
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.Plugins.PluginAttribute[*]", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Plugins.PluginAttribute[*]", response)
}
if len(v.([]interface{})) == 0 {
return object, WrapErrorf(NotFoundErr("Plugin", id), NotFoundMsg, response)
}
return v.([]interface{})[0].(map[string]interface{}), nil
}
func (s *ApiGatewayServiceV2) ApiGatewayPluginStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeApiGatewayPlugin(id)
if err != nil {
if NotFoundError(err) {
return object, "", nil
}
return nil, "", WrapError(err)
}
v, err := jsonpath.Get(field, object)
currentStatus := fmt.Sprint(v)
for _, failState := range failStates {
if currentStatus == failState {
return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus))
}
}
return object, currentStatus, nil
}
}
// DescribeApiGatewayPlugin >>> Encapsulated.
// SetResourceTags <<< Encapsulated tag function for ApiGateway.
func (s *ApiGatewayServiceV2) SetResourceTags(d *schema.ResourceData, resourceType string) error {
if d.HasChange("tags") {
var err error
var action string
client := s.client
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
added, removed := parsingTags(d)
removedTagKeys := make([]string, 0)
for _, v := range removed {
if !ignoredTags(v, "") {
removedTagKeys = append(removedTagKeys, v)
}
}
if len(removedTagKeys) > 0 {
action = "UntagResources"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ResourceId.1"] = d.Id()
for i, key := range removedTagKeys {
request[fmt.Sprintf("TagKey.%d", i+1)] = key
}
request["ResourceType"] = resourceType
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", action, query, 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 {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
}
if len(added) > 0 {
action = "TagResources"
request = make(map[string]interface{})
query = make(map[string]interface{})
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++
}
request["ResourceType"] = resourceType
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", action, query, 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 {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
}
}
return nil
}
// SetResourceTags >>> tag function encapsulated.
// DescribeApiGatewayAccessControlList <<< Encapsulated get interface for ApiGateway AccessControlList.
func (s *ApiGatewayServiceV2) DescribeApiGatewayAccessControlList(id string) (object map[string]interface{}, err error) {
client := s.client
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
action := "DescribeAccessControlListAttribute"
request = make(map[string]interface{})
query = make(map[string]interface{})
query["AclId"] = id
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", action, query, 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{"InvokeSlbApiFail"}) {
return object, WrapErrorf(NotFoundErr("AccessControlList", id), NotFoundMsg, response)
}
addDebug(action, response, request)
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
return response, nil
}
func (s *ApiGatewayServiceV2) DescribeApiGatewayAclEntryAttachmentAttribute(id string) (object map[string]interface{}, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return object, WrapError(err)
}
client := s.client
var response map[string]interface{}
action := "DescribeAccessControlListAttribute"
request := map[string]interface{}{
"AclId": parts[0],
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", 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{"InvokeSlbApiFail"}) {
return object, WrapErrorf(NotFoundErr("AclEntryAttachment", id), NotFoundMsg, response)
}
addDebug(action, response, request)
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
aclEntries, err := jsonpath.Get("$.AclEntrys.AclEntry", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.AclEntrys.AclEntry", response)
}
if len(aclEntries.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("AclEntryAttachment", id), NotFoundWithResponse, response)
}
for _, v := range aclEntries.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["AclEntryIp"]) == parts[1] {
return v.(map[string]interface{}), nil
}
}
return object, WrapErrorf(NotFoundErr("AclEntryAttachment", id), NotFoundWithResponse, response)
}
func (s *ApiGatewayServiceV2) DescribeApiGatewayInstanceAclAttachmentAttribute(id string) (object map[string]interface{}, err error) {
parts, err := ParseResourceIds(id)
if err != nil {
return nil, WrapError(err)
}
instanceID := parts[0]
response, err := s.DescribeApiGatewayInstance(instanceID)
if err != nil {
return nil, WrapError(err)
}
if _, ok := response["AclId"].(string); !ok {
return nil, WrapErrorf(NotFoundErr("InstanceAclAttachment", id), NotFoundMsg, response)
}
return response, nil
}
func (s *ApiGatewayServiceV2) ApiGatewayAccessControlListStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeApiGatewayAccessControlList(id)
if err != nil {
if NotFoundError(err) {
return object, "", nil
}
return nil, "", WrapError(err)
}
v, err := jsonpath.Get(field, object)
currentStatus := fmt.Sprint(v)
for _, failState := range failStates {
if currentStatus == failState {
return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus))
}
}
return object, currentStatus, nil
}
}
// DescribeApiGatewayAccessControlList >>> Encapsulated.
// DescribeApiGatewayApi <<< Encapsulated get interface for ApiGateway Api.
func (s *ApiGatewayServiceV2) DescribeApiGatewayApi(id string) (object map[string]interface{}, err error) {
client := s.client
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
action := "DescribeApi"
request = make(map[string]interface{})
query = make(map[string]interface{})
parts, err := ParseResourceId(id, 2)
query["ApiId"] = parts[1]
query["GroupId"] = parts[0]
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("CloudAPI", "2016-07-14", action, query, 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 {
addDebug(action, response, request)
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
if _, ok := response["ApiId"].(string); !ok {
return nil, WrapErrorf(NotFoundErr("Api", id), NotFoundMsg, response)
}
return response, nil
}
// DescribeApiGatewayApi >>> Encapsulated.