alibabacloudstack/resource_apsarastack_apigateway_api.go (915 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"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/aliyun/alibaba-cloud-sdk-go/services/cloudapi"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackApigatewayApi() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"group_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
Deprecated: "Field 'name' is deprecated and will be removed in a future release. Please use new field 'api_name' instead.",
ConflictsWith: []string{"api_name"},
},
"api_name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringLenBetween(2, 128),
ConflictsWith: []string{"name"},
},
"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,
},
},
},
},
"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,
},
},
},
},
"fc_service_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Required: true,
},
"function_name": {
Type: schema.TypeString,
Required: true,
},
"service_name": {
Type: schema.TypeString,
Required: true,
},
"arn_role": {
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,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackApigatewayApiCreate, resourceAlibabacloudStackApigatewayApiRead, resourceAlibabacloudStackApigatewayApiUpdate, resourceAlibabacloudStackApigatewayApiDelete)
return resource
}
func resourceAlibabacloudStackApigatewayApiCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request, err := buildAlibabacloudStackApiArgs(d, meta)
if err != nil {
return errmsgs.WrapError(err)
}
client.InitRpcRequest(*request.RpcRequest)
raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) {
return cloudApiClient.CreateApi(request)
})
response, ok := raw.(*cloudapi.CreateApiResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(raw.(*cloudapi.CreateApiResponse).BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_api-gateway_api", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
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 errmsgs.WrapError(err)
}
}
return nil
}
func resourceAlibabacloudStackApigatewayApiRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
cloudApiService := CloudApiService{client}
request := cloudapi.CreateDescribeApiRequest()
client.InitRpcRequest(*request.RpcRequest)
request.ApiId = d.Get("api_id").(string)
request.GroupId = d.Get("group_id").(string)
object, err := cloudApiService.DescribeApiGatewayApi(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
stageNames, err := getStageNameList(d, cloudApiService)
if err != nil {
if !errmsgs.NotFoundError(err) {
return errmsgs.WrapError(err)
}
}
if err := d.Set("stage_names", stageNames); err != nil {
return errmsgs.WrapError(err)
}
d.Set("api_id", object.ApiId)
d.Set("group_id", object.GroupId)
connectivity.SetResourceData(d, object.ApiName, "api_name", "name")
d.Set("description", object.Description)
d.Set("auth_type", object.AuthType)
d.Set("force_nonce_check", object.ForceNonceCheck)
requestConfig := map[string]interface{}{}
requestConfig["protocol"] = object.RequestConfig.RequestProtocol
requestConfig["method"] = object.RequestConfig.RequestHttpMethod
requestConfig["path"] = object.RequestConfig.RequestPath
requestConfig["mode"] = object.RequestConfig.RequestMode
if object.RequestConfig.BodyFormat != "" {
requestConfig["body_format"] = object.RequestConfig.BodyFormat
}
if err := d.Set("request_config", []map[string]interface{}{requestConfig}); err != nil {
return errmsgs.WrapError(err)
}
if object.ServiceConfig.Mock == "TRUE" {
d.Set("service_type", "MOCK")
MockServiceConfig := map[string]interface{}{}
MockServiceConfig["result"] = object.ServiceConfig.MockResult
MockServiceConfig["aone_name"] = object.ServiceConfig.AoneAppName
if err := d.Set("mock_service_config", []map[string]interface{}{MockServiceConfig}); err != nil {
return errmsgs.WrapError(err)
}
} else if object.ServiceConfig.ServiceVpcEnable == "TRUE" {
d.Set("service_type", "HTTP-VPC")
vpcServiceConfig := map[string]interface{}{}
vpcServiceConfig["name"] = object.ServiceConfig.VpcConfig.Name
vpcServiceConfig["path"] = object.ServiceConfig.ServicePath
vpcServiceConfig["method"] = object.ServiceConfig.ServiceHttpMethod
vpcServiceConfig["timeout"] = object.ServiceConfig.ServiceTimeout
vpcServiceConfig["aone_name"] = object.ServiceConfig.AoneAppName
if err := d.Set("http_vpc_service_config", []map[string]interface{}{vpcServiceConfig}); err != nil {
return errmsgs.WrapError(err)
}
} else if object.ServiceConfig.ServiceProtocol == "FunctionCompute" {
d.Set("service_type", "FunctionCompute")
fcServiceConfig := map[string]interface{}{}
fcServiceConfig["region"] = object.ServiceConfig.FunctionComputeConfig.RegionId
fcServiceConfig["function_name"] = object.ServiceConfig.FunctionComputeConfig.FunctionName
fcServiceConfig["service_name"] = object.ServiceConfig.FunctionComputeConfig.ServiceName
fcServiceConfig["arn_role"] = object.ServiceConfig.FunctionComputeConfig.RoleArn
fcServiceConfig["timeout"] = object.ServiceConfig.ServiceTimeout
if err := d.Set("fc_service_config", []map[string]interface{}{fcServiceConfig}); err != nil {
return errmsgs.WrapError(err)
}
} else {
d.Set("service_type", "HTTP")
httpServiceConfig := map[string]interface{}{}
httpServiceConfig["address"] = object.ServiceConfig.ServiceAddress
httpServiceConfig["path"] = object.ServiceConfig.ServicePath
httpServiceConfig["method"] = object.ServiceConfig.ServiceHttpMethod
httpServiceConfig["timeout"] = object.ServiceConfig.ServiceTimeout
httpServiceConfig["aone_name"] = object.ServiceConfig.AoneAppName
if err := d.Set("http_service_config", []map[string]interface{}{httpServiceConfig}); err != nil {
return errmsgs.WrapError(err)
}
}
requestParams := []map[string]interface{}{}
for _, mapParam := range object.ServiceParametersMap.ServiceParameterMap {
param := map[string]interface{}{}
requestName := mapParam.RequestParameterName
serviceName := mapParam.ServiceParameterName
for _, serviceParam := range object.ServiceParameters.ServiceParameter {
if serviceParam.ServiceParameterName == serviceName {
param["name_service"] = serviceName
param["in_service"] = strings.ToUpper(serviceParam.Location)
break
}
}
for _, requestParam := range object.RequestParameters.RequestParameter {
if requestParam.ApiParameterName == requestName {
param["name"] = requestName
param["type"] = requestParam.ParameterType
param["required"] = requestParam.Required
param["in"] = requestParam.Location
if requestParam.Description != "" {
param["description"] = requestParam.Description
}
if requestParam.DefaultValue != "" {
param["default_value"] = requestParam.DefaultValue
}
break
}
}
requestParams = append(requestParams, param)
}
d.Set("request_parameters", requestParams)
constantParams := []map[string]interface{}{}
for _, constantParam := range object.ConstantParameters.ConstantParameter {
param := map[string]interface{}{}
param["name"] = constantParam.ServiceParameterName
param["in"] = constantParam.Location
param["value"] = constantParam.ConstantValue
if constantParam.Description != "" {
param["description"] = constantParam.Description
}
constantParams = append(constantParams, param)
}
d.Set("constant_parameters", constantParams)
SystemParams := []map[string]interface{}{}
for _, systemParam := range object.SystemParameters.SystemParameter {
param := map[string]interface{}{}
param["name"] = systemParam.ParameterName
param["in"] = systemParam.Location
param["name_service"] = systemParam.ServiceParameterName
}
d.Set("system_parameters", SystemParams)
return nil
}
func resourceAlibabacloudStackApigatewayApiUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := cloudapi.CreateModifyApiRequest()
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return errmsgs.WrapError(err)
}
request.ApiId = parts[1]
request.GroupId = parts[0]
update := false
d.Partial(true)
if d.HasChanges("api_name","name","description","auth_type") {
update = true
}
request.ApiName = connectivity.GetResourceData(d, "api_name", "name").(string)
if err := errmsgs.CheckEmpty(request.ApiName, schema.TypeString, "api_name", "name"); err != nil {
return errmsgs.WrapError(err)
}
request.Description = d.Get("description").(string)
request.AuthType = d.Get("auth_type").(string)
client.InitRpcRequest(*request.RpcRequest)
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") {
update = true
}
serviceConfig, err := serviceConfigToJsonStr(d)
if err != nil {
return errmsgs.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 errmsgs.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)
})
response, ok := raw.(*cloudapi.ModifyApiResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
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 errmsgs.WrapError(err)
}
}
//d.SetPartial("stage_names")
}
d.Partial(false)
return nil
}
func resourceAlibabacloudStackApigatewayApiDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
cloudApiService := CloudApiService{client}
request := cloudapi.CreateDeleteApiRequest()
client.InitRpcRequest(*request.RpcRequest)
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ConcurrencyLockTimeout"}) {
time.Sleep(3 * time.Second)
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
if err != nil {
return errmsgs.WrapError(err)
}
_, err = cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
if !errmsgs.NotFoundError(err) {
return errmsgs.WrapError(err)
}
}
}
raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) {
return cloudApiClient.DeleteApi(request)
})
response, ok := raw.(*cloudapi.DeleteApiResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"NotFoundApi"}) {
return nil
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return errmsgs.WrapError(cloudApiService.WaitForApiGatewayApi(d.Id(), Deleted, DefaultTimeout))
}
func buildAlibabacloudStackApiArgs(d *schema.ResourceData, meta interface{}) (*cloudapi.CreateApiRequest, error) {
request := cloudapi.CreateCreateApiRequest()
client := meta.(*connectivity.AlibabacloudStackClient)
client.InitRpcRequest(*request.RpcRequest)
request.GroupId = d.Get("group_id").(string)
request.Description = d.Get("description").(string)
request.ApiName = connectivity.GetResourceData(d, "api_name", "name").(string)
if err := errmsgs.CheckEmpty(request.ApiName, schema.TypeString, "api_name", "name"); err != nil {
return request, errmsgs.WrapError(err)
}
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, errmsgs.WrapError(err)
}
request.RequestConfig = requestConfig
serviceConfig, err := serviceConfigToJsonStr(d)
if err != nil {
return request, errmsgs.WrapError(err)
}
request.ServiceConfig = serviceConfig
rps, sps, spm, err := setParameters(d)
if err != nil {
return request, errmsgs.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, errmsgs.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), errmsgs.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)
}
configStr, err := json.Marshal(serviceConfig)
return configStr, errmsgs.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{}, errmsgs.WrapError(errmsgs.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)
}
configStr, err := json.Marshal(serviceConfig)
return configStr, errmsgs.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{}, errmsgs.WrapError(errmsgs.Error("Creating apigatway api error: fc_service_config is null"))
}
l = v.([]interface{})
config := l[0].(map[string]interface{})
serviceConfig.Protocol = "FunctionCompute"
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, errmsgs.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{}, errmsgs.WrapError(errmsgs.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, errmsgs.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 "", errmsgs.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 = errmsgs.WrapError(err)
return
}
sps, err = json.Marshal(serviceParameters)
if err != nil {
err = errmsgs.WrapError(err)
return
}
spm, err = json.Marshal(serviceParamMaps)
if err != nil {
err = errmsgs.WrapError(err)
return
}
return rps, sps, spm, errmsgs.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 errmsgs.NotFoundError(err) {
continue
}
return nil, errmsgs.WrapError(err)
}
stageNames = append(stageNames, stageName)
}
return stageNames, nil
}
func updateApiStages(d *schema.ResourceData, stageNames *schema.Set, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
cloudApiService := CloudApiService{client}
for _, stageName := range ApiGatewayStageNames {
if stageNames.Contains(stageName) {
err := cloudApiService.DeployedApi(d.Id(), stageName)
if err != nil {
return errmsgs.WrapError(err)
}
_, err = cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
return errmsgs.WrapError(err)
}
} else {
err := cloudApiService.AbolishApi(d.Id(), stageName)
if err != nil {
return errmsgs.WrapError(err)
}
_, err = cloudApiService.DescribeDeployedApi(d.Id(), stageName)
if err != nil {
if !errmsgs.NotFoundError(err) {
return errmsgs.WrapError(err)
}
}
}
}
return nil
}