Skip to content

Commit 6808548

Browse files
authored
Merge branch 'master' into context_k8s
2 parents e3465b1 + 316c164 commit 6808548

21 files changed

+1058
-174
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module github.com/terraform-providers/terraform-provider-scaleway
22

33
require (
44
github.com/aws/aws-sdk-go v1.34.32
5+
github.com/dnaeon/go-vcr v1.0.1
56
github.com/google/go-cmp v0.5.2
67
github.com/hashicorp/go-retryablehttp v0.6.7
78
github.com/hashicorp/terraform-plugin-sdk/v2 v2.0.3

main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ func main() {
1818
if debugMode {
1919
err := plugin.Debug(context.Background(), "registry.terraform.io/namespace/provider",
2020
&plugin.ServeOpts{
21-
ProviderFunc: scaleway.Provider(),
21+
ProviderFunc: scaleway.Provider(scaleway.DefaultProviderConfig()),
2222
})
2323
if err != nil {
2424
log.Println(err.Error())
2525
}
2626
} else {
2727
plugin.Serve(&plugin.ServeOpts{
28-
ProviderFunc: scaleway.Provider(),
28+
ProviderFunc: scaleway.Provider(scaleway.DefaultProviderConfig()),
2929
})
3030
}
3131
}

scaleway/data_source_account_ssh_key.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package scaleway
22

33
import (
4+
"context"
45
"fmt"
56

7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
68
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
79
account "github.com/scaleway/scaleway-sdk-go/api/account/v2alpha1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
811
)
912

1013
func dataSourceScalewayAccountSSHKey() *schema.Resource {
1114
return &schema.Resource{
12-
Read: dataSourceScalewayAccountSSHKeyRead,
13-
15+
ReadContext: dataSourceScalewayAccountSSHKeyRead,
1416
Schema: map[string]*schema.Schema{
1517
"name": {
1618
Type: schema.TypeString,
@@ -35,29 +37,29 @@ func dataSourceScalewayAccountSSHKey() *schema.Resource {
3537
}
3638
}
3739

38-
func dataSourceScalewayAccountSSHKeyRead(d *schema.ResourceData, m interface{}) error {
40+
func dataSourceScalewayAccountSSHKeyRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
3941
accountAPI := accountAPI(m)
4042

4143
var sshKey *account.SSHKey
4244
sshKeyID, ok := d.GetOk("ssh_key_id")
4345
if ok {
44-
res, err := accountAPI.GetSSHKey(&account.GetSSHKeyRequest{SSHKeyID: expandID(sshKeyID)})
46+
res, err := accountAPI.GetSSHKey(&account.GetSSHKeyRequest{SSHKeyID: expandID(sshKeyID)}, scw.WithContext(ctx))
4547
if err != nil {
46-
return err
48+
return diag.FromErr(err)
4749
}
4850
sshKey = res
4951
} else {
5052
res, err := accountAPI.ListSSHKeys(&account.ListSSHKeysRequest{
5153
Name: expandStringPtr(d.Get("name")),
52-
})
54+
}, scw.WithContext(ctx))
5355
if err != nil {
54-
return err
56+
return diag.FromErr(err)
5557
}
5658
if len(res.SSHKeys) == 0 {
57-
return fmt.Errorf("no SSH Key found with the name %s", d.Get("name"))
59+
return diag.FromErr(fmt.Errorf("no SSH Key found with the name %s", d.Get("name")))
5860
}
5961
if len(res.SSHKeys) > 1 {
60-
return fmt.Errorf("%d SSH Keys found with the same name %s", len(res.SSHKeys), d.Get("name"))
62+
return diag.FromErr(fmt.Errorf("%d SSH Keys found with the same name %s", len(res.SSHKeys), d.Get("name")))
6163
}
6264
sshKey = res.SSHKeys[0]
6365
}

scaleway/provider.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scaleway
33
import (
44
"context"
55
"fmt"
6+
"net/http"
67

78
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -11,8 +12,20 @@ import (
1112
"github.com/scaleway/scaleway-sdk-go/validation"
1213
)
1314

15+
// Provider config can be used to provide additional config when creating provider.
16+
type ProviderConfig struct {
17+
// Meta can be used to override Meta that will be used by the provider.
18+
// This is useful for tests.
19+
Meta *Meta
20+
}
21+
22+
// DefaultProviderConfig return default ProviderConfig struct
23+
func DefaultProviderConfig() *ProviderConfig {
24+
return &ProviderConfig{}
25+
}
26+
1427
// Provider returns a terraform.ResourceProvider.
15-
func Provider() plugin.ProviderFunc {
28+
func Provider(config *ProviderConfig) plugin.ProviderFunc {
1629
return func() *schema.Provider {
1730
p := &schema.Provider{
1831
Schema: map[string]*schema.Schema{
@@ -102,9 +115,16 @@ func Provider() plugin.ProviderFunc {
102115

103116
p.ConfigureContextFunc = func(ctx context.Context, data *schema.ResourceData) (interface{}, diag.Diagnostics) {
104117
terraformVersion := p.TerraformVersion
118+
119+
// If we provide meta in config use it. This is useful for tests
120+
if config.Meta != nil {
121+
return config.Meta, nil
122+
}
123+
105124
meta, err := buildMeta(&MetaConfig{
106125
providerSchema: data,
107126
terraformVersion: terraformVersion,
127+
httpClient: &http.Client{Transport: newRetryableTransport(http.DefaultTransport)},
108128
})
109129
if err != nil {
110130
return nil, diag.FromErr(err)
@@ -128,12 +148,11 @@ type MetaConfig struct {
128148
providerSchema *schema.ResourceData
129149
terraformVersion string
130150
forceZone scw.Zone
151+
httpClient *http.Client
131152
}
132153

133154
// providerConfigure creates the Meta object containing the SDK client.
134155
func buildMeta(config *MetaConfig) (*Meta, error) {
135-
httpClient := createRetryableHTTPClient(false)
136-
137156
////
138157
// Load Profile
139158
////
@@ -158,7 +177,7 @@ func buildMeta(config *MetaConfig) (*Meta, error) {
158177
opts := []scw.ClientOption{
159178
scw.WithUserAgent(fmt.Sprintf("terraform-provider/%s terraform/%s", version, config.terraformVersion)),
160179
scw.WithProfile(profile),
161-
scw.WithHTTPClient(httpClient),
180+
scw.WithHTTPClient(config.httpClient),
162181
}
163182

164183
scwClient, err := scw.NewClient(opts...)

scaleway/provider_test.go

Lines changed: 101 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,34 @@
11
package scaleway
22

33
import (
4+
"flag"
5+
"net/http"
6+
"os"
7+
"path/filepath"
8+
"regexp"
9+
"strings"
410
"testing"
511

12+
"github.com/dnaeon/go-vcr/cassette"
13+
"github.com/dnaeon/go-vcr/recorder"
614
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15+
"github.com/scaleway/scaleway-sdk-go/strcase"
16+
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/require"
718
)
819

9-
var testAccProviders map[string]*schema.Provider
10-
var testAccProvider *schema.Provider
20+
var (
21+
// Deprecated
22+
testAccProviders map[string]*schema.Provider
23+
// Deprecated
24+
testAccProvider *schema.Provider
25+
26+
// UpdateCassettes will update all cassettes of a given test
27+
UpdateCassettes = flag.Bool("cassettes", os.Getenv("TF_UPDATE_CASSETTES") == "true", "Record Cassettes")
28+
)
1129

1230
func init() {
13-
p := Provider()()
31+
p := Provider(DefaultProviderConfig())()
1432
testAccProvider = p
1533
version += "-tftest"
1634
testAccProviders = map[string]*schema.Provider{
@@ -19,3 +37,83 @@ func init() {
1937
}
2038

2139
func testAccPreCheck(_ *testing.T) {}
40+
41+
// getTestFilePath returns a valid filename path based on the go test name and suffix. (Take care of non fs friendly char)
42+
func getTestFilePath(t *testing.T, suffix string) string {
43+
specialChars := regexp.MustCompile(`[\\?%*:|"<>. ]`)
44+
45+
// Replace nested tests separators.
46+
fileName := strings.Replace(t.Name(), "/", "-", -1)
47+
48+
fileName = strcase.ToBashArg(fileName)
49+
50+
// Replace special characters.
51+
fileName = specialChars.ReplaceAllLiteralString(fileName, "") + suffix
52+
53+
// Remove prefix to simplify
54+
fileName = strings.TrimPrefix(fileName, "test-acc-scaleway-")
55+
56+
return filepath.Join(".", "testdata", fileName)
57+
}
58+
59+
// getHTTPRecoder creates a new httpClient that records all HTTP requests in a cassette.
60+
// This cassette is then replayed whenever tests are executed again. This means that once the
61+
// requests are recorded in the cassette, no more real HTTP requests must be made to run the tests.
62+
//
63+
// It is important to add a `defer cleanup()` so the given cassette files are correctly
64+
// closed and saved after the requests.
65+
func getHTTPRecoder(t *testing.T, update bool) (client *http.Client, cleanup func(), err error) {
66+
recorderMode := recorder.ModeReplaying
67+
if update {
68+
recorderMode = recorder.ModeRecording
69+
}
70+
71+
// Setup recorder and scw client
72+
r, err := recorder.NewAsMode(getTestFilePath(t, ".cassette"), recorderMode, nil)
73+
if err != nil {
74+
return nil, nil, err
75+
}
76+
77+
// Add a filter which removes Authorization headers from all requests:
78+
r.AddFilter(func(i *cassette.Interaction) error {
79+
delete(i.Request.Headers, "x-auth-token")
80+
delete(i.Request.Headers, "X-Auth-Token")
81+
return nil
82+
})
83+
84+
return &http.Client{Transport: newRetryableTransport(r)}, func() {
85+
assert.NoError(t, r.Stop()) // Make sure recorder is stopped once done with it
86+
}, nil
87+
}
88+
89+
type TestTools struct {
90+
T *testing.T
91+
Meta *Meta
92+
ProviderFactories map[string]func() (*schema.Provider, error)
93+
Cleanup func()
94+
}
95+
96+
func NewTestTools(t *testing.T) *TestTools {
97+
// Create an http client with recording capabilities
98+
httpClient, cleanup, err := getHTTPRecoder(t, *UpdateCassettes)
99+
require.NoError(t, err)
100+
101+
// Create meta that will be passed in the provider config
102+
meta, err := buildMeta(&MetaConfig{
103+
providerSchema: nil,
104+
terraformVersion: "terraform-tests",
105+
httpClient: httpClient,
106+
})
107+
require.NoError(t, err)
108+
109+
return &TestTools{
110+
T: t,
111+
Meta: meta,
112+
ProviderFactories: map[string]func() (*schema.Provider, error){
113+
"scaleway": func() (*schema.Provider, error) {
114+
return Provider(&ProviderConfig{Meta: meta})(), nil
115+
},
116+
},
117+
Cleanup: cleanup,
118+
}
119+
}

scaleway/resource_account_ssh_key.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package scaleway
22

33
import (
4+
"context"
45
"strings"
56

7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
68
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
79
account "github.com/scaleway/scaleway-sdk-go/api/account/v2alpha1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
811
)
912

1013
func resourceScalewayAccountSSKKey() *schema.Resource {
1114
return &schema.Resource{
12-
Create: resourceScalewayAccountSSHKeyCreate,
13-
Read: resourceScalewayAccountSSHKeyRead,
14-
Update: resourceScalewayAccountSSHKeyUpdate,
15-
Delete: resourceScalewayAccountSSHKeyDelete,
15+
CreateContext: resourceScalewayAccountSSHKeyCreate,
16+
ReadContext: resourceScalewayAccountSSHKeyRead,
17+
UpdateContext: resourceScalewayAccountSSHKeyUpdate,
18+
DeleteContext: resourceScalewayAccountSSHKeyDelete,
1619
Importer: &schema.ResourceImporter{
17-
State: schema.ImportStatePassthrough,
20+
StateContext: schema.ImportStatePassthroughContext,
1821
},
1922
Schema: map[string]*schema.Schema{
2023
"name": {
@@ -37,35 +40,35 @@ func resourceScalewayAccountSSKKey() *schema.Resource {
3740
}
3841
}
3942

40-
func resourceScalewayAccountSSHKeyCreate(d *schema.ResourceData, m interface{}) error {
43+
func resourceScalewayAccountSSHKeyCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
4144
accountAPI := accountAPI(m)
4245

4346
res, err := accountAPI.CreateSSHKey(&account.CreateSSHKeyRequest{
4447
Name: d.Get("name").(string),
4548
PublicKey: strings.Trim(d.Get("public_key").(string), "\n"),
4649
OrganizationID: expandStringPtr(d.Get("organization_id")),
47-
})
50+
}, scw.WithContext(ctx))
4851
if err != nil {
49-
return err
52+
return diag.FromErr(err)
5053
}
5154

5255
d.SetId(res.ID)
5356

54-
return resourceScalewayAccountSSHKeyRead(d, m)
57+
return resourceScalewayAccountSSHKeyRead(ctx, d, m)
5558
}
5659

57-
func resourceScalewayAccountSSHKeyRead(d *schema.ResourceData, m interface{}) error {
60+
func resourceScalewayAccountSSHKeyRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
5861
accountAPI := accountAPI(m)
5962

6063
res, err := accountAPI.GetSSHKey(&account.GetSSHKeyRequest{
6164
SSHKeyID: d.Id(),
62-
})
65+
}, scw.WithContext(ctx))
6366
if err != nil {
6467
if is404Error(err) {
6568
d.SetId("")
6669
return nil
6770
}
68-
return err
71+
return diag.FromErr(err)
6972
}
7073

7174
_ = d.Set("name", res.Name)
@@ -75,30 +78,30 @@ func resourceScalewayAccountSSHKeyRead(d *schema.ResourceData, m interface{}) er
7578
return nil
7679
}
7780

78-
func resourceScalewayAccountSSHKeyUpdate(d *schema.ResourceData, m interface{}) error {
81+
func resourceScalewayAccountSSHKeyUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
7982
accountAPI := accountAPI(m)
8083

8184
if d.HasChange("name") {
8285
_, err := accountAPI.UpdateSSHKey(&account.UpdateSSHKeyRequest{
8386
SSHKeyID: d.Id(),
8487
Name: expandStringPtr(d.Get("name")),
85-
})
88+
}, scw.WithContext(ctx))
8689
if err != nil {
87-
return err
90+
return diag.FromErr(err)
8891
}
8992
}
9093

91-
return resourceScalewayAccountSSHKeyRead(d, m)
94+
return resourceScalewayAccountSSHKeyRead(ctx, d, m)
9295
}
9396

94-
func resourceScalewayAccountSSHKeyDelete(d *schema.ResourceData, m interface{}) error {
97+
func resourceScalewayAccountSSHKeyDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
9598
accountAPI := accountAPI(m)
9699

97100
err := accountAPI.DeleteSSHKey(&account.DeleteSSHKeyRequest{
98101
SSHKeyID: d.Id(),
99-
})
102+
}, scw.WithContext(ctx))
100103
if err != nil && !is404Error(err) {
101-
return err
104+
return diag.FromErr(err)
102105
}
103106

104107
return nil

scaleway/resource_baremetal_server_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ func init() {
1818
}
1919

2020
func testSweepBaremetalServer(_ string) error {
21-
return sweepZones([]scw.Zone{scw.ZoneFrPar2}, func(scwClient *scw.Client) error {
21+
return sweepZones([]scw.Zone{scw.ZoneFrPar2}, func(scwClient *scw.Client, zone scw.Zone) error {
2222
baremetalAPI := baremetal.NewAPI(scwClient)
23-
zone, _ := scwClient.GetDefaultZone()
2423
l.Debugf("sweeper: destroying the baremetal server in (%s)", zone)
2524
listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{}, scw.WithAllPages())
2625
if err != nil {

0 commit comments

Comments
 (0)