feat: try to query bind result before deploy to tencentcloud cos

This commit is contained in:
Fu Diwei 2025-08-28 16:52:43 +08:00
parent a9d565d4fd
commit f82d43e10e
5 changed files with 68 additions and 2 deletions

View File

@ -12,7 +12,7 @@ func (ne *endNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutio
execRes := newNodeExecutionResult(execCtx.Node)
execRes.Terminated = true
ne.logger.Info("the is ending")
ne.logger.Info("the workflow is ending")
return execRes, nil
}

View File

@ -11,7 +11,7 @@ type startNodeExecutor struct {
func (ne *startNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) {
execRes := newNodeExecutionResult(execCtx.Node)
ne.logger.Info("")
ne.logger.Info("the workflow is starting")
return execRes, nil
}

View File

@ -93,6 +93,12 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
d.logger.Info("ssl certificate uploaded", slog.Any("result", upres))
}
// 避免多次部署,否则会报错 https://github.com/certimate-go/certimate/issues/897#issuecomment-3182904098
if bind, _ := d.checkIsBind(ctx, upres.CertId); bind {
d.logger.Info("ssl certificate already deployed")
return &core.SSLDeployResult{}, nil
}
// 证书部署到 COS 实例
// REF: https://cloud.tencent.com/document/api/400/91667
deployCertificateInstanceReq := tcssl.NewDeployCertificateInstanceRequest()
@ -158,6 +164,64 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
return &core.SSLDeployResult{}, nil
}
func (d *SSLDeployerProvider) checkIsBind(ctx context.Context, cloudCertId string) (bool, error) {
// 创建证书关联云资源异步任务
// REF: https://cloud.tencent.com/document/api/400/97759
createCertificateBindResourceSyncTaskReq := tcssl.NewCreateCertificateBindResourceSyncTaskRequest()
createCertificateBindResourceSyncTaskReq.CertificateIds = []*string{common.StringPtr(cloudCertId)}
createCertificateBindResourceSyncTaskReq.IsCache = common.Uint64Ptr(0)
createCertificateBindResourceSyncTaskResp, err := d.sdkClient.SSL.CreateCertificateBindResourceSyncTask(createCertificateBindResourceSyncTaskReq)
d.logger.Debug("sdk request 'ssl.CreateCertificateBindResourceSyncTask'", slog.Any("request", createCertificateBindResourceSyncTaskReq), slog.Any("response", createCertificateBindResourceSyncTaskResp))
if err != nil {
return false, fmt.Errorf("failed to execute sdk request 'ssl.CreateCertificateBindResourceSyncTask': %w", err)
}
// 查询证书关联云资源任务结果
// REF: https://cloud.tencent.com/document/api/400/97758
for {
select {
case <-ctx.Done():
return false, ctx.Err()
default:
}
describeCertificateBindResourceTaskDetailReq := tcssl.NewDescribeCertificateBindResourceTaskDetailRequest()
describeCertificateBindResourceTaskDetailReq.TaskId = createCertificateBindResourceSyncTaskResp.Response.CertTaskIds[0].TaskId
describeCertificateBindResourceTaskDetailReq.ResourceTypes = []*string{common.StringPtr("cos")}
describeCertificateBindResourceTaskDetailReq.Regions = []*string{common.StringPtr(d.config.Region)}
describeCertificateBindResourceTaskDetailReq.Offset = common.StringPtr("0")
describeCertificateBindResourceTaskDetailReq.Limit = common.StringPtr("100")
describeCertificateBindResourceTaskDetailResp, err := d.sdkClient.SSL.DescribeCertificateBindResourceTaskDetail(describeCertificateBindResourceTaskDetailReq)
d.logger.Debug("sdk request 'ssl.DescribeCertificateBindResourceTaskDetail'", slog.Any("request", describeCertificateBindResourceTaskDetailReq), slog.Any("response", describeCertificateBindResourceTaskDetailResp))
if err != nil {
return false, fmt.Errorf("failed to execute sdk request 'ssl.DescribeCertificateBindResourceTaskDetail': %w", err)
}
if describeCertificateBindResourceTaskDetailResp.Response.Status == nil || *describeCertificateBindResourceTaskDetailResp.Response.Status == 2 {
return false, errors.New("unexpected tencentcloud query task status")
} else if *describeCertificateBindResourceTaskDetailResp.Response.Status == 1 {
for _, record := range describeCertificateBindResourceTaskDetailResp.Response.COS {
for _, instance := range record.InstanceList {
if instance.Bucket == nil || *instance.Bucket != d.config.Bucket {
continue
}
if instance.Domain == nil || *instance.Domain != d.config.Domain {
continue
}
if instance.Status == nil || *instance.Status != "ENABLED" {
continue
}
return true, nil
}
}
return false, nil
}
d.logger.Info("waiting for tencentcloud query task completion")
time.Sleep(time.Second * 5)
}
}
func createSDKClients(secretId, secretKey, region string) (*wSDKClients, error) {
credential := common.NewCredential(secretId, secretKey)
client, err := tcssl.NewClient(credential, region, profile.NewClientProfile())

View File

@ -118,6 +118,7 @@ func (d *SSLDeployerProvider) Deploy(ctx context.Context, certPEM string, privke
describeHostDeployRecordDetailReq := tcssl.NewDescribeHostDeployRecordDetailRequest()
describeHostDeployRecordDetailReq.DeployRecordId = common.StringPtr(fmt.Sprintf("%d", *deployCertificateInstanceResp.Response.DeployRecordId))
describeHostDeployRecordDetailReq.Limit = common.Uint64Ptr(200)
describeHostDeployRecordDetailResp, err := d.sdkClient.DescribeHostDeployRecordDetail(describeHostDeployRecordDetailReq)
d.logger.Debug("sdk request 'ssl.DescribeHostDeployRecordDetail'", slog.Any("request", describeHostDeployRecordDetailReq), slog.Any("response", describeHostDeployRecordDetailResp))
if err != nil {

View File

@ -151,6 +151,7 @@ func (d *SSLDeployerProvider) executeUpdateCertificateInstance(ctx context.Conte
describeHostUpdateRecordDetailReq := tcssl.NewDescribeHostUpdateRecordDetailRequest()
describeHostUpdateRecordDetailReq.DeployRecordId = common.StringPtr(deployRecordId)
describeHostUpdateRecordDetailReq.Limit = common.StringPtr("200")
describeHostUpdateRecordDetailResp, err := d.sdkClient.DescribeHostUpdateRecordDetail(describeHostUpdateRecordDetailReq)
d.logger.Debug("sdk request 'ssl.DescribeHostUpdateRecordDetail'", slog.Any("request", describeHostUpdateRecordDetailReq), slog.Any("response", describeHostUpdateRecordDetailResp))
if err != nil {