Skip to content

Commit 7c5234c

Browse files
authored
feat(domain): add waiting process for dns zone and associated reverse test (#1217)
1 parent f55c798 commit 7c5234c

20 files changed

+4699
-1750
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ require (
99
github.com/hashicorp/aws-sdk-go-base v1.1.0
1010
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
1111
github.com/hashicorp/go-retryablehttp v0.7.1
12+
github.com/hashicorp/terraform-plugin-log v0.3.0
1213
github.com/hashicorp/terraform-plugin-sdk/v2 v2.13.0
13-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220414162120-5b6c03f0ce5f
14+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220419094512-76deec7b31e7
1415
github.com/stretchr/testify v1.7.1
1516
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f
1617

@@ -44,7 +45,6 @@ require (
4445
github.com/hashicorp/terraform-exec v0.16.1 // indirect
4546
github.com/hashicorp/terraform-json v0.13.0 // indirect
4647
github.com/hashicorp/terraform-plugin-go v0.9.0 // indirect
47-
github.com/hashicorp/terraform-plugin-log v0.3.0 // indirect
4848
github.com/hashicorp/terraform-registry-address v0.0.0-20220131103327-5c1c5e123275 // indirect
4949
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
5050
github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 // indirect

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -868,8 +868,8 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb
868868
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
869869
github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
870870
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
871-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220414162120-5b6c03f0ce5f h1:iHIYJFID9/T8F3BDVymesruLN71NSUdpsV8m7s5eDEA=
872-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220414162120-5b6c03f0ce5f/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
871+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220419094512-76deec7b31e7 h1:zbYmcD37hndTsbmtrH9Asi672IVtYl2fTqulDZPUaIY=
872+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220419094512-76deec7b31e7/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
873873
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
874874
github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
875875
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=

scaleway/helpers.go

+16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scaleway
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"net"
78
"net/http"
@@ -596,3 +597,18 @@ func toUint32(number interface{}) *uint32 {
596597
func errorCheck(err error, message string) bool {
597598
return strings.Contains(err.Error(), message)
598599
}
600+
601+
// ErrCodeEquals returns true if the error matches all these conditions:
602+
// * err is of type scw.Error
603+
// * Error.Error() equals one of the passed codes
604+
func ErrCodeEquals(err error, codes ...string) bool {
605+
var scwErr scw.SdkError
606+
if errors.As(err, &scwErr) {
607+
for _, code := range codes {
608+
if scwErr.Error() == code {
609+
return true
610+
}
611+
}
612+
}
613+
return false
614+
}

scaleway/helpers_domain.go

+18-2
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package scaleway
22

33
import (
4+
"context"
45
"net"
56
"strings"
67
"time"
78

89
domain "github.com/scaleway/scaleway-sdk-go/api/domain/v2beta1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
911
)
1012

1113
const (
12-
defaultDomainRecordTimeout = 30 * time.Second
13-
defaultDomainZoneTimeout = 30 * time.Second
14+
defaultDomainRecordTimeout = 30 * time.Second
15+
defaultDomainZoneTimeout = 30 * time.Second
16+
defaultDomainZoneRetryInterval = 5 * time.Second
1417
)
1518

1619
// domainAPI returns a new domain API.
@@ -238,3 +241,16 @@ func expandDomainView(i interface{}, ok bool) *domain.RecordViewConfig {
238241
Views: views,
239242
}
240243
}
244+
245+
func waitForDNSZone(ctx context.Context, domainAPI *domain.API, dnsZone string, timeout time.Duration) (*domain.DNSZone, error) {
246+
retryInterval := defaultDomainZoneRetryInterval
247+
if DefaultWaitRetryInterval != nil {
248+
retryInterval = *DefaultWaitRetryInterval
249+
}
250+
251+
return domainAPI.WaitForDNSZone(&domain.WaitForDNSZoneRequest{
252+
DNSZone: dnsZone,
253+
Timeout: scw.TimeDurationPtr(timeout),
254+
RetryInterval: scw.TimeDurationPtr(retryInterval),
255+
}, scw.WithContext(ctx))
256+
}

scaleway/resource_domain_record.go

+23-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"strings"
77

8+
"github.com/hashicorp/terraform-plugin-log/tflog"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
@@ -260,6 +261,11 @@ func resourceScalewayDomainRecordCreate(ctx context.Context, d *schema.ResourceD
260261
return diag.FromErr(err)
261262
}
262263

264+
_, err = waitForDNSZone(ctx, domainAPI, dnsZone, d.Timeout(schema.TimeoutCreate))
265+
if err != nil {
266+
return diag.FromErr(err)
267+
}
268+
263269
return resourceScalewayDomainRecordRead(ctx, d, meta)
264270
}
265271

@@ -283,7 +289,7 @@ func resourceScalewayDomainRecordRead(ctx context.Context, d *schema.ResourceDat
283289
res, err := domainAPI.ListDNSZoneRecords(&domain.ListDNSZoneRecordsRequest{
284290
DNSZone: dnsZone,
285291
ID: &id,
286-
}, scw.WithAllPages())
292+
}, scw.WithAllPages(), scw.WithContext(ctx))
287293

288294
if err != nil {
289295
if is404Error(err) {
@@ -407,6 +413,11 @@ func resourceScalewayDomainRecordUpdate(ctx context.Context, d *schema.ResourceD
407413
if err != nil {
408414
return diag.FromErr(err)
409415
}
416+
417+
_, err = waitForDNSZone(ctx, domainAPI, d.Get("dns_zone").(string), d.Timeout(schema.TimeoutUpdate))
418+
if err != nil {
419+
return diag.FromErr(err)
420+
}
410421
}
411422

412423
return resourceScalewayDomainRecordRead(ctx, d, meta)
@@ -432,7 +443,15 @@ func resourceScalewayDomainRecordDelete(ctx context.Context, d *schema.ResourceD
432443
}
433444
d.SetId("")
434445

435-
// for non root zone, if the zone have only NS records, then delete the zone
446+
_, err = waitForDNSZone(ctx, domainAPI, d.Get("dns_zone").(string), d.Timeout(schema.TimeoutDelete))
447+
if err != nil && !ErrCodeEquals(err, domain.ErrCodeNoSuchDNSZone) {
448+
if is404Error(err) {
449+
return nil
450+
}
451+
return diag.FromErr(err)
452+
}
453+
454+
// for non-root zone, if the zone have only NS records, then delete the zone
436455
if !d.Get("keep_empty_zone").(bool) && d.Get("root_zone") != nil && !d.Get("root_zone").(bool) {
437456
res, err := domainAPI.ListDNSZoneRecords(&domain.ListDNSZoneRecordsRequest{
438457
DNSZone: d.Get("dns_zone").(string),
@@ -451,6 +470,7 @@ func resourceScalewayDomainRecordDelete(ctx context.Context, d *schema.ResourceD
451470
hasRecords = true
452471
break
453472
}
473+
tflog.Debug(ctx, fmt.Sprintf("record [%s], type [%s]", r.Name, r.Type))
454474
}
455475

456476
if !hasRecords {
@@ -460,7 +480,7 @@ func resourceScalewayDomainRecordDelete(ctx context.Context, d *schema.ResourceD
460480
})
461481

462482
if err != nil {
463-
if is404Error(err) {
483+
if is404Error(err) || is403Error(err) {
464484
return nil
465485
}
466486
return diag.FromErr(err)

scaleway/resource_instance_ip.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,12 @@ func resourceScalewayInstanceIPDelete(ctx context.Context, d *schema.ResourceDat
160160
Zone: zone,
161161
}, scw.WithContext(ctx))
162162

163-
if err != nil && !is404Error(err) && !is403Error(err) {
163+
if err != nil {
164+
// We check for 403 because instance API returns 403 for a deleted IP
165+
if is404Error(err) || is403Error(err) {
166+
d.SetId("")
167+
return nil
168+
}
164169
return diag.FromErr(err)
165170
}
166171

scaleway/resource_instance_ip_reverse_dns_test.go

-5
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ func TestAccScalewayInstanceIPReverseDns_Basic(t *testing.T) {
3838
resource.TestCheckResourceAttr("scaleway_instance_ip_reverse_dns.base", "reverse", testDNSZone),
3939
),
4040
},
41-
{
42-
Config: `
43-
resource "scaleway_instance_ip" "ip" {}
44-
`,
45-
},
4641
{
4742
Config: `
4843
resource "scaleway_instance_ip" "ip" {}

scaleway/resource_instance_ip_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -230,20 +230,20 @@ func testAccCheckScalewayInstanceIPDestroy(tt *TestTools) resource.TestCheckFunc
230230
return err
231231
}
232232

233-
_, err = instanceAPI.GetIP(&instance.GetIPRequest{
233+
_, errIP := instanceAPI.GetIP(&instance.GetIPRequest{
234234
Zone: zone,
235235
IP: id,
236236
})
237237

238238
// If no error resource still exist
239-
if err == nil {
239+
if errIP == nil {
240240
return fmt.Errorf("resource %s(%s) still exist", rs.Type, rs.Primary.ID)
241241
}
242242

243243
// Unexpected api error we return it
244244
// We check for 403 because instance API return 403 for deleted IP
245-
if !is404Error(err) && !is403Error(err) {
246-
return err
245+
if !is404Error(errIP) && !is403Error(errIP) {
246+
return errIP
247247
}
248248
}
249249

scaleway/resource_lb_frontend_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func TestAccScalewayLbFrontend_Basic(t *testing.T) {
8585
// One possible way to circumvent this limitation is to generate for a random set of alternative domain names that are all subdomains of the main test domain.
8686
// For instance: *.test.scaleway-terraform.com which is a wildcard domain name.
8787
// And we generate certificate for foo.test.scaleway-terraform.com, bar.test.scaleway-terraform.com, baz.test.scaleway-terraform.com, etc.
88-
// Even changing one alternative domaine name is enough to count as a new certificate (which is rate limited by the 50 certificates per week limit and not the 5 duplicate certificates per week limit).
88+
// Even changing one alternative domain name is enough to count as a new certificate (which is rate limited by the 50 certificates per week limit and not the 5 duplicate certificates per week limit).
8989
// The only limitation is that all subdomains must resolve to the same IP address.
9090
func TestAccScalewayLbFrontend_Certificate(t *testing.T) {
9191
tt := NewTestTools(t)

0 commit comments

Comments
 (0)