diff --git a/internal/deployer/providers.go b/internal/deployer/providers.go
index 00feace5..708dc6d0 100644
--- a/internal/deployer/providers.go
+++ b/internal/deployer/providers.go
@@ -1130,6 +1130,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudCDN.NewSSLDeployerProvider(&pTencentCloudCDN.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
})
return deployer, err
@@ -1138,6 +1139,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudCLB.NewSSLDeployerProvider(&pTencentCloudCLB.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Region: xmaps.GetString(options.ProviderServiceConfig, "region"),
ResourceType: pTencentCloudCLB.ResourceType(xmaps.GetString(options.ProviderServiceConfig, "resourceType")),
LoadbalancerId: xmaps.GetString(options.ProviderServiceConfig, "loadbalancerId"),
@@ -1160,6 +1162,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudCSS.NewSSLDeployerProvider(&pTencentCloudCSS.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
})
return deployer, err
@@ -1168,6 +1171,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudECDN.NewSSLDeployerProvider(&pTencentCloudECDN.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
})
return deployer, err
@@ -1176,6 +1180,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudEO.NewSSLDeployerProvider(&pTencentCloudEO.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
ZoneId: xmaps.GetString(options.ProviderServiceConfig, "zoneId"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
})
@@ -1185,6 +1190,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudGAAP.NewSSLDeployerProvider(&pTencentCloudGAAP.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
ResourceType: pTencentCloudGAAP.ResourceType(xmaps.GetString(options.ProviderServiceConfig, "resourceType")),
ProxyId: xmaps.GetString(options.ProviderServiceConfig, "proxyId"),
ListenerId: xmaps.GetString(options.ProviderServiceConfig, "listenerId"),
@@ -1195,6 +1201,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudSCF.NewSSLDeployerProvider(&pTencentCloudSCF.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Region: xmaps.GetString(options.ProviderServiceConfig, "region"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
})
@@ -1204,6 +1211,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudSSL.NewSSLDeployerProvider(&pTencentCloudSSL.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
})
return deployer, err
@@ -1211,6 +1219,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudSSLDeploy.NewSSLDeployerProvider(&pTencentCloudSSLDeploy.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Region: xmaps.GetString(options.ProviderServiceConfig, "region"),
ResourceType: xmaps.GetString(options.ProviderServiceConfig, "resourceType"),
ResourceIds: xslices.Filter(strings.Split(xmaps.GetString(options.ProviderServiceConfig, "resourceIds"), ";"), func(s string) bool { return s != "" }),
@@ -1221,6 +1230,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudVOD.NewSSLDeployerProvider(&pTencentCloudVOD.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
SubAppId: xmaps.GetInt64(options.ProviderServiceConfig, "subAppId"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
})
@@ -1230,6 +1240,7 @@ func createSSLDeployerProvider(options *deployerProviderOptions) (core.SSLDeploy
deployer, err := pTencentCloudWAF.NewSSLDeployerProvider(&pTencentCloudWAF.SSLDeployerProviderConfig{
SecretId: access.SecretId,
SecretKey: access.SecretKey,
+ Endpoint: xmaps.GetString(options.ProviderServiceConfig, "endpoint"),
Domain: xmaps.GetString(options.ProviderServiceConfig, "domain"),
DomainId: xmaps.GetString(options.ProviderServiceConfig, "domainId"),
InstanceId: xmaps.GetString(options.ProviderServiceConfig, "instanceId"),
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go b/pkg/core/ssl-deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go
index 332bf610..73235e07 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go
@@ -6,16 +6,15 @@ import (
"fmt"
"log/slog"
"strings"
- "time"
tccdn "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn/v20180606"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
tcssl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
- "golang.org/x/exp/slices"
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -23,6 +22,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 加速域名(支持泛域名)。
Domain string `json:"domain"`
}
@@ -30,7 +31,7 @@ type SSLDeployerProviderConfig struct {
type SSLDeployerProvider struct {
config *SSLDeployerProviderConfig
logger *slog.Logger
- sdkClients *wSDKClients
+ sdkClient *tccdn.Client
sslManager core.SSLManager
}
@@ -46,7 +47,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- clients, err := createSDKClients(config.SecretId, config.SecretKey)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -54,6 +55,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -62,7 +67,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return &SSLDeployerProvider{
config: config,
logger: slog.Default(),
- sdkClients: clients,
+ sdkClient: client,
sslManager: sslmgr,
}, nil
}
@@ -92,106 +97,51 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
// 获取待部署的 CDN 实例
// 如果是泛域名,根据证书匹配 CDN 实例
- instanceIds := make([]string, 0)
+ domains := make([]string, 0)
if strings.HasPrefix(d.config.Domain, "*.") {
- domains, err := d.getDomainsByCertificateId(upres.CertId)
+ temp, err := d.getDomainsByCertId(ctx, upres.CertId)
if err != nil {
return nil, err
}
- instanceIds = domains
+ domains = temp
} else {
- instanceIds = append(instanceIds, d.config.Domain)
+ domains = append(domains, d.config.Domain)
}
- // 跳过已部署的 CDN 实例
- if len(instanceIds) > 0 {
- deployedDomains, err := d.getDeployedDomainsByCertificateId(upres.CertId)
- if err != nil {
- return nil, err
- }
-
- temp := make([]string, 0)
- for _, instanceId := range instanceIds {
- if !slices.Contains(deployedDomains, instanceId) {
- temp = append(temp, instanceId)
- }
- }
- instanceIds = temp
- }
-
- if len(instanceIds) == 0 {
- d.logger.Info("no cdn instances to deploy")
+ // 遍历更新域名证书
+ if len(domains) == 0 {
+ d.logger.Info("no cdn domains to deploy")
} else {
- d.logger.Info("found cdn instances to deploy", slog.Any("instanceIds", instanceIds))
+ d.logger.Info("found cdn domains to deploy", slog.Any("domains", domains))
+ var errs []error
- // 证书部署到 CDN 实例
- // REF: https://cloud.tencent.com/document/product/400/91667
- deployCertificateInstanceReq := tcssl.NewDeployCertificateInstanceRequest()
- deployCertificateInstanceReq.CertificateId = common.StringPtr(upres.CertId)
- deployCertificateInstanceReq.ResourceType = common.StringPtr("cdn")
- deployCertificateInstanceReq.Status = common.Int64Ptr(1)
- deployCertificateInstanceReq.InstanceIdList = common.StringPtrs(instanceIds)
- deployCertificateInstanceResp, err := d.sdkClients.SSL.DeployCertificateInstance(deployCertificateInstanceReq)
- d.logger.Debug("sdk request 'ssl.DeployCertificateInstance'", slog.Any("request", deployCertificateInstanceReq), slog.Any("response", deployCertificateInstanceResp))
- if err != nil {
- return nil, fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err)
- }
-
- // 循环获取部署任务详情,等待任务状态变更
- // REF: https://cloud.tencent.com/document/api/400/91658
- for {
+ for _, domain := range domains {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
- }
-
- describeHostDeployRecordDetailReq := tcssl.NewDescribeHostDeployRecordDetailRequest()
- describeHostDeployRecordDetailReq.DeployRecordId = common.StringPtr(fmt.Sprintf("%d", *deployCertificateInstanceResp.Response.DeployRecordId))
- describeHostDeployRecordDetailResp, err := d.sdkClients.SSL.DescribeHostDeployRecordDetail(describeHostDeployRecordDetailReq)
- d.logger.Debug("sdk request 'ssl.DescribeHostDeployRecordDetail'", slog.Any("request", describeHostDeployRecordDetailReq), slog.Any("response", describeHostDeployRecordDetailResp))
- if err != nil {
- return nil, fmt.Errorf("failed to execute sdk request 'ssl.DescribeHostDeployRecordDetail': %w", err)
- }
-
- var runningCount, succeededCount, failedCount, totalCount int64
- if describeHostDeployRecordDetailResp.Response.TotalCount == nil {
- return nil, errors.New("unexpected deployment job status")
- } else {
- if describeHostDeployRecordDetailResp.Response.RunningTotalCount != nil {
- runningCount = *describeHostDeployRecordDetailResp.Response.RunningTotalCount
- }
- if describeHostDeployRecordDetailResp.Response.SuccessTotalCount != nil {
- succeededCount = *describeHostDeployRecordDetailResp.Response.SuccessTotalCount
- }
- if describeHostDeployRecordDetailResp.Response.FailedTotalCount != nil {
- failedCount = *describeHostDeployRecordDetailResp.Response.FailedTotalCount
- }
- if describeHostDeployRecordDetailResp.Response.TotalCount != nil {
- totalCount = *describeHostDeployRecordDetailResp.Response.TotalCount
- }
-
- if succeededCount+failedCount == totalCount {
- break
+ if err := d.updateDomainHttpsServerCert(ctx, domain, upres.CertId); err != nil {
+ errs = append(errs, err)
}
}
+ }
- d.logger.Info(fmt.Sprintf("waiting for deployment job completion (running: %d, succeeded: %d, failed: %d, total: %d) ...", runningCount, succeededCount, failedCount, totalCount))
- time.Sleep(time.Second * 5)
+ if len(errs) > 0 {
+ return nil, errors.Join(errs...)
}
}
return &core.SSLDeployResult{}, nil
}
-func (d *SSLDeployerProvider) getDomainsByCertificateId(cloudCertId string) ([]string, error) {
+func (d *SSLDeployerProvider) getDomainsByCertId(ctx context.Context, cloudCertId string) ([]string, error) {
// 获取证书中的可用域名
// REF: https://cloud.tencent.com/document/product/228/42491
describeCertDomainsReq := tccdn.NewDescribeCertDomainsRequest()
describeCertDomainsReq.CertId = common.StringPtr(cloudCertId)
describeCertDomainsReq.Product = common.StringPtr("cdn")
- describeCertDomainsResp, err := d.sdkClients.CDN.DescribeCertDomains(describeCertDomainsReq)
+ describeCertDomainsResp, err := d.sdkClient.DescribeCertDomains(describeCertDomainsReq)
d.logger.Debug("sdk request 'cdn.DescribeCertDomains'", slog.Any("request", describeCertDomainsReq), slog.Any("response", describeCertDomainsResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'cdn.DescribeCertDomains': %w", err)
@@ -207,45 +157,68 @@ func (d *SSLDeployerProvider) getDomainsByCertificateId(cloudCertId string) ([]s
return domains, nil
}
-func (d *SSLDeployerProvider) getDeployedDomainsByCertificateId(cloudCertId string) ([]string, error) {
- // 根据证书查询关联资源
- // REF: https://cloud.tencent.com/document/product/400/62674
- describeDeployedResourcesReq := tcssl.NewDescribeDeployedResourcesRequest()
- describeDeployedResourcesReq.CertificateIds = common.StringPtrs([]string{cloudCertId})
- describeDeployedResourcesReq.ResourceType = common.StringPtr("cdn")
- describeDeployedResourcesResp, err := d.sdkClients.SSL.DescribeDeployedResources(describeDeployedResourcesReq)
- d.logger.Debug("sdk request 'cdn.DescribeDeployedResources'", slog.Any("request", describeDeployedResourcesReq), slog.Any("response", describeDeployedResourcesResp))
+func (d *SSLDeployerProvider) updateDomainHttpsServerCert(ctx context.Context, domain string, cloudCertId string) error {
+ // 查询域名详细配置
+ // REF: https://cloud.tencent.com/document/product/228/41117
+ describeDomainsConfigReq := tccdn.NewDescribeDomainsConfigRequest()
+ describeDomainsConfigReq.Filters = []*tccdn.DomainFilter{
+ {
+ Name: common.StringPtr("domain"),
+ Value: common.StringPtrs([]string{domain}),
+ },
+ }
+ describeDomainsConfigReq.Offset = common.Int64Ptr(0)
+ describeDomainsConfigReq.Limit = common.Int64Ptr(1)
+ describeDomainsConfigResp, err := d.sdkClient.DescribeDomainsConfig(describeDomainsConfigReq)
+ d.logger.Debug("sdk request 'cdn.DescribeDomainsConfig'", slog.Any("request", describeDomainsConfigReq), slog.Any("response", describeDomainsConfigResp))
if err != nil {
- return nil, fmt.Errorf("failed to execute sdk request 'cdn.DescribeDeployedResources': %w", err)
+ return fmt.Errorf("failed to execute sdk request 'cdn.DescribeDomainsConfig': %w", err)
+ } else if len(describeDomainsConfigResp.Response.Domains) == 0 {
+ return fmt.Errorf("domain %s not found", domain)
}
- domains := make([]string, 0)
- if describeDeployedResourcesResp.Response.DeployedResources != nil {
- for _, deployedResource := range describeDeployedResourcesResp.Response.DeployedResources {
- for _, resource := range deployedResource.Resources {
- domains = append(domains, *resource)
- }
+ domainConfig := describeDomainsConfigResp.Response.Domains[0]
+ if domainConfig.Https != nil && domainConfig.Https.CertInfo != nil && domainConfig.Https.CertInfo.CertId != nil && *domainConfig.Https.CertInfo.CertId == cloudCertId {
+ // 已部署过此域名,跳过
+ return nil
+ }
+
+ // 更新加速域名配置
+ // REF: https://cloud.tencent.com/document/product/228/41116
+ updateDomainConfigReq := tccdn.NewUpdateDomainConfigRequest()
+ updateDomainConfigReq.Domain = common.StringPtr(domain)
+ updateDomainConfigReq.Https = domainConfig.Https
+ if updateDomainConfigReq.Https == nil {
+ updateDomainConfigReq.Https = &tccdn.Https{
+ Switch: common.StringPtr("on"),
}
+ } else {
+ updateDomainConfigReq.Https.SslStatus = nil
+ }
+ updateDomainConfigReq.Https.CertInfo = &tccdn.ServerCert{
+ CertId: common.StringPtr(cloudCertId),
+ }
+ updateDomainConfigResp, err := d.sdkClient.UpdateDomainConfig(updateDomainConfigReq)
+ d.logger.Debug("sdk request 'cdn.UpdateDomainConfig'", slog.Any("request", updateDomainConfigReq), slog.Any("response", updateDomainConfigResp))
+ if err != nil {
+ return fmt.Errorf("failed to execute sdk request 'cdn.UpdateDomainConfig': %w", err)
}
- return domains, nil
+ return nil
}
-func createSDKClients(secretId, secretKey string) (*wSDKClients, error) {
+func createSDKClient(secretId, secretKey, endpoint string) (*tccdn.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- sslClient, err := tcssl.NewClient(credential, "", profile.NewClientProfile())
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tccdn.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
- cdnClient, err := tccdn.NewClient(credential, "", profile.NewClientProfile())
- if err != nil {
- return nil, err
- }
-
- return &wSDKClients{
- SSL: sslClient,
- CDN: cdnClient,
- }, nil
+ return client, nil
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-clb/tencentcloud_clb.go b/pkg/core/ssl-deployer/providers/tencentcloud-clb/tencentcloud_clb.go
index 0c37558d..c8f07d2d 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-clb/tencentcloud_clb.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-clb/tencentcloud_clb.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"time"
tcclb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317"
@@ -14,6 +15,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -23,6 +25,8 @@ type SSLDeployerProviderConfig struct {
SecretKey string `json:"secretKey"`
// 腾讯云地域。
Region string `json:"region"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 部署资源类型。
ResourceType ResourceType `json:"resourceType"`
// 负载均衡器 ID。
@@ -55,7 +59,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- clients, err := createSDKClients(config.SecretId, config.SecretKey, config.Region)
+ clients, err := createSDKClients(config.SecretId, config.SecretKey, config.Endpoint, config.Region)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -63,6 +67,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -306,7 +314,7 @@ func (d *SSLDeployerProvider) modifyListenerCertificate(ctx context.Context, clo
if err != nil {
return fmt.Errorf("failed to execute sdk request 'clb.DescribeListeners': %w", err)
} else if len(describeListenersResp.Response.Listeners) == 0 {
- return errors.New("listener not found")
+ return fmt.Errorf("listener %s not found", cloudListenerId)
}
// 修改监听器属性
@@ -330,16 +338,28 @@ func (d *SSLDeployerProvider) modifyListenerCertificate(ctx context.Context, clo
return nil
}
-func createSDKClients(secretId, secretKey, region string) (*wSDKClients, error) {
+func createSDKClients(secretId, secretKey, endpoint, region string) (*wSDKClients, error) {
credential := common.NewCredential(secretId, secretKey)
+ sslCpf := profile.NewClientProfile()
+ if endpoint != "" {
+ if strings.HasSuffix(endpoint, "intl.tencentcloudapi.com") {
+ sslCpf.HttpProfile.Endpoint = "ssl.intl.tencentcloudapi.com"
+ }
+ }
+
// 注意虽然官方文档中地域无需指定,但实际需要部署到 CLB 时必传
- sslClient, err := tcssl.NewClient(credential, region, profile.NewClientProfile())
+ sslClient, err := tcssl.NewClient(credential, region, sslCpf)
if err != nil {
return nil, err
}
- clbClient, err := tcclb.NewClient(credential, region, profile.NewClientProfile())
+ clbCpf := profile.NewClientProfile()
+ if endpoint != "" {
+ clbCpf.HttpProfile.Endpoint = endpoint
+ }
+
+ clbClient, err := tcclb.NewClient(credential, region, clbCpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-cos/tencentcloud_cos.go b/pkg/core/ssl-deployer/providers/tencentcloud-cos/tencentcloud_cos.go
index 7f4501d1..6bca08a0 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-cos/tencentcloud_cos.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-cos/tencentcloud_cos.go
@@ -31,18 +31,22 @@ type SSLDeployerProviderConfig struct {
type SSLDeployerProvider struct {
config *SSLDeployerProviderConfig
logger *slog.Logger
- sdkClient *tcssl.Client
+ sdkClient *wSDKClients
sslManager core.SSLManager
}
var _ core.SSLDeployer = (*SSLDeployerProvider)(nil)
+type wSDKClients struct {
+ SSL *tcssl.Client
+}
+
func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProvider, error) {
if config == nil {
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey, config.Region)
+ clients, err := createSDKClients(config.SecretId, config.SecretKey, config.Region)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -58,7 +62,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return &SSLDeployerProvider{
config: config,
logger: slog.Default(),
- sdkClient: client,
+ sdkClient: clients,
sslManager: sslmgr,
}, nil
}
@@ -96,7 +100,7 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
deployCertificateInstanceReq.ResourceType = common.StringPtr("cos")
deployCertificateInstanceReq.Status = common.Int64Ptr(1)
deployCertificateInstanceReq.InstanceIdList = common.StringPtrs([]string{fmt.Sprintf("%s#%s#%s", d.config.Region, d.config.Bucket, d.config.Domain)})
- deployCertificateInstanceResp, err := d.sdkClient.DeployCertificateInstance(deployCertificateInstanceReq)
+ deployCertificateInstanceResp, err := d.sdkClient.SSL.DeployCertificateInstance(deployCertificateInstanceReq)
d.logger.Debug("sdk request 'ssl.DeployCertificateInstance'", slog.Any("request", deployCertificateInstanceReq), slog.Any("response", deployCertificateInstanceResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err)
@@ -113,7 +117,7 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
describeHostDeployRecordDetailReq := tcssl.NewDescribeHostDeployRecordDetailRequest()
describeHostDeployRecordDetailReq.DeployRecordId = common.StringPtr(fmt.Sprintf("%d", *deployCertificateInstanceResp.Response.DeployRecordId))
- describeHostDeployRecordDetailResp, err := d.sdkClient.DescribeHostDeployRecordDetail(describeHostDeployRecordDetailReq)
+ describeHostDeployRecordDetailResp, err := d.sdkClient.SSL.DescribeHostDeployRecordDetail(describeHostDeployRecordDetailReq)
d.logger.Debug("sdk request 'ssl.DescribeHostDeployRecordDetail'", slog.Any("request", describeHostDeployRecordDetailReq), slog.Any("response", describeHostDeployRecordDetailResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'ssl.DescribeHostDeployRecordDetail': %w", err)
@@ -148,12 +152,14 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClient(secretId, secretKey, region string) (*tcssl.Client, error) {
+func createSDKClients(secretId, secretKey, region string) (*wSDKClients, error) {
credential := common.NewCredential(secretId, secretKey)
client, err := tcssl.NewClient(credential, region, profile.NewClientProfile())
if err != nil {
return nil, err
}
- return client, nil
+ return &wSDKClients{
+ SSL: client,
+ }, nil
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-css/tencentcloud_css.go b/pkg/core/ssl-deployer/providers/tencentcloud-css/tencentcloud_css.go
index ab07c62f..f83e602c 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-css/tencentcloud_css.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-css/tencentcloud_css.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
@@ -12,6 +13,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -19,6 +21,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 直播播放域名(不支持泛域名)。
Domain string `json:"domain"`
}
@@ -37,7 +41,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -45,6 +49,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -100,10 +108,15 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClient(secretId, secretKey string) (*tclive.Client, error) {
+func createSDKClient(secretId, secretKey, endpoint string) (*tclive.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tclive.NewClient(credential, "", profile.NewClientProfile())
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tclive.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go b/pkg/core/ssl-deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go
index 817a1042..3b054e24 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go
@@ -6,7 +6,6 @@ import (
"fmt"
"log/slog"
"strings"
- "time"
tccdn "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn/v20180606"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
@@ -15,6 +14,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -22,6 +22,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 加速域名(支持泛域名)。
Domain string `json:"domain"`
}
@@ -29,7 +31,7 @@ type SSLDeployerProviderConfig struct {
type SSLDeployerProvider struct {
config *SSLDeployerProviderConfig
logger *slog.Logger
- sdkClients *wSDKClients
+ sdkClient *tccdn.Client
sslManager core.SSLManager
}
@@ -45,7 +47,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- clients, err := createSDKClients(config.SecretId, config.SecretKey)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -53,6 +55,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -61,7 +67,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return &SSLDeployerProvider{
config: config,
logger: slog.Default(),
- sdkClients: clients,
+ sdkClient: client,
sslManager: sslmgr,
}, nil
}
@@ -91,90 +97,51 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
// 获取待部署的 CDN 实例
// 如果是泛域名,根据证书匹配 CDN 实例
- instanceIds := make([]string, 0)
+ domains := make([]string, 0)
if strings.HasPrefix(d.config.Domain, "*.") {
- domains, err := d.getDomainsByCertificateId(upres.CertId)
+ temp, err := d.getDomainsByCertId(upres.CertId)
if err != nil {
return nil, err
}
- instanceIds = domains
+ domains = temp
} else {
- instanceIds = append(instanceIds, d.config.Domain)
+ domains = append(domains, d.config.Domain)
}
- if len(instanceIds) == 0 {
- d.logger.Info("no ecdn instances to deploy")
+ // 遍历更新域名证书
+ if len(domains) == 0 {
+ d.logger.Info("no ecdn domains to deploy")
} else {
- d.logger.Info("found ecdn instances to deploy", slog.Any("instanceIds", instanceIds))
+ d.logger.Info("found ecdn domains to deploy", slog.Any("domains", domains))
+ var errs []error
- // 证书部署到 CDN 实例
- // REF: https://cloud.tencent.com/document/product/400/91667
- deployCertificateInstanceReq := tcssl.NewDeployCertificateInstanceRequest()
- deployCertificateInstanceReq.CertificateId = common.StringPtr(upres.CertId)
- deployCertificateInstanceReq.ResourceType = common.StringPtr("cdn")
- deployCertificateInstanceReq.Status = common.Int64Ptr(1)
- deployCertificateInstanceReq.InstanceIdList = common.StringPtrs(instanceIds)
- deployCertificateInstanceResp, err := d.sdkClients.SSL.DeployCertificateInstance(deployCertificateInstanceReq)
- d.logger.Debug("sdk request 'ssl.DeployCertificateInstance'", slog.Any("request", deployCertificateInstanceReq), slog.Any("response", deployCertificateInstanceResp))
- if err != nil {
- return nil, fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err)
- }
-
- // 循环获取部署任务详情,等待任务状态变更
- // REF: https://cloud.tencent.com/document/api/400/91658
- for {
+ for _, domain := range domains {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
- }
-
- describeHostDeployRecordDetailReq := tcssl.NewDescribeHostDeployRecordDetailRequest()
- describeHostDeployRecordDetailReq.DeployRecordId = common.StringPtr(fmt.Sprintf("%d", *deployCertificateInstanceResp.Response.DeployRecordId))
- describeHostDeployRecordDetailResp, err := d.sdkClients.SSL.DescribeHostDeployRecordDetail(describeHostDeployRecordDetailReq)
- d.logger.Debug("sdk request 'ssl.DescribeHostDeployRecordDetail'", slog.Any("request", describeHostDeployRecordDetailReq), slog.Any("response", describeHostDeployRecordDetailResp))
- if err != nil {
- return nil, fmt.Errorf("failed to execute sdk request 'ssl.DescribeHostDeployRecordDetail': %w", err)
- }
-
- var runningCount, succeededCount, failedCount, totalCount int64
- if describeHostDeployRecordDetailResp.Response.TotalCount == nil {
- return nil, errors.New("unexpected deployment job status")
- } else {
- if describeHostDeployRecordDetailResp.Response.RunningTotalCount != nil {
- runningCount = *describeHostDeployRecordDetailResp.Response.RunningTotalCount
- }
- if describeHostDeployRecordDetailResp.Response.SuccessTotalCount != nil {
- succeededCount = *describeHostDeployRecordDetailResp.Response.SuccessTotalCount
- }
- if describeHostDeployRecordDetailResp.Response.FailedTotalCount != nil {
- failedCount = *describeHostDeployRecordDetailResp.Response.FailedTotalCount
- }
- if describeHostDeployRecordDetailResp.Response.TotalCount != nil {
- totalCount = *describeHostDeployRecordDetailResp.Response.TotalCount
- }
-
- if succeededCount+failedCount == totalCount {
- break
+ if err := d.updateDomainHttpsServerCert(ctx, domain, upres.CertId); err != nil {
+ errs = append(errs, err)
}
}
+ }
- d.logger.Info(fmt.Sprintf("waiting for deployment job completion (running: %d, succeeded: %d, failed: %d, total: %d) ...", runningCount, succeededCount, failedCount, totalCount))
- time.Sleep(time.Second * 5)
+ if len(errs) > 0 {
+ return nil, errors.Join(errs...)
}
}
return &core.SSLDeployResult{}, nil
}
-func (d *SSLDeployerProvider) getDomainsByCertificateId(cloudCertId string) ([]string, error) {
+func (d *SSLDeployerProvider) getDomainsByCertId(cloudCertId string) ([]string, error) {
// 获取证书中的可用域名
// REF: https://cloud.tencent.com/document/product/228/42491
describeCertDomainsReq := tccdn.NewDescribeCertDomainsRequest()
describeCertDomainsReq.CertId = common.StringPtr(cloudCertId)
describeCertDomainsReq.Product = common.StringPtr("ecdn")
- describeCertDomainsResp, err := d.sdkClients.CDN.DescribeCertDomains(describeCertDomainsReq)
+ describeCertDomainsResp, err := d.sdkClient.DescribeCertDomains(describeCertDomainsReq)
d.logger.Debug("sdk request 'cdn.DescribeCertDomains'", slog.Any("request", describeCertDomainsReq), slog.Any("response", describeCertDomainsResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'cdn.DescribeCertDomains': %w", err)
@@ -190,21 +157,68 @@ func (d *SSLDeployerProvider) getDomainsByCertificateId(cloudCertId string) ([]s
return domains, nil
}
-func createSDKClients(secretId, secretKey string) (*wSDKClients, error) {
+func (d *SSLDeployerProvider) updateDomainHttpsServerCert(ctx context.Context, domain string, cloudCertId string) error {
+ // 查询域名详细配置
+ // REF: https://cloud.tencent.com/document/product/228/41117
+ describeDomainsConfigReq := tccdn.NewDescribeDomainsConfigRequest()
+ describeDomainsConfigReq.Filters = []*tccdn.DomainFilter{
+ {
+ Name: common.StringPtr("domain"),
+ Value: common.StringPtrs([]string{domain}),
+ },
+ }
+ describeDomainsConfigReq.Offset = common.Int64Ptr(0)
+ describeDomainsConfigReq.Limit = common.Int64Ptr(1)
+ describeDomainsConfigResp, err := d.sdkClient.DescribeDomainsConfig(describeDomainsConfigReq)
+ d.logger.Debug("sdk request 'cdn.DescribeDomainsConfig'", slog.Any("request", describeDomainsConfigReq), slog.Any("response", describeDomainsConfigResp))
+ if err != nil {
+ return fmt.Errorf("failed to execute sdk request 'cdn.DescribeDomainsConfig': %w", err)
+ } else if len(describeDomainsConfigResp.Response.Domains) == 0 {
+ return fmt.Errorf("domain %s not found", domain)
+ }
+
+ domainConfig := describeDomainsConfigResp.Response.Domains[0]
+ if domainConfig.Https != nil && domainConfig.Https.CertInfo != nil && domainConfig.Https.CertInfo.CertId != nil && *domainConfig.Https.CertInfo.CertId == cloudCertId {
+ // 已部署过此域名,跳过
+ return nil
+ }
+
+ // 更新加速域名配置
+ // REF: https://cloud.tencent.com/document/product/228/41116
+ updateDomainConfigReq := tccdn.NewUpdateDomainConfigRequest()
+ updateDomainConfigReq.Domain = common.StringPtr(domain)
+ updateDomainConfigReq.Https = domainConfig.Https
+ if updateDomainConfigReq.Https == nil {
+ updateDomainConfigReq.Https = &tccdn.Https{
+ Switch: common.StringPtr("on"),
+ }
+ } else {
+ updateDomainConfigReq.Https.SslStatus = nil
+ }
+ updateDomainConfigReq.Https.CertInfo = &tccdn.ServerCert{
+ CertId: common.StringPtr(cloudCertId),
+ }
+ updateDomainConfigResp, err := d.sdkClient.UpdateDomainConfig(updateDomainConfigReq)
+ d.logger.Debug("sdk request 'cdn.UpdateDomainConfig'", slog.Any("request", updateDomainConfigReq), slog.Any("response", updateDomainConfigResp))
+ if err != nil {
+ return fmt.Errorf("failed to execute sdk request 'cdn.UpdateDomainConfig': %w", err)
+ }
+
+ return nil
+}
+
+func createSDKClient(secretId, secretKey, endpoint string) (*tccdn.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- sslClient, err := tcssl.NewClient(credential, "", profile.NewClientProfile())
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tccdn.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
- cdnClient, err := tccdn.NewClient(credential, "", profile.NewClientProfile())
- if err != nil {
- return nil, err
- }
-
- return &wSDKClients{
- SSL: sslClient,
- CDN: cdnClient,
- }, nil
+ return client, nil
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-eo/tencentcloud_eo.go b/pkg/core/ssl-deployer/providers/tencentcloud-eo/tencentcloud_eo.go
index 2f94f438..c18ced57 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-eo/tencentcloud_eo.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-eo/tencentcloud_eo.go
@@ -5,14 +5,15 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
- tcssl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
tcteo "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo/v20220901"
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -20,6 +21,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 站点 ID。
ZoneId string `json:"zoneId"`
// 加速域名(支持泛域名)。
@@ -29,23 +32,18 @@ type SSLDeployerProviderConfig struct {
type SSLDeployerProvider struct {
config *SSLDeployerProviderConfig
logger *slog.Logger
- sdkClients *wSDKClients
+ sdkClient *tcteo.Client
sslManager core.SSLManager
}
var _ core.SSLDeployer = (*SSLDeployerProvider)(nil)
-type wSDKClients struct {
- SSL *tcssl.Client
- TEO *tcteo.Client
-}
-
func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProvider, error) {
if config == nil {
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- clients, err := createSDKClients(config.SecretId, config.SecretKey)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -53,6 +51,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -61,7 +63,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return &SSLDeployerProvider{
config: config,
logger: slog.Default(),
- sdkClients: clients,
+ sdkClient: client,
sslManager: sslmgr,
}, nil
}
@@ -99,7 +101,7 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
modifyHostsCertificateReq.Mode = common.StringPtr("sslcert")
modifyHostsCertificateReq.Hosts = common.StringPtrs([]string{d.config.Domain})
modifyHostsCertificateReq.ServerCertInfo = []*tcteo.ServerCertInfo{{CertId: common.StringPtr(upres.CertId)}}
- modifyHostsCertificateResp, err := d.sdkClients.TEO.ModifyHostsCertificate(modifyHostsCertificateReq)
+ modifyHostsCertificateResp, err := d.sdkClient.ModifyHostsCertificate(modifyHostsCertificateReq)
d.logger.Debug("sdk request 'teo.ModifyHostsCertificate'", slog.Any("request", modifyHostsCertificateReq), slog.Any("response", modifyHostsCertificateResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'teo.ModifyHostsCertificate': %w", err)
@@ -108,21 +110,18 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClients(secretId, secretKey string) (*wSDKClients, error) {
+func createSDKClient(secretId, secretKey, endpoint string) (*tcteo.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- sslClient, err := tcssl.NewClient(credential, "", profile.NewClientProfile())
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcteo.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
- teoClient, err := tcteo.NewClient(credential, "", profile.NewClientProfile())
- if err != nil {
- return nil, err
- }
-
- return &wSDKClients{
- SSL: sslClient,
- TEO: teoClient,
- }, nil
+ return client, nil
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-gaap/tencentcloud_gaap.go b/pkg/core/ssl-deployer/providers/tencentcloud-gaap/tencentcloud_gaap.go
index 64e2d570..09e6da8e 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-gaap/tencentcloud_gaap.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-gaap/tencentcloud_gaap.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
@@ -12,6 +13,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
xtypes "github.com/certimate-go/certimate/pkg/utils/types"
)
@@ -20,6 +22,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 部署资源类型。
ResourceType ResourceType `json:"resourceType"`
// 通道 ID。
@@ -44,7 +48,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClients(config.SecretId, config.SecretKey)
+ client, err := createSDKClients(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -52,6 +56,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -123,7 +131,7 @@ func (d *SSLDeployerProvider) modifyHttpsListenerCertificate(ctx context.Context
if err != nil {
return fmt.Errorf("failed to execute sdk request 'gaap.DescribeHTTPSListeners': %w", err)
} else if len(describeHTTPSListenersResp.Response.ListenerSet) == 0 {
- return errors.New("listener not found")
+ return fmt.Errorf("listener %s not found", cloudListenerId)
}
// 修改 HTTPS 监听器配置
@@ -141,10 +149,15 @@ func (d *SSLDeployerProvider) modifyHttpsListenerCertificate(ctx context.Context
return nil
}
-func createSDKClients(secretId, secretKey string) (*tcgaap.Client, error) {
+func createSDKClients(secretId, secretKey, endpoint string) (*tcgaap.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tcgaap.NewClient(credential, "", profile.NewClientProfile())
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcgaap.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-scf/tencentcloud_scf.go b/pkg/core/ssl-deployer/providers/tencentcloud-scf/tencentcloud_scf.go
index e8135421..94729516 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-scf/tencentcloud_scf.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-scf/tencentcloud_scf.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
@@ -12,6 +13,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -19,6 +21,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 腾讯云地域。
Region string `json:"region"`
// 自定义域名(不支持泛域名)。
@@ -39,7 +43,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey, config.Region)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint, config.Region)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -47,6 +51,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -110,9 +118,15 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClient(secretId, secretKey, region string) (*tcscf.Client, error) {
+func createSDKClient(secretId, secretKey, endpoint, region string) (*tcscf.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tcscf.NewClient(credential, region, profile.NewClientProfile())
+
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcscf.NewClient(credential, region, cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go b/pkg/core/ssl-deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go
index cd07cc88..4c2de86c 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go
@@ -20,6 +20,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 腾讯云地域。
Region string `json:"region"`
// 腾讯云云资源类型。
@@ -42,7 +44,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey, config.Region)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint, config.Region)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -50,6 +52,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: config.Endpoint,
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -150,10 +153,15 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClient(secretId, secretKey, region string) (*tcssl.Client, error) {
+func createSDKClient(secretId, secretKey, endpoint, region string) (*tcssl.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tcssl.NewClient(credential, region, profile.NewClientProfile())
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcssl.NewClient(credential, region, cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-ssl/tencentcloud_ssl.go b/pkg/core/ssl-deployer/providers/tencentcloud-ssl/tencentcloud_ssl.go
index 89f439ac..5879d064 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-ssl/tencentcloud_ssl.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-ssl/tencentcloud_ssl.go
@@ -15,6 +15,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
}
type SSLDeployerProvider struct {
@@ -33,6 +35,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: config.Endpoint,
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-vod/tencentcloud_vod.go b/pkg/core/ssl-deployer/providers/tencentcloud-vod/tencentcloud_vod.go
index afc4ddb6..9a1ece3f 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-vod/tencentcloud_vod.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-vod/tencentcloud_vod.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
@@ -12,6 +13,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -19,6 +21,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 点播应用 ID。
SubAppId int64 `json:"subAppId"`
// 点播加速域名(不支持泛域名)。
@@ -39,7 +43,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -47,6 +51,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -101,9 +109,15 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClient(secretId, secretKey string) (*tcvod.Client, error) {
+func createSDKClient(secretId, secretKey, endpoint string) (*tcvod.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tcvod.NewClient(credential, "", profile.NewClientProfile())
+
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcvod.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-waf/tencentcloud_waf.go b/pkg/core/ssl-deployer/providers/tencentcloud-waf/tencentcloud_waf.go
index 94e42f00..3bad8d41 100644
--- a/pkg/core/ssl-deployer/providers/tencentcloud-waf/tencentcloud_waf.go
+++ b/pkg/core/ssl-deployer/providers/tencentcloud-waf/tencentcloud_waf.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
+ "strings"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
@@ -12,6 +13,7 @@ import (
"github.com/certimate-go/certimate/pkg/core"
sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl"
+ "github.com/certimate-go/certimate/pkg/utils/ifelse"
)
type SSLDeployerProviderConfig struct {
@@ -19,6 +21,8 @@ type SSLDeployerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
// 腾讯云地域。
Region string `json:"region"`
// 防护域名(不支持泛域名)。
@@ -43,7 +47,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
return nil, errors.New("the configuration of the ssl deployer provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey, config.Region)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint, config.Region)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -51,6 +55,10 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv
sslmgr, err := sslmgrsp.NewSSLManagerProvider(&sslmgrsp.SSLManagerProviderConfig{
SecretId: config.SecretId,
SecretKey: config.SecretKey,
+ Endpoint: ifelse.
+ If[string](strings.HasSuffix(strings.TrimSpace(config.Endpoint), "intl.tencentcloudapi.com")).
+ Then("ssl.intl.tencentcloudapi.com"). // 国际站使用独立的接口端点
+ Else(""),
})
if err != nil {
return nil, fmt.Errorf("could not create ssl manager: %w", err)
@@ -122,9 +130,15 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
-func createSDKClient(secretId, secretKey, region string) (*tcwaf.Client, error) {
+func createSDKClient(secretId, secretKey, endpoint, region string) (*tcwaf.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tcwaf.NewClient(credential, region, profile.NewClientProfile())
+
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcwaf.NewClient(credential, region, cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/core/ssl-manager/providers/tencentcloud-ssl/tencentcloud_ssl.go b/pkg/core/ssl-manager/providers/tencentcloud-ssl/tencentcloud_ssl.go
index 11724028..fc062b72 100644
--- a/pkg/core/ssl-manager/providers/tencentcloud-ssl/tencentcloud_ssl.go
+++ b/pkg/core/ssl-manager/providers/tencentcloud-ssl/tencentcloud_ssl.go
@@ -17,6 +17,8 @@ type SSLManagerProviderConfig struct {
SecretId string `json:"secretId"`
// 腾讯云 SecretKey。
SecretKey string `json:"secretKey"`
+ // 腾讯云接口端点。
+ Endpoint string `json:"endpoint,omitempty"`
}
type SSLManagerProvider struct {
@@ -32,7 +34,7 @@ func NewSSLManagerProvider(config *SSLManagerProviderConfig) (*SSLManagerProvide
return nil, errors.New("the configuration of the ssl manager provider is nil")
}
- client, err := createSDKClient(config.SecretId, config.SecretKey)
+ client, err := createSDKClient(config.SecretId, config.SecretKey, config.Endpoint)
if err != nil {
return nil, fmt.Errorf("could not create sdk client: %w", err)
}
@@ -70,9 +72,15 @@ func (m *SSLManagerProvider) Upload(ctx context.Context, certPEM string, privkey
}, nil
}
-func createSDKClient(secretId, secretKey string) (*tcssl.Client, error) {
+func createSDKClient(secretId, secretKey, endpoint string) (*tcssl.Client, error) {
credential := common.NewCredential(secretId, secretKey)
- client, err := tcssl.NewClient(credential, "", profile.NewClientProfile())
+
+ cpf := profile.NewClientProfile()
+ if endpoint != "" {
+ cpf.HttpProfile.Endpoint = endpoint
+ }
+
+ client, err := tcssl.NewClient(credential, "", cpf)
if err != nil {
return nil, err
}
diff --git a/pkg/utils/ifelse/ifelse.go b/pkg/utils/ifelse/ifelse.go
new file mode 100644
index 00000000..fce28401
--- /dev/null
+++ b/pkg/utils/ifelse/ifelse.go
@@ -0,0 +1,34 @@
+package ifelse
+
+type ifExpr[T any] struct {
+ condition bool
+}
+
+type thenExpr[T any] struct {
+ condition bool
+ consequent T
+}
+
+// 示例:
+//
+// result := ifelse.If[T](condition).Then(consequent).Else(alternative)
+func If[T any](condition bool) *ifExpr[T] {
+ return &ifExpr[T]{
+ condition: condition,
+ }
+}
+
+func (e *ifExpr[T]) Then(consequent T) *thenExpr[T] {
+ return &thenExpr[T]{
+ condition: e.condition,
+ consequent: consequent,
+ }
+}
+
+func (e *thenExpr[T]) Else(alternative T) T {
+ if e.condition {
+ return e.consequent
+ }
+
+ return alternative
+}
diff --git a/pkg/utils/ifelse/ternary.go b/pkg/utils/ifelse/ternary.go
new file mode 100644
index 00000000..a2a060f0
--- /dev/null
+++ b/pkg/utils/ifelse/ternary.go
@@ -0,0 +1,35 @@
+package ifelse
+
+// 三目条件函数。
+//
+// 入参:
+// - condition: 条件。
+// - consequent: 条件为真时返回的值。
+// - alternative: 条件为假时返回的值。
+//
+// 出参:
+// - 若 condition 的为真,将返回 consequent;否则,将返回 alternative。
+func Ternary[T any](condition bool, consequent, alternative T) T {
+ if condition {
+ return consequent
+ } else {
+ return alternative
+ }
+}
+
+// 与 [Ternary] 类似,但返回值支持延迟计算函数。
+//
+// 入参:
+// - condition: 条件。
+// - consequentFunc: 条件为真时返回的计算函数。
+// - alternativeFunc: 条件为假时返回的计算函数。
+//
+// 出参:
+// - 若 condition 的为真,将返回 consequentFunc 的计算结果;否则,将返回 alternativeFunc 的计算结果。
+func TernaryFunc[T any](condition bool, consequentFunc, alternativeFunc func() T) T {
+ if condition {
+ return consequentFunc()
+ } else {
+ return alternativeFunc()
+ }
+}
diff --git a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
index 15f627a9..318e3c95 100644
--- a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
+++ b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
@@ -85,6 +85,7 @@ import DeployNodeConfigFormTencentCloudECDNConfig from "./DeployNodeConfigFormTe
import DeployNodeConfigFormTencentCloudEOConfig from "./DeployNodeConfigFormTencentCloudEOConfig.tsx";
import DeployNodeConfigFormTencentCloudGAAPConfig from "./DeployNodeConfigFormTencentCloudGAAPConfig.tsx";
import DeployNodeConfigFormTencentCloudSCFConfig from "./DeployNodeConfigFormTencentCloudSCFConfig";
+import DeployNodeConfigFormTencentCloudSSLConfig from "./DeployNodeConfigFormTencentCloudSSLConfig";
import DeployNodeConfigFormTencentCloudSSLDeployConfig from "./DeployNodeConfigFormTencentCloudSSLDeployConfig";
import DeployNodeConfigFormTencentCloudVODConfig from "./DeployNodeConfigFormTencentCloudVODConfig";
import DeployNodeConfigFormTencentCloudWAFConfig from "./DeployNodeConfigFormTencentCloudWAFConfig";
@@ -344,6 +345,8 @@ const DeployNodeConfigForm = forwardRef;
case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SCF:
return ;
+ case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL:
+ return ;
case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL_DEPLOY:
return ;
case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_VOD:
diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormAliyunALBConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormAliyunALBConfig.tsx
index 570109e5..5203130e 100644
--- a/ui/src/components/workflow/node/DeployNodeConfigFormAliyunALBConfig.tsx
+++ b/ui/src/components/workflow/node/DeployNodeConfigFormAliyunALBConfig.tsx
@@ -7,8 +7,8 @@ import Show from "@/components/Show";
import { validDomainName } from "@/utils/validators";
type DeployNodeConfigFormAliyunALBConfigFieldValues = Nullish<{
- resourceType: string;
region: string;
+ resourceType: string;
loadbalancerId?: string;
listenerId?: string;
domain?: string;
@@ -41,12 +41,12 @@ const DeployNodeConfigFormAliyunALBConfig = ({
const { t } = useTranslation();
const formSchema = z.object({
- resourceType: z.union([z.literal(RESOURCE_TYPE_LOADBALANCER), z.literal(RESOURCE_TYPE_LISTENER)], {
- message: t("workflow_node.deploy.form.aliyun_alb_resource_type.placeholder"),
- }),
region: z
.string({ message: t("workflow_node.deploy.form.aliyun_alb_region.placeholder") })
.nonempty(t("workflow_node.deploy.form.aliyun_alb_region.placeholder")),
+ resourceType: z.union([z.literal(RESOURCE_TYPE_LOADBALANCER), z.literal(RESOURCE_TYPE_LISTENER)], {
+ message: t("workflow_node.deploy.form.aliyun_alb_resource_type.placeholder"),
+ }),
loadbalancerId: z
.string()
.max(64, t("common.errmsg.string_max", { max: 64 }))
@@ -82,6 +82,15 @@ const DeployNodeConfigFormAliyunALBConfig = ({
name={formName}
onValuesChange={handleFormChange}
>
+
}
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
;
@@ -39,12 +39,12 @@ const DeployNodeConfigFormAliyunNLBConfig = ({
const { t } = useTranslation();
const formSchema = z.object({
- resourceType: z.union([z.literal(RESOURCE_TYPE_LOADBALANCER), z.literal(RESOURCE_TYPE_LISTENER)], {
- message: t("workflow_node.deploy.form.aliyun_nlb_resource_type.placeholder"),
- }),
region: z
.string({ message: t("workflow_node.deploy.form.aliyun_nlb_region.placeholder") })
.nonempty(t("workflow_node.deploy.form.aliyun_nlb_region.placeholder")),
+ resourceType: z.union([z.literal(RESOURCE_TYPE_LOADBALANCER), z.literal(RESOURCE_TYPE_LISTENER)], {
+ message: t("workflow_node.deploy.form.aliyun_nlb_resource_type.placeholder"),
+ }),
loadbalancerId: z
.string()
.max(64, t("common.errmsg.string_max", { max: 64 }))
@@ -73,6 +73,15 @@ const DeployNodeConfigFormAliyunNLBConfig = ({
name={formName}
onValuesChange={handleFormChange}
>
+ }
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
+ }
+ >
+
+
+
- }
- >
-
-
-
;
@@ -31,6 +32,7 @@ const DeployNodeConfigFormTencentCloudCDNConfig = ({
const { t } = useTranslation();
const formSchema = z.object({
+ endpoint: z.string().nullish(),
domain: z
.string({ message: t("workflow_node.deploy.form.tencentcloud_cdn_domain.placeholder") })
.refine((v) => validDomainName(v, { allowWildcard: true }), t("common.errmsg.domain_invalid")),
@@ -50,6 +52,15 @@ const DeployNodeConfigFormTencentCloudCDNConfig = ({
name={formName}
onValuesChange={handleFormChange}
>
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
- }
- >
-
-
-
;
@@ -31,6 +32,7 @@ const DeployNodeConfigFormTencentCloudCSSConfig = ({
const { t } = useTranslation();
const formSchema = z.object({
+ endpoint: z.string().nullish(),
domain: z
.string({ message: t("workflow_node.deploy.form.tencentcloud_css_domain.placeholder") })
.refine((v) => validDomainName(v, { allowWildcard: true }), t("common.errmsg.domain_invalid")),
@@ -50,6 +52,15 @@ const DeployNodeConfigFormTencentCloudCSSConfig = ({
name={formName}
onValuesChange={handleFormChange}
>
+ }
+ >
+
+
+
;
@@ -31,6 +32,7 @@ const DeployNodeConfigFormTencentCloudECDNConfig = ({
const { t } = useTranslation();
const formSchema = z.object({
+ endpoint: z.string().nullish(),
domain: z
.string({ message: t("workflow_node.deploy.form.tencentcloud_ecdn_domain.placeholder") })
.refine((v) => validDomainName(v, { allowWildcard: true }), t("common.errmsg.domain_invalid")),
@@ -50,6 +52,15 @@ const DeployNodeConfigFormTencentCloudECDNConfig = ({
name={formName}
onValuesChange={handleFormChange}
>
+ }
+ >
+
+
+
;
@@ -32,6 +33,7 @@ const DeployNodeConfigFormTencentCloudEOConfig = ({
const { t } = useTranslation();
const formSchema = z.object({
+ endpoint: z.string().nullish(),
zoneId: z
.string({ message: t("workflow_node.deploy.form.tencentcloud_eo_zone_id.placeholder") })
.nonempty(t("workflow_node.deploy.form.tencentcloud_eo_zone_id.placeholder")),
@@ -54,6 +56,15 @@ const DeployNodeConfigFormTencentCloudEOConfig = ({
name={formName}
onValuesChange={handleFormChange}
>
+ }
+ >
+
+
+
+ }
+ >
+
+
+