Skip to content

Commit 22d3b38

Browse files
QuentinBrossejerome-quere
authored andcommitted
refactor: update internal meta struct (scaleway#132)
1 parent 38b7188 commit 22d3b38

31 files changed

+143
-131
lines changed

scaleway/config.go

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package scaleway
33
import (
44
"bytes"
55
"context"
6+
"encoding/json"
7+
"fmt"
68
"io"
79
"io/ioutil"
810
"log"
@@ -23,16 +25,44 @@ type Config struct {
2325
Region string
2426
}
2527

26-
// Client contains scaleway api clients
27-
type Client struct {
28-
scaleway *sdk.API
28+
// Meta contains SDK clients used by resources.
29+
//
30+
// This meta value is passed into all resources.
31+
type Meta struct {
32+
// Deprecated: The deprecated Scaleway SDK (will be removed in `v2.0.0`).
33+
deprecatedClient *sdk.API
2934
}
3035

31-
// client is a bridge between sdk.HTTPClient interface and retryablehttp.Client
36+
// Meta creates a meta instance from a client configuration.
37+
func (c *Config) Meta() (*Meta, error) {
38+
meta := &Meta{}
39+
40+
deprecatedClient, err := c.GetDeprecatedClient()
41+
if err != nil {
42+
return nil, fmt.Errorf("error: cannot create deprecated client: %s", err)
43+
}
44+
meta.deprecatedClient = deprecatedClient
45+
46+
// fetch known scaleway server types to support validation in r/server
47+
if len(commercialServerTypes) == 0 {
48+
if availability, err := deprecatedClient.GetServerAvailabilities(); err == nil {
49+
commercialServerTypes = availability.CommercialTypes()
50+
sort.StringSlice(commercialServerTypes).Sort()
51+
}
52+
if os.Getenv("DISABLE_SCALEWAY_SERVER_TYPE_VALIDATION") != "" {
53+
commercialServerTypes = commercialServerTypes[:0]
54+
}
55+
}
56+
57+
return meta, nil
58+
}
59+
60+
// client is a bridge between scw.httpClient interface and retryablehttp.Client
3261
type client struct {
3362
*retryablehttp.Client
3463
}
3564

65+
// Do wraps calling an HTTP method with retries.
3666
func (c *client) Do(r *http.Request) (*http.Response, error) {
3767
var body io.ReadSeeker
3868
if r.Body != nil {
@@ -52,8 +82,8 @@ func (c *client) Do(r *http.Request) (*http.Response, error) {
5282
return c.Client.Do(req)
5383
}
5484

55-
// Client configures and returns a fully initialized Scaleway client
56-
func (c *Config) Client() (*Client, error) {
85+
// GetDeprecatedClient create a new deprecated client from a configuration.
86+
func (c *Config) GetDeprecatedClient() (*sdk.API, error) {
5787
options := func(sdkApi *sdk.API) {
5888
cl := retryablehttp.NewClient()
5989

@@ -75,25 +105,32 @@ func (c *Config) Client() (*Client, error) {
75105
sdkApi.Client = &client{cl}
76106
}
77107

78-
api, err := sdk.New(
108+
return sdk.New(
79109
c.Organization,
80110
c.APIKey,
81111
c.Region,
82112
options,
83113
)
114+
}
115+
116+
// deprecatedScalewayConfig is the structure of the deprecated Scaleway config file.
117+
type deprecatedScalewayConfig struct {
118+
Organization string `json:"organization"`
119+
Token string `json:"token"`
120+
Version string `json:"version"`
121+
}
122+
123+
// readDeprecatedScalewayConfig parse the deprecated Scaleway config file.
124+
func readDeprecatedScalewayConfig(path string) (string, string, error) {
125+
f, err := os.Open(path)
84126
if err != nil {
85-
return nil, err
127+
return "", "", err
86128
}
129+
defer f.Close()
87130

88-
// fetch known scaleway server types to support validation in r/server
89-
if len(commercialServerTypes) == 0 {
90-
if availability, err := api.GetServerAvailabilities(); err == nil {
91-
commercialServerTypes = availability.CommercialTypes()
92-
sort.StringSlice(commercialServerTypes).Sort()
93-
}
94-
if os.Getenv("DISABLE_SCALEWAY_SERVER_TYPE_VALIDATION") != "" {
95-
commercialServerTypes = commercialServerTypes[:0]
96-
}
131+
var data deprecatedScalewayConfig
132+
if err := json.NewDecoder(f).Decode(&data); err != nil {
133+
return "", "", err
97134
}
98-
return &Client{api}, nil
135+
return data.Token, data.Organization, nil
99136
}

scaleway/data_source_bootscript.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func bootscriptDescriptionAttributes(d *schema.ResourceData, script api.Bootscri
8080
}
8181

8282
func dataSourceScalewayBootscriptRead(d *schema.ResourceData, meta interface{}) error {
83-
scaleway := meta.(*Client).scaleway
83+
scaleway := meta.(*Meta).deprecatedClient
8484

8585
scripts, err := scaleway.GetBootscripts()
8686
if err != nil {

scaleway/data_source_bootscript_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func testAccCheckBootscriptID(n string) resource.TestCheckFunc {
3636
return fmt.Errorf("bootscript data source ID not set")
3737
}
3838

39-
scaleway := testAccProvider.Meta().(*Client).scaleway
39+
scaleway := testAccProvider.Meta().(*Meta).deprecatedClient
4040
_, err := scaleway.GetBootscript(rs.Primary.ID)
4141
if err != nil {
4242
return err

scaleway/data_source_image.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ type localImage struct {
7979
}
8080

8181
func dataSourceScalewayImageRead(d *schema.ResourceData, meta interface{}) error {
82-
scaleway := meta.(*Client).scaleway
82+
scaleway := meta.(*Meta).deprecatedClient
8383

8484
var nameMatch func(api.MarketImage) bool
8585
if name, ok := d.GetOk("name"); ok {

scaleway/data_source_image_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func testAccCheckImageID(n string) resource.TestCheckFunc {
7777
return fmt.Errorf("image data source ID not set")
7878
}
7979

80-
scaleway := testAccProvider.Meta().(*Client).scaleway
80+
scaleway := testAccProvider.Meta().(*Meta).deprecatedClient
8181
_, err := scaleway.GetImage(rs.Primary.ID)
8282

8383
if err != nil {

scaleway/data_source_security_group.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func dataSourceScalewaySecurityGroup() *schema.Resource {
3030
}
3131
}
3232
func dataSourceScalewaySecurityGroupRead(d *schema.ResourceData, m interface{}) error {
33-
client := m.(*Client).scaleway
33+
client := m.(*Meta).deprecatedClient
3434

3535
groups, err := client.GetSecurityGroups()
3636
if err != nil {

scaleway/data_source_volume.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func dataSourceScalewayVolume() *schema.Resource {
3737
}
3838

3939
func dataSourceScalewayVolumeRead(d *schema.ResourceData, m interface{}) error {
40-
client := m.(*Client).scaleway
40+
client := m.(*Meta).deprecatedClient
4141

4242
name := d.Get("name").(string)
4343

scaleway/provider.go

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package scaleway
22

33
import (
4-
"encoding/json"
54
"errors"
65
"fmt"
76
"os"
@@ -35,7 +34,7 @@ func Provider() terraform.ResourceProvider {
3534
}
3635
}
3736
if path, err := homedir.Expand("~/.scwrc"); err == nil {
38-
scwAPIKey, _, err := readScalewayConfig(path)
37+
scwAPIKey, _, err := readDeprecatedScalewayConfig(path)
3938
if err != nil {
4039
return nil, err
4140
}
@@ -55,7 +54,7 @@ func Provider() terraform.ResourceProvider {
5554
}
5655
}
5756
if path, err := homedir.Expand("~/.scwrc"); err == nil {
58-
_, scwOrganization, err := readScalewayConfig(path)
57+
_, scwOrganization, err := readDeprecatedScalewayConfig(path)
5958
if err != nil {
6059
return nil, err
6160
}
@@ -98,26 +97,7 @@ func Provider() terraform.ResourceProvider {
9897
}
9998
}
10099

101-
type scalewayConfig struct {
102-
Organization string `json:"organization"`
103-
Token string `json:"token"`
104-
Version string `json:"version"`
105-
}
106-
107-
func readScalewayConfig(path string) (string, string, error) {
108-
f, err := os.Open(path)
109-
if err != nil {
110-
return "", "", err
111-
}
112-
defer f.Close()
113-
114-
var data scalewayConfig
115-
if err := json.NewDecoder(f).Decode(&data); err != nil {
116-
return "", "", err
117-
}
118-
return data.Token, data.Organization, nil
119-
}
120-
100+
// providerConfigure creates the Meta object containing the SDK client.
121101
func providerConfigure(d *schema.ResourceData) (interface{}, error) {
122102
apiKey := ""
123103
if v, ok := d.Get("token").(string); ok {
@@ -132,7 +112,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
132112

133113
if apiKey == "" {
134114
if path, err := homedir.Expand("~/.scwrc"); err == nil {
135-
scwAPIKey, scwOrganization, err := readScalewayConfig(path)
115+
scwAPIKey, scwOrganization, err := readDeprecatedScalewayConfig(path)
136116
if err != nil {
137117
return nil, fmt.Errorf("Error loading credentials from SCW: %s", err)
138118
}
@@ -147,5 +127,5 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
147127
Region: d.Get("region").(string),
148128
}
149129

150-
return config.Client()
130+
return config.Meta()
151131
}

scaleway/provider_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestProvider_impl(t *testing.T) {
3232
func testAccPreCheck(t *testing.T) {
3333
if v := os.Getenv("SCALEWAY_ORGANIZATION"); v == "" {
3434
if path, err := homedir.Expand("~/.scwrc"); err == nil {
35-
scwAPIKey, scwOrganization, err := readScalewayConfig(path)
35+
scwAPIKey, scwOrganization, err := readDeprecatedScalewayConfig(path)
3636
if err != nil {
3737
t.Fatalf("failed falling back to %s: %v", path, err)
3838
}

scaleway/resource_bucket.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func resourceScalewayBucket() *schema.Resource {
2929
}
3030

3131
func resourceScalewayBucketRead(d *schema.ResourceData, m interface{}) error {
32-
scaleway := m.(*Client).scaleway
32+
scaleway := m.(*Meta).deprecatedClient
3333

3434
_, err := scaleway.ListObjects(d.Get("name").(string))
3535
if err != nil {
@@ -44,7 +44,7 @@ func resourceScalewayBucketRead(d *schema.ResourceData, m interface{}) error {
4444
}
4545

4646
func resourceScalewayBucketCreate(d *schema.ResourceData, m interface{}) error {
47-
scaleway := m.(*Client).scaleway
47+
scaleway := m.(*Meta).deprecatedClient
4848

4949
container, err := scaleway.CreateBucket(&api.CreateBucketRequest{
5050
Name: d.Get("name").(string),
@@ -59,7 +59,7 @@ func resourceScalewayBucketCreate(d *schema.ResourceData, m interface{}) error {
5959
}
6060

6161
func resourceScalewayBucketDelete(d *schema.ResourceData, m interface{}) error {
62-
scaleway := m.(*Client).scaleway
62+
scaleway := m.(*Meta).deprecatedClient
6363

6464
err := scaleway.DeleteBucket(d.Id())
6565
if err != nil {

scaleway/resource_bucket_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ func init() {
1717
}
1818

1919
func testSweepBucket(region string) error {
20-
client, err := sharedClientForRegion(region)
20+
scaleway, err := sharedDeprecatedClientForRegion(region)
2121
if err != nil {
2222
return fmt.Errorf("error getting client: %s", err)
2323
}
2424

25-
scaleway := client.(*Client).scaleway
2625
log.Printf("[DEBUG] Destroying the buckets in (%s)", region)
2726

2827
containers, err := scaleway.GetContainers()
@@ -56,7 +55,7 @@ func TestAccScalewayBucket(t *testing.T) {
5655
}
5756

5857
func testAccCheckScalewayBucketDestroy(s *terraform.State) error {
59-
client := testAccProvider.Meta().(*Client).scaleway
58+
client := testAccProvider.Meta().(*Meta).deprecatedClient
6059

6160
for _, rs := range s.RootModule().Resources {
6261
if rs.Type != "scaleway" {

scaleway/resource_ip.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func resourceScalewayIP() *schema.Resource {
4141
}
4242

4343
func resourceScalewayIPCreate(d *schema.ResourceData, m interface{}) error {
44-
scaleway := m.(*Client).scaleway
44+
scaleway := m.(*Meta).deprecatedClient
4545

4646
ip, err := scaleway.CreateIP()
4747
if err != nil {
@@ -53,7 +53,7 @@ func resourceScalewayIPCreate(d *schema.ResourceData, m interface{}) error {
5353
}
5454

5555
func resourceScalewayIPRead(d *schema.ResourceData, m interface{}) error {
56-
scaleway := m.(*Client).scaleway
56+
scaleway := m.(*Meta).deprecatedClient
5757

5858
ip, err := scaleway.GetIP(d.Id())
5959
if err != nil {
@@ -79,7 +79,7 @@ func resourceScalewayIPRead(d *schema.ResourceData, m interface{}) error {
7979
}
8080

8181
func resourceScalewayIPUpdate(d *schema.ResourceData, m interface{}) error {
82-
scaleway := m.(*Client).scaleway
82+
scaleway := m.(*Meta).deprecatedClient
8383

8484
if d.HasChange("reverse") {
8585
log.Printf("[DEBUG] Updating IP %q reverse to %q\n", d.Id(), d.Get("reverse").(string))
@@ -108,7 +108,7 @@ func resourceScalewayIPUpdate(d *schema.ResourceData, m interface{}) error {
108108
}
109109

110110
func resourceScalewayIPDelete(d *schema.ResourceData, m interface{}) error {
111-
scaleway := m.(*Client).scaleway
111+
scaleway := m.(*Meta).deprecatedClient
112112

113113
err := scaleway.DeleteIP(d.Id())
114114
if err != nil {

scaleway/resource_ip_reverse_dns.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func resourceScalewayIPReverseDNS() *schema.Resource {
3131
}
3232

3333
func resourceScalewayIPReverseDNSCreate(d *schema.ResourceData, m interface{}) error {
34-
scaleway := m.(*Client).scaleway
34+
scaleway := m.(*Meta).deprecatedClient
3535

3636
ips, err := scaleway.GetIPS()
3737
if err != nil {
@@ -50,7 +50,7 @@ func resourceScalewayIPReverseDNSCreate(d *schema.ResourceData, m interface{}) e
5050
}
5151

5252
func resourceScalewayIPReverseDNSRead(d *schema.ResourceData, m interface{}) error {
53-
scaleway := m.(*Client).scaleway
53+
scaleway := m.(*Meta).deprecatedClient
5454

5555
ip, err := scaleway.GetIP(d.Get("ip").(string))
5656
if err != nil {
@@ -69,7 +69,7 @@ func resourceScalewayIPReverseDNSRead(d *schema.ResourceData, m interface{}) err
6969
}
7070

7171
func resourceScalewayIPReverseDNSUpdate(d *schema.ResourceData, m interface{}) error {
72-
scaleway := m.(*Client).scaleway
72+
scaleway := m.(*Meta).deprecatedClient
7373

7474
ip, err := scaleway.UpdateIP(api.UpdateIPRequest{
7575
ID: d.Get("ip").(string),
@@ -88,7 +88,7 @@ func resourceScalewayIPReverseDNSUpdate(d *schema.ResourceData, m interface{}) e
8888
}
8989

9090
func resourceScalewayIPReverseDNSDelete(d *schema.ResourceData, m interface{}) error {
91-
scaleway := m.(*Client).scaleway
91+
scaleway := m.(*Meta).deprecatedClient
9292

9393
_, err := scaleway.UpdateIP(api.UpdateIPRequest{
9494
ID: d.Get("ip").(string),

0 commit comments

Comments
 (0)