From 38dc8a63d962268dcfdb7e2a7a1863d63bac4c40 Mon Sep 17 00:00:00 2001 From: Leo Chen Date: Sun, 27 Oct 2024 23:48:52 +0800 Subject: [PATCH 1/2] enhance: resolve error on tencent cdn dupe deployment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化:腾讯云cdn重复部署报错的问题 --- internal/deployer/deployer.go | 10 ++++++ internal/deployer/tencent_cdn.go | 60 +++++++++++++++++++++++++++----- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/internal/deployer/deployer.go b/internal/deployer/deployer.go index c4530df4..113a92d6 100644 --- a/internal/deployer/deployer.go +++ b/internal/deployer/deployer.go @@ -195,3 +195,13 @@ func getDeployVariables(conf domain.DeployConfig) map[string]string { return rs } + +// contains 检查字符串切片中是否包含指定的字符串 +func contains(slice []string, item string) bool { + for _, s := range slice { + if s == item { + return true + } + } + return false +} \ No newline at end of file diff --git a/internal/deployer/tencent_cdn.go b/internal/deployer/tencent_cdn.go index aa315466..e3c968e9 100644 --- a/internal/deployer/tencent_cdn.go +++ b/internal/deployer/tencent_cdn.go @@ -2,7 +2,6 @@ package deployer import ( "context" - "encoding/base64" "encoding/json" "fmt" "strings" @@ -100,16 +99,23 @@ func (d *TencentCDNDeployer) deploy(certId string) error { // 如果是泛域名就从cdn列表下获取SSL证书中的可用域名 domain := getDeployString(d.option.DeployConfig, "domain") if strings.Contains(domain, "*") { - list, errGetList := d.getDomainList() + list, errGetList := d.getDomainList(certId) if errGetList != nil { return fmt.Errorf("failed to get certificate domain list: %w", errGetList) } - if list == nil || len(list) == 0 { - return fmt.Errorf("failed to get certificate domain list: empty list.") + if len(list) == 0 { + d.infos = append(d.infos, "没有需要部署的实例") + return nil } request.InstanceIdList = common.StringPtrs(list) } else { // 否则直接使用传入的域名 - request.InstanceIdList = common.StringPtrs([]string{domain}) + if(isDomainDeployed(certId, domain)){ + d.infos = append(d.infos, "域名已部署") + return nil + } + else{ + request.InstanceIdList = common.StringPtrs([]string{domain}) + } } // 返回的resp是一个DeployCertificateInstanceResponse的实例,与请求对象对应 @@ -121,23 +127,61 @@ func (d *TencentCDNDeployer) deploy(certId string) error { return nil } -func (d *TencentCDNDeployer) getDomainList() ([]string, error) { +func (d *TencentCDNDeployer) getDomainList(certId string) ([]string, error) { cpf := profile.NewClientProfile() cpf.HttpProfile.Endpoint = "cdn.tencentcloudapi.com" client, _ := cdn.NewClient(d.credential, "", cpf) request := cdn.NewDescribeCertDomainsRequest() - cert := base64.StdEncoding.EncodeToString([]byte(d.option.Certificate.Certificate)) - request.Cert = &cert + request.CertId = common.StringPtr(certId) response, err := client.DescribeCertDomains(request) if err != nil { return nil, fmt.Errorf("failed to get domain list: %w", err) } + deployedDomains, err := d.getDeployedDomainList(certId) + if err != nil { + return nil, fmt.Errorf("failed to get deployed domain list: %w", err) + } + domains := make([]string, 0) for _, domain := range response.Response.Domains { + domainStr := *domain + if(contains(deployedDomains, domainStr)){ + domains = append(domains, domainStr) + } + } + + return domains, nil +} + +func (d *TencentCDNDeployer) isDomainDeployed(certId, domain string) (bool, error) { + deployedDomains, err := d.getDeployedDomainList(certId) + if(err != nil){ + return false, err + } + + return contains(deployedDomains, domain), nil +} + +func (d *TencentCDNDeployer) getDeployedDomainList(certId string) ([]string, error) { + cpf := profile.NewClientProfile() + cpf.HttpProfile.Endpoint = "ssl.tencentcloudapi.com" + client, _ := ssl.NewClient(d.credential, "", cpf) + + request := ssl.NewDescribeDeployedResourcesRequest() + request.CertificateIds = common.StringPtrs([]string{certId}) + request.ResourceType = common.StringPtr("cdn") + + response, err := client.DescribeDeployedResources(request) + if err != nil { + return nil, fmt.Errorf("failed to get deployed domain list: %w", err) + } + + domains := make([]string, 0) + for _, domain := range response.Response.DeployedResources[0].Resources { domains = append(domains, *domain) } From c419b2c8b4b0a9fa988c9dadabc78d29d545b545 Mon Sep 17 00:00:00 2001 From: Leo Chen Date: Mon, 28 Oct 2024 20:28:13 +0800 Subject: [PATCH 2/2] use slice pkg --- go.mod | 5 +++-- go.sum | 4 ++++ internal/deployer/deployer.go | 10 ---------- internal/deployer/tencent_cdn.go | 11 ++++++----- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index e5ef76c1..7ce3ede6 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,9 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1017 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1030 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.992 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1030 golang.org/x/crypto v0.28.0 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 k8s.io/api v0.31.1 k8s.io/apimachinery v0.31.1 k8s.io/client-go v0.31.1 @@ -58,7 +60,6 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/technoweenie/multipartstreamer v1.0.1 // indirect - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1030 // indirect github.com/x448/float16 v0.8.4 // indirect go.mongodb.org/mongo-driver v1.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -111,7 +112,7 @@ require ( github.com/domodwyer/mailyak/v3 v3.6.2 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.17.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/ganigeorgiev/fexpr v0.4.1 // indirect github.com/go-jose/go-jose/v4 v4.0.4 // indirect github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect diff --git a/go.sum b/go.sum index 69a4a09c..05531e6b 100644 --- a/go.sum +++ b/go.sum @@ -206,6 +206,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw= github.com/ganigeorgiev/fexpr v0.4.1 h1:hpUgbUEEWIZhSDBtf4M9aUNfQQ0BZkGRaMePy7Gcx5k= github.com/ganigeorgiev/fexpr v0.4.1/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE= @@ -531,6 +533,8 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= diff --git a/internal/deployer/deployer.go b/internal/deployer/deployer.go index 113a92d6..c26907db 100644 --- a/internal/deployer/deployer.go +++ b/internal/deployer/deployer.go @@ -194,14 +194,4 @@ func getDeployVariables(conf domain.DeployConfig) map[string]string { } return rs -} - -// contains 检查字符串切片中是否包含指定的字符串 -func contains(slice []string, item string) bool { - for _, s := range slice { - if s == item { - return true - } - } - return false } \ No newline at end of file diff --git a/internal/deployer/tencent_cdn.go b/internal/deployer/tencent_cdn.go index e3c968e9..26c9c252 100644 --- a/internal/deployer/tencent_cdn.go +++ b/internal/deployer/tencent_cdn.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "strings" + "golang.org/x/exp/slices" cdn "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn/v20180606" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -109,11 +110,11 @@ func (d *TencentCDNDeployer) deploy(certId string) error { } request.InstanceIdList = common.StringPtrs(list) } else { // 否则直接使用传入的域名 - if(isDomainDeployed(certId, domain)){ + deployed, _ := d.isDomainDeployed(certId, domain) + if(deployed){ d.infos = append(d.infos, "域名已部署") return nil - } - else{ + }else{ request.InstanceIdList = common.StringPtrs([]string{domain}) } } @@ -149,7 +150,7 @@ func (d *TencentCDNDeployer) getDomainList(certId string) ([]string, error) { domains := make([]string, 0) for _, domain := range response.Response.Domains { domainStr := *domain - if(contains(deployedDomains, domainStr)){ + if(slices.Contains(deployedDomains, domainStr)){ domains = append(domains, domainStr) } } @@ -163,7 +164,7 @@ func (d *TencentCDNDeployer) isDomainDeployed(certId, domain string) (bool, erro return false, err } - return contains(deployedDomains, domain), nil + return slices.Contains(deployedDomains, domain), nil } func (d *TencentCDNDeployer) getDeployedDomainList(certId string) ([]string, error) {