alicloud/resource_alicloud_api_gateway_api.go (1,111 lines of code) (raw):
package alicloud
import (
"encoding/json"
"fmt"
"log"
"strconv"
"strings"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
)
func resourceAliyunApigatewayApi() *schema.Resource {
return &schema.Resource{
Create: resourceAliyunApigatewayApiCreate,
Read: resourceAliyunApigatewayApiRead,
Update: resourceAliyunApigatewayApiUpdate,
Delete: resourceAliyunApigatewayApiDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"group_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"name": {
Type: schema.TypeString,
Required: true,
},
"description": {
Type: schema.TypeString,
Required: true,
},
"auth_type": {
Type: schema.TypeString,
Required: true,
},
"request_config": {
Type: schema.TypeList,
Required: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"protocol": {
Type: schema.TypeString,
Required: true,
},
"method": {
Type: schema.TypeString,
Required: true,
},
"path": {
Type: schema.TypeString,
Required: true,
},
"mode": {
Type: schema.TypeString,
Required: true,
},
"body_format": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"service_type": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"MOCK", "HTTP-VPC", "FunctionCompute", "HTTP"}, false),
},
"http_service_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"address": {
Type: schema.TypeString,
Required: true,
},
"path": {
Type: schema.TypeString,
Required: true,
},
"method": {
Type: schema.TypeString,
Required: true,
},
"timeout": {
Type: schema.TypeInt,
Required: true,
},
"aone_name": {
Type: schema.TypeString,
Optional: true,
},
"content_type_category": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"content_type_value": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
},
},
},
"http_vpc_service_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"path": {
Type: schema.TypeString,
Required: true,
},
"method": {
Type: schema.TypeString,
Required: true,
},
"timeout": {
Type: schema.TypeInt,
Required: true,
},
"aone_name": {
Type: schema.TypeString,
Optional: true,
},
"vpc_scheme": {
Type: schema.TypeString,
Optional: true,
},
"content_type_category": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"content_type_value": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
},
},
},
"fc_service_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"function_version": {
Type: schema.TypeString,
Optional: true,
Default: "2.0",
},
"function_type": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: StringInSlice([]string{"FCEvent", "HttpTrigger"}, false),
},
"region": {
Type: schema.TypeString,
Required: true,
},
"function_name": {
Type: schema.TypeString,
Optional: true,
},
"service_name": {
Type: schema.TypeString,
Optional: true,
},
"function_base_url": {
Type: schema.TypeString,
Optional: true,
},
"path": {
Type: schema.TypeString,
Optional: true,
},
"method": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"only_business_path": {
Type: schema.TypeBool,
Optional: true,
},
"arn_role": {
Type: schema.TypeString,
Required: true,
},
"qualifier": {
Type: schema.TypeString,
Optional: true,
},
"timeout": {
Type: schema.TypeInt,
Required: true,
},
},
},
},
"mock_service_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"result": {
Type: schema.TypeString,
Required: true,
},
"aone_name": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"request_parameters": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"type": {
Type: schema.TypeString,
Required: true,
},
"required": {
Type: schema.TypeString,
Required: true,
},
"in": {
Type: schema.TypeString,
Required: true,
},
"in_service": {
Type: schema.TypeString,
Required: true,
},
"name_service": {
Type: schema.TypeString,
Required: true,
},
"description": {
Type: schema.TypeString,
Optional: true,
},
"default_value": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"constant_parameters": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"in": {
Type: schema.TypeString,
Required: true,
},
"value": {
Type: schema.TypeString,
Required: true,
},
"description": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"system_parameters": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"name_service": {
Type: schema.TypeString,
Required: true,
},
"in": {
Type: schema.TypeString,
Required: true,
},
},
},
},
"stage_names": {
Type: schema.TypeSet,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"PRE", "RELEASE", "TEST"}, false),
},
Optional: true,
},
"api_id": {
Type: schema.TypeString,
Computed: true,
},
"force_nonce_check": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
},
}
}
func resourceAliyunApigatewayApiCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
request, err := buildAliyunApiArgs(d, meta)
request.RegionId = client.RegionId
if err != nil {
return WrapError(err)
}
raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) {
return cloudApiClient.CreateApi(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_apigateway_api", request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*cloudapi.CreateApiResponse)
d.SetId(fmt.Sprintf("%s%s%s", request.GroupId, COLON_SEPARATED, response.ApiId))
if l, ok := d.GetOk("stage_names"); ok {
err = updateApiStages(d, l.(*schema.Set), meta)
if err != nil {
return WrapError(err)
}
}
return resourceAliyunApigatewayApiRead(d, meta)
}
func resourceAliyunApigatewayApiRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
cloudApiService := CloudApiService{client}
apiGatewayServiceV2 := ApiGatewayServiceV2{client}
objectRaw, err := apiGatewayServiceV2.DescribeApiGatewayApi(d.Id())
if err != nil {
if !d.IsNewResource() && NotFoundError(err) {
log.Printf("[DEBUG] Resource alicloud_api_gateway_api DescribeApiGatewayApi Failed!!! %s", err)
d.SetId("")
return nil
}
return WrapError(err)
}
stageNames, err := getStageNameList(d, cloudApiService)
if err != nil {
if !NotFoundError(err) {
return WrapError(err)
}
}
if err := d.Set("stage_names", stageNames); err != nil {
return WrapError(err)
}
d.Set("api_id", objectRaw["ApiId"])
d.Set("group_id", objectRaw["GroupId"])
d.Set("name", objectRaw["ApiName"])
d.Set("description", objectRaw["Description"])
d.Set("auth_type", objectRaw["AuthType"])
d.Set("force_nonce_check", objectRaw["ForceNonceCheck"])
v := convertApiGatewayApiRequestConfigResponse(objectRaw["RequestConfig"])
if err := d.Set("request_config", []map[string]interface{}{v}); err != nil {
return WrapError(err)
}
serviceConfig, ok := objectRaw["ServiceConfig"].(map[string]interface{})
if !ok {
return WrapError(Error("ApiGateway resource Api service_config is not valid."))
}
if mock, ok := serviceConfig["Mock"]; ok && mock == "TRUE" {
d.Set("service_type", "MOCK")
v := convertApiGatewayApiServiceConfigMockServiceConfigResponse(serviceConfig)
if err := d.Set("mock_service_config", []map[string]interface{}{v}); err != nil {
return WrapError(err)
}
} else if vpcEnable, ok := serviceConfig["ServiceVpcEnable"]; ok && vpcEnable == "TRUE" {
d.Set("service_type", "HTTP-VPC")
v := convertApiGatewayApiServiceConfigVpcServiceConfigResponse(serviceConfig)
if err := d.Set("http_vpc_service_config", []map[string]interface{}{v}); err != nil {
return WrapError(err)
}
} else if serviceProtocol, ok := serviceConfig["ServiceProtocol"]; ok && serviceProtocol == "FunctionCompute" {
d.Set("service_type", "FunctionCompute")
v := convertApiGatewayApiServiceConfigFcServiceConfigResponse(serviceConfig)
if err := d.Set("fc_service_config", []map[string]interface{}{v}); err != nil {
return WrapError(err)
}
} else {
d.Set("service_type", "HTTP")
v := convertApiGatewayApiServiceConfigHttpServiceConfigResponse(serviceConfig)
if err := d.Set("http_service_config", []map[string]interface{}{v}); err != nil {
return WrapError(err)
}
}
d.Set("request_parameters", convertApiGatewayApiRequestParamsResponse(objectRaw))
d.Set("constant_parameters", convertApiGatewayApiConstantParamsResponse(objectRaw["ConstantParameters"]))
d.Set("system_parameters", convertApiGatewayApiSystemParamsResponse(objectRaw["SystemParameters"]))
return nil
}
func resourceAliyunApigatewayApiUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
request := cloudapi.CreateModifyApiRequest()
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return WrapError(err)
}
request.ApiId = parts[1]
request.GroupId = parts[0]
update := false
d.Partial(true)
if d.HasChanges("name", "description", "auth_type") {
update = true
}
request.ApiName = d.Get("name").(string)
request.Description = d.Get("description").(string)
request.AuthType = d.Get("auth_type").(string)
if d.HasChange("force_nonce_check") {
update = true
}
if v, exist := d.GetOk("force_nonce_check"); exist {
request.ForceNonceCheck = requests.Boolean(strconv.FormatBool(v.(bool)))
}
var paramErr error
var paramConfig string
if d.HasChange("request_config") {
update = true
}
paramConfig, paramErr = requestConfigToJsonStr(d.Get("request_config").([]interface{}))
if paramErr != nil {
return paramErr
}
request.RequestConfig = paramConfig
if d.HasChanges("service_type", "http_service_config", "http_vpc_service_config", "mock_service_config", "fc_service_config") {
update = true
}
serviceConfig, err := serviceConfigToJsonStr(d)
if err != nil {
return WrapError(err)
}
request.ServiceConfig = serviceConfig
if d.HasChanges("request_parameters", "constant_parameters", "system_parameters") {
update = true
}
rps, sps, spm, err := setParameters(d)
if err != nil {
return WrapError(err)
}
request.RequestParameters = string(rps)
request.ServiceParameters = string(sps)
request.ServiceParametersMap = string(spm)
if update {
request.ResultType = ResultType
request.ResultSample = ResultSample
request.Visibility = Visibility
request.AllowSignatureMethod = AllowSignatureMethod
request.WebSocketApiType = WebSocketApiType
raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) {
return cloudApiClient.ModifyApi(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
d.SetPartial("name")
d.SetPartial("description")
d.SetPartial("auth_type")
d.SetPartial("service_type")
d.SetPartial("http_service_config")
d.SetPartial("http_vpc_service_config")
d.SetPartial("fc_service_config")
d.SetPartial("mock_service_config")
d.SetPartial("request_parameters")
d.SetPartial("constant_parameters")
d.SetPartial("system_parameters")
}
if update || d.HasChange("stage_names") {
if l, ok := d.GetOk("stage_names"); ok {
err = updateApiStages(d, l.(*schema.Set), meta)
if err != nil {
return WrapError(err)
}
}
d.SetPartial("stage_names")
}
d.Partial(false)
return resourceAliyunApigatewayApiRead(d, meta)
}
func resourceAliyunApigatewayApiDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
cloudApiService := CloudApiService{client}
request := cloudapi.CreateDeleteApiRequest()
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return WrapError(err)
}
request.ApiId = parts[1]
request.GroupId = parts[0]
for _, stageName := range ApiGatewayStageNames {
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
err := cloudApiService.AbolishApi(d.Id(), stageName)
if err != nil {
if IsExpectedErrors(err, []string{"ConcurrencyLockTimeout"}) {
time.Sleep(3 * time.Second)
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
if err != nil {
return WrapError(err)
}
_, err = cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
if !NotFoundError(err) {
return WrapError(err)
}
}
}
raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) {
return cloudApiClient.DeleteApi(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"NotFoundApi"}) {
return nil
}
return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return WrapError(cloudApiService.WaitForApiGatewayApi(d.Id(), Deleted, DefaultTimeout))
}
func buildAliyunApiArgs(d *schema.ResourceData, meta interface{}) (*cloudapi.CreateApiRequest, error) {
request := cloudapi.CreateCreateApiRequest()
request.GroupId = d.Get("group_id").(string)
request.Description = d.Get("description").(string)
request.ApiName = d.Get("name").(string)
request.AuthType = d.Get("auth_type").(string)
if v, exist := d.GetOk("force_nonce_check"); exist {
request.ForceNonceCheck = requests.Boolean(strconv.FormatBool(v.(bool)))
}
requestConfig, err := requestConfigToJsonStr(d.Get("request_config").([]interface{}))
if err != nil {
return request, WrapError(err)
}
request.RequestConfig = requestConfig
serviceConfig, err := serviceConfigToJsonStr(d)
if err != nil {
return request, WrapError(err)
}
request.ServiceConfig = serviceConfig
rps, sps, spm, err := setParameters(d)
if err != nil {
return request, WrapError(err)
}
request.RequestParameters = string(rps)
request.ServiceParameters = string(sps)
request.ServiceParametersMap = string(spm)
request.ResultType = ResultType
request.ResultSample = ResultSample
request.Visibility = Visibility
request.AllowSignatureMethod = AllowSignatureMethod
request.WebSocketApiType = WebSocketApiType
return request, WrapError(err)
}
func requestConfigToJsonStr(l []interface{}) (string, error) {
config := l[0].(map[string]interface{})
var requestConfig ApiGatewayRequestConfig
requestConfig.Protocol = config["protocol"].(string)
requestConfig.Path = config["path"].(string)
requestConfig.Method = config["method"].(string)
requestConfig.Mode = config["mode"].(string)
if v, ok := config["body_format"]; ok {
requestConfig.BodyFormat = v.(string)
}
configStr, err := json.Marshal(requestConfig)
return string(configStr), WrapError(err)
}
func getHttpServiceConfig(d *schema.ResourceData) ([]byte, error) {
var serviceConfig ApiGatewayServiceConfig
var l []interface{}
v, ok := d.GetOk("http_service_config")
if !ok {
return []byte{}, fmt.Errorf("Creating apigatway api error: http_service_config is null")
}
l = v.([]interface{})
config := l[0].(map[string]interface{})
serviceConfig.Protocol = "HTTP"
serviceConfig.Address = config["address"].(string)
serviceConfig.Path = config["path"].(string)
serviceConfig.Method = config["method"].(string)
serviceConfig.Timeout = config["timeout"].(int)
serviceConfig.MockEnable = "FALSE"
serviceConfig.VpcEnable = "FALSE"
serviceConfig.ContentTypeCategory = "CLIENT"
if v, ok := config["aone_name"]; ok {
serviceConfig.AoneName = v.(string)
}
if v, ok := config["content_type_category"]; ok {
serviceConfig.ContentTypeCategory = v.(string)
}
if v, ok := config["content_type_value"]; ok {
serviceConfig.ContentTypeValue = v.(string)
}
configStr, err := json.Marshal(serviceConfig)
return configStr, WrapError(err)
}
func getHttpVpcServiceConfig(d *schema.ResourceData) ([]byte, error) {
var serviceConfig ApiGatewayServiceConfig
var l []interface{}
v, ok := d.GetOk("http_vpc_service_config")
if !ok {
return []byte{}, WrapError(Error("Creating apigatway api error: http_vpc_service_config is null"))
}
l = v.([]interface{})
config := l[0].(map[string]interface{})
serviceConfig.Protocol = "HTTP"
serviceConfig.VpcConfig.Name = config["name"].(string)
serviceConfig.Path = config["path"].(string)
serviceConfig.Method = config["method"].(string)
serviceConfig.Timeout = config["timeout"].(int)
serviceConfig.VpcEnable = "TRUE"
serviceConfig.MockEnable = "FALSE"
serviceConfig.ContentTypeCategory = "CLIENT"
if v, ok := config["aone_name"]; ok {
serviceConfig.AoneName = v.(string)
}
if v, ok := config["vpc_scheme"]; ok {
serviceConfig.VpcConfig.VpcScheme = v.(string)
}
if v, ok := config["content_type_category"]; ok {
serviceConfig.ContentTypeCategory = v.(string)
}
if v, ok := config["content_type_value"]; ok {
serviceConfig.ContentTypeValue = v.(string)
}
configStr, err := json.Marshal(serviceConfig)
return configStr, WrapError(err)
}
func getFcServiceConfig(d *schema.ResourceData) ([]byte, error) {
var serviceConfig ApiGatewayServiceConfig
var l []interface{}
v, ok := d.GetOk("fc_service_config")
if !ok {
return []byte{}, WrapError(Error("Creating apigatway api error: fc_service_config is null"))
}
l = v.([]interface{})
config := l[0].(map[string]interface{})
serviceConfig.Protocol = "FunctionCompute"
serviceConfig.FcConfig.FunctionVersion = config["function_version"].(string)
serviceConfig.FcConfig.FunctionType = config["function_type"].(string)
serviceConfig.FcConfig.FunctionBaseUrl = config["function_base_url"].(string)
serviceConfig.FcConfig.Path = config["path"].(string)
serviceConfig.FcConfig.Method = config["method"].(string)
serviceConfig.FcConfig.OnlyBusinessPath = config["only_business_path"].(bool)
serviceConfig.FcConfig.Qualifier = config["qualifier"].(string)
serviceConfig.FcConfig.Region = config["region"].(string)
serviceConfig.FcConfig.FunctionName = config["function_name"].(string)
serviceConfig.FcConfig.ServiceName = config["service_name"].(string)
serviceConfig.FcConfig.Arn = config["arn_role"].(string)
serviceConfig.Timeout = config["timeout"].(int)
serviceConfig.VpcEnable = "FALSE"
serviceConfig.MockEnable = "FALSE"
serviceConfig.ContentTypeCategory = "CLIENT"
if v, ok := config["aone_name"]; ok {
serviceConfig.AoneName = v.(string)
}
configStr, err := json.Marshal(serviceConfig)
return configStr, WrapError(err)
}
func getMockServiceConfig(d *schema.ResourceData) ([]byte, error) {
var serviceConfig ApiGatewayServiceConfig
var l []interface{}
v, ok := d.GetOk("mock_service_config")
if !ok {
return []byte{}, WrapError(Error("Creating apigatway api error: mock_service_config is null"))
}
l = v.([]interface{})
config := l[0].(map[string]interface{})
serviceConfig.Protocol = "HTTP"
serviceConfig.Method = "GET"
serviceConfig.MockResult = config["result"].(string)
serviceConfig.MockEnable = "TRUE"
serviceConfig.VpcEnable = "FALSE"
serviceConfig.Timeout = ApigatewayDefaultTimeout
serviceConfig.Address = ApigatewayDefaultAddress
if v, ok := config["aone_name"]; ok {
serviceConfig.AoneName = v.(string)
}
configStr, err := json.Marshal(serviceConfig)
return configStr, WrapError(err)
}
func serviceConfigToJsonStr(d *schema.ResourceData) (string, error) {
var err error
var configStr []byte
serviceType := d.Get("service_type").(string)
switch serviceType {
case "HTTP":
configStr, err = getHttpServiceConfig(d)
break
case "HTTP-VPC":
configStr, err = getHttpVpcServiceConfig(d)
break
case "FunctionCompute":
configStr, err = getFcServiceConfig(d)
break
case "MOCK":
configStr, err = getMockServiceConfig(d)
break
}
if err != nil {
return "", WrapError(err)
}
return string(configStr), nil
}
func setParameters(d *schema.ResourceData) (rps []byte, sps []byte, spm []byte, err error) {
requestParameters := make([]ApiGatewayRequestParam, 0)
serviceParameters := make([]ApiGatewayServiceParam, 0)
serviceParamMaps := make([]ApiGatewayParameterMap, 0)
requestParameters, serviceParameters, serviceParamMaps = setRequestParameters(d, requestParameters, serviceParameters, serviceParamMaps)
requestParameters, serviceParameters, serviceParamMaps = setConstantParameters(d, requestParameters, serviceParameters, serviceParamMaps)
requestParameters, serviceParameters, serviceParamMaps = setSystemParameters(d, requestParameters, serviceParameters, serviceParamMaps)
rps, err = json.Marshal(requestParameters)
if err != nil {
err = WrapError(err)
return
}
sps, err = json.Marshal(serviceParameters)
if err != nil {
err = WrapError(err)
return
}
spm, err = json.Marshal(serviceParamMaps)
if err != nil {
err = WrapError(err)
return
}
return rps, sps, spm, WrapError(err)
}
func setSystemParameters(d *schema.ResourceData, requestParameters []ApiGatewayRequestParam, serviceParameters []ApiGatewayServiceParam, serviceParamMaps []ApiGatewayParameterMap) ([]ApiGatewayRequestParam, []ApiGatewayServiceParam, []ApiGatewayParameterMap) {
if l, ok := d.GetOk("system_parameters"); ok {
for _, element := range l.(*schema.Set).List() {
var requestParam ApiGatewayRequestParam
var serviceParam ApiGatewayServiceParam
var serviceParamMap ApiGatewayParameterMap
request := element.(map[string]interface{})
nameRequest := request["name"].(string)
nameService := request["name_service"].(string)
in := request["in"].(string)
requestParam.Name = nameRequest
requestParam.ApiParameterName = nameRequest
requestParam.In = in
requestParam.Required = "REQUIRED"
requestParam.Type = "String"
requestParameters = append(requestParameters, requestParam)
serviceParam.Type = "String"
serviceParam.In = in
serviceParam.Name = nameService
serviceParam.Catalog = CatalogSystem
serviceParameters = append(serviceParameters, serviceParam)
serviceParamMap.RequestParamName = nameRequest
serviceParamMap.ServiceParamName = nameService
serviceParamMaps = append(serviceParamMaps, serviceParamMap)
}
}
return requestParameters, serviceParameters, serviceParamMaps
}
func setConstantParameters(d *schema.ResourceData, requestParameters []ApiGatewayRequestParam, serviceParameters []ApiGatewayServiceParam, serviceParamMaps []ApiGatewayParameterMap) ([]ApiGatewayRequestParam, []ApiGatewayServiceParam, []ApiGatewayParameterMap) {
if l, ok := d.GetOk("constant_parameters"); ok {
for _, element := range l.(*schema.Set).List() {
var requestParam ApiGatewayRequestParam
var serviceParam ApiGatewayServiceParam
var serviceParamMap ApiGatewayParameterMap
request := element.(map[string]interface{})
name := request["name"].(string)
in := request["in"].(string)
value := request["value"].(string)
requestParam.Name = name
requestParam.Required = "REQUIRED"
requestParam.ApiParameterName = name
requestParam.In = in
requestParam.Type = "String"
if description, ok := request["description"]; ok {
requestParam.Description = description.(string)
}
requestParam.DefualtValue = value
requestParameters = append(requestParameters, requestParam)
serviceParam.In = in
serviceParam.Name = name
serviceParam.Catalog = CatalogConstant
serviceParameters = append(serviceParameters, serviceParam)
serviceParamMap.RequestParamName = name
serviceParamMap.ServiceParamName = name
serviceParamMaps = append(serviceParamMaps, serviceParamMap)
}
}
return requestParameters, serviceParameters, serviceParamMaps
}
func setRequestParameters(d *schema.ResourceData, requestParameters []ApiGatewayRequestParam, serviceParameters []ApiGatewayServiceParam, serviceParamMaps []ApiGatewayParameterMap) ([]ApiGatewayRequestParam, []ApiGatewayServiceParam, []ApiGatewayParameterMap) {
if l, ok := d.GetOk("request_parameters"); ok {
for _, element := range l.(*schema.Set).List() {
var requestParam ApiGatewayRequestParam
var serviceParam ApiGatewayServiceParam
var serviceParamMap ApiGatewayParameterMap
request := element.(map[string]interface{})
nameRequest := request["name"].(string)
paramType := request["type"].(string)
required := request["required"].(string)
in := request["in"].(string)
inService := request["in_service"].(string)
nameService := request["name_service"].(string)
if description, ok := request["description"]; ok {
requestParam.Description = description.(string)
}
if defaultValue, ok := request["default_value"]; ok {
requestParam.DefualtValue = defaultValue.(string)
}
requestParam.Name = nameRequest
requestParam.Required = required
requestParam.ApiParameterName = nameRequest
requestParam.In = in
requestParam.Type = paramType
requestParameters = append(requestParameters, requestParam)
serviceParam.Type = paramType
serviceParam.In = inService
serviceParam.Name = nameService
serviceParam.Catalog = CatalogRequest
serviceParameters = append(serviceParameters, serviceParam)
serviceParamMap.RequestParamName = nameRequest
serviceParamMap.ServiceParamName = nameService
serviceParamMaps = append(serviceParamMaps, serviceParamMap)
}
}
return requestParameters, serviceParameters, serviceParamMaps
}
func getStageNameList(d *schema.ResourceData, cloudApiService CloudApiService) ([]string, error) {
var stageNames []string
for _, stageName := range ApiGatewayStageNames {
_, err := cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
if NotFoundError(err) {
continue
}
return nil, WrapError(err)
}
stageNames = append(stageNames, stageName)
}
return stageNames, nil
}
func updateApiStages(d *schema.ResourceData, stageNames *schema.Set, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
cloudApiService := CloudApiService{client}
for _, stageName := range ApiGatewayStageNames {
if stageNames.Contains(stageName) {
err := cloudApiService.DeployedApi(d.Id(), stageName)
if err != nil {
return WrapError(err)
}
_, err = cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
return WrapError(err)
}
} else {
err := cloudApiService.AbolishApi(d.Id(), stageName)
if err != nil {
return WrapError(err)
}
_, err = cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
if !NotFoundError(err) {
return WrapError(err)
}
}
}
}
return nil
}
func convertApiGatewayApiRequestConfigResponse(source interface{}) map[string]interface{} {
requestConfig := map[string]interface{}{}
if source == nil {
return requestConfig
}
requestConfigMap, ok := source.(map[string]interface{})
if !ok {
return requestConfig
}
requestConfig["protocol"] = requestConfigMap["RequestProtocol"]
requestConfig["method"] = requestConfigMap["RequestHttpMethod"]
requestConfig["path"] = requestConfigMap["RequestPath"]
requestConfig["mode"] = requestConfigMap["RequestMode"]
if bodyFormat, ok := requestConfigMap["BodyFormat"]; ok && bodyFormat != "" {
requestConfig["body_format"] = bodyFormat
}
return requestConfig
}
func convertApiGatewayApiServiceConfigMockServiceConfigResponse(serviceConfig map[string]interface{}) map[string]interface{} {
mockServiceConfig := map[string]interface{}{}
if serviceConfig == nil {
return mockServiceConfig
}
mockServiceConfig["result"] = serviceConfig["MockResult"]
mockServiceConfig["aone_name"] = serviceConfig["AoneAppName"]
return mockServiceConfig
}
func convertApiGatewayApiServiceConfigVpcServiceConfigResponse(serviceConfig map[string]interface{}) map[string]interface{} {
vpcServiceConfig := map[string]interface{}{}
if serviceConfig == nil {
return vpcServiceConfig
}
vpcServiceConfig["path"] = serviceConfig["ServicePath"]
vpcServiceConfig["method"] = serviceConfig["ServiceHttpMethod"]
vpcServiceConfig["timeout"] = serviceConfig["ServiceTimeout"]
vpcServiceConfig["aone_name"] = serviceConfig["AoneAppName"]
vpcServiceConfig["content_type_category"] = serviceConfig["ContentTypeCatagory"]
vpcServiceConfig["content_type_value"] = serviceConfig["ContentTypeValue"]
if vpcConfig, ok := serviceConfig["VpcConfig"].(map[string]interface{}); ok {
vpcServiceConfig["name"] = vpcConfig["Name"]
vpcServiceConfig["vpc_scheme"] = vpcConfig["VpcScheme"]
}
return vpcServiceConfig
}
func convertApiGatewayApiServiceConfigFcServiceConfigResponse(serviceConfig map[string]interface{}) map[string]interface{} {
fcServiceConfig := map[string]interface{}{}
if serviceConfig == nil {
return fcServiceConfig
}
fcServiceConfig["timeout"] = serviceConfig["ServiceTimeout"]
if fcConfig, ok := serviceConfig["FunctionComputeConfig"].(map[string]interface{}); ok {
fcServiceConfig["region"] = fcConfig["RegionId"]
fcServiceConfig["function_version"] = fcConfig["FcVersion"]
fcServiceConfig["function_type"] = fcConfig["FcType"]
fcServiceConfig["function_base_url"] = fcConfig["FcBaseUrl"]
fcServiceConfig["path"] = fcConfig["Path"]
fcServiceConfig["method"] = fcConfig["Method"]
fcServiceConfig["only_business_path"] = fcConfig["OnlyBusinessPath"]
fcServiceConfig["qualifier"] = fcConfig["Qualifier"]
fcServiceConfig["function_name"] = fcConfig["FunctionName"]
fcServiceConfig["service_name"] = fcConfig["ServiceName"]
fcServiceConfig["arn_role"] = fcConfig["RoleArn"]
}
return fcServiceConfig
}
func convertApiGatewayApiServiceConfigHttpServiceConfigResponse(serviceConfig map[string]interface{}) map[string]interface{} {
httpServiceConfig := map[string]interface{}{}
if serviceConfig == nil {
return httpServiceConfig
}
httpServiceConfig["address"] = serviceConfig["ServiceAddress"]
httpServiceConfig["path"] = serviceConfig["ServicePath"]
httpServiceConfig["method"] = serviceConfig["ServiceHttpMethod"]
httpServiceConfig["timeout"] = serviceConfig["ServiceTimeout"]
httpServiceConfig["aone_name"] = serviceConfig["AoneAppName"]
httpServiceConfig["content_type_category"] = serviceConfig["ContentTypeCatagory"]
httpServiceConfig["content_type_value"] = serviceConfig["ContentTypeValue"]
return httpServiceConfig
}
func convertApiGatewayApiRequestParamsResponse(objectRaw map[string]interface{}) []map[string]interface{} {
var requestParams []map[string]interface{}
if objectRaw == nil {
return requestParams
}
serviceParametersMap, ok := objectRaw["ServiceParametersMap"].(map[string]interface{})
if !ok {
return requestParams
}
serviceParameterMap, ok := serviceParametersMap["ServiceParameterMap"].([]interface{})
if !ok {
return requestParams
}
for _, mapParam := range serviceParameterMap {
param := map[string]interface{}{}
paramMap, ok := mapParam.(map[string]interface{})
if !ok {
continue
}
requestName := paramMap["RequestParameterName"]
serviceName := paramMap["ServiceParameterName"]
serviceParameters, ok := objectRaw["ServiceParameters"].(map[string]interface{})
if !ok {
continue
}
serviceParameter, ok := serviceParameters["ServiceParameter"].([]interface{})
if !ok {
continue
}
for _, serviceParam := range serviceParameter {
serviceParamMap, ok := serviceParam.(map[string]interface{})
if !ok {
continue
}
if serviceParamMap["ServiceParameterName"] == serviceName {
param["name_service"] = serviceName
param["in_service"] = strings.ToUpper(serviceParamMap["Location"].(string))
break
}
}
requestParameters, ok := objectRaw["RequestParameters"].(map[string]interface{})
if !ok {
continue
}
requestParameter, ok := requestParameters["RequestParameter"].([]interface{})
if !ok {
continue
}
for _, requestParam := range requestParameter {
requestParamMap, ok := requestParam.(map[string]interface{})
if !ok {
continue
}
if requestParamMap["ApiParameterName"] == requestName {
param["name"] = requestName
param["type"] = requestParamMap["ParameterType"]
param["required"] = requestParamMap["Required"]
param["in"] = requestParamMap["Location"]
if description, ok := requestParamMap["Description"]; ok && description != "" {
param["description"] = description
}
if defaultValue, ok := requestParamMap["DefaultValue"]; ok && defaultValue != "" {
param["default_value"] = defaultValue
}
break
}
}
requestParams = append(requestParams, param)
}
return requestParams
}
func convertApiGatewayApiConstantParamsResponse(source interface{}) []map[string]interface{} {
var constantParams []map[string]interface{}
if source == nil {
return constantParams
}
constantParametersMap, ok := source.(map[string]interface{})
if !ok {
return constantParams
}
constantParameter, ok := constantParametersMap["ConstantParameter"].([]interface{})
if !ok {
return constantParams
}
for _, constantParam := range constantParameter {
param := map[string]interface{}{}
constantParamMap, ok := constantParam.(map[string]interface{})
if !ok {
continue
}
param["name"] = constantParamMap["ServiceParameterName"]
param["in"] = constantParamMap["Location"]
param["value"] = constantParamMap["ConstantValue"]
if description, ok := constantParamMap["Description"]; ok && description != "" {
param["description"] = description
}
constantParams = append(constantParams, param)
}
return constantParams
}
func convertApiGatewayApiSystemParamsResponse(source interface{}) []map[string]interface{} {
var systemParams []map[string]interface{}
if source == nil {
return systemParams
}
systemParametersMap, ok := source.(map[string]interface{})
if !ok {
return systemParams
}
systemParameter, ok := systemParametersMap["SystemParameter"].([]interface{})
if !ok {
return systemParams
}
for _, systemParam := range systemParameter {
param := map[string]interface{}{}
systemParamMap, ok := systemParam.(map[string]interface{})
if !ok {
continue
}
param["name"] = systemParamMap["ParameterName"]
param["in"] = systemParamMap["Location"]
param["name_service"] = systemParamMap["ServiceParameterName"]
systemParams = append(systemParams, param)
}
return systemParams
}