@@ -2,29 +2,33 @@ package client
22
33import (
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+
1923type 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
3034type DoCredentialStruct struct {
@@ -37,27 +41,10 @@ type SpacesCredentialsProvider struct {
3741 SpacesAccessKeyId string
3842}
3943
40- type AwsLogger struct {
41- l hclog.Logger
42- }
43-
4444type 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
6350func (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+
7167func (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}
0 commit comments