Skip to content

Commit ed9d79b

Browse files
authored
use sdk vcr (v4) if migrating package (#3426)
1 parent f89b981 commit ed9d79b

File tree

76 files changed

+39595
-73074
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+39595
-73074
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ require (
3535
golang.org/x/crypto v0.43.0
3636
golang.org/x/sync v0.17.0
3737
gopkg.in/dnaeon/go-vcr.v3 v3.2.0
38+
gopkg.in/dnaeon/go-vcr.v4 v4.0.5
3839
)
3940

4041
require (
@@ -85,6 +86,7 @@ require (
8586
github.com/fsnotify/fsnotify v1.8.0 // indirect
8687
github.com/go-logr/logr v1.4.3 // indirect
8788
github.com/go-logr/stdr v1.2.2 // indirect
89+
github.com/goccy/go-yaml v1.18.0 // indirect
8890
github.com/golang/protobuf v1.5.4 // indirect
8991
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
9092
github.com/gookit/color v1.5.1 // indirect

internal/acctest/acctest.go

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package acctest
22

33
import (
4+
"encoding/base64"
5+
"encoding/json"
6+
"encoding/xml"
7+
"net/http"
48
"os"
59
"strconv"
610
"strings"
@@ -9,11 +13,15 @@ import (
913

1014
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
1115
"github.com/hashicorp/terraform-plugin-mux/tf6muxserver"
16+
"github.com/scaleway/scaleway-sdk-go/scw"
17+
"github.com/scaleway/scaleway-sdk-go/vcr"
1218
"github.com/scaleway/terraform-provider-scaleway/v2/internal/env"
1319
"github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
1420
"github.com/scaleway/terraform-provider-scaleway/v2/internal/transport"
1521
"github.com/scaleway/terraform-provider-scaleway/v2/provider"
1622
"github.com/stretchr/testify/require"
23+
"gopkg.in/dnaeon/go-vcr.v4/pkg/cassette"
24+
"gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
1725
)
1826

1927
func PreCheck(_ *testing.T) {}
@@ -25,6 +33,77 @@ type TestTools struct {
2533
Cleanup func()
2634
}
2735

36+
var foldersUsingVCRv4 = []string{
37+
"instance",
38+
}
39+
40+
func folderUsesVCRv4(fullFolderPath string) bool {
41+
fullPathSplit := strings.Split(fullFolderPath, "/")
42+
43+
folder := fullPathSplit[len(fullPathSplit)-1]
44+
for _, migratedFolder := range foldersUsingVCRv4 {
45+
if migratedFolder == folder {
46+
return true
47+
}
48+
}
49+
50+
return false
51+
}
52+
53+
// s3Encoder encodes binary payloads as base64 because serialization changed on go-vcr.v4
54+
func s3Encoder(i *cassette.Interaction) error {
55+
if !strings.HasSuffix(i.Request.Host, "scw.cloud") {
56+
return nil
57+
}
58+
59+
if i.Request.Body != "" && i.Request.Headers.Get("Content-Type") == "application/octet-stream" {
60+
requestBody := []byte(i.Request.Body)
61+
if !json.Valid(requestBody) {
62+
err := xml.Unmarshal(requestBody, new(any))
63+
if err != nil {
64+
i.Request.Body = base64.StdEncoding.EncodeToString(requestBody)
65+
}
66+
}
67+
}
68+
69+
if i.Response.Body != "" && i.Response.Headers.Get("Content-Type") == "binary/octet-stream" {
70+
responseBody := []byte(i.Response.Body)
71+
if !json.Valid(responseBody) {
72+
err := xml.Unmarshal(responseBody, new(any))
73+
if err != nil {
74+
i.Response.Body = base64.StdEncoding.EncodeToString(responseBody)
75+
}
76+
}
77+
}
78+
79+
return nil
80+
}
81+
82+
func NewRecordedClient(t *testing.T, pkgFolder string, update bool) (client *http.Client, cleanup func(), err error) {
83+
t.Helper()
84+
85+
s3EncoderHook := vcr.AdditionalHook{
86+
HookFunc: s3Encoder,
87+
Kind: recorder.AfterCaptureHook,
88+
}
89+
90+
r, err := vcr.NewHTTPRecorder(t, pkgFolder, update, nil, s3EncoderHook)
91+
if err != nil {
92+
return nil, nil, err
93+
}
94+
95+
retryOptions := transport.RetryableTransportOptions{}
96+
if !update {
97+
retryOptions.RetryWaitMax = scw.TimeDurationPtr(0)
98+
}
99+
100+
return &http.Client{
101+
Transport: transport.NewRetryableTransportWithOptions(r, retryOptions),
102+
}, func() {
103+
require.NoError(t, r.Stop()) // Make sure recorder is stopped once done with it
104+
}, nil
105+
}
106+
28107
func NewTestTools(t *testing.T) *TestTools {
29108
t.Helper()
30109

@@ -35,8 +114,18 @@ func NewTestTools(t *testing.T) *TestTools {
35114
t.Fatalf("cannot detect working directory for testing")
36115
}
37116

38-
// Create a http client with recording capabilities
39-
httpClient, cleanup, err := getHTTPRecoder(t, folder, *UpdateCassettes)
117+
// Create an HTTP client with recording capabilities
118+
var (
119+
httpClient *http.Client
120+
cleanup func()
121+
)
122+
123+
if folderUsesVCRv4(folder) {
124+
httpClient, cleanup, err = NewRecordedClient(t, folder, *UpdateCassettes)
125+
} else {
126+
httpClient, cleanup, err = getHTTPRecoder(t, folder, *UpdateCassettes)
127+
}
128+
40129
require.NoError(t, err)
41130

42131
// Create meta that will be passed in the provider config
@@ -48,11 +137,11 @@ func NewTestTools(t *testing.T) *TestTools {
48137
require.NoError(t, err)
49138

50139
if !*UpdateCassettes {
51-
// If no recording is happening, the delay to retry to interactions should be 0
140+
// If no recording is happening, the delay to retry interactions should be 0
52141
tmp := 0 * time.Second
53142
transport.DefaultWaitRetryInterval = &tmp
54143
} else if os.Getenv(env.RetryDelay) != "" {
55-
// Overriding the delay interval is helpful to reduce the amount of requests performed while waiting for a ressource to be available
144+
// Overriding the delay interval is helpful to reduce the amount of requests performed while waiting for a resource to be available
56145
tmp, err := time.ParseDuration(os.Getenv(env.RetryDelay))
57146
if err != nil {
58147
t.Fatal(err)

internal/services/instance/server_test.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -726,25 +726,25 @@ func TestAccServer_WithPlacementGroup(t *testing.T) {
726726
policy_type = "max_availability"
727727
}
728728
729-
resource "scaleway_instance_server" "base" {
729+
resource "scaleway_instance_server" "ha" {
730730
count = 3
731731
name = "tf-tests-server-${count.index}-with-placement-group"
732732
image = "ubuntu_focal"
733733
type = "PLAY2-PICO"
734734
placement_group_id = "${scaleway_instance_placement_group.ha.id}"
735-
tags = [ "terraform-test", "scaleway_instance_server", "placement_group" ]
735+
tags = [ "terraform-test", "scaleway_instance_server", "placement_group", "${count.index}" ]
736736
}`,
737737
Check: resource.ComposeTestCheckFunc(
738-
isServerPresent(tt, "scaleway_instance_server.base.0"),
739-
isServerPresent(tt, "scaleway_instance_server.base.1"),
740-
isServerPresent(tt, "scaleway_instance_server.base.2"),
738+
isServerPresent(tt, "scaleway_instance_server.ha.0"),
739+
isServerPresent(tt, "scaleway_instance_server.ha.1"),
740+
isServerPresent(tt, "scaleway_instance_server.ha.2"),
741741
isPlacementGroupPresent(tt, "scaleway_instance_placement_group.ha"),
742742
resource.TestCheckResourceAttr("scaleway_instance_placement_group.ha", "policy_respected", "true"),
743743

744744
// placement_group_policy_respected is deprecated and should always be false.
745-
resource.TestCheckResourceAttr("scaleway_instance_server.base.0", "placement_group_policy_respected", "false"),
746-
resource.TestCheckResourceAttr("scaleway_instance_server.base.1", "placement_group_policy_respected", "false"),
747-
resource.TestCheckResourceAttr("scaleway_instance_server.base.2", "placement_group_policy_respected", "false"),
745+
resource.TestCheckResourceAttr("scaleway_instance_server.ha.0", "placement_group_policy_respected", "false"),
746+
resource.TestCheckResourceAttr("scaleway_instance_server.ha.1", "placement_group_policy_respected", "false"),
747+
resource.TestCheckResourceAttr("scaleway_instance_server.ha.2", "placement_group_policy_respected", "false"),
748748
),
749749
},
750750
},
@@ -1405,12 +1405,14 @@ func TestAccServer_CustomDiffImage(t *testing.T) {
14051405
image = "ubuntu_jammy"
14061406
type = "DEV1-S"
14071407
state = "stopped"
1408+
tags = [ "main" ]
14081409
}
14091410
resource "scaleway_instance_server" "control" {
14101411
name = "control-server"
14111412
image = "ubuntu_jammy"
14121413
type = "DEV1-S"
14131414
state = "stopped"
1415+
tags = [ "control" ]
14141416
}
14151417
`,
14161418
Check: resource.ComposeTestCheckFunc(
@@ -1433,12 +1435,14 @@ func TestAccServer_CustomDiffImage(t *testing.T) {
14331435
image = data.scaleway_marketplace_image.jammy.id
14341436
type = "DEV1-S"
14351437
state = "stopped"
1438+
tags = [ "main" ]
14361439
}
14371440
resource "scaleway_instance_server" "control" {
14381441
name = "control-server"
14391442
image = "ubuntu_jammy"
14401443
type = "DEV1-S"
14411444
state = "stopped"
1445+
tags = [ "conntrol" ]
14421446
}
14431447
`, marketplaceImageType),
14441448
Check: resource.ComposeTestCheckFunc(
@@ -1462,12 +1466,14 @@ func TestAccServer_CustomDiffImage(t *testing.T) {
14621466
image = data.scaleway_marketplace_image.focal.id
14631467
type = "DEV1-S"
14641468
state = "stopped"
1469+
tags = [ "main" ]
14651470
}
14661471
resource "scaleway_instance_server" "control" {
14671472
name = "control-server"
14681473
image = "ubuntu_jammy"
14691474
type = "DEV1-S"
14701475
state = "stopped"
1476+
tags = [ "conntrol" ]
14711477
}
14721478
`, marketplaceImageType),
14731479
Check: resource.ComposeTestCheckFunc(

0 commit comments

Comments
 (0)