From 496341fd2e642578c7a5590fa73d22a4ebab34f0 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 27 Aug 2025 21:05:57 +0800 Subject: [PATCH] feat: remove tencentcloud-clb deployment via tencentcloud-ssl --- .../providers/tencentcloud-clb/consts.go | 2 - .../tencentcloud-clb/tencentcloud_clb.go | 134 ++---------------- ...odeConfigFieldsProviderTencentCloudCLB.tsx | 37 +---- .../i18n/locales/en/nls.workflow.nodes.json | 5 - .../i18n/locales/zh/nls.workflow.nodes.json | 5 - 5 files changed, 16 insertions(+), 167 deletions(-) diff --git a/pkg/core/ssl-deployer/providers/tencentcloud-clb/consts.go b/pkg/core/ssl-deployer/providers/tencentcloud-clb/consts.go index 2728e7301..56f4889f4 100644 --- a/pkg/core/ssl-deployer/providers/tencentcloud-clb/consts.go +++ b/pkg/core/ssl-deployer/providers/tencentcloud-clb/consts.go @@ -3,8 +3,6 @@ package tencentcloudclb type ResourceType string const ( - // 资源类型:通过 SSL 服务部署到云资源实例。 - RESOURCE_TYPE_VIA_SSLDEPLOY = ResourceType("ssl-deploy") // 资源类型:部署到指定负载均衡器。 RESOURCE_TYPE_LOADBALANCER = ResourceType("loadbalancer") // 资源类型:部署到指定监听器。 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 ee0b9a700..0cd514cb3 100644 --- a/pkg/core/ssl-deployer/providers/tencentcloud-clb/tencentcloud_clb.go +++ b/pkg/core/ssl-deployer/providers/tencentcloud-clb/tencentcloud_clb.go @@ -12,7 +12,6 @@ import ( tcclb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317" "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" "github.com/certimate-go/certimate/pkg/core" sslmgrsp "github.com/certimate-go/certimate/pkg/core/ssl-manager/providers/tencentcloud-ssl" @@ -43,23 +42,18 @@ type SSLDeployerProviderConfig struct { type SSLDeployerProvider struct { config *SSLDeployerProviderConfig logger *slog.Logger - sdkClients *wSDKClients + sdkClient *tcclb.Client sslManager core.SSLManager } var _ core.SSLDeployer = (*SSLDeployerProvider)(nil) -type wSDKClients struct { - SSL *tcssl.Client - CLB *tcclb.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, config.Endpoint, 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) } @@ -78,7 +72,7 @@ func NewSSLDeployerProvider(config *SSLDeployerProviderConfig) (*SSLDeployerProv return &SSLDeployerProvider{ config: config, logger: slog.Default(), - sdkClients: clients, + sdkClient: client, sslManager: sslmgr, }, nil } @@ -104,11 +98,6 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke // 根据部署资源类型决定部署方式 switch d.config.ResourceType { - case RESOURCE_TYPE_VIA_SSLDEPLOY: - if err := d.deployViaSslService(ctx, upres.CertId); err != nil { - return nil, err - } - case RESOURCE_TYPE_LOADBALANCER: if err := d.deployToLoadbalancer(ctx, upres.CertId); err != nil { return nil, err @@ -131,85 +120,6 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke return &core.SSLDeployResult{}, nil } -func (d *SSLDeployerProvider) deployViaSslService(ctx context.Context, cloudCertId string) error { - if d.config.LoadbalancerId == "" { - return errors.New("config `loadbalancerId` is required") - } - if d.config.ListenerId == "" { - return errors.New("config `listenerId` is required") - } - - // 证书部署到 CLB 实例 - // REF: https://cloud.tencent.com/document/api/400/91667 - deployCertificateInstanceReq := tcssl.NewDeployCertificateInstanceRequest() - deployCertificateInstanceReq.CertificateId = common.StringPtr(cloudCertId) - deployCertificateInstanceReq.ResourceType = common.StringPtr("clb") - deployCertificateInstanceReq.Status = common.Int64Ptr(1) - if d.config.Domain == "" { - // 未指定 SNI,只需部署到监听器 - deployCertificateInstanceReq.InstanceIdList = common.StringPtrs([]string{fmt.Sprintf("%s|%s", d.config.LoadbalancerId, d.config.ListenerId)}) - } else { - // 指定 SNI,需部署到域名 - deployCertificateInstanceReq.InstanceIdList = common.StringPtrs([]string{fmt.Sprintf("%s|%s|%s", d.config.LoadbalancerId, d.config.ListenerId, d.config.Domain)}) - } - 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 fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err) - } - - // 循环获取部署任务详情,等待任务状态变更 - // REF: https://cloud.tencent.com/document/api/400/91658 - for { - select { - case <-ctx.Done(): - return 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 fmt.Errorf("failed to execute sdk request 'ssl.DescribeHostDeployRecordDetail': %w", err) - } - - var pendingCount, runningCount, succeededCount, failedCount, totalCount int64 - if describeHostDeployRecordDetailResp.Response.TotalCount == nil { - return errors.New("unexpected tencentcloud deployment job status") - } else { - if describeHostDeployRecordDetailResp.Response.PendingTotalCount != nil { - pendingCount = *describeHostDeployRecordDetailResp.Response.PendingTotalCount - } - 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 { - if failedCount > 0 { - return fmt.Errorf("tencentcloud deployment job failed (succeeded: %d, failed: %d, total: %d)", succeededCount, failedCount, totalCount) - } - break - } - } - - d.logger.Info(fmt.Sprintf("waiting for tencentcloud deployment job completion (pending: %d, running: %d, succeeded: %d, failed: %d, total: %d) ...", pendingCount, runningCount, succeededCount, failedCount, totalCount)) - time.Sleep(time.Second * 5) - } - - return nil -} - func (d *SSLDeployerProvider) deployToLoadbalancer(ctx context.Context, cloudCertId string) error { if d.config.LoadbalancerId == "" { return errors.New("config `loadbalancerId` is required") @@ -220,7 +130,7 @@ func (d *SSLDeployerProvider) deployToLoadbalancer(ctx context.Context, cloudCer listenerIds := make([]string, 0) describeListenersReq := tcclb.NewDescribeListenersRequest() describeListenersReq.LoadBalancerId = common.StringPtr(d.config.LoadbalancerId) - describeListenersResp, err := d.sdkClients.CLB.DescribeListeners(describeListenersReq) + describeListenersResp, err := d.sdkClient.DescribeListeners(describeListenersReq) d.logger.Debug("sdk request 'clb.DescribeListeners'", slog.Any("request", describeListenersReq), slog.Any("response", describeListenersResp)) if err != nil { return fmt.Errorf("failed to execute sdk request 'clb.DescribeListeners': %w", err) @@ -299,7 +209,7 @@ func (d *SSLDeployerProvider) deployToRuleDomain(ctx context.Context, cloudCertI SSLMode: common.StringPtr("UNIDIRECTIONAL"), CertId: common.StringPtr(cloudCertId), } - modifyDomainAttributesResp, err := d.sdkClients.CLB.ModifyDomainAttributes(modifyDomainAttributesReq) + modifyDomainAttributesResp, err := d.sdkClient.ModifyDomainAttributes(modifyDomainAttributesReq) d.logger.Debug("sdk request 'clb.ModifyDomainAttributes'", slog.Any("request", modifyDomainAttributesReq), slog.Any("response", modifyDomainAttributesResp)) if err != nil { return fmt.Errorf("failed to execute sdk request 'clb.ModifyDomainAttributes': %w", err) @@ -316,7 +226,7 @@ func (d *SSLDeployerProvider) deployToRuleDomain(ctx context.Context, cloudCertI describeTaskStatusReq := tcclb.NewDescribeTaskStatusRequest() describeTaskStatusReq.TaskId = modifyDomainAttributesResp.Response.RequestId - describeTaskStatusResp, err := d.sdkClients.CLB.DescribeTaskStatus(describeTaskStatusReq) + describeTaskStatusResp, err := d.sdkClient.DescribeTaskStatus(describeTaskStatusReq) d.logger.Debug("sdk request 'clb.DescribeTaskStatus'", slog.Any("request", describeTaskStatusReq), slog.Any("response", describeTaskStatusResp)) if err != nil { return fmt.Errorf("failed to execute sdk request 'clb.DescribeTaskStatus': %w", err) @@ -341,7 +251,7 @@ func (d *SSLDeployerProvider) modifyListenerCertificate(ctx context.Context, clo describeListenersReq := tcclb.NewDescribeListenersRequest() describeListenersReq.LoadBalancerId = common.StringPtr(cloudLoadbalancerId) describeListenersReq.ListenerIds = common.StringPtrs([]string{cloudListenerId}) - describeListenersResp, err := d.sdkClients.CLB.DescribeListeners(describeListenersReq) + describeListenersResp, err := d.sdkClient.DescribeListeners(describeListenersReq) d.logger.Debug("sdk request 'clb.DescribeListeners'", slog.Any("request", describeListenersReq), slog.Any("response", describeListenersResp)) if err != nil { return fmt.Errorf("failed to execute sdk request 'clb.DescribeListeners': %w", err) @@ -361,7 +271,7 @@ func (d *SSLDeployerProvider) modifyListenerCertificate(ctx context.Context, clo } else { modifyListenerReq.Certificate.SSLMode = common.StringPtr("UNIDIRECTIONAL") } - modifyListenerResp, err := d.sdkClients.CLB.ModifyListener(modifyListenerReq) + modifyListenerResp, err := d.sdkClient.ModifyListener(modifyListenerReq) d.logger.Debug("sdk request 'clb.ModifyListener'", slog.Any("request", modifyListenerReq), slog.Any("response", modifyListenerResp)) if err != nil { return fmt.Errorf("failed to execute sdk request 'clb.ModifyListener': %w", err) @@ -378,7 +288,7 @@ func (d *SSLDeployerProvider) modifyListenerCertificate(ctx context.Context, clo describeTaskStatusReq := tcclb.NewDescribeTaskStatusRequest() describeTaskStatusReq.TaskId = modifyListenerResp.Response.RequestId - describeTaskStatusResp, err := d.sdkClients.CLB.DescribeTaskStatus(describeTaskStatusReq) + describeTaskStatusResp, err := d.sdkClient.DescribeTaskStatus(describeTaskStatusReq) d.logger.Debug("sdk request 'clb.DescribeTaskStatus'", slog.Any("request", describeTaskStatusReq), slog.Any("response", describeTaskStatusResp)) if err != nil { return fmt.Errorf("failed to execute sdk request 'clb.DescribeTaskStatus': %w", err) @@ -397,34 +307,18 @@ func (d *SSLDeployerProvider) modifyListenerCertificate(ctx context.Context, clo return nil } -func createSDKClients(secretId, secretKey, endpoint, region string) (*wSDKClients, error) { +func createSDKClient(secretId, secretKey, endpoint, region string) (*tcclb.Client, error) { credential := common.NewCredential(secretId, secretKey) - sslCpf := profile.NewClientProfile() + cpf := profile.NewClientProfile() if endpoint != "" { - if strings.HasSuffix(endpoint, "intl.tencentcloudapi.com") { - sslCpf.HttpProfile.Endpoint = "ssl.intl.tencentcloudapi.com" - } + cpf.HttpProfile.Endpoint = endpoint } - // 注意虽然官方文档中地域无需指定,但实际需要部署到 CLB 时必传 - sslClient, err := tcssl.NewClient(credential, region, sslCpf) + client, err := tcclb.NewClient(credential, region, cpf) if err != nil { return nil, err } - clbCpf := profile.NewClientProfile() - if endpoint != "" { - clbCpf.HttpProfile.Endpoint = endpoint - } - - clbClient, err := tcclb.NewClient(credential, region, clbCpf) - if err != nil { - return nil, err - } - - return &wSDKClients{ - SSL: sslClient, - CLB: clbClient, - }, nil + return client, nil } diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderTencentCloudCLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderTencentCloudCLB.tsx index a075b7903..2afac7042 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderTencentCloudCLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderTencentCloudCLB.tsx @@ -11,7 +11,6 @@ import { useFormNestedFieldsContext } from "./_context"; const RESOURCE_TYPE_LOADBALANCER = "loadbalancer" as const; const RESOURCE_TYPE_LISTENER = "listener" as const; const RESOURCE_TYPE_RULEDOMAIN = "ruledomain" as const; -const RESOURCE_TYPE_VIA_SSLDEPLOY = "ssl-deploy" as const; const BizDeployNodeConfigFieldsProviderTencentCloudCLB = () => { const { i18n, t } = useTranslation(); @@ -64,9 +63,6 @@ const BizDeployNodeConfigFieldsProviderTencentCloudCLB = () => { {t("workflow_node.deploy.form.tencentcloud_clb_resource_type.option.ruledomain.label")} - - {t("workflow_node.deploy.form.tencentcloud_clb_resource_type.option.ssl_deploy.label")} - @@ -80,11 +76,7 @@ const BizDeployNodeConfigFieldsProviderTencentCloudCLB = () => { - + { - - } - > - - - - }) .object({ endpoint: z.string().nullish(), resourceType: z.literal( - [RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER, RESOURCE_TYPE_RULEDOMAIN, RESOURCE_TYPE_VIA_SSLDEPLOY], + [RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER, RESOURCE_TYPE_RULEDOMAIN], t("workflow_node.deploy.form.tencentcloud_clb_resource_type.placeholder") ), region: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_clb_region.placeholder")), @@ -180,18 +159,6 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) } } break; - - case RESOURCE_TYPE_VIA_SSLDEPLOY: - { - if (!values.listenerId?.trim()) { - ctx.addIssue({ - code: "custom", - message: t("workflow_node.deploy.form.tencentcloud_clb_listener_id.placeholder"), - path: ["listenerId"], - }); - } - } - break; } }); }; diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json index 9857113c9..0d93192cb 100644 --- a/ui/src/i18n/locales/en/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json @@ -721,7 +721,6 @@ "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", @@ -731,10 +730,6 @@ "workflow_node.deploy.form.tencentcloud_clb_listener_id.label": "Tencent Cloud CLB listener ID", "workflow_node.deploy.form.tencentcloud_clb_listener_id.placeholder": "Please enter Tencent Cloud CLB listener ID", "workflow_node.deploy.form.tencentcloud_clb_listener_id.tooltip": "For more information, see https://console.tencentcloud.com/clb", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.label": "Tencent Cloud CLB SNI domain (Optional)", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.placeholder": "Please enter Tencent Cloud CLB SNI domain name", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.help": "", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.tooltip": "For more information, see https://console.tencentcloud.com/clb
It is optional. If you want to deploy multiple certificates on the same CLB listener, you can fill in this field.", "workflow_node.deploy.form.tencentcloud_clb_ruledomain.label": "Tencent Cloud CLB domain", "workflow_node.deploy.form.tencentcloud_clb_ruledomain.placeholder": "Please enter Tencent Cloud CLB domain name", "workflow_node.deploy.form.tencentcloud_clb_ruledomain.tooltip": "For more information, see https://console.tencentcloud.com/clb", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index 45069defa..0398cef57 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -719,7 +719,6 @@ "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": "替换指定七层监听转发规则域名的证书", @@ -729,10 +728,6 @@ "workflow_node.deploy.form.tencentcloud_clb_listener_id.label": "腾讯云 CLB 监听器 ID", "workflow_node.deploy.form.tencentcloud_clb_listener_id.placeholder": "请输入腾讯云 CLB 监听器 ID", "workflow_node.deploy.form.tencentcloud_clb_listener_id.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/clb", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.label": "腾讯云 CLB SNI 域名(可选)", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.placeholder": "请输入腾讯云 CLB SNI 域名", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.help": "提示:不填写时,将替换监听器的默认证书;否则,将替换扩展域名证书。", - "workflow_node.deploy.form.tencentcloud_clb_snidomain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/clb", "workflow_node.deploy.form.tencentcloud_clb_ruledomain.label": "腾讯云 CLB 七层转发规则域名", "workflow_node.deploy.form.tencentcloud_clb_ruledomain.placeholder": "请输入腾讯云 CLB 七层转发规则域名", "workflow_node.deploy.form.tencentcloud_clb_ruledomain.tooltip": "这是什么?请参阅 https://console.cloud.tencent.com/clb",