mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-06 09:36:58 +02:00
* ci linting fixes Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * remove staticcheck Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * disable naming rule Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * disable stylecheck too Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * linter errors fixes Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * re-add staticcheck Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * fixes various linting issues Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * fix imports Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * fix tlsconfig Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * fix alibabacloud Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * ioutil fixes Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * remove all references to ioutil Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> * ignore linting for azure deprecated sdk Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com> Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com>
280 lines
10 KiB
Go
280 lines
10 KiB
Go
/*
|
|
Copyright 2022 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package cloudapi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"time"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
|
|
dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
|
|
privatedns "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns/v20201028"
|
|
)
|
|
|
|
type defaultTencentAPIService struct {
|
|
RetryDefault int
|
|
TaskCheckInterval time.Duration
|
|
ClientSetService TencentClientSetService
|
|
}
|
|
|
|
func NewTencentAPIService(region string, rate int, secretId string, secretKey string, internetEndpoint bool) *defaultTencentAPIService {
|
|
tencentAPIService := &defaultTencentAPIService{
|
|
RetryDefault: 3,
|
|
TaskCheckInterval: 3 * time.Second,
|
|
ClientSetService: NewTencentClientSetService(region, rate, secretId, secretKey, internetEndpoint),
|
|
}
|
|
return tencentAPIService
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
// PrivateDns API
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
func (api *defaultTencentAPIService) CreatePrivateZoneRecord(request *privatedns.CreatePrivateZoneRecordRequest) (response *privatedns.CreatePrivateZoneRecordResponse, err error) {
|
|
apiAction := CreatePrivateZoneRecord
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.PrivateDnsCli(apiAction.Name)
|
|
if response, err = client.CreatePrivateZoneRecord(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) DeletePrivateZoneRecord(request *privatedns.DeletePrivateZoneRecordRequest) (response *privatedns.DeletePrivateZoneRecordResponse, err error) {
|
|
apiAction := DeletePrivateZoneRecord
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.PrivateDnsCli(apiAction.Name)
|
|
if response, err = client.DeletePrivateZoneRecord(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) ModifyPrivateZoneRecord(request *privatedns.ModifyPrivateZoneRecordRequest) (response *privatedns.ModifyPrivateZoneRecordResponse, err error) {
|
|
apiAction := ModifyPrivateZoneRecord
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.PrivateDnsCli(apiAction.Name)
|
|
if response, err = client.ModifyPrivateZoneRecord(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) DescribePrivateZoneList(request *privatedns.DescribePrivateZoneListRequest) (response *privatedns.DescribePrivateZoneListResponse, err error) {
|
|
apiAction := DescribePrivateZoneList
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.PrivateDnsCli(apiAction.Name)
|
|
if response, err = client.DescribePrivateZoneList(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) DescribePrivateZoneRecordList(request *privatedns.DescribePrivateZoneRecordListRequest) (response *privatedns.DescribePrivateZoneRecordListResponse, err error) {
|
|
apiAction := DescribePrivateZoneRecordList
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.PrivateDnsCli(apiAction.Name)
|
|
if response, err = client.DescribePrivateZoneRecordList(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
// DnsPod API
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
func (api *defaultTencentAPIService) DescribeDomainList(request *dnspod.DescribeDomainListRequest) (response *dnspod.DescribeDomainListResponse, err error) {
|
|
apiAction := DescribeDomainList
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.DnsPodCli(apiAction.Name)
|
|
if response, err = client.DescribeDomainList(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) DescribeRecordList(request *dnspod.DescribeRecordListRequest) (response *dnspod.DescribeRecordListResponse, err error) {
|
|
apiAction := DescribeRecordList
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.DnsPodCli(apiAction.Name)
|
|
if response, err = client.DescribeRecordList(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) CreateRecord(request *dnspod.CreateRecordRequest) (response *dnspod.CreateRecordResponse, err error) {
|
|
apiAction := CreateRecord
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.DnsPodCli(apiAction.Name)
|
|
if response, err = client.CreateRecord(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) DeleteRecord(request *dnspod.DeleteRecordRequest) (response *dnspod.DeleteRecordResponse, err error) {
|
|
apiAction := DeleteRecord
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.DnsPodCli(apiAction.Name)
|
|
if response, err = client.DeleteRecord(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
func (api *defaultTencentAPIService) ModifyRecord(request *dnspod.ModifyRecordRequest) (response *dnspod.ModifyRecordResponse, err error) {
|
|
apiAction := ModifyRecord
|
|
for times := 1; times <= api.RetryDefault; times++ {
|
|
client := api.ClientSetService.DnsPodCli(apiAction.Name)
|
|
if response, err = client.ModifyRecord(request); err != nil {
|
|
requestJson := JsonWrapper(request)
|
|
if retry := dealWithError(apiAction, requestJson, err); retry || times == api.RetryDefault {
|
|
APIErrorRecord(apiAction, requestJson, JsonWrapper(response), err)
|
|
return nil, err
|
|
}
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
APIRecord(apiAction, JsonWrapper(request), JsonWrapper(response))
|
|
return response, nil
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
// API Error Report
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
func dealWithError(action Action, request string, err error) bool {
|
|
log.Errorf("dealWithError %s/%s request: %s, error: %s.", action.Service, action.Name, request, err.Error())
|
|
if sdkError, ok := err.(*errors.TencentCloudSDKError); ok {
|
|
if sdkError.Code == "RequestLimitExceeded" {
|
|
return true
|
|
} else if sdkError.Code == "InternalError" || sdkError.Code == "ClientError.HttpStatusCodeError" {
|
|
return false
|
|
} else if sdkError.Code == "ClientError.NetworkError" {
|
|
return false
|
|
} else if sdkError.Code == "AuthFailure.UnauthorizedOperation" || sdkError.Code == "UnauthorizedOperation.CamNoAuth" {
|
|
return false
|
|
}
|
|
return false
|
|
}
|
|
|
|
if _, ok := err.(net.Error); ok {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func APIErrorRecord(apiAction Action, request string, response string, err error) {
|
|
log.Infof(fmt.Sprintf("APIError API: %s/%s Request: %s, Response: %s, Error: %s", apiAction.Service, apiAction.Name, request, response, err.Error()))
|
|
}
|
|
|
|
func APIRecord(apiAction Action, request string, response string) {
|
|
message := fmt.Sprintf("APIRecord API: %s/%s Request: %s, Response: %s", apiAction.Service, apiAction.Name, request, response)
|
|
|
|
if apiAction.ReadOnly {
|
|
// log.Infof(message)
|
|
} else {
|
|
log.Infof(message)
|
|
}
|
|
}
|
|
|
|
func JsonWrapper(obj interface{}) string {
|
|
if jsonStr, jsonErr := json.Marshal(obj); jsonErr == nil {
|
|
return string(jsonStr)
|
|
}
|
|
return "json_format_error"
|
|
}
|