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>
122 lines
3.5 KiB
Go
122 lines
3.5 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 tencentcloud
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"sigs.k8s.io/external-dns/endpoint"
|
|
"sigs.k8s.io/external-dns/plan"
|
|
"sigs.k8s.io/external-dns/provider"
|
|
"sigs.k8s.io/external-dns/provider/tencentcloud/cloudapi"
|
|
)
|
|
|
|
const (
|
|
TencentCloudEmptyPrefix = "@"
|
|
DefaultAPIRate = 9
|
|
)
|
|
|
|
func NewTencentCloudProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, configFile string, zoneType string, dryRun bool) (*TencentCloudProvider, error) {
|
|
cfg := tencentCloudConfig{}
|
|
if configFile != "" {
|
|
contents, err := os.ReadFile(configFile)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to read Tencent Cloud config file '%s': %w", configFile, err)
|
|
}
|
|
err = json.Unmarshal(contents, &cfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse Tencent Cloud config file '%s': %w", configFile, err)
|
|
}
|
|
}
|
|
|
|
var apiService cloudapi.TencentAPIService = cloudapi.NewTencentAPIService(cfg.RegionId, DefaultAPIRate, cfg.SecretId, cfg.SecretKey, cfg.InternetEndpoint)
|
|
if dryRun {
|
|
apiService = cloudapi.NewReadOnlyAPIService(cfg.RegionId, DefaultAPIRate, cfg.SecretId, cfg.SecretKey, cfg.InternetEndpoint)
|
|
}
|
|
|
|
tencentCloudProvider := &TencentCloudProvider{
|
|
domainFilter: domainFilter,
|
|
zoneIDFilter: zoneIDFilter,
|
|
apiService: apiService,
|
|
vpcID: cfg.VPCId,
|
|
privateZone: zoneType == "private",
|
|
}
|
|
|
|
return tencentCloudProvider, nil
|
|
}
|
|
|
|
type TencentCloudProvider struct {
|
|
provider.BaseProvider
|
|
apiService cloudapi.TencentAPIService
|
|
domainFilter endpoint.DomainFilter
|
|
zoneIDFilter provider.ZoneIDFilter // Private Zone only
|
|
vpcID string // Private Zone only
|
|
privateZone bool
|
|
}
|
|
|
|
type tencentCloudConfig struct {
|
|
RegionId string `json:"regionId" yaml:"regionId"`
|
|
SecretId string `json:"secretId" yaml:"secretId"`
|
|
SecretKey string `json:"secretKey" yaml:"secretKey"`
|
|
VPCId string `json:"vpcId" yaml:"vpcId"`
|
|
InternetEndpoint bool `json:"internetEndpoint" yaml:"internetEndpoint"`
|
|
}
|
|
|
|
func (p *TencentCloudProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, error) {
|
|
if p.privateZone {
|
|
return p.privateZoneRecords()
|
|
}
|
|
return p.dnsRecords()
|
|
}
|
|
|
|
func (p *TencentCloudProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
|
|
if !changes.HasChanges() {
|
|
return nil
|
|
}
|
|
|
|
log.Infof("apply changes. %s", cloudapi.JsonWrapper(changes))
|
|
|
|
if p.privateZone {
|
|
return p.applyChangesForPrivateZone(changes)
|
|
}
|
|
return p.applyChangesForDNS(changes)
|
|
}
|
|
|
|
func getSubDomain(domain string, endpoint *endpoint.Endpoint) string {
|
|
name := endpoint.DNSName
|
|
name = name[:len(name)-len(domain)]
|
|
name = strings.TrimSuffix(name, ".")
|
|
|
|
if name == "" {
|
|
return TencentCloudEmptyPrefix
|
|
}
|
|
return name
|
|
}
|
|
|
|
func getDnsDomain(subDomain string, domain string) string {
|
|
if subDomain == TencentCloudEmptyPrefix {
|
|
return domain
|
|
}
|
|
return subDomain + "." + domain
|
|
}
|