Skip to content

Commit 205b2a7

Browse files
committed
feat(dns): 接入七家服务商配置 CNAME
1 parent 930dad4 commit 205b2a7

24 files changed

Lines changed: 2964 additions & 315 deletions

‎config.example.yaml‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,16 @@ log:
8888

8989
# 可选。云服务 provider 配置。未配置则不启用云服务证书上传与部署。
9090
# 密钥信息只保存在 deploy 客户端内存或本地配置中,不会上报到服务端。
91+
# 一键配置 CNAME 需 CLI 上报 deployment.dns.cname,不依赖已有证书或部署绑定。
92+
# DNS 检查只读;以下接口需允许访问实际托管区和全部记录线路:
93+
# 阿里云:alidns:DescribeDomainInfo / DescribeDomainRecords / AddDomainRecord。
94+
# 腾讯云:dnspod:DescribeDomain / DescribeRecordList / CreateRecord。
95+
# 华为云:公网 Zone 查询 / 含线路 RecordSet 查询 / RecordSet 新增。
96+
# 百度云:DNS Zone 查询 / Record 查询 / Record 新增。
97+
# 京东云:domainservice:describeDomains / describeResourceRecord / createResourceRecord。
98+
# 火山引擎:dns:ListZones / ListRecords / CreateRecord。
99+
# Cloudflare:Zone:Read、DNS:Read、DNS:Edit(建议限制到所需 Zone)。
100+
# 仅 DNS 配置不需要 CAS、SCM、CDN 或其他证书部署权限。相同记录保留,冲突不覆盖。
91101
# provider:
92102
# - name: "aliyun"
93103
# remark: "阿里云"
@@ -113,6 +123,12 @@ log:
113123
# # 腾讯云 SecretKey。
114124
# secretKey: "your-tencent-secret-key"
115125
#
126+
# - name: "cloudflare"
127+
# remark: "Cloudflare DNS"
128+
# auth:
129+
# # Cloudflare API Token,建议仅授予指定 Zone 的 Zone:Read、DNS:Read、DNS:Edit。
130+
# apiToken: "your-cloudflare-api-token"
131+
#
116132
# - name: "huawei"
117133
# remark: "华为云"
118134
# # 默认资源地域和 SCM 证书中心地域。

‎go.mod‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/alibabacloud-go/darabonba-openapi/v2 v2.2.4
88
github.com/alibabacloud-go/tea-utils/v2 v2.0.9
99
github.com/baidubce/bce-sdk-go v0.9.275
10+
github.com/cloudflare/cloudflare-go/v4 v4.6.0
1011
github.com/coder/websocket v1.8.15
1112
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.26.6+incompatible
1213
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.216
@@ -18,6 +19,7 @@ require (
1819
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.3.176
1920
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.188
2021
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.3.177
22+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.131
2123
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.3.147
2224
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.3.180
2325
github.com/tencentyun/cos-go-sdk-v5 v0.7.75
@@ -63,6 +65,10 @@ require (
6365
github.com/spf13/pflag v1.0.10 // indirect
6466
github.com/stretchr/testify v1.12.1 // indirect
6567
github.com/subosito/gotenv v1.6.0 // indirect
68+
github.com/tidwall/gjson v1.14.4 // indirect
69+
github.com/tidwall/match v1.1.1 // indirect
70+
github.com/tidwall/pretty v1.2.1 // indirect
71+
github.com/tidwall/sjson v1.2.5 // indirect
6672
github.com/tjfoc/gmsm v1.4.1 // indirect
6773
github.com/volcengine/volc-sdk-golang v1.0.257 // indirect
6874
go.mongodb.org/mongo-driver v1.17.10 // indirect

‎go.sum‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5P
139139
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
140140
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
141141
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
142+
github.com/cloudflare/cloudflare-go/v4 v4.6.0 h1:ZaWwXjHFR5NoY8UEf4QFY0g3KTi72kqqEXpajV610/o=
143+
github.com/cloudflare/cloudflare-go/v4 v4.6.0/go.mod h1:XcYpLe7Mf6FN87kXzEWVnJ6z+vskW/k6eUqgqfhFE9k=
142144
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
143145
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
144146
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
@@ -540,6 +542,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.3.173/go.mod h1:
540542
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.3.176 h1:RhLdcpXkSlN0uv5K9bDFH6wfXKY9fBbnxZxcrYSXk/0=
541543
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.3.176/go.mod h1:QyCKJ0925wjmQgIK7NUa4mqz1RKdb4GSwoHL32sZ/VI=
542544
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
545+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.131/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
543546
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.147/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
544547
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.173/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
545548
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.176/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
@@ -549,6 +552,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.188 h1:K9fk
549552
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.188/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
550553
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.3.177 h1:0F0hsXSmfmNZM/nf2IeKO32KATB2r/v2B1yZK67bTNE=
551554
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.3.177/go.mod h1:RzyDv6MEarxNU07UZFFu87Ww0ezu0wW9F8PXTbvPY9o=
555+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.131 h1:YfzhVkH30GipMEOGIx6nkaJv2E/mWN+G6Vvg+M7SqGg=
556+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.131/go.mod h1:Eejvn572HmciFhWFMg6a+eZvkegnEzJrPSnJYKYZX2s=
552557
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
553558
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.3.147 h1:7wFGHghpGVkPotX6PCpwt7Xn4BerFib++kAoafMSyR0=
554559
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.3.147/go.mod h1:XMVT8POd1Rlwegh9N8EPPZP3+93Zo4tML9Asn5SL/lI=
@@ -557,6 +562,16 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.3.180/go.mod h1:
557562
github.com/tencentyun/cos-go-sdk-v5 v0.7.75 h1:eRCGP5chujSYGFnsCPxlhQcN9wtlSO/4eXrxKtLVAIw=
558563
github.com/tencentyun/cos-go-sdk-v5 v0.7.75/go.mod h1:STbTNaNKq03u+gscPEGOahKzLcGSYOj6Dzc5zNay7Pg=
559564
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20250515025012-e0eec8a5d123/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
565+
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
566+
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
567+
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
568+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
569+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
570+
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
571+
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
572+
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
573+
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
574+
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
560575
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
561576
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
562577
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=

‎internal/client/deployment_dns.go‎

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package client
2+
3+
import (
4+
"context"
5+
6+
"github.com/https-cert/deploy/internal/client/dnsconfig"
7+
"github.com/https-cert/deploy/pb/deployPB"
8+
"github.com/https-cert/deploy/pkg/logger"
9+
)
10+
11+
// runDNS 将 DNS 操作纳入并发槽和 55 秒响应时限;不可取消 SDK 仍持有记录锁直到收敛。
12+
func (s *deploymentService) runDNS(requestID string, request *deployPB.DnsOperationRequest, write bool) {
13+
name := "dns-check"
14+
if write {
15+
name = "dns-configure"
16+
}
17+
record := request.GetRecord()
18+
s.ops.Run(name, func() {
19+
s.sendDNSResult(requestID, &deployPB.DnsOperationResult{Record: record, Status: deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_FAILED, Message: "客户端繁忙,请稍后重试"}, write)
20+
}, func() {
21+
ctx, cancel := newDeploymentOperationContext(s.parent)
22+
defer cancel()
23+
// 百度、京东和部分华为 SDK 不支持 context,中途超时仍不能提前释放串行锁。
24+
completed := make(chan *deployPB.DnsOperationResult, 1)
25+
go func() { completed <- s.performDNS(ctx, record, write) }()
26+
select {
27+
case result := <-completed:
28+
logger.Info("DNS 操作完成", "operation", name, "requestId", requestID, "provider", record.GetProvider().String(), "status", result.Status.String())
29+
s.sendDNSResult(requestID, result, write)
30+
case <-ctx.Done():
31+
status := deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_FAILED
32+
if write {
33+
status = deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_UNCONFIRMED
34+
}
35+
s.sendDNSResult(requestID, &deployPB.DnsOperationResult{Record: record, Status: status, Message: "客户端操作超时,结果待确认,请重新检查远端记录"}, write)
36+
// 响应只发送一次,但业务槽位保持占用,避免未收敛的 SDK 调用持续累积。
37+
<-completed
38+
}
39+
})
40+
}
41+
42+
// performDNS 获取同区同名串行锁后复查远端状态,完成或取消时释放锁。
43+
func (s *deploymentService) performDNS(ctx context.Context, record *deployPB.DnsRecord, write bool) *deployPB.DnsOperationResult {
44+
if record == nil {
45+
return &deployPB.DnsOperationResult{Status: deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_FAILED, Message: "DNS 记录不能为空"}
46+
}
47+
release, err := s.client.lockOperationWithContext(ctx, "dns\x00"+dnsconfig.Normalize(record.Zone)+"\x00"+dnsconfig.Normalize(record.Fqdn))
48+
if err != nil {
49+
return &deployPB.DnsOperationResult{Record: record, Status: deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_FAILED, Message: "等待 DNS 记录锁超时,请重试"}
50+
}
51+
defer release()
52+
factory := s.newDNSBackend
53+
if factory == nil {
54+
factory = dnsconfig.NewBackend
55+
}
56+
backend, err := factory(s.client.runtime, record.Provider)
57+
if err != nil {
58+
return &deployPB.DnsOperationResult{Record: record, Status: deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_NOT_CONFIGURED, Message: "CLI DNS 密钥未配置或初始化失败"}
59+
}
60+
return dnsconfig.Operate(ctx, backend, record, write)
61+
}
62+
63+
// sendDNSResult 按请求类型回包,密钥和 SDK 原始错误不进入信封。
64+
func (s *deploymentService) sendDNSResult(requestID string, result *deployPB.DnsOperationResult, write bool) {
65+
envelope := &deployPB.DeploymentRequest{AccessKey: s.accessKey, ClientId: s.clientID, RequestId: requestID}
66+
if write {
67+
envelope.Data = &deployPB.DeploymentRequest_DnsConfigureResponse{DnsConfigureResponse: result}
68+
} else {
69+
envelope.Data = &deployPB.DeploymentRequest_DnsCheckResponse{DnsCheckResponse: result}
70+
}
71+
if s.sendEnvelope == nil {
72+
logger.Warn("DNS 响应发送器未初始化")
73+
return
74+
}
75+
s.sendEnvelope(envelope)
76+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"testing"
6+
"time"
7+
8+
"github.com/https-cert/deploy/internal/client/dnsconfig"
9+
"github.com/https-cert/deploy/internal/config"
10+
"github.com/https-cert/deploy/pb/deployPB"
11+
)
12+
13+
// blockingDNS 模拟写入已发出而 SDK 暂时不响应取消的情况。
14+
type blockingDNS struct {
15+
started chan struct{} // started 通知新增请求已经进入云 SDK。
16+
release chan struct{} // release 控制 SDK 完成的时刻。
17+
}
18+
19+
// FindZone 返回精确托管区,不依赖证书绑定。
20+
func (b *blockingDNS) FindZone(context.Context, string) (string, error) {
21+
return "zone-id", nil
22+
}
23+
24+
// List 返回空记录目录,确保测试进入新增路径。
25+
func (b *blockingDNS) List(context.Context, string, *deployPB.DnsRecord) ([]dnsconfig.Entry, error) {
26+
return nil, nil
27+
}
28+
29+
// Create 保持阻塞直到 SDK 自行收敛,故意忽略取消信号。
30+
func (b *blockingDNS) Create(context.Context, string, *deployPB.DnsRecord) (string, error) {
31+
close(b.started)
32+
<-b.release
33+
return "create-id", nil
34+
}
35+
36+
// TestDNSTimeoutRetainsLocksAndSlot 验证超时只回包一次,底层写入结束前不释放锁和并发槽。
37+
func TestDNSTimeoutRetainsLocksAndSlot(t *testing.T) {
38+
parent, cancel := context.WithCancel(context.Background())
39+
defer cancel()
40+
runner := newOperationRunner(1)
41+
backend := &blockingDNS{started: make(chan struct{}), release: make(chan struct{})}
42+
defer close(backend.release)
43+
replies := make(chan *deployPB.DeploymentRequest, 4)
44+
service := &deploymentService{
45+
client: &WSClient{ops: runner}, ops: runner, parent: parent, clientID: "dns-client",
46+
sendEnvelope: func(reply *deployPB.DeploymentRequest) { replies <- reply },
47+
newDNSBackend: func(*config.Runtime, deployPB.DnsProvider) (dnsconfig.Backend, error) { return backend, nil },
48+
}
49+
record := &deployPB.DnsRecord{Zone: "example.com", Fqdn: "_acme-challenge.example.com", Host: "_acme-challenge", Value: "target.example.net"}
50+
service.runDNS("first", &deployPB.DnsOperationRequest{Record: record}, true)
51+
select {
52+
case <-backend.started:
53+
case <-time.After(time.Second):
54+
t.Fatal("新增没有启动")
55+
}
56+
cancel()
57+
select {
58+
case reply := <-replies:
59+
if reply.ClientId != "dns-client" || reply.RequestId != "first" || reply.GetDnsConfigureResponse().GetStatus() != deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_UNCONFIRMED {
60+
t.Fatal("超时响应关联或状态错误", reply)
61+
}
62+
case <-time.After(time.Second):
63+
t.Fatal("取消后没有及时回包")
64+
}
65+
lockCtx, lockCancel := context.WithTimeout(context.Background(), 20*time.Millisecond)
66+
defer lockCancel()
67+
if release, err := runner.LockResource(lockCtx, "dns\x00example.com\x00_acme-challenge.example.com"); err == nil {
68+
release()
69+
t.Fatal("未收敛写入的串行锁被提前释放")
70+
}
71+
service.runDNS("second", &deployPB.DnsOperationRequest{Record: record}, true)
72+
if reply := <-replies; reply.RequestId != "second" || reply.GetDnsConfigureResponse().GetStatus() != deployPB.DnsOperationStatus_DNS_OPERATION_STATUS_FAILED {
73+
t.Fatal("未收敛写入的并发槽被提前释放", reply)
74+
}
75+
backend.release <- struct{}{}
76+
runner.Wait()
77+
select {
78+
case reply := <-replies:
79+
t.Fatal("已超时的任务再次回包", reply)
80+
default:
81+
}
82+
if len(runner.sem) != 0 {
83+
t.Fatal("SDK 收敛后未释放并发槽")
84+
}
85+
}

‎internal/client/deployment_service.go‎

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,38 @@ import (
55
"errors"
66

77
"github.com/https-cert/deploy/internal/client/deploys"
8+
"github.com/https-cert/deploy/internal/client/dnsconfig"
89
"github.com/https-cert/deploy/internal/client/providers"
10+
"github.com/https-cert/deploy/internal/config"
911
"github.com/https-cert/deploy/pb/deployPB"
1012
"github.com/https-cert/deploy/pkg/logger"
1113
)
1214

1315
// deploymentService 处理 v2 业务消息分发、执行与回包组装。
1416
type deploymentService struct {
15-
client *WSClient
16-
handlers *DeploymentHandlerRegistry
17-
executor *DeploymentExecutor
18-
ops *operationRunner
19-
accessKey string
20-
clientID string
21-
parent context.Context
22-
sendEnvelope func(*deployPB.DeploymentRequest)
17+
client *WSClient // client 提供运行期配置和连接生命周期。
18+
handlers *DeploymentHandlerRegistry // handlers 保存原有证书部署能力。
19+
executor *DeploymentExecutor // executor 执行原有部署任务。
20+
ops *operationRunner // ops 限制并发并串行化同名资源。
21+
accessKey string // accessKey 仅用于既有连接信封认证。
22+
clientID string // clientID 是当前客户端标识。
23+
parent context.Context // parent 约束客户端关闭时的任务生命周期。
24+
sendEnvelope func(*deployPB.DeploymentRequest) // sendEnvelope 回传操作结果。
25+
newDNSBackend func(*config.Runtime, deployPB.DnsProvider) (dnsconfig.Backend, error) // newDNSBackend 构建独立 DNS 适配器,允许模拟不可取消的 SDK。
2326
}
2427

28+
// newDeploymentService 复用客户端的业务调度器,并注入官方 DNS 适配器。
2529
func newDeploymentService(client *WSClient) *deploymentService {
2630
return &deploymentService{
27-
client: client,
28-
handlers: client.deploymentHandlers,
29-
executor: client.deploymentExecutor,
30-
ops: client.ops,
31-
accessKey: client.accessKey,
32-
clientID: client.clientId,
33-
parent: client.ctx,
34-
sendEnvelope: client.sendDeploymentEnvelope,
31+
client: client,
32+
handlers: client.deploymentHandlers,
33+
executor: client.deploymentExecutor,
34+
ops: client.ops,
35+
accessKey: client.accessKey,
36+
clientID: client.clientId,
37+
parent: client.ctx,
38+
sendEnvelope: client.sendDeploymentEnvelope,
39+
newDNSBackend: dnsconfig.NewBackend,
3540
}
3641
}
3742

@@ -73,6 +78,10 @@ func (s *deploymentService) HandleResponse(response *deployPB.DeploymentResponse
7378
}, func() {
7479
s.handleChallengeRequest(requestID, data.ChallengeRequest)
7580
})
81+
case *deployPB.DeploymentResponse_DnsCheckRequest:
82+
s.runDNS(response.GetRequestId(), data.DnsCheckRequest, false)
83+
case *deployPB.DeploymentResponse_DnsConfigureRequest:
84+
s.runDNS(response.GetRequestId(), data.DnsConfigureRequest, true)
7685
case *deployPB.DeploymentResponse_UpdateRequest:
7786
s.ops.Run("deployment-v2-update", nil, func() {
7887
s.handleUpdateRequest(data.UpdateRequest)

0 commit comments

Comments
 (0)