diff --git a/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go b/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go index 01f71d9e..a92e4eb1 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-cdn/tencentcloud_cdn.go @@ -2,9 +2,11 @@ package tencentcloudcdn import ( "context" + "errors" "fmt" "log/slog" "strings" + "time" tccdn "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn/v20180606" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -132,6 +134,49 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err) } + + // 循环获取部署任务详情,等待任务状态变更 + // REF: https://cloud.tencent.com.cn/document/api/400/91658 + for { + 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 + } + } + + 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) + } } return &deployer.DeployResult{}, nil diff --git a/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go b/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go index 0c2f8902..2f7c0f22 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-clb/tencentcloud_clb.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "log/slog" + "time" tcclb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -151,6 +152,49 @@ func (d *DeployerProvider) deployViaSslService(ctx context.Context, cloudCertId return fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err) } + // 循环获取部署任务详情,等待任务状态变更 + // REF: https://cloud.tencent.com.cn/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 runningCount, succeededCount, failedCount, totalCount int64 + if describeHostDeployRecordDetailResp.Response.TotalCount == nil { + return 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 + } + } + + 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) + } + return nil } diff --git a/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go b/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go index 0949c5a3..99ee9b2f 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-cos/tencentcloud_cos.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "log/slog" + "time" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" @@ -102,6 +103,49 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE return nil, fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err) } + // 循环获取部署任务详情,等待任务状态变更 + // REF: https://cloud.tencent.com.cn/document/api/400/91658 + for { + 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.sdkClient.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 + } + } + + 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) + } + return &deployer.DeployResult{}, nil } diff --git a/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go b/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go index ebe87025..88840f4a 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-ecdn/tencentcloud_ecdn.go @@ -2,9 +2,11 @@ package tencentcloudecdn import ( "context" + "errors" "fmt" "log/slog" "strings" + "time" tccdn "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn/v20180606" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -103,7 +105,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE } else { d.logger.Info("found ecdn instances to deploy", slog.Any("instanceIds", instanceIds)) - // 证书部署到 ECDN 实例 + // 证书部署到 CDN 实例 // REF: https://cloud.tencent.com/document/product/400/91667 deployCertificateInstanceReq := tcssl.NewDeployCertificateInstanceRequest() deployCertificateInstanceReq.CertificateId = common.StringPtr(upres.CertId) @@ -115,6 +117,49 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'ssl.DeployCertificateInstance': %w", err) } + + // 循环获取部署任务详情,等待任务状态变更 + // REF: https://cloud.tencent.com.cn/document/api/400/91658 + for { + 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 + } + } + + 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) + } } return &deployer.DeployResult{}, nil diff --git a/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go b/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go index 5f13660d..585000d9 100644 --- a/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go +++ b/internal/pkg/core/deployer/providers/tencentcloud-ssl-deploy/tencentcloud_ssl_deploy.go @@ -116,30 +116,35 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE describeHostDeployRecordDetailReq := tcssl.NewDescribeHostDeployRecordDetailRequest() describeHostDeployRecordDetailReq.DeployRecordId = common.StringPtr(fmt.Sprintf("%d", *deployCertificateInstanceResp.Response.DeployRecordId)) - describeHostDeployRecordDetailReq.Limit = common.Uint64Ptr(100) describeHostDeployRecordDetailResp, err := d.sdkClient.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 { - acc := int64(0) + if describeHostDeployRecordDetailResp.Response.RunningTotalCount != nil { + runningCount = *describeHostDeployRecordDetailResp.Response.RunningTotalCount + } if describeHostDeployRecordDetailResp.Response.SuccessTotalCount != nil { - acc += *describeHostDeployRecordDetailResp.Response.SuccessTotalCount + succeededCount = *describeHostDeployRecordDetailResp.Response.SuccessTotalCount } if describeHostDeployRecordDetailResp.Response.FailedTotalCount != nil { - acc += *describeHostDeployRecordDetailResp.Response.FailedTotalCount + failedCount = *describeHostDeployRecordDetailResp.Response.FailedTotalCount + } + if describeHostDeployRecordDetailResp.Response.TotalCount != nil { + totalCount = *describeHostDeployRecordDetailResp.Response.TotalCount } - if acc == *describeHostDeployRecordDetailResp.Response.TotalCount { + if succeededCount+failedCount == totalCount { break } } - d.logger.Info("waiting for deployment job completion ...") + 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) }