Skip to content

Commit 3cf8ee2

Browse files
committed
use sdk vcr (v4) if migrating package
1 parent f89b981 commit 3cf8ee2

File tree

76 files changed

+41118
-73825
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

+41118
-73825
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: 91 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,75 @@ 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+
if i.Request.Body != "" && i.Request.Headers.Get("Content-Type") == "application/octet-stream" {
57+
requestBody := []byte(i.Request.Body)
58+
if !json.Valid(requestBody) {
59+
err := xml.Unmarshal(requestBody, new(any))
60+
if err != nil {
61+
i.Request.Body = base64.StdEncoding.EncodeToString(requestBody)
62+
}
63+
}
64+
}
65+
66+
if i.Response.Body != "" && i.Response.Headers.Get("Content-Type") == "binary/octet-stream" {
67+
responseBody := []byte(i.Response.Body)
68+
if !json.Valid(responseBody) {
69+
err := xml.Unmarshal(responseBody, new(any))
70+
if err != nil {
71+
i.Response.Body = base64.StdEncoding.EncodeToString(responseBody)
72+
}
73+
}
74+
}
75+
}
76+
77+
return nil
78+
}
79+
80+
func NewRecordedClient(t *testing.T, pkgFolder string, update bool) (client *http.Client, cleanup func(), err error) {
81+
t.Helper()
82+
83+
s3EncoderHook := vcr.AdditionalHook{
84+
HookFunc: s3Encoder,
85+
Kind: recorder.AfterCaptureHook,
86+
}
87+
88+
r, err := vcr.NewHTTPRecorder(t, pkgFolder, update, nil, s3EncoderHook)
89+
if err != nil {
90+
return nil, nil, err
91+
}
92+
93+
retryOptions := transport.RetryableTransportOptions{}
94+
if !update {
95+
retryOptions.RetryWaitMax = scw.TimeDurationPtr(0)
96+
}
97+
98+
return &http.Client{
99+
Transport: transport.NewRetryableTransportWithOptions(r, retryOptions),
100+
}, func() {
101+
require.NoError(t, r.Stop()) // Make sure recorder is stopped once done with it
102+
}, nil
103+
}
104+
28105
func NewTestTools(t *testing.T) *TestTools {
29106
t.Helper()
30107

@@ -35,8 +112,18 @@ func NewTestTools(t *testing.T) *TestTools {
35112
t.Fatalf("cannot detect working directory for testing")
36113
}
37114

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

42129
// Create meta that will be passed in the provider config
@@ -48,11 +135,11 @@ func NewTestTools(t *testing.T) *TestTools {
48135
require.NoError(t, err)
49136

50137
if !*UpdateCassettes {
51-
// If no recording is happening, the delay to retry to interactions should be 0
138+
// If no recording is happening, the delay to retry interactions should be 0
52139
tmp := 0 * time.Second
53140
transport.DefaultWaitRetryInterval = &tmp
54141
} 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
142+
// Overriding the delay interval is helpful to reduce the amount of requests performed while waiting for a resource to be available
56143
tmp, err := time.ParseDuration(os.Getenv(env.RetryDelay))
57144
if err != nil {
58145
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)