Skip to content

Commit e556185

Browse files
amanenkyevgenypatshermanschaafkodiakhq[bot]
authored
feat!: Migrate DigitalOcean plugin to v2 (#1794)
Co-authored-by: Yevgeny Pats <yev.pats@gmail.com> Co-authored-by: Herman Schaaf <hermanschaaf@gmail.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
1 parent 99e7089 commit e556185

198 files changed

Lines changed: 6149 additions & 5158 deletions

File tree

Some content is hidden

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

plugins/source/digitalocean/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2020

2121
* **deps:** Update Terraform tls to v4.0.2 ([#1653](https://github.com/cloudquery/cloudquery/issues/1653)) ([8f3bbeb](https://github.com/cloudquery/cloudquery/commit/8f3bbeba64723c6744ae0f9db747261668f6a087))
2222

23+
2324
## [0.6.4](https://github.com/cloudquery/cloudquery/compare/plugins/source/digitalocean-v0.6.3...plugins/source/digitalocean/v0.6.4) (2022-08-25)
2425

2526

plugins/source/digitalocean/client/client.go

Lines changed: 136 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,33 @@ package client
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
76
"os"
87

98
"github.com/aws/aws-sdk-go-v2/aws"
109
awscfg "github.com/aws/aws-sdk-go-v2/config"
1110
"github.com/aws/aws-sdk-go-v2/service/s3"
1211
"github.com/aws/smithy-go/logging"
13-
"github.com/cloudquery/cq-provider-sdk/provider/diag"
14-
"github.com/cloudquery/cq-provider-sdk/provider/schema"
12+
"github.com/cloudquery/plugin-sdk/schema"
13+
"github.com/cloudquery/plugin-sdk/specs"
1514
"github.com/digitalocean/godo"
16-
"github.com/hashicorp/go-hclog"
15+
"github.com/pkg/errors"
16+
"github.com/rs/zerolog"
1717
)
1818

19+
var defaultSpacesRegions = []string{"nyc3", "sfo3", "ams3", "sgp1", "fra1"}
20+
21+
const MaxItemsPerPage = 200
22+
1923
type Client struct {
20-
// This is a client that you need to create and initialize in Configure
24+
// This is a client that you need to create and initialize in New
2125
// It will be passed for each resource fetcher.
22-
logger hclog.Logger
26+
logger zerolog.Logger
2327
DoClient *godo.Client
2428
Regions []string
2529
SpacesRegion string
2630
CredentialStatus DoCredentialStruct
27-
S3 *s3.Client
31+
Services *Services
2832
}
2933

3034
type DoCredentialStruct struct {
@@ -37,27 +41,10 @@ type SpacesCredentialsProvider struct {
3741
SpacesAccessKeyId string
3842
}
3943

40-
type AwsLogger struct {
41-
l hclog.Logger
42-
}
43-
4444
type SpacesEndpointResolver struct{}
4545

46-
const MaxItemsPerPage = 200
47-
48-
var defaultSpacesRegions = []string{"nyc3", "sfo3", "ams3", "sgp1", "fra1"}
49-
50-
func (c *Client) Logger() hclog.Logger {
51-
return c.logger
52-
}
53-
54-
func (c *Client) WithSpacesRegion(region string) *Client {
55-
return &Client{
56-
logger: c.Logger().With("spaces_region", region),
57-
DoClient: c.DoClient,
58-
SpacesRegion: region,
59-
S3: c.S3,
60-
}
46+
type DoLogger struct {
47+
l zerolog.Logger
6148
}
6249

6350
func (s SpacesCredentialsProvider) Retrieve(ctx context.Context) (aws.Credentials, error) {
@@ -68,92 +55,172 @@ func (s SpacesCredentialsProvider) Retrieve(ctx context.Context) (aws.Credential
6855
}, nil
6956
}
7057

58+
func (c *Client) WithSpacesRegion(region string) *Client {
59+
return &Client{
60+
logger: c.Logger().With().Str("spaces_region", region).Logger(),
61+
DoClient: c.DoClient,
62+
SpacesRegion: region,
63+
Services: initServices(c.DoClient, c.Services.Spaces),
64+
}
65+
}
66+
7167
func (SpacesEndpointResolver) ResolveEndpoint(_, region string) (aws.Endpoint, error) {
7268
return aws.Endpoint{
7369
URL: fmt.Sprintf("https://%s.digitaloceanspaces.com", region),
7470
Source: aws.EndpointSourceCustom,
7571
}, nil
7672
}
7773

78-
func Configure(logger hclog.Logger, config interface{}) (schema.ClientMeta, diag.Diagnostics) {
79-
providerConfig := config.(*Config)
80-
if providerConfig.Token == "" {
81-
providerConfig.Token = getTokenFromEnv()
74+
func getTokenFromEnv() string {
75+
doToken := os.Getenv("DIGITALOCEAN_TOKEN")
76+
doAccessToken := os.Getenv("DIGITALOCEAN_ACCESS_TOKEN")
77+
if doToken != "" {
78+
return doToken
79+
}
80+
if doAccessToken != "" {
81+
return doAccessToken
82+
}
83+
return ""
84+
}
85+
86+
func getSpacesTokenFromEnv() (string, string) {
87+
spacesAccessKey := os.Getenv("SPACES_ACCESS_KEY_ID")
88+
spacesSecretKey := os.Getenv("SPACES_SECRET_ACCESS_KEY")
89+
if spacesAccessKey == "" {
90+
return "", ""
91+
}
92+
if spacesSecretKey == "" {
93+
return "", ""
94+
}
95+
return spacesAccessKey, spacesSecretKey
96+
}
97+
98+
type Services struct {
99+
Account AccountService
100+
Cdn CdnService
101+
BillingHistory BillingHistoryService
102+
Monitoring MonitoringService
103+
Balance BalanceService
104+
Certificates CertificatesService
105+
Databases DatabasesService
106+
Domains DomainsService
107+
Droplets DropletsService
108+
Firewalls FirewallsService
109+
FloatingIps FloatingIpsService
110+
Images ImagesService
111+
Keys KeysService
112+
LoadBalancers LoadBalancersService
113+
Projects ProjectsService
114+
Registry RegistryService
115+
Sizes SizesService
116+
Snapshots SnapshotsService
117+
Storage StorageService
118+
Vpcs VpcsService
119+
Spaces SpacesService
120+
}
121+
122+
type ServicesRegionMap map[string]*Services
123+
124+
// ServicesManager will hold the entire map of region services
125+
type ServicesManager struct {
126+
services ServicesRegionMap
127+
}
128+
129+
func (s *ServicesManager) ServicesByRegion(region string) *Services {
130+
return s.services[region]
131+
}
132+
133+
func New(ctx context.Context, logger zerolog.Logger, s specs.Source) (schema.ClientMeta, error) {
134+
// providerConfig := config.(*Config)
135+
var doSpec Spec
136+
if err := s.UnmarshalSpec(&doSpec); err != nil {
137+
return nil, errors.WithStack(fmt.Errorf("failed to unmarshal digitalocean spec: %w", err))
82138
}
83-
if providerConfig.Token == "" {
84-
return nil, diag.FromError(errors.New("missing API token"), diag.USER)
139+
140+
if doSpec.Token == "" {
141+
doSpec.Token = getTokenFromEnv()
142+
}
143+
if doSpec.Token == "" {
144+
return nil, errors.WithStack(fmt.Errorf("missing API token"))
85145
}
86146

87147
credStatus := DoCredentialStruct{
88148
Api: true,
89149
Spaces: true,
90150
}
91151

92-
if providerConfig.SpacesAccessKey == "" || providerConfig.SpacesAccessKeyId == "" {
93-
providerConfig.SpacesAccessKeyId, providerConfig.SpacesAccessKey = getSpacesTokenFromEnv()
152+
if doSpec.SpacesAccessKey == "" || doSpec.SpacesAccessKeyId == "" {
153+
doSpec.SpacesAccessKeyId, doSpec.SpacesAccessKey = getSpacesTokenFromEnv()
94154
}
95-
if providerConfig.SpacesAccessKey == "" || providerConfig.SpacesAccessKeyId == "" {
155+
if doSpec.SpacesAccessKey == "" || doSpec.SpacesAccessKeyId == "" {
96156
credStatus.Spaces = false
97157
}
98158

99159
awsCfg, err := awscfg.LoadDefaultConfig(context.Background(),
100-
awscfg.WithCredentialsProvider(SpacesCredentialsProvider{providerConfig.SpacesAccessKey, providerConfig.SpacesAccessKeyId}),
160+
awscfg.WithCredentialsProvider(SpacesCredentialsProvider{doSpec.SpacesAccessKey, doSpec.SpacesAccessKeyId}),
101161
awscfg.WithEndpointResolver(SpacesEndpointResolver{}),
102162
)
103163

104164
if err != nil {
105-
return nil, diag.FromError(err, diag.INTERNAL)
165+
return nil, errors.WithStack(err)
106166
}
107167

108-
if providerConfig.SpacesDebugLogging {
168+
if doSpec.SpacesDebugLogging {
109169
awsCfg.ClientLogMode = aws.LogRequest | aws.LogResponse | aws.LogRetries
110-
awsCfg.Logger = AwsLogger{logger}
170+
awsCfg.Logger = DoLogger{logger}
111171
}
112172

113173
spacesRegions := defaultSpacesRegions
114-
if len(providerConfig.SpacesRegions) > 0 {
115-
spacesRegions = providerConfig.SpacesRegions
174+
if len(doSpec.SpacesRegions) > 0 {
175+
spacesRegions = doSpec.SpacesRegions
116176
}
117177

118-
client := Client{
178+
client := godo.NewFromToken(doSpec.Token)
179+
c := Client{
119180
logger: logger,
120-
DoClient: godo.NewFromToken(providerConfig.Token),
181+
DoClient: godo.NewFromToken(doSpec.Token),
121182
Regions: spacesRegions,
122183
SpacesRegion: "nyc3",
123-
S3: s3.NewFromConfig(awsCfg),
124184
CredentialStatus: credStatus,
185+
Services: initServices(client, s3.NewFromConfig(awsCfg)),
125186
}
126-
return &client, nil
187+
return &c, nil
127188
}
128189

129-
func getTokenFromEnv() string {
130-
doToken := os.Getenv("DIGITALOCEAN_TOKEN")
131-
doAccessToken := os.Getenv("DIGITALOCEAN_ACCESS_TOKEN")
132-
if doToken != "" {
133-
return doToken
134-
}
135-
if doAccessToken != "" {
136-
return doAccessToken
190+
func (a DoLogger) Logf(classification logging.Classification, format string, v ...interface{}) {
191+
if classification == logging.Warn {
192+
a.l.Warn().Msg(fmt.Sprintf(format, v...))
193+
} else {
194+
a.l.Debug().Msg(fmt.Sprintf(format, v...))
137195
}
138-
return ""
139196
}
140197

141-
func getSpacesTokenFromEnv() (string, string) {
142-
spacesAccessKey := os.Getenv("SPACES_ACCESS_KEY_ID")
143-
spacesSecretKey := os.Getenv("SPACES_SECRET_ACCESS_KEY")
144-
if spacesAccessKey == "" {
145-
return "", ""
146-
}
147-
if spacesSecretKey == "" {
148-
return "", ""
149-
}
150-
return spacesAccessKey, spacesSecretKey
198+
func (c *Client) Logger() *zerolog.Logger {
199+
return &c.logger
151200
}
152201

153-
func (a AwsLogger) Logf(classification logging.Classification, format string, v ...interface{}) {
154-
if classification == logging.Warn {
155-
a.l.Warn(fmt.Sprintf(format, v...))
156-
} else {
157-
a.l.Debug(fmt.Sprintf(format, v...))
202+
func initServices(doClient *godo.Client, spacesService SpacesService) *Services {
203+
return &Services{
204+
Account: doClient.Account,
205+
Cdn: doClient.CDNs,
206+
BillingHistory: doClient.BillingHistory,
207+
Monitoring: doClient.Monitoring,
208+
Balance: doClient.Balance,
209+
Certificates: doClient.Certificates,
210+
Databases: doClient.Databases,
211+
Domains: doClient.Domains,
212+
Droplets: doClient.Droplets,
213+
Firewalls: doClient.Firewalls,
214+
FloatingIps: doClient.FloatingIPs,
215+
Images: doClient.Images,
216+
Keys: doClient.Keys,
217+
LoadBalancers: doClient.LoadBalancers,
218+
Projects: doClient.Projects,
219+
Registry: doClient.Registry,
220+
Sizes: doClient.Sizes,
221+
Snapshots: doClient.Snapshots,
222+
Storage: doClient.Storage,
223+
Vpcs: doClient.VPCs,
224+
Spaces: spacesService,
158225
}
159226
}

plugins/source/digitalocean/client/config.go

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)