alibabacloudstack/service_apsarastack_vpn_gateway.go (382 lines of code) (raw):
package alibabacloudstack
import (
"time"
"strings"
"encoding/json"
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/vpc"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
)
type VpnGatewayService struct {
client *connectivity.AlibabacloudStackClient
}
func (s *VpnGatewayService) DoVpcDescribevpngatewayRequest(id string) (v vpc.DescribeVpnGatewayResponse, err error) {
return s.DescribeVpnGateway(id)
}
func (s *VpnGatewayService) DescribeVpnGateway(id string) (v vpc.DescribeVpnGatewayResponse, err error) {
request := vpc.CreateDescribeVpnGatewayRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.VpnGatewayId = id
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVpnGateway(request)
})
response, ok := raw.(*vpc.DescribeVpnGatewayResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"Forbidden", "InvalidVpnGatewayInstanceId.NotFound"}) {
return v, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if response.VpnGatewayId != id {
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VpnGateway", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return *response, nil
}
func (s *VpnGatewayService) DoVpcDescribecustomergatewayRequest(id string) (v vpc.DescribeCustomerGatewayResponse, err error) {
return s.DescribeVpnCustomerGateway(id)
}
func (s *VpnGatewayService) DescribeVpnCustomerGateway(id string) (v vpc.DescribeCustomerGatewayResponse, err error) {
request := vpc.CreateDescribeCustomerGatewayRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.CustomerGatewayId = id
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeCustomerGateway(request)
})
response, ok := raw.(*vpc.DescribeCustomerGatewayResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"Forbidden", "InvalidCustomerGatewayInstanceId.NotFound"}) {
return v, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if response.CustomerGatewayId != id {
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VpnCustomerGateway", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return *response, nil
}
func (s *VpnGatewayService) DescribeVpnConnection(id string) (v vpc.DescribeVpnConnectionResponse, err error) {
request := vpc.CreateDescribeVpnConnectionRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.VpnConnectionId = id
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVpnConnection(request)
})
response, ok := raw.(*vpc.DescribeVpnConnectionResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"Forbidden", "InvalidVpnConnectionInstanceId.NotFound"}) {
return v, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if response.VpnConnectionId != id {
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VpnConnection", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return *response, nil
}
func (s *VpnGatewayService) DescribeSslVpnServer(id string) (v vpc.SslVpnServer, err error) {
request := vpc.CreateDescribeSslVpnServersRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.SslVpnServerId = id
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeSslVpnServers(request)
})
response, ok := raw.(*vpc.DescribeSslVpnServersResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"Forbidden", "InvalidSslVpnServerId.NotFound"}) {
return v, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.SslVpnServers.SslVpnServer) == 0 || response.SslVpnServers.SslVpnServer[0].SslVpnServerId != id {
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SslVpnGateway", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return response.SslVpnServers.SslVpnServer[0], nil
}
func (s *VpnGatewayService) DescribeSslVpnClientCert(id string) (v vpc.DescribeSslVpnClientCertResponse, err error) {
request := vpc.CreateDescribeSslVpnClientCertRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.SslVpnClientCertId = id
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeSslVpnClientCert(request)
})
response, ok := raw.(*vpc.DescribeSslVpnClientCertResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"Forbidden", "InvalidSslVpnClientCertId.NotFound"}) {
return v, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if response.SslVpnClientCertId != id {
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SslVpnClientCert", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return *response, nil
}
func (s *VpnGatewayService) DescribeVpnRouteEntry(id string) (v vpc.VpnRouteEntry, err error) {
request := vpc.CreateDescribeVpnRouteEntriesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
parts, err := ParseResourceId(id, 3)
if err != nil {
return v, errmsgs.WrapError(err)
}
gatewayId := parts[0]
request.VpnGatewayId = gatewayId
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVpnRouteEntries(request)
})
response, ok := raw.(*vpc.DescribeVpnRouteEntriesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"Forbidden", "InvalidVpnGatewayInstanceId.NotFound"}) {
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VpnRouterEntry", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
for _, routeEntry := range response.VpnRouteEntries.VpnRouteEntry {
if id == gatewayId+":"+routeEntry.NextHop+":"+routeEntry.RouteDest {
return routeEntry, nil
}
}
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VpnRouterEntry", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
func (s *VpnGatewayService) WaitForVpnGateway(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeVpnGateway(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if strings.EqualFold(object.Status, string(status)) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpnGatewayService) WaitForVpnConnection(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeVpnConnection(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if status != Deleted && object.VpnConnectionId == id {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpnGatewayService) WaitForVpnCustomerGateway(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeVpnCustomerGateway(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.CustomerGatewayId == id && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpnGatewayService) WaitForSslVpnServer(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeSslVpnServer(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.SslVpnServerId == id && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpnGatewayService) WaitForSslVpnClientCert(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeSslVpnClientCert(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpnGatewayService) WaitForVpnRouteEntry(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeVpnRouteEntry(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
parts, err := ParseResourceId(id, 3)
if err != nil {
return errmsgs.WrapError(err)
}
if object.NextHop == parts[1] && object.RouteDest == parts[2] && string(status) != string(Deleted) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpnGatewayService) ParseIkeConfig(ike vpc.IkeConfig) (ikeConfigs []map[string]interface{}) {
item := map[string]interface{}{
"ike_auth_alg": ike.IkeAuthAlg,
"ike_enc_alg": ike.IkeEncAlg,
"ike_lifetime": ike.IkeLifetime,
"ike_local_id": ike.LocalId,
"ike_mode": ike.IkeMode,
"ike_pfs": ike.IkePfs,
"ike_remote_id": ike.RemoteId,
"ike_version": ike.IkeVersion,
"psk": ike.Psk,
}
ikeConfigs = append(ikeConfigs, item)
return
}
func (s *VpnGatewayService) ParseIpsecConfig(ipsec vpc.IpsecConfig) (ipsecConfigs []map[string]interface{}) {
item := map[string]interface{}{
"ipsec_auth_alg": ipsec.IpsecAuthAlg,
"ipsec_enc_alg": ipsec.IpsecEncAlg,
"ipsec_lifetime": ipsec.IpsecLifetime,
"ipsec_pfs": ipsec.IpsecPfs,
}
ipsecConfigs = append(ipsecConfigs, item)
return
}
func (s *VpnGatewayService) AssembleIkeConfig(ikeCfgParam []interface{}) (string, error) {
var ikeCfg IkeConfig
v := ikeCfgParam[0]
item := v.(map[string]interface{})
ikeCfg = IkeConfig{
IkeAuthAlg: item["ike_auth_alg"].(string),
IkeEncAlg: item["ike_enc_alg"].(string),
IkeLifetime: item["ike_lifetime"].(int),
LocalId: item["ike_local_id"].(string),
IkeMode: item["ike_mode"].(string),
IkePfs: item["ike_pfs"].(string),
RemoteId: item["ike_remote_id"].(string),
IkeVersion: item["ike_version"].(string),
Psk: item["psk"].(string),
}
data, err := json.Marshal(ikeCfg)
if err != nil {
return "", errmsgs.WrapError(err)
}
return string(data), nil
}
func (s *VpnGatewayService) AssembleIpsecConfig(ipsecCfgParam []interface{}) (string, error) {
var ipsecCfg IpsecConfig
v := ipsecCfgParam[0]
item := v.(map[string]interface{})
ipsecCfg = IpsecConfig{
IpsecAuthAlg: item["ipsec_auth_alg"].(string),
IpsecEncAlg: item["ipsec_enc_alg"].(string),
IpsecLifetime: item["ipsec_lifetime"].(int),
IpsecPfs: item["ipsec_pfs"].(string),
}
data, err := json.Marshal(ipsecCfg)
if err != nil {
return "", errmsgs.WrapError(err)
}
return string(data), nil
}
func (s *VpnGatewayService) AssembleNetworkSubnetToString(list []interface{}) string {
if len(list) < 1 {
return ""
}
var items []string
for _, id := range list {
items = append(items, fmt.Sprintf("%s", id))
}
return fmt.Sprintf("%s", strings.Join(items, COMMA_SEPARATED))
}
func TimestampToStr(timestamp int64) string {
tm := time.Unix(timestamp/1000, 0)
timeString := tm.Format("2006-01-02T15:04:05Z")
return timeString
}