Skip to content

Commit a9149dc

Browse files
committed
chore: compress cassettes and test that cassettes are compressed
1 parent a4d6f1c commit a9149dc

File tree

101 files changed

+11410
-205242
lines changed

Some content is hidden

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

101 files changed

+11410
-205242
lines changed

cmd/vcr-compressor/main.go

Lines changed: 2 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,18 @@
11
package main
22

33
import (
4-
"encoding/json"
54
"log"
65
"os"
76

8-
"github.com/scaleway/scaleway-sdk-go/api/k8s/v1"
9-
"github.com/scaleway/scaleway-sdk-go/api/rdb/v1"
10-
"gopkg.in/dnaeon/go-vcr.v3/cassette"
7+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
118
)
129

13-
var transientStates = map[string]bool{
14-
k8s.ClusterStatusCreating.String(): true,
15-
k8s.ClusterStatusDeleting.String(): true,
16-
k8s.ClusterStatusUpdating.String(): true,
17-
k8s.PoolStatusDeleting.String(): true,
18-
k8s.PoolStatusScaling.String(): true,
19-
k8s.PoolStatusUpgrading.String(): true,
20-
21-
rdb.DatabaseBackupStatusCreating.String(): true,
22-
rdb.DatabaseBackupStatusDeleting.String(): true,
23-
rdb.DatabaseBackupStatusExporting.String(): true,
24-
rdb.DatabaseBackupStatusRestoring.String(): true,
25-
rdb.InstanceStatusAutohealing.String(): true,
26-
rdb.InstanceStatusBackuping.String(): true,
27-
rdb.InstanceStatusConfiguring.String(): true,
28-
rdb.InstanceStatusDeleting.String(): true,
29-
rdb.InstanceStatusInitializing.String(): true,
30-
rdb.InstanceStatusProvisioning.String(): true,
31-
rdb.InstanceStatusRestarting.String(): true,
32-
rdb.InstanceStatusSnapshotting.String(): true,
33-
}
34-
3510
func main() {
3611
if len(os.Args) < 2 {
3712
log.Fatalf("Usage: %s <cassette_file_name_without_yaml>\n", os.Args[0])
3813
}
3914

4015
path := os.Args[1]
4116

42-
inputCassette, err := cassette.Load(path)
43-
if err != nil {
44-
log.Fatalf("Error while reading file : %v\n", err)
45-
}
46-
47-
outputCassette := cassette.New(path)
48-
transitioning := false
49-
50-
for i := range len(inputCassette.Interactions) {
51-
interaction := inputCassette.Interactions[i]
52-
responseBody := interaction.Response.Body
53-
requestMethod := interaction.Request.Method
54-
55-
if requestMethod != "GET" {
56-
transitioning = false
57-
58-
log.Printf("Interaction %d is not a GET request. Recording it\n", i)
59-
outputCassette.AddInteraction(interaction)
60-
61-
continue
62-
}
63-
64-
if responseBody == "" {
65-
log.Printf("Interaction %d got an empty response body. Recording it\n", i)
66-
outputCassette.AddInteraction(interaction)
67-
68-
continue
69-
}
70-
71-
var m map[string]any
72-
73-
err := json.Unmarshal([]byte(responseBody), &m)
74-
if err != nil {
75-
log.Printf("Interaction %d have an error with unmarshalling response body: %v. Recording it\n", i, err)
76-
outputCassette.AddInteraction(interaction)
77-
78-
continue
79-
}
80-
81-
if m["status"] == nil {
82-
log.Printf("Interaction %d does not contain a status field. Recording it\n", i)
83-
outputCassette.AddInteraction(interaction)
84-
85-
continue
86-
}
87-
88-
status := m["status"].(string)
89-
// We test if the state is transient
90-
if _, ok := transientStates[status]; ok {
91-
if transitioning {
92-
log.Printf("Interaction %d is in a transient state while we are already in transitient state. No need to record it: %s\n", i, status)
93-
} else {
94-
log.Printf("Interaction %d is in a transient state: %s, Recording it\n", i, status)
95-
96-
transitioning = true
97-
98-
outputCassette.AddInteraction(interaction)
99-
}
100-
} else {
101-
if transitioning {
102-
log.Printf("Interaction %d is not in a transient state anymore: %s, Recording it\n", i, status)
103-
104-
outputCassette.AddInteraction(interaction)
105-
106-
transitioning = false
107-
} else {
108-
log.Printf("Interaction %d is not in a transient state: %s, Recording it\n", i, status)
109-
outputCassette.AddInteraction(interaction)
110-
}
111-
}
112-
}
113-
114-
err = outputCassette.Save()
115-
if err != nil {
116-
log.Fatalf("error while saving file: %v", err)
117-
}
17+
acctest.CompressCassette(path)
11818
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package acctest_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
7+
"github.com/stretchr/testify/require"
8+
"golang.org/x/sync/errgroup"
9+
)
10+
11+
func TestAccCassettes_Compressed(t *testing.T) {
12+
paths, err := getTestFiles(false)
13+
require.NoError(t, err)
14+
15+
var g errgroup.Group
16+
17+
for path := range paths {
18+
g.Go(func() error {
19+
report, errCompression := acctest.CompressCassette(path)
20+
require.Nil(t, errCompression)
21+
require.Zero(t, report.SkippedInteraction, "Issue with cassette: %s", report.Path)
22+
return nil
23+
})
24+
}
25+
26+
if err := g.Wait(); err != nil {
27+
t.Errorf("error: %s", err)
28+
}
29+
}

internal/acctest/vcr_compress.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package acctest
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"log"
7+
8+
applesilicon "github.com/scaleway/scaleway-sdk-go/api/applesilicon/v1alpha1"
9+
"github.com/scaleway/scaleway-sdk-go/api/baremetal/v1"
10+
block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
11+
container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
12+
file "github.com/scaleway/scaleway-sdk-go/api/file/v1alpha1"
13+
function "github.com/scaleway/scaleway-sdk-go/api/function/v1beta1"
14+
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
15+
"github.com/scaleway/scaleway-sdk-go/api/k8s/v1"
16+
"github.com/scaleway/scaleway-sdk-go/api/mongodb/v1"
17+
"github.com/scaleway/scaleway-sdk-go/api/rdb/v1"
18+
"github.com/scaleway/scaleway-sdk-go/api/redis/v1"
19+
"gopkg.in/dnaeon/go-vcr.v3/cassette"
20+
)
21+
22+
var transientStates = map[string]bool{
23+
applesilicon.ServerStatusStarting.String(): true,
24+
applesilicon.ServerStatusRebooting.String(): true,
25+
applesilicon.ServerStatusReinstalling.String(): true,
26+
27+
baremetal.ServerStatusDeleting.String(): true,
28+
baremetal.ServerStatusStarting.String(): true,
29+
baremetal.ServerStatusDelivering.String(): true,
30+
baremetal.ServerStatusStarting.String(): true,
31+
baremetal.ServerStatusMigrating.String(): true,
32+
baremetal.ServerInstallStatusInstalling.String(): true,
33+
34+
block.VolumeStatusCreating.String(): true,
35+
block.VolumeStatusUpdating.String(): true,
36+
block.VolumeStatusDeleting.String(): true,
37+
block.VolumeStatusResizing.String(): true,
38+
block.VolumeStatusSnapshotting.String(): true,
39+
40+
container.ContainerStatusCreating.String(): true,
41+
container.ContainerStatusDeleting.String(): true,
42+
43+
file.FileSystemStatusCreating.String(): true,
44+
45+
function.FunctionStatusCreating.String(): true,
46+
function.FunctionStatusDeleting.String(): true,
47+
48+
instance.ServerStateStarting.String(): true,
49+
instance.ServerStateStopping.String(): true,
50+
51+
k8s.ClusterStatusCreating.String(): true,
52+
k8s.ClusterStatusDeleting.String(): true,
53+
k8s.ClusterStatusUpdating.String(): true,
54+
k8s.PoolStatusDeleting.String(): true,
55+
k8s.PoolStatusScaling.String(): true,
56+
k8s.PoolStatusUpgrading.String(): true,
57+
58+
mongodb.InstanceStatusDeleting.String(): true,
59+
mongodb.InstanceStatusSnapshotting.String(): true,
60+
mongodb.InstanceStatusConfiguring.String(): true,
61+
mongodb.InstanceStatusInitializing.String(): true,
62+
mongodb.InstanceStatusProvisioning.String(): true,
63+
64+
rdb.DatabaseBackupStatusCreating.String(): true,
65+
rdb.DatabaseBackupStatusDeleting.String(): true,
66+
rdb.DatabaseBackupStatusExporting.String(): true,
67+
rdb.DatabaseBackupStatusRestoring.String(): true,
68+
rdb.InstanceStatusAutohealing.String(): true,
69+
rdb.InstanceStatusBackuping.String(): true,
70+
rdb.InstanceStatusConfiguring.String(): true,
71+
rdb.InstanceStatusDeleting.String(): true,
72+
rdb.InstanceStatusInitializing.String(): true,
73+
rdb.InstanceStatusProvisioning.String(): true,
74+
rdb.InstanceStatusRestarting.String(): true,
75+
rdb.InstanceStatusSnapshotting.String(): true,
76+
77+
redis.ClusterStatusAutohealing.String(): true,
78+
redis.ClusterStatusConfiguring.String(): true,
79+
redis.ClusterStatusProvisioning.String(): true,
80+
redis.ClusterStatusDeleting.String(): true,
81+
redis.ClusterStatusInitializing.String(): true,
82+
}
83+
84+
type CompressReport struct {
85+
SkippedInteraction int
86+
Path string
87+
Logs []string
88+
ErrorLogs []string
89+
}
90+
91+
func CompressCassette(path string) (CompressReport, error) {
92+
inputCassette, err := cassette.Load(path)
93+
if err != nil {
94+
log.Fatalf("Error while reading file : %v\n", err)
95+
}
96+
97+
outputCassette := cassette.New(path)
98+
transitioning := false
99+
100+
report := CompressReport{
101+
SkippedInteraction: 0,
102+
Path: path,
103+
ErrorLogs: []string{},
104+
Logs: []string{},
105+
}
106+
107+
for i := range len(inputCassette.Interactions) {
108+
interaction := inputCassette.Interactions[i]
109+
responseBody := interaction.Response.Body
110+
requestMethod := interaction.Request.Method
111+
112+
if requestMethod != "GET" {
113+
transitioning = false
114+
115+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s is not a GET request. Recording it\n", i, path))
116+
outputCassette.AddInteraction(interaction)
117+
118+
continue
119+
}
120+
121+
if responseBody == "" {
122+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s got an empty response body. Recording it\n", i, path))
123+
outputCassette.AddInteraction(interaction)
124+
125+
continue
126+
}
127+
128+
var m map[string]any
129+
130+
err := json.Unmarshal([]byte(responseBody), &m)
131+
if err != nil {
132+
report.ErrorLogs = append(report.ErrorLogs, fmt.Sprintf("Interaction %d in test %s have an error with unmarshalling response body: %v. Recording it\n", i, path, err))
133+
outputCassette.AddInteraction(interaction)
134+
135+
continue
136+
}
137+
138+
if m["status"] == nil {
139+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s does not contain a status field. Recording it\n", i, path))
140+
outputCassette.AddInteraction(interaction)
141+
142+
continue
143+
}
144+
145+
status := m["status"].(string)
146+
// We test if the state is transient
147+
if _, ok := transientStates[status]; ok {
148+
if transitioning {
149+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s is in a transient state while we are already in transitient state. No need to record it: %s\n", i, path, status))
150+
report.SkippedInteraction++
151+
} else {
152+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s is in a transient state: %s, Recording it\n", i, path, status))
153+
154+
transitioning = true
155+
156+
outputCassette.AddInteraction(interaction)
157+
}
158+
} else {
159+
if transitioning {
160+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s is not in a transient state anymore: %s, Recording it\n", i, path, status))
161+
outputCassette.AddInteraction(interaction)
162+
transitioning = false
163+
} else {
164+
report.Logs = append(report.Logs, fmt.Sprintf("Interaction %d in test %s is not in a transient state: %s, Recording it\n", i, path, status))
165+
outputCassette.AddInteraction(interaction)
166+
}
167+
}
168+
}
169+
170+
err = outputCassette.Save()
171+
if err != nil {
172+
return report, fmt.Errorf("error while saving file: %v", err)
173+
}
174+
175+
return report, nil
176+
}

0 commit comments

Comments
 (0)