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} > + } + > + + + + } + > + + + + + ; + +export type DeployNodeConfigFormTencentCloudSSLConfigProps = { + form: FormInstance; + formName: string; + disabled?: boolean; + initialValues?: DeployNodeConfigFormTencentCloudSSLConfigFieldValues; + onValuesChange?: (values: DeployNodeConfigFormTencentCloudSSLConfigFieldValues) => void; +}; + +const initFormModel = (): DeployNodeConfigFormTencentCloudSSLConfigFieldValues => { + return {}; +}; + +const DeployNodeConfigFormTencentCloudSSLConfig = ({ + form: formInst, + formName, + disabled, + initialValues, + onValuesChange, +}: DeployNodeConfigFormTencentCloudSSLConfigProps) => { + const { t } = useTranslation(); + + const formSchema = z.object({ + endpoint: z.string().nullish(), + }); + const formRule = createSchemaFieldRule(formSchema); + + const handleFormChange = (_: unknown, values: z.infer) => { + onValuesChange?.(values); + }; + + return ( +
+ } + > + + +
+ ); +}; + +export default DeployNodeConfigFormTencentCloudSSLConfig; diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormTencentCloudSSLDeployConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormTencentCloudSSLDeployConfig.tsx index a0477fbf..b003876c 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigFormTencentCloudSSLDeployConfig.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigFormTencentCloudSSLDeployConfig.tsx @@ -6,6 +6,7 @@ import { z } from "zod"; import MultipleSplitValueInput from "@/components/MultipleSplitValueInput"; type DeployNodeConfigFormTencentCloudSSLDeployConfigFieldValues = Nullish<{ + endpoint?: string; region: string; resourceType: string; resourceIds: string; @@ -35,6 +36,7 @@ const DeployNodeConfigFormTencentCloudSSLDeployConfig = ({ const { t } = useTranslation(); const formSchema = z.object({ + endpoint: z.string().nullish(), region: z .string({ message: t("workflow_node.deploy.form.tencentcloud_ssl_deploy_region.placeholder") }) .nonempty(t("workflow_node.deploy.form.tencentcloud_ssl_deploy_region.placeholder")), @@ -63,6 +65,15 @@ const DeployNodeConfigFormTencentCloudSSLDeployConfig = ({ name={formName} onValuesChange={handleFormChange} > + } + > + + + ; @@ -32,6 +33,7 @@ const DeployNodeConfigFormTencentCloudVODConfig = ({ const { t } = useTranslation(); const formSchema = z.object({ + endpoint: z.string().nullish(), subAppId: z .union([z.string(), z.number()]) .nullish() @@ -58,6 +60,15 @@ const DeployNodeConfigFormTencentCloudVODConfig = ({ name={formName} onValuesChange={handleFormChange} > + } + > + + + + } + > + + + + } + > + + + - } - > - - - ; @@ -39,12 +39,12 @@ const DeployNodeConfigFormVolcEngineCLBConfig = ({ 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.volcengine_clb_resource_type.placeholder"), - }), region: z .string({ message: t("workflow_node.deploy.form.volcengine_clb_region.placeholder") }) .nonempty(t("workflow_node.deploy.form.volcengine_clb_region.placeholder")), + resourceType: z.union([z.literal(RESOURCE_TYPE_LOADBALANCER), z.literal(RESOURCE_TYPE_LISTENER)], { + message: t("workflow_node.deploy.form.volcengine_clb_resource_type.placeholder"), + }), loadbalancerId: z .string() .max(64, t("common.errmsg.string_max", { max: 64 })) @@ -79,6 +79,15 @@ const DeployNodeConfigFormVolcEngineCLBConfig = ({ name={formName} onValuesChange={handleFormChange} > + } + > + + + - } - > - - - https://www.alibabacloud.com/help/en/slb/application-load-balancer/product-overview/supported-regions-and-zones", "workflow_node.deploy.form.aliyun_alb_resource_type.label": "Resource type", "workflow_node.deploy.form.aliyun_alb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.aliyun_alb_resource_type.option.loadbalancer.label": "ALB load balancer", "workflow_node.deploy.form.aliyun_alb_resource_type.option.listener.label": "ALB listener", - "workflow_node.deploy.form.aliyun_alb_region.label": "Alibaba Cloud ALB region", - "workflow_node.deploy.form.aliyun_alb_region.placeholder": "Please enter Alibaba Cloud ALB region (e.g. cn-hangzhou)", - "workflow_node.deploy.form.aliyun_alb_region.tooltip": "For more information, see https://www.alibabacloud.com/help/en/slb/application-load-balancer/product-overview/supported-regions-and-zones", "workflow_node.deploy.form.aliyun_alb_loadbalancer_id.label": "Alibaba Cloud ALB load balancer ID", "workflow_node.deploy.form.aliyun_alb_loadbalancer_id.placeholder": "Please enter Alibaba Cloud ALB load balancer ID", "workflow_node.deploy.form.aliyun_alb_loadbalancer_id.tooltip": "For more information, see https://slb.console.aliyun.com/alb", @@ -185,13 +185,13 @@ "workflow_node.deploy.form.aliyun_cas_deploy_contact_ids.tooltip": "For more information, see https://www.alibabacloud.com/help/en/ssl-certificate/developer-reference/api-cas-2020-04-07-listcontact

Leave it blank to use the first system contact.", "workflow_node.deploy.form.aliyun_cas_deploy_contact_ids.multiple_input_modal.title": "Change Alibaba Cloud contact IDs", "workflow_node.deploy.form.aliyun_cas_deploy_contact_ids.multiple_input_modal.placeholder": "Please enter Alibaba Cloud contact ID", + "workflow_node.deploy.form.aliyun_clb_region.label": "Alibaba Cloud CLB region", + "workflow_node.deploy.form.aliyun_clb_region.placeholder": "Please enter Alibaba Cloud CLB region (e.g. cn-hangzhou)", + "workflow_node.deploy.form.aliyun_clb_region.tooltip": "For more information, see https://www.alibabacloud.com/help/en/slb/classic-load-balancer/product-overview/regions-that-support-clb", "workflow_node.deploy.form.aliyun_clb_resource_type.label": "Resource type", "workflow_node.deploy.form.aliyun_clb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.aliyun_clb_resource_type.option.loadbalancer.label": "CLB load balancer", "workflow_node.deploy.form.aliyun_clb_resource_type.option.listener.label": "CLB listener", - "workflow_node.deploy.form.aliyun_clb_region.label": "Alibaba Cloud CLB region", - "workflow_node.deploy.form.aliyun_clb_region.placeholder": "Please enter Alibaba Cloud CLB region (e.g. cn-hangzhou)", - "workflow_node.deploy.form.aliyun_clb_region.tooltip": "For more information, see https://www.alibabacloud.com/help/en/slb/classic-load-balancer/product-overview/regions-that-support-clb", "workflow_node.deploy.form.aliyun_clb_loadbalancer_id.label": "Alibaba Cloud CLB load balancer ID", "workflow_node.deploy.form.aliyun_clb_loadbalancer_id.placeholder": "Please enter Alibaba Cloud CLB load balancer ID", "workflow_node.deploy.form.aliyun_clb_loadbalancer_id.tooltip": "For more information, see https://slb.console.aliyun.com/clb", @@ -246,13 +246,13 @@ "workflow_node.deploy.form.aliyun_live_domain.label": "Alibaba Cloud live streaming domain", "workflow_node.deploy.form.aliyun_live_domain.placeholder": "Please enter Alibaba Cloud live streaming domain name", "workflow_node.deploy.form.aliyun_live_domain.tooltip": "For more information, see https://live.console.aliyun.com", + "workflow_node.deploy.form.aliyun_nlb_region.label": "Alibaba Cloud NLB region", + "workflow_node.deploy.form.aliyun_nlb_region.placeholder": "Please enter Alibaba Cloud NLB region (e.g. cn-hangzhou)", + "workflow_node.deploy.form.aliyun_nlb_region.tooltip": "For more information, see https://www.alibabacloud.com/help/en/slb/network-load-balancer/product-overview/regions-that-support-nlb", "workflow_node.deploy.form.aliyun_nlb_resource_type.label": "Resource type", "workflow_node.deploy.form.aliyun_nlb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.aliyun_nlb_resource_type.option.loadbalancer.label": "NLB load balancer", "workflow_node.deploy.form.aliyun_nlb_resource_type.option.listener.label": "NLB listener", - "workflow_node.deploy.form.aliyun_nlb_region.label": "Alibaba Cloud NLB region", - "workflow_node.deploy.form.aliyun_nlb_region.placeholder": "Please enter Alibaba Cloud NLB region (e.g. cn-hangzhou)", - "workflow_node.deploy.form.aliyun_nlb_region.tooltip": "For more information, see https://www.alibabacloud.com/help/en/slb/network-load-balancer/product-overview/regions-that-support-nlb", "workflow_node.deploy.form.aliyun_nlb_loadbalancer_id.label": "Alibaba Cloud NLB load balancer ID", "workflow_node.deploy.form.aliyun_nlb_loadbalancer_id.placeholder": "Please enter Alibaba Cloud NLB load balancer ID", "workflow_node.deploy.form.aliyun_nlb_loadbalancer_id.tooltip": "For more information, see https://slb.console.aliyun.com/nlb", @@ -319,13 +319,13 @@ "workflow_node.deploy.form.azure_keyvault_certificate_name.placeholder": "Please enter Azure KeyVault certificate name", "workflow_node.deploy.form.azure_keyvault_certificate_name.tooltip": "Leave it blank to use a default name generated by Certimate.", "workflow_node.deploy.form.azure_keyvault_certificate_name.errmsg.invalid": "Certificate name can only contain letters, numbers, and hyphens (-), with a length limit of 1 to 127 characters", + "workflow_node.deploy.form.baiducloud_appblb_region.label": "Baidu Cloud BLB region", + "workflow_node.deploy.form.baiducloud_appblb_region.placeholder": "Please enter Baidu Cloud BLB region (e.g. bj)", + "workflow_node.deploy.form.baiducloud_appblb_region.tooltip": "For more information, see https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_appblb_resource_type.label": "Resource type", "workflow_node.deploy.form.baiducloud_appblb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.baiducloud_appblb_resource_type.option.loadbalancer.label": "BLB load balancer", "workflow_node.deploy.form.baiducloud_appblb_resource_type.option.listener.label": "BLB listener", - "workflow_node.deploy.form.baiducloud_appblb_region.label": "Baidu Cloud BLB region", - "workflow_node.deploy.form.baiducloud_appblb_region.placeholder": "Please enter Baidu Cloud BLB region (e.g. bj)", - "workflow_node.deploy.form.baiducloud_appblb_region.tooltip": "For more information, see https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.label": "Baidu Cloud BLB load balancer ID", "workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.placeholder": "Please enter Baidu Cloud BLB load balancer ID", "workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.tooltip": "For more information, see https://console.bce.baidu.com/blb/#/appblb/list", @@ -335,13 +335,13 @@ "workflow_node.deploy.form.baiducloud_appblb_snidomain.label": "Baidu Cloud BLB SNI domain (Optional)", "workflow_node.deploy.form.baiducloud_appblb_snidomain.placeholder": "Please enter Baidu Cloud BLB SNI domain name", "workflow_node.deploy.form.baiducloud_appblb_snidomain.tooltip": "For more information, see https://console.bce.baidu.com/blb/#/appblb/list", + "workflow_node.deploy.form.baiducloud_blb_region.label": "Baidu Cloud BLB region", + "workflow_node.deploy.form.baiducloud_blb_region.placeholder": "Please enter Baidu Cloud BLB region (e.g. bj)", + "workflow_node.deploy.form.baiducloud_blb_region.tooltip": "For more information, see https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_blb_resource_type.label": "Resource type", "workflow_node.deploy.form.baiducloud_blb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.baiducloud_blb_resource_type.option.loadbalancer.label": "BLB load balancer", "workflow_node.deploy.form.baiducloud_blb_resource_type.option.listener.label": "BLB listener", - "workflow_node.deploy.form.baiducloud_blb_region.label": "Baidu Cloud BLB region", - "workflow_node.deploy.form.baiducloud_blb_region.placeholder": "Please enter Baidu Cloud BLB region (e.g. bj)", - "workflow_node.deploy.form.baiducloud_blb_region.tooltip": "For more information, see https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.label": "Baidu Cloud BLB load balancer ID", "workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.placeholder": "Please enter Baidu Cloud BLB load balancer ID", "workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.tooltip": "For more information, see https://console.bce.baidu.com/blb/#/blb/list", @@ -404,14 +404,14 @@ "workflow_node.deploy.form.ctcccloud_cdn_domain.label": "CTCC StateCloud CDN domain", "workflow_node.deploy.form.ctcccloud_cdn_domain.placeholder": "Please enter CTCC StateCloud CDN domain name", "workflow_node.deploy.form.ctcccloud_cdn_domain.tooltip": "For more information, see https://cdn-console.ctyun.cn", + "workflow_node.deploy.form.ctcccloud_elb_region_id.label": "CTCC StateCloud ELB region ID", + "workflow_node.deploy.form.ctcccloud_elb_region_id.placeholder": "Please enter CTCC StateCloud ELB region ID", + "workflow_node.deploy.form.ctcccloud_elb_region_id.tooltip": "For more information, see https://www.ctyun.cn/document/10026755/10196575", "workflow_node.deploy.form.ctcccloud_elb_resource_type.label": "Resource type", "workflow_node.deploy.form.ctcccloud_elb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.ctcccloud_elb_resource_type.option.certificate.label": "ELB certificate", "workflow_node.deploy.form.ctcccloud_elb_resource_type.option.loadbalancer.label": "ELB load balancer", "workflow_node.deploy.form.ctcccloud_elb_resource_type.option.listener.label": "ELB listener", - "workflow_node.deploy.form.ctcccloud_elb_region_id.label": "CTCC StateCloud ELB region ID", - "workflow_node.deploy.form.ctcccloud_elb_region_id.placeholder": "Please enter CTCC StateCloud ELB region ID", - "workflow_node.deploy.form.ctcccloud_elb_region_id.tooltip": "For more information, see https://www.ctyun.cn/document/10026755/10196575", "workflow_node.deploy.form.ctcccloud_elb_loadbalancer_id.label": "CTCC StateCloud ELB load balancer ID", "workflow_node.deploy.form.ctcccloud_elb_loadbalancer_id.placeholder": "Please enter CTCC StateCloud ELB load balancer ID", "workflow_node.deploy.form.ctcccloud_elb_loadbalancer_id.tooltip": "For more information, see https://console.ctyun.cn/network/index/#/elb/elbList", @@ -454,14 +454,14 @@ "workflow_node.deploy.form.huaweicloud_cdn_domain.label": "Huawei Cloud CDN domain", "workflow_node.deploy.form.huaweicloud_cdn_domain.placeholder": "Please enter Huawei Cloud CDN domain name", "workflow_node.deploy.form.huaweicloud_cdn_domain.tooltip": "For more information, see https://console-intl.huaweicloud.com/cdn", + "workflow_node.deploy.form.huaweicloud_elb_region.label": "Huawei Cloud ELB region", + "workflow_node.deploy.form.huaweicloud_elb_region.placeholder": "Please enter Huawei Cloud ELB region (e.g. cn-north-1)", + "workflow_node.deploy.form.huaweicloud_elb_region.tooltip": "For more information, see https://console-intl.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_elb_resource_type.label": "Resource type", "workflow_node.deploy.form.huaweicloud_elb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.huaweicloud_elb_resource_type.option.certificate.label": "ELB certificate", "workflow_node.deploy.form.huaweicloud_elb_resource_type.option.loadbalancer.label": "ELB load balancer", "workflow_node.deploy.form.huaweicloud_elb_resource_type.option.listener.label": "ELB listener", - "workflow_node.deploy.form.huaweicloud_elb_region.label": "Huawei Cloud ELB region", - "workflow_node.deploy.form.huaweicloud_elb_region.placeholder": "Please enter Huawei Cloud ELB region (e.g. cn-north-1)", - "workflow_node.deploy.form.huaweicloud_elb_region.tooltip": "For more information, see https://console-intl.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_elb_certificate_id.label": "Huawei Cloud ELB certificate ID", "workflow_node.deploy.form.huaweicloud_elb_certificate_id.placeholder": "Please enter Huawei Cloud ELB certificate ID", "workflow_node.deploy.form.huaweicloud_elb_certificate_id.tooltip": "For more information, see https://console-intl.huaweicloud.com/vpc/#/elb/elbCert", @@ -471,27 +471,27 @@ "workflow_node.deploy.form.huaweicloud_elb_listener_id.label": "Huawei Cloud ELB listener ID", "workflow_node.deploy.form.huaweicloud_elb_listener_id.placeholder": "Please enter Huawei Cloud ELB listener ID", "workflow_node.deploy.form.huaweicloud_elb_listener_id.tooltip": "For more information, see https://console-intl.huaweicloud.com/vpc/#/elb/list/grid", + "workflow_node.deploy.form.huaweicloud_waf_region.label": "Huawei Cloud WAF region", + "workflow_node.deploy.form.huaweicloud_waf_region.placeholder": "Please enter Huawei Cloud WAF region (e.g. cn-north-1)", + "workflow_node.deploy.form.huaweicloud_waf_region.tooltip": "For more information, see https://console-intl.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_waf_resource_type.label": "Resource type", "workflow_node.deploy.form.huaweicloud_waf_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.huaweicloud_waf_resource_type.option.certificate.label": "WAF certificate", "workflow_node.deploy.form.huaweicloud_waf_resource_type.option.cloudserver.label": "WAF cloud server", "workflow_node.deploy.form.huaweicloud_waf_resource_type.option.premiumhost.label": "WAF premium host", - "workflow_node.deploy.form.huaweicloud_waf_region.label": "Huawei Cloud WAF region", - "workflow_node.deploy.form.huaweicloud_waf_region.placeholder": "Please enter Huawei Cloud WAF region (e.g. cn-north-1)", - "workflow_node.deploy.form.huaweicloud_waf_region.tooltip": "For more information, see https://console-intl.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_waf_certificate_id.label": "Huawei Cloud WAF certificate ID", "workflow_node.deploy.form.huaweicloud_waf_certificate_id.placeholder": "Please enter Huawei Cloud WAF certificate ID", "workflow_node.deploy.form.huaweicloud_waf_certificate_id.tooltip": "For more information, see https://console-intl.huaweicloud.com/console/#/waf/certificateManagement", "workflow_node.deploy.form.huaweicloud_waf_domain.label": "Huawei Cloud WAF domain", "workflow_node.deploy.form.huaweicloud_waf_domain.placeholder": "Please enter Huawei Cloud WAF domain name", "workflow_node.deploy.form.huaweicloud_waf_domain.tooltip": "For more information, see https://console-intl.huaweicloud.com/console/#/waf/domain/list", + "workflow_node.deploy.form.jdcloud_alb_region_id.label": "JD Cloud ALB region ID", + "workflow_node.deploy.form.jdcloud_alb_region_id.placeholder": "Please enter JD Cloud ALB region ID (e.g. cn-north-1)", + "workflow_node.deploy.form.jdcloud_alb_region_id.tooltip": "For more information, see https://docs.jdcloud.com/en/common-declaration/api/introduction", "workflow_node.deploy.form.jdcloud_alb_resource_type.label": "Resource type", "workflow_node.deploy.form.jdcloud_alb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.jdcloud_alb_resource_type.option.loadbalancer.label": "ALB load balancer", "workflow_node.deploy.form.jdcloud_alb_resource_type.option.listener.label": "ALB listener", - "workflow_node.deploy.form.jdcloud_alb_region_id.label": "JD Cloud ALB region ID", - "workflow_node.deploy.form.jdcloud_alb_region_id.placeholder": "Please enter JD Cloud ALB region ID (e.g. cn-north-1)", - "workflow_node.deploy.form.jdcloud_alb_region_id.tooltip": "For more information, see https://docs.jdcloud.com/en/common-declaration/api/introduction", "workflow_node.deploy.form.jdcloud_alb_loadbalancer_id.label": "JD Cloud ALB load balancer ID", "workflow_node.deploy.form.jdcloud_alb_loadbalancer_id.placeholder": "Please enter JD Cloud ALB load balancer ID", "workflow_node.deploy.form.jdcloud_alb_loadbalancer_id.tooltip": "For more information, see https://cns-console.jdcloud.com/host/loadBalance/list", @@ -658,18 +658,24 @@ "workflow_node.deploy.form.ssh_preset_scripts.option.ps_binding_rdp.label": "PowerShell - Binding RDP", "workflow_node.deploy.form.ssh_use_scp.label": "Fallback to use SCP", "workflow_node.deploy.form.ssh_use_scp.tooltip": "If the remote server does not support SFTP, please enable this option to fallback to SCP.", + "workflow_node.deploy.form.tencentcloud_cdn_endpoint.label": "Tencent Cloud CDN API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_cdn_endpoint.placeholder": "Please enter Tencent Cloud CDN API endpoint (e.g. cdn.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_cdn_endpoint.tooltip": "
  • cdn.intl.tencentcloudapi.com for Tencent Cloud International
  • cdn.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_cdn_domain.label": "Tencent Cloud CDN domain", "workflow_node.deploy.form.tencentcloud_cdn_domain.placeholder": "Please enter Tencent Cloud CDN domain name", "workflow_node.deploy.form.tencentcloud_cdn_domain.tooltip": "For more information, see https://console.tencentcloud.com/cdn", + "workflow_node.deploy.form.tencentcloud_clb_endpoint.label": "Tencent Cloud CLB API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_clb_endpoint.placeholder": "Please enter Tencent Cloud CLB API endpoint (e.g. clb.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_clb_endpoint.tooltip": "
  • clb.intl.tencentcloudapi.com for Tencent Cloud International
  • clb.tencentcloudapi.com for Tencent Cloud in China
", + "workflow_node.deploy.form.tencentcloud_clb_region.label": "Tencent Cloud CLB region", + "workflow_node.deploy.form.tencentcloud_clb_region.placeholder": "Please enter Tencent Cloud CLB region (e.g. ap-guangzhou)", + "workflow_node.deploy.form.tencentcloud_clb_region.tooltip": "For more information, see https://www.tencentcloud.com/document/product/214/13629", "workflow_node.deploy.form.tencentcloud_clb_resource_type.label": "Resource type", "workflow_node.deploy.form.tencentcloud_clb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.ssl_deploy.label": "Via SSL deploy", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.loadbalancer.label": "CLB instance", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.listener.label": "CLB listener", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.ruledomain.label": "CLB rule domain", - "workflow_node.deploy.form.tencentcloud_clb_region.label": "Tencent Cloud CLB region", - "workflow_node.deploy.form.tencentcloud_clb_region.placeholder": "Please enter Tencent Cloud CLB region (e.g. ap-guangzhou)", - "workflow_node.deploy.form.tencentcloud_clb_region.tooltip": "For more information, see https://www.tencentcloud.com/document/product/214/13629", "workflow_node.deploy.form.tencentcloud_clb_loadbalancer_id.label": "Tencent Cloud CLB instance ID", "workflow_node.deploy.form.tencentcloud_clb_loadbalancer_id.placeholder": "Please enter Tencent Cloud CLB instance ID", "workflow_node.deploy.form.tencentcloud_clb_loadbalancer_id.tooltip": "For more information, see https://console.tencentcloud.com/clb", @@ -691,18 +697,30 @@ "workflow_node.deploy.form.tencentcloud_cos_domain.label": "Tencent Cloud COS domain", "workflow_node.deploy.form.tencentcloud_cos_domain.placeholder": "Please enter Tencent Cloud COS domain name", "workflow_node.deploy.form.tencentcloud_cos_domain.tooltip": "For more information, see https://console.tencentcloud.com/cos", + "workflow_node.deploy.form.tencentcloud_css_endpoint.label": "Tencent Cloud CSS API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_css_endpoint.placeholder": "Please enter Tencent Cloud CSS API endpoint (e.g. live.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_css_endpoint.tooltip": "
  • live.intl.tencentcloudapi.com for Tencent Cloud International
  • live.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_css_domain.label": "Tencent Cloud CSS play domain", "workflow_node.deploy.form.tencentcloud_css_domain.placeholder": "Please enter Tencent Cloud CSS play domain name", "workflow_node.deploy.form.tencentcloud_css_domain.tooltip": "For more information, see https://console.tencentcloud.com/live", + "workflow_node.deploy.form.tencentcloud_ecdn_endpoint.label": "Tencent Cloud ECDN API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_ecdn_endpoint.placeholder": "Please enter Tencent Cloud ECDN API endpoint (e.g. cdn.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_ecdn_endpoint.tooltip": "
  • cdn.intl.tencentcloudapi.com for Tencent Cloud International
  • cdn.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_ecdn_domain.label": "Tencent Cloud ECDN domain", "workflow_node.deploy.form.tencentcloud_ecdn_domain.placeholder": "Please enter Tencent Cloud ECDN domain name", "workflow_node.deploy.form.tencentcloud_ecdn_domain.tooltip": "For more information, see https://console.tencentcloud.com/cdn", + "workflow_node.deploy.form.tencentcloud_eo_endpoint.label": "Tencent Cloud EdgeOne API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_eo_endpoint.placeholder": "Please enter Tencent Cloud EdgeOne API endpoint (e.g. teo.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_eo_endpoint.tooltip": "
  • cdn.intl.tencentcloudapi.com for Tencent Cloud International
  • teo.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_eo_zone_id.label": "Tencent Cloud EdgeOne zone ID", "workflow_node.deploy.form.tencentcloud_eo_zone_id.placeholder": "Please enter Tencent Cloud EdgeOne zone ID", "workflow_node.deploy.form.tencentcloud_eo_zone_id.tooltip": "For more information, see https://console.tencentcloud.com/edgeone", "workflow_node.deploy.form.tencentcloud_eo_domain.label": "Tencent Cloud EdgeOne domain", "workflow_node.deploy.form.tencentcloud_eo_domain.placeholder": "Please enter Tencent Cloud EdgeOne domain name", "workflow_node.deploy.form.tencentcloud_eo_domain.tooltip": "For more information, see https://console.tencentcloud.com/edgeone", + "workflow_node.deploy.form.tencentcloud_gaap_endpoint.label": "Tencent Cloud GAAP API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_gaap_endpoint.placeholder": "Please enter Tencent Cloud GAAP API endpoint (e.g. gaap.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_gaap_endpoint.tooltip": "
  • gaap.intl.tencentcloudapi.com for Tencent Cloud International
  • gaap.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_gaap_resource_type.label": "Resource type", "workflow_node.deploy.form.tencentcloud_gaap_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.tencentcloud_gaap_resource_type.option.listener.label": "GAAP listener", @@ -712,13 +730,22 @@ "workflow_node.deploy.form.tencentcloud_gaap_listener_id.label": "Tencent Cloud GAAP listener ID", "workflow_node.deploy.form.tencentcloud_gaap_listener_id.placeholder": "Please enter Tencent Cloud GAAP listener ID", "workflow_node.deploy.form.tencentcloud_gaap_listener_id.tooltip": "For more information, see https://console.tencentcloud.com/gaap", + "workflow_node.deploy.form.tencentcloud_scf_endpoint.label": "Tencent Cloud SCF API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_scf_endpoint.placeholder": "Please enter Tencent Cloud SCF API endpoint (e.g. scf.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_scf_endpoint.tooltip": "
  • scf.intl.tencentcloudapi.com for Tencent Cloud International
  • scf.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_scf_region.label": "Tencent Cloud SCF region", "workflow_node.deploy.form.tencentcloud_scf_region.placeholder": "Please enter Tencent Cloud SCF region (e.g. ap-guangzhou)", "workflow_node.deploy.form.tencentcloud_scf_region.tooltip": "For more information, see https://www.tencentcloud.com/document/product/583/17299", "workflow_node.deploy.form.tencentcloud_scf_domain.label": "Tencent Cloud SCF domain", "workflow_node.deploy.form.tencentcloud_scf_domain.placeholder": "Please enter Tencent Cloud SCF domain name", "workflow_node.deploy.form.tencentcloud_scf_domain.tooltip": "For more information, see https://console.tencentcloud.com/scf", + "workflow_node.deploy.form.tencentcloud_ssl_endpoint.label": "Tencent Cloud SSL API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_ssl_endpoint.placeholder": "Please enter Tencent Cloud SSL API endpoint (e.g. ssl.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_ssl_endpoint.tooltip": "
  • ssl.intl.tencentcloudapi.com for Tencent Cloud International
  • ssl.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_ssl_deploy.guide": "TIPS: You need to go to the Tencent Cloud console to check the actual deployment results by yourself, because Tencent Cloud deployment tasks are running asynchronously.", + "workflow_node.deploy.form.tencentcloud_ssl_deploy_endpoint.label": "Tencent Cloud SSL API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_ssl_deploy_endpoint.placeholder": "Please enter Tencent Cloud SSL API endpoint (e.g. ssl.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_ssl_deploy_endpoint.tooltip": "
  • ssl.intl.tencentcloudapi.com for Tencent Cloud International
  • ssl.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_ssl_deploy_region.label": "Tencent Cloud service region", "workflow_node.deploy.form.tencentcloud_ssl_deploy_region.placeholder": "Please enter Tencent Cloud service region (e.g. ap-guangzhou)", "workflow_node.deploy.form.tencentcloud_ssl_deploy_region.tooltip": "For more information, see https://www.tencentcloud.com/document/product/1007/36573", @@ -731,12 +758,18 @@ "workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.tooltip": "For more information, see https://cloud.tencent.com/document/product/400/91667", "workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.multiple_input_modal.title": "Change Tencent Cloud resource IDs", "workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.multiple_input_modal.placeholder": "Please enter Tencent Cloud resouce ID", + "workflow_node.deploy.form.tencentcloud_vod_endpoint.label": "Tencent Cloud VOD API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_vod_endpoint.placeholder": "Please enter Tencent Cloud VOD API endpoint (e.g. vod.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_vod_endpoint.tooltip": "
  • vod.intl.tencentcloudapi.com for Tencent Cloud International
  • vod.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_vod_sub_app_id.label": "Tencent Cloud VOD App ID", "workflow_node.deploy.form.tencentcloud_vod_sub_app_id.placeholder": "Please enter Tencent Cloud VOD App ID", "workflow_node.deploy.form.tencentcloud_vod_sub_app_id.tooltip": "For more information, see https://console.tencentcloud.com/vod", "workflow_node.deploy.form.tencentcloud_vod_domain.label": "Tencent Cloud VOD domain", "workflow_node.deploy.form.tencentcloud_vod_domain.placeholder": "Please enter Tencent Cloud VOD domain name", "workflow_node.deploy.form.tencentcloud_vod_domain.tooltip": "For more information, see https://console.tencentcloud.com/vod", + "workflow_node.deploy.form.tencentcloud_waf_endpoint.label": "Tencent Cloud WAF API endpoint (Optional)", + "workflow_node.deploy.form.tencentcloud_waf_endpoint.placeholder": "Please enter Tencent Cloud WAF API endpoint (e.g. waf.intl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_waf_endpoint.tooltip": "
  • waf.intl.tencentcloudapi.com for Tencent Cloud International
  • waf.tencentcloudapi.com for Tencent Cloud in China
", "workflow_node.deploy.form.tencentcloud_waf_region.label": "Tencent Cloud WAF region", "workflow_node.deploy.form.tencentcloud_waf_region.placeholder": "Please enter Tencent Cloud WAF region (e.g. ap-guangzhou)", "workflow_node.deploy.form.tencentcloud_waf_region.tooltip": "For more information, see https://www.tencentcloud.com/document/product/627/38085", @@ -779,13 +812,13 @@ "workflow_node.deploy.form.upyun_file_domain.label": "UPYUN bucket domain", "workflow_node.deploy.form.upyun_file_domain.placeholder": "Please enter UPYUN bucket domain name", "workflow_node.deploy.form.upyun_file_domain.tooltip": "For more information, see https://console.upyun.com/services/file/", + "workflow_node.deploy.form.volcengine_alb_region.label": "VolcEngine ALB region", + "workflow_node.deploy.form.volcengine_alb_region.placeholder": "Please enter VolcEngine ALB region (e.g. cn-beijing)", + "workflow_node.deploy.form.volcengine_alb_region.tooltip": "For more information, see https://www.volcengine.com/docs/6767/127501", "workflow_node.deploy.form.volcengine_alb_resource_type.label": "Resource type", "workflow_node.deploy.form.volcengine_alb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.volcengine_alb_resource_type.option.loadbalancer.label": "ALB load balancer", "workflow_node.deploy.form.volcengine_alb_resource_type.option.listener.label": "ALB listener", - "workflow_node.deploy.form.volcengine_alb_region.label": "VolcEngine ALB region", - "workflow_node.deploy.form.volcengine_alb_region.placeholder": "Please enter VolcEngine ALB region (e.g. cn-beijing)", - "workflow_node.deploy.form.volcengine_alb_region.tooltip": "For more information, see https://www.volcengine.com/docs/6767/127501", "workflow_node.deploy.form.volcengine_alb_loadbalancer_id.label": "VolcEngine ALB load balancer ID", "workflow_node.deploy.form.volcengine_alb_loadbalancer_id.placeholder": "Please enter VolcEngine ALB load balancer ID", "workflow_node.deploy.form.volcengine_alb_loadbalancer_id.tooltip": "For more information, see https://console.volcengine.com/alb", @@ -800,13 +833,13 @@ "workflow_node.deploy.form.volcengine_cdn_domain.tooltip": "For more information, see https://console.volcengine.com/cdn/homepage", "workflow_node.deploy.form.volcengine_certcenter_region.label": "VolcEngine Certificate Center region", "workflow_node.deploy.form.volcengine_certcenter_region.placeholder": "Please enter VolcEngine Certificate Center region (e.g. cn-beijing)", + "workflow_node.deploy.form.volcengine_clb_region.label": "VolcEngine CLB region", + "workflow_node.deploy.form.volcengine_clb_region.placeholder": "Please enter VolcEngine CLB region (e.g. cn-beijing)", + "workflow_node.deploy.form.volcengine_clb_region.tooltip": "For more information, see https://www.volcengine.com/docs/6406/74892", "workflow_node.deploy.form.volcengine_clb_resource_type.label": "Resource type", "workflow_node.deploy.form.volcengine_clb_resource_type.placeholder": "Please select resource type", "workflow_node.deploy.form.volcengine_clb_resource_type.option.loadbalancer.label": "CLB load balancer", "workflow_node.deploy.form.volcengine_clb_resource_type.option.listener.label": "CLB listener", - "workflow_node.deploy.form.volcengine_clb_region.label": "VolcEngine CLB region", - "workflow_node.deploy.form.volcengine_clb_region.placeholder": "Please enter VolcEngine CLB region (e.g. cn-beijing)", - "workflow_node.deploy.form.volcengine_clb_region.tooltip": "For more information, see https://www.volcengine.com/docs/6406/74892", "workflow_node.deploy.form.volcengine_clb_loadbalancer_id.label": "VolcEngine CLB load balancer ID", "workflow_node.deploy.form.volcengine_clb_loadbalancer_id.placeholder": "Please enter VolcEngine CLB load balancer ID", "workflow_node.deploy.form.volcengine_clb_loadbalancer_id.tooltip": "For more information, see https://console.volcengine.com/clb/LoadBalancer", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index cdb519db..1639339a 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -133,13 +133,13 @@ "workflow_node.deploy.form.1panel_site_certificate_id.label": "1Panel 证书 ID", "workflow_node.deploy.form.1panel_site_certificate_id.placeholder": "请输入 1Panel 证书 ID", "workflow_node.deploy.form.1panel_site_certificate_id.tooltip": "请登录 1Panel 面板查看。", + "workflow_node.deploy.form.aliyun_alb_region.label": "阿里云 ALB 服务地域", + "workflow_node.deploy.form.aliyun_alb_region.placeholder": "请输入阿里云 ALB 服务地域(例如:cn-hangzhou)", + "workflow_node.deploy.form.aliyun_alb_region.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/slb/application-load-balancer/product-overview/supported-regions-and-zones", "workflow_node.deploy.form.aliyun_alb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.aliyun_alb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.aliyun_alb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS/QUIC 监听的证书", "workflow_node.deploy.form.aliyun_alb_resource_type.option.listener.label": "替换指定负载均衡监听器的证书", - "workflow_node.deploy.form.aliyun_alb_region.label": "阿里云 ALB 服务地域", - "workflow_node.deploy.form.aliyun_alb_region.placeholder": "请输入阿里云 ALB 服务地域(例如:cn-hangzhou)", - "workflow_node.deploy.form.aliyun_alb_region.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/slb/application-load-balancer/product-overview/supported-regions-and-zones", "workflow_node.deploy.form.aliyun_alb_loadbalancer_id.label": "阿里云 ALB 负载均衡器 ID", "workflow_node.deploy.form.aliyun_alb_loadbalancer_id.placeholder": "请输入阿里云 ALB 负载均衡器 ID", "workflow_node.deploy.form.aliyun_alb_loadbalancer_id.tooltip": "这是什么?请参阅 https://slb.console.aliyun.com/alb", @@ -184,13 +184,13 @@ "workflow_node.deploy.form.aliyun_cas_deploy_contact_ids.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/ssl-certificate/developer-reference/api-cas-2020-04-07-listcontact

不填写时,将使用系统联系人列表中的第一个。", "workflow_node.deploy.form.aliyun_cas_deploy_contact_ids.multiple_input_modal.title": "修改阿里云联系人 ID", "workflow_node.deploy.form.aliyun_cas_deploy_contact_ids.multiple_input_modal.placeholder": "请输入阿里云联系人 ID", + "workflow_node.deploy.form.aliyun_clb_region.label": "阿里云 CLB 服务地域", + "workflow_node.deploy.form.aliyun_clb_region.placeholder": "请输入阿里云 CLB 服务地域(例如:cn-hangzhou)", + "workflow_node.deploy.form.aliyun_clb_region.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/slb/classic-load-balancer/product-overview/regions-that-support-clb", "workflow_node.deploy.form.aliyun_clb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.aliyun_clb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.aliyun_clb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS 监听的证书", "workflow_node.deploy.form.aliyun_clb_resource_type.option.listener.label": "替换指定负载均衡监听的证书", - "workflow_node.deploy.form.aliyun_clb_region.label": "阿里云 CLB 服务地域", - "workflow_node.deploy.form.aliyun_clb_region.placeholder": "请输入阿里云 CLB 服务地域(例如:cn-hangzhou)", - "workflow_node.deploy.form.aliyun_clb_region.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/slb/classic-load-balancer/product-overview/regions-that-support-clb", "workflow_node.deploy.form.aliyun_clb_loadbalancer_id.label": "阿里云 CLB 负载均衡器 ID", "workflow_node.deploy.form.aliyun_clb_loadbalancer_id.placeholder": "请输入阿里云 CLB 负载均衡器 ID", "workflow_node.deploy.form.aliyun_clb_loadbalancer_id.tooltip": "这是什么?请参阅 https://slb.console.aliyun.com/clb", @@ -245,13 +245,13 @@ "workflow_node.deploy.form.aliyun_live_domain.label": "阿里云视频直播流域名", "workflow_node.deploy.form.aliyun_live_domain.placeholder": "请输入阿里云视频直播流域名(支持泛域名)", "workflow_node.deploy.form.aliyun_live_domain.tooltip": "这是什么?请参阅 https://live.console.aliyun.com", + "workflow_node.deploy.form.aliyun_nlb_region.label": "阿里云 NLB 服务地域", + "workflow_node.deploy.form.aliyun_nlb_region.placeholder": "请输入阿里云 NLB 服务地域(例如:cn-hangzhou)", + "workflow_node.deploy.form.aliyun_nlb_region.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/slb/network-load-balancer/product-overview/regions-that-support-nlb", "workflow_node.deploy.form.aliyun_nlb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.aliyun_nlb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.aliyun_nlb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS/QUIC 监听的证书", "workflow_node.deploy.form.aliyun_nlb_resource_type.option.listener.label": "替换指定负载均衡监听器的证书", - "workflow_node.deploy.form.aliyun_nlb_region.label": "阿里云 NLB 服务地域", - "workflow_node.deploy.form.aliyun_nlb_region.placeholder": "请输入阿里云 NLB 服务地域(例如:cn-hangzhou)", - "workflow_node.deploy.form.aliyun_nlb_region.tooltip": "这是什么?请参阅 https://help.aliyun.com/zh/slb/network-load-balancer/product-overview/regions-that-support-nlb", "workflow_node.deploy.form.aliyun_nlb_loadbalancer_id.label": "阿里云 NLB 负载均衡器 ID", "workflow_node.deploy.form.aliyun_nlb_loadbalancer_id.placeholder": "请输入阿里云 NLB 负载均衡器 ID", "workflow_node.deploy.form.aliyun_nlb_loadbalancer_id.tooltip": "这是什么?请参阅 https://slb.console.aliyun.com/nlb", @@ -318,13 +318,13 @@ "workflow_node.deploy.form.azure_keyvault_certificate_name.placeholder": "请输入 Azure KeyVault 证书名称", "workflow_node.deploy.form.azure_keyvault_certificate_name.tooltip": "不填写时,将由 Certimate 自动生成证书名称。", "workflow_node.deploy.form.azure_keyvault_certificate_name.errmsg.invalid": "证书名称只能包含字母、数字和连字符(-),长度限制为 1 到 127 个字符", + "workflow_node.deploy.form.baiducloud_appblb_region.label": "百度智能云 BLB 服务地域", + "workflow_node.deploy.form.baiducloud_appblb_region.placeholder": "请输入百度智能云 BLB 服务地域(例如:bj)", + "workflow_node.deploy.form.baiducloud_appblb_region.tooltip": "这是什么?请参阅 https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_appblb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.baiducloud_appblb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.baiducloud_appblb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS/SSL 监听的证书", "workflow_node.deploy.form.baiducloud_appblb_resource_type.option.listener.label": "替换指定负载均衡监听的证书", - "workflow_node.deploy.form.baiducloud_appblb_region.label": "百度智能云 BLB 服务地域", - "workflow_node.deploy.form.baiducloud_appblb_region.placeholder": "请输入百度智能云 BLB 服务地域(例如:bj)", - "workflow_node.deploy.form.baiducloud_appblb_region.tooltip": "这是什么?请参阅 https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.label": "百度智能云 BLB 负载均衡器 ID", "workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.placeholder": "请输入百度智能云 BLB 负载均衡器 ID", "workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.tooltip": "这是什么?请参阅 https://console.bce.baidu.com/blb/#/appblb/list", @@ -334,13 +334,13 @@ "workflow_node.deploy.form.baiducloud_appblb_snidomain.label": "百度智能云 BLB 扩展域名(可选)", "workflow_node.deploy.form.baiducloud_appblb_snidomain.placeholder": "请输入百度智能云 BLB 扩展域名(支持泛域名)", "workflow_node.deploy.form.baiducloud_appblb_snidomain.tooltip": "这是什么?请参阅 https://console.bce.baidu.com/blb/#/appblb/list

不填写时,将替换监听器的默认证书;否则,将替换扩展域名证书。", + "workflow_node.deploy.form.baiducloud_blb_region.label": "百度智能云 BLB 服务地域", + "workflow_node.deploy.form.baiducloud_blb_region.placeholder": "请输入百度智能云 BLB 服务地域(例如:bj)", + "workflow_node.deploy.form.baiducloud_blb_region.tooltip": "这是什么?请参阅 https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_blb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.baiducloud_blb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.baiducloud_blb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS/SSL 监听的证书", "workflow_node.deploy.form.baiducloud_blb_resource_type.option.listener.label": "替换指定负载均衡监听的证书", - "workflow_node.deploy.form.baiducloud_blb_region.label": "百度智能云 BLB 服务地域", - "workflow_node.deploy.form.baiducloud_blb_region.placeholder": "请输入百度智能云 BLB 服务地域(例如:bj)", - "workflow_node.deploy.form.baiducloud_blb_region.tooltip": "这是什么?请参阅 https://cloud.baidu.com/doc/BLB/s/cjwvxnzix", "workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.label": "百度智能云 BLB 负载均衡器 ID", "workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.placeholder": "请输入百度智能云 BLB 负载均衡器 ID", "workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.tooltip": "这是什么?请参阅 https://console.bce.baidu.com/blb/#/blb/list", @@ -403,13 +403,13 @@ "workflow_node.deploy.form.ctcccloud_cdn_domain.label": "天翼云 CDN 加速域名", "workflow_node.deploy.form.ctcccloud_cdn_domain.placeholder": "请输入天翼云 CDN 加速域名(支持泛域名)", "workflow_node.deploy.form.ctcccloud_cdn_domain.tooltip": "这是什么?请参阅 https://cdn-console.ctyun.cn", + "workflow_node.deploy.form.ctcccloud_elb_region_id.label": "天翼云 ELB 资源池 ID", + "workflow_node.deploy.form.ctcccloud_elb_region_id.placeholder": "请输入天翼云 ELB 资源池 ID", + "workflow_node.deploy.form.ctcccloud_elb_region_id.tooltip": "这是什么?请参阅 https://www.ctyun.cn/document/10026755/10196575", "workflow_node.deploy.form.ctcccloud_elb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.ctcccloud_elb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.ctcccloud_elb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS 监听器的证书", "workflow_node.deploy.form.ctcccloud_elb_resource_type.option.listener.label": "替换指定监听器的证书", - "workflow_node.deploy.form.ctcccloud_elb_region_id.label": "天翼云 ELB 资源池 ID", - "workflow_node.deploy.form.ctcccloud_elb_region_id.placeholder": "请输入天翼云 ELB 资源池 ID", - "workflow_node.deploy.form.ctcccloud_elb_region_id.tooltip": "这是什么?请参阅 https://www.ctyun.cn/document/10026755/10196575", "workflow_node.deploy.form.ctcccloud_elb_loadbalancer_id.label": "天翼云 ELB 负载均衡器 ID", "workflow_node.deploy.form.ctcccloud_elb_loadbalancer_id.placeholder": "请输入天翼云 ELB 负载均衡器 ID", "workflow_node.deploy.form.ctcccloud_elb_loadbalancer_id.tooltip": "这是什么?请参阅 https://console.ctyun.cn/network/index/#/elb/elbList", @@ -452,14 +452,14 @@ "workflow_node.deploy.form.huaweicloud_cdn_domain.label": "华为云 CDN 加速域名", "workflow_node.deploy.form.huaweicloud_cdn_domain.placeholder": "请输入华为云 CDN 加速域名", "workflow_node.deploy.form.huaweicloud_cdn_domain.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/cdn", + "workflow_node.deploy.form.huaweicloud_elb_region.label": "华为云 ELB 服务区域", + "workflow_node.deploy.form.huaweicloud_elb_region.placeholder": "请输入华为云 ELB 服务区域(例如:cn-north-1)", + "workflow_node.deploy.form.huaweicloud_elb_region.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_elb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.huaweicloud_elb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.huaweicloud_elb_resource_type.option.certificate.label": "替换指定证书", "workflow_node.deploy.form.huaweicloud_elb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS 监听器的证书", "workflow_node.deploy.form.huaweicloud_elb_resource_type.option.listener.label": "替换指定监听器的证书", - "workflow_node.deploy.form.huaweicloud_elb_region.label": "华为云 ELB 服务区域", - "workflow_node.deploy.form.huaweicloud_elb_region.placeholder": "请输入华为云 ELB 服务区域(例如:cn-north-1)", - "workflow_node.deploy.form.huaweicloud_elb_region.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_elb_certificate_id.label": "华为云 ELB 证书 ID", "workflow_node.deploy.form.huaweicloud_elb_certificate_id.placeholder": "请输入华为云 ELB 证书 ID", "workflow_node.deploy.form.huaweicloud_elb_certificate_id.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/vpc/#/elb/elbCert", @@ -469,27 +469,27 @@ "workflow_node.deploy.form.huaweicloud_elb_listener_id.label": "华为云 ELB 监听器 ID", "workflow_node.deploy.form.huaweicloud_elb_listener_id.placeholder": "请输入华为云 ELB 监听器 ID", "workflow_node.deploy.form.huaweicloud_elb_listener_id.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/vpc/#/elb/list/grid", + "workflow_node.deploy.form.huaweicloud_waf_region.label": "华为云 WAF 服务区域", + "workflow_node.deploy.form.huaweicloud_waf_region.placeholder": "请输入华为云 WAF 服务区域(例如:cn-north-1)", + "workflow_node.deploy.form.huaweicloud_waf_region.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_waf_resource_type.label": "证书部署方式", "workflow_node.deploy.form.huaweicloud_waf_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.huaweicloud_waf_resource_type.option.certificate.label": "替换指定证书", "workflow_node.deploy.form.huaweicloud_waf_resource_type.option.cloudserver.label": "替换指定云模式防护网站的证书", "workflow_node.deploy.form.huaweicloud_waf_resource_type.option.premiumhost.label": "替换指定独享模式防护网站的证书", - "workflow_node.deploy.form.huaweicloud_waf_region.label": "华为云 WAF 服务区域", - "workflow_node.deploy.form.huaweicloud_waf_region.placeholder": "请输入华为云 WAF 服务区域(例如:cn-north-1)", - "workflow_node.deploy.form.huaweicloud_waf_region.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/apiexplorer/#/endpoint", "workflow_node.deploy.form.huaweicloud_waf_certificate_id.label": "华为云 WAF 证书 ID", "workflow_node.deploy.form.huaweicloud_waf_certificate_id.placeholder": "请输入华为云 WAF 证书 ID", "workflow_node.deploy.form.huaweicloud_waf_certificate_id.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/console/#/waf/certificateManagement", "workflow_node.deploy.form.huaweicloud_waf_domain.label": "华为云 WAF 防护域名", "workflow_node.deploy.form.huaweicloud_waf_domain.placeholder": "请输入华为云 WAF 防护域名(支持泛域名)", "workflow_node.deploy.form.huaweicloud_waf_domain.tooltip": "这是什么?请参阅 https://console.huaweicloud.com/console/#/waf/domain/list", + "workflow_node.deploy.form.jdcloud_alb_region_id.label": "京东云 ALB 服务地域 ID", + "workflow_node.deploy.form.jdcloud_alb_region_id.placeholder": "请输入京东云 ALB 服务地域 ID(例如:cn-north-1", + "workflow_node.deploy.form.jdcloud_alb_region_id.tooltip": "这是什么?请参阅 https://docs.jdcloud.com/cn/common-declaration/api/introduction", "workflow_node.deploy.form.jdcloud_alb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.jdcloud_alb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.jdcloud_alb_resource_type.option.loadbalancer.label": "替换指定负载均衡器下的全部 HTTPS/TLS 监听的证书", "workflow_node.deploy.form.jdcloud_alb_resource_type.option.listener.label": "替换指定负载均衡监听器的证书", - "workflow_node.deploy.form.jdcloud_alb_region_id.label": "京东云 ALB 服务地域 ID", - "workflow_node.deploy.form.jdcloud_alb_region_id.placeholder": "请输入京东云 ALB 服务地域 ID(例如:cn-north-1", - "workflow_node.deploy.form.jdcloud_alb_region_id.tooltip": "这是什么?请参阅 https://docs.jdcloud.com/cn/common-declaration/api/introduction", "workflow_node.deploy.form.jdcloud_alb_loadbalancer_id.label": "京东云 ALB 负载均衡器 ID", "workflow_node.deploy.form.jdcloud_alb_loadbalancer_id.placeholder": "请输入京东云 ALB 负载均衡器 ID", "workflow_node.deploy.form.jdcloud_alb_loadbalancer_id.tooltip": "这是什么?请参阅 https://cns-console.jdcloud.com/host/loadBalance/list", @@ -656,18 +656,24 @@ "workflow_node.deploy.form.ssh_preset_scripts.option.ps_binding_rdp.label": "PowerShell - 导入并绑定到 RDP", "workflow_node.deploy.form.ssh_use_scp.label": "回退使用 SCP", "workflow_node.deploy.form.ssh_use_scp.tooltip": "如果你的远程服务器不支持 SFTP,请开启此选项回退为 SCP。", + "workflow_node.deploy.form.tencentcloud_cdn_endpoint.label": "腾讯云 CDN 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_cdn_endpoint.placeholder": "请输入腾讯云 CDN 接口端点(例如:cdn.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_cdn_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/228/30976", "workflow_node.deploy.form.tencentcloud_cdn_domain.label": "腾讯云 CDN 加速域名", "workflow_node.deploy.form.tencentcloud_cdn_domain.placeholder": "请输入腾讯云 CDN 加速域名(支持泛域名)", "workflow_node.deploy.form.tencentcloud_cdn_domain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/cdn", + "workflow_node.deploy.form.tencentcloud_clb_endpoint.label": "腾讯云 CLB 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_clb_endpoint.placeholder": "请输入腾讯云 CLB 接口端点(例如:clb.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_clb_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/214/30669", + "workflow_node.deploy.form.tencentcloud_clb_region.label": "腾讯云 CLB 产品地域", + "workflow_node.deploy.form.tencentcloud_clb_region.placeholder": "请输入腾讯云 CLB 服务地域(例如:ap-guangzhou)", + "workflow_node.deploy.form.tencentcloud_clb_region.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/214/33415", "workflow_node.deploy.form.tencentcloud_clb_resource_type.label": "证书部署方式", "workflow_node.deploy.form.tencentcloud_clb_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.ssl_deploy.label": "通过 SSL 服务部署到云资源实例", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.loadbalancer.label": "替换指定实例下的全部 HTTPS/TCPSSL/QUIC 监听器的证书", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.listener.label": "替换指定监听器的证书", "workflow_node.deploy.form.tencentcloud_clb_resource_type.option.ruledomain.label": "替换指定七层监听转发规则域名的证书", - "workflow_node.deploy.form.tencentcloud_clb_region.label": "腾讯云 CLB 产品地域", - "workflow_node.deploy.form.tencentcloud_clb_region.placeholder": "请输入腾讯云 CLB 服务地域(例如:ap-guangzhou)", - "workflow_node.deploy.form.tencentcloud_clb_region.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/214/33415", "workflow_node.deploy.form.tencentcloud_clb_loadbalancer_id.label": "腾讯云 CLB 实例 ID", "workflow_node.deploy.form.tencentcloud_clb_loadbalancer_id.placeholder": "请输入腾讯云 CLB 实例 ID", "workflow_node.deploy.form.tencentcloud_clb_loadbalancer_id.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/clb", @@ -689,18 +695,30 @@ "workflow_node.deploy.form.tencentcloud_cos_domain.label": "腾讯云 COS 自定义域名", "workflow_node.deploy.form.tencentcloud_cos_domain.placeholder": "请输入腾讯云 COS 自定义域名", "workflow_node.deploy.form.tencentcloud_cos_domain.tooltip": "这是什么?请参阅 see https://console.cloud.tencent.com/cos", + "workflow_node.deploy.form.tencentcloud_css_endpoint.label": "腾讯云云直播接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_css_endpoint.placeholder": "请输入腾讯云云直播接口端点(例如:live.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_css_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/267/20458", "workflow_node.deploy.form.tencentcloud_css_domain.label": "腾讯云云直播播放域名", "workflow_node.deploy.form.tencentcloud_css_domain.placeholder": "请输入腾讯云云直播播放域名", "workflow_node.deploy.form.tencentcloud_css_domain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/live", + "workflow_node.deploy.form.tencentcloud_ecdn_endpoint.label": "腾讯云 ECDN 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_ecdn_endpoint.placeholder": "请输入腾讯云 ECDN 接口端点(例如:cdn.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_ecdn_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/214/30669", "workflow_node.deploy.form.tencentcloud_ecdn_domain.label": "腾讯云 ECDN 加速域名", "workflow_node.deploy.form.tencentcloud_ecdn_domain.placeholder": "请输入腾讯云 ECDN 加速域名(支持泛域名)", "workflow_node.deploy.form.tencentcloud_ecdn_domain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/cdn", + "workflow_node.deploy.form.tencentcloud_eo_endpoint.label": "腾讯云 EdgeOne 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_eo_endpoint.placeholder": "请输入腾讯云 EdgeOne 接口端点(例如:teo.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_eo_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/1552/80723", "workflow_node.deploy.form.tencentcloud_eo_zone_id.label": "腾讯云 EdgeOne 站点 ID", "workflow_node.deploy.form.tencentcloud_eo_zone_id.placeholder": "请输入腾讯云 EdgeOne 站点 ID", "workflow_node.deploy.form.tencentcloud_eo_zone_id.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/edgeone", "workflow_node.deploy.form.tencentcloud_eo_domain.label": "腾讯云 EdgeOne 加速域名", "workflow_node.deploy.form.tencentcloud_eo_domain.placeholder": "请输入腾讯云 EdgeOne 加速域名(支持泛域名)", "workflow_node.deploy.form.tencentcloud_eo_domain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/edgeone", + "workflow_node.deploy.form.tencentcloud_gaap_endpoint.label": "腾讯云 GAAP 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_gaap_endpoint.placeholder": "请输入腾讯云 GAAP 接口端点(例如:gaap.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_gaap_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/608/36934", "workflow_node.deploy.form.tencentcloud_gaap_resource_type.label": "证书部署方式", "workflow_node.deploy.form.tencentcloud_gaap_resource_type.placeholder": "请选择证书部署方式", "workflow_node.deploy.form.tencentcloud_gaap_resource_type.option.listener.label": "替换指定监听器的证书", @@ -710,13 +728,22 @@ "workflow_node.deploy.form.tencentcloud_gaap_listener_id.label": "腾讯云 GAAP 监听器 ID", "workflow_node.deploy.form.tencentcloud_gaap_listener_id.placeholder": "请输入腾讯云 GAAP 监听器 ID", "workflow_node.deploy.form.tencentcloud_gaap_listener_id.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/gaap", + "workflow_node.deploy.form.tencentcloud_scf_endpoint.label": "腾讯云 SCF 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_scf_endpoint.placeholder": "请输入腾讯云 SCF 接口端点(例如:scf.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_scf_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/583/17237", "workflow_node.deploy.form.tencentcloud_scf_region.label": "腾讯云 SCF 产品地域", "workflow_node.deploy.form.tencentcloud_scf_region.placeholder": "输入腾讯云 SCF 产品地域(例如:ap-guangzhou)", "workflow_node.deploy.form.tencentcloud_scf_region.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/583/17299", "workflow_node.deploy.form.tencentcloud_scf_domain.label": "腾讯云 SCF 自定义域名", "workflow_node.deploy.form.tencentcloud_scf_domain.placeholder": "输入腾讯云 SCF 自定义域名", "workflow_node.deploy.form.tencentcloud_scf_domain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/scf", + "workflow_node.deploy.form.tencentcloud_ssl_endpoint.label": "腾讯云 SSL 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_ssl_endpoint.placeholder": "请输入腾讯云 SSL 接口端点(例如:ssl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_ssl_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/400/41659", "workflow_node.deploy.form.tencentcloud_ssl_deploy.guide": "小贴士:由于腾讯云证书部署任务是异步的,此节点若执行成功仅代表已创建部署任务,实际部署结果需要你自行前往腾讯云控制台查询。", + "workflow_node.deploy.form.tencentcloud_ssl_deploy_endpoint.label": "腾讯云 SSL 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_ssl_deploy_endpoint.placeholder": "请输入腾讯云 SSL 接口端点(例如:ssl.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_ssl_deploy_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/400/41659", "workflow_node.deploy.form.tencentcloud_ssl_deploy_region.label": "腾讯云云产品地域", "workflow_node.deploy.form.tencentcloud_ssl_deploy_region.placeholder": "请输入腾讯云云产品地域(例如:ap-guangzhou)", "workflow_node.deploy.form.tencentcloud_ssl_deploy_region.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/400/41659", @@ -729,12 +756,18 @@ "workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/400/91667

注意与各产品本身的实例 ID 区分。", "workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.multiple_input_modal.title": "修改腾讯云云产品资源 ID", "workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.multiple_input_modal.placeholder": "请输入腾讯云云产品资源 ID", + "workflow_node.deploy.form.tencentcloud_vod_endpoint.label": "腾讯云云点播接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_vod_endpoint.placeholder": "请输入腾讯云云点播接口端点(例如:vod.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_vod_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/266/31755", "workflow_node.deploy.form.tencentcloud_vod_sub_app_id.label": "腾讯云云点播应用 ID", "workflow_node.deploy.form.tencentcloud_vod_sub_app_id.placeholder": "请输入腾讯云云点播应用 ID", "workflow_node.deploy.form.tencentcloud_vod_sub_app_id.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/vod", "workflow_node.deploy.form.tencentcloud_vod_domain.label": "腾讯云云点播加速域名", "workflow_node.deploy.form.tencentcloud_vod_domain.placeholder": "请输入腾讯云云点播加速域名", "workflow_node.deploy.form.tencentcloud_vod_domain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/vod", + "workflow_node.deploy.form.tencentcloud_waf_endpoint.label": "腾讯云 WAF 接口端点(可选)", + "workflow_node.deploy.form.tencentcloud_waf_endpoint.placeholder": "请输入腾讯云 WAF 接口端点(例如:waf.tencentcloudapi.com)", + "workflow_node.deploy.form.tencentcloud_waf_endpoint.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/627/53611", "workflow_node.deploy.form.tencentcloud_waf_region.label": "腾讯云 WAF 产品地域", "workflow_node.deploy.form.tencentcloud_waf_region.placeholder": "请输入腾讯云 WAF 产品地域(例如:ap-guangzhou)", "workflow_node.deploy.form.tencentcloud_waf_region.tooltip": "这是什么?请参阅 https://cloud.tencent.com/document/product/627/47525",