@@ -19,6 +19,7 @@ import (
19
19
"errors"
20
20
"fmt"
21
21
"net/http"
22
+ "net/url"
22
23
"os"
23
24
"runtime"
24
25
"time"
@@ -29,6 +30,7 @@ import (
29
30
30
31
"cloud.google.com/go/compute/metadata"
31
32
"golang.org/x/oauth2"
33
+ computealpha "google.golang.org/api/compute/v0.alpha"
32
34
computebeta "google.golang.org/api/compute/v0.beta"
33
35
"google.golang.org/api/compute/v1"
34
36
"google.golang.org/api/googleapi"
@@ -46,8 +48,27 @@ const (
46
48
regionURITemplate = "projects/%s/regions/%s"
47
49
48
50
replicaZoneURITemplateSingleZone = "projects/%s/zones/%s" // {gce.projectID}/zones/{disk.Zone}
51
+ versionV1 = "v1"
52
+ versionBeta = "beta"
53
+ versionAlpha = "alpha"
54
+ googleEnv = "googleapis"
49
55
)
50
56
57
+ var computeVersionMap = map [string ]map [string ]map [string ]string {
58
+ googleEnv : {
59
+ "prod" : {
60
+ versionV1 : "compute/v1/" ,
61
+ versionBeta : "compute/beta/" ,
62
+ versionAlpha : "compute/alpha/" ,
63
+ },
64
+ "staging" : {
65
+ versionV1 : "compute/staging_v1/" ,
66
+ versionBeta : "compute/staging_beta/" ,
67
+ versionAlpha : "compute/staging_alpha/" ,
68
+ },
69
+ },
70
+ }
71
+
51
72
type CloudProvider struct {
52
73
service * compute.Service
53
74
betaService * computebeta.Service
@@ -70,7 +91,7 @@ type ConfigGlobal struct {
70
91
Zone string `gcfg:"zone"`
71
92
}
72
93
73
- func CreateCloudProvider (ctx context.Context , vendorVersion string , configPath string , computeEndpoint string ) (* CloudProvider , error ) {
94
+ func CreateCloudProvider (ctx context.Context , vendorVersion string , configPath string , computeEndpoint string , computeEnvironment string ) (* CloudProvider , error ) {
74
95
configFile , err := readConfig (configPath )
75
96
if err != nil {
76
97
return nil , err
@@ -85,15 +106,23 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
85
106
return nil , err
86
107
}
87
108
88
- svc , err := createCloudService (ctx , vendorVersion , tokenSource , computeEndpoint )
109
+ svc , err := createCloudService (ctx , vendorVersion , tokenSource , computeEndpoint , computeEnvironment )
89
110
if err != nil {
90
111
return nil , err
91
112
}
113
+ klog .Infof ("Compute endpoint for V1 version: %s" , svc .BasePath )
92
114
93
- betasvc , err := createBetaCloudService (ctx , vendorVersion , tokenSource , computeEndpoint )
115
+ betasvc , err := createBetaCloudService (ctx , vendorVersion , tokenSource , computeEndpoint , computeEnvironment )
94
116
if err != nil {
95
117
return nil , err
96
118
}
119
+ klog .Infof ("Compute endpoint for Beta version: %s" , betasvc .BasePath )
120
+
121
+ alphasvc , err := createAlphaCloudService (ctx , vendorVersion , tokenSource , computeEndpoint , computeEnvironment )
122
+ if err != nil {
123
+ return nil , err
124
+ }
125
+ klog .Infof ("Compute endpoint for Alpha version: %s" , alphasvc .BasePath )
97
126
98
127
project , zone , err := getProjectAndZone (configFile )
99
128
if err != nil {
@@ -156,16 +185,23 @@ func readConfig(configPath string) (*ConfigFile, error) {
156
185
return cfg , nil
157
186
}
158
187
159
- func createBetaCloudService (ctx context.Context , vendorVersion string , tokenSource oauth2.TokenSource , computeEndpoint string ) (* computebeta.Service , error ) {
160
- client , err := newOauthClient (ctx , tokenSource )
188
+ func createAlphaCloudService (ctx context.Context , vendorVersion string , tokenSource oauth2.TokenSource , computeEndpoint string , computeEnvironment string ) (* computealpha.Service , error ) {
189
+ computeOpts , err := getComputeVersion (ctx , tokenSource , computeEndpoint , computeEnvironment , versionAlpha )
190
+ if err != nil {
191
+ klog .Errorf ("Failed to get compute endpoint: %s" , err )
192
+ }
193
+ service , err := computealpha .NewService (ctx , computeOpts ... )
161
194
if err != nil {
162
195
return nil , err
163
196
}
197
+ service .UserAgent = fmt .Sprintf ("GCE CSI Driver/%s (%s %s)" , vendorVersion , runtime .GOOS , runtime .GOARCH )
198
+ return service , nil
199
+ }
164
200
165
- computeOpts := []option. ClientOption { option . WithHTTPClient ( client )}
166
- if computeEndpoint != "" {
167
- betaEndpoint := fmt . Sprintf ( "%s/compute/beta/" , computeEndpoint )
168
- computeOpts = append ( computeOpts , option . WithEndpoint ( betaEndpoint ) )
201
+ func createBetaCloudService ( ctx context. Context , vendorVersion string , tokenSource oauth2. TokenSource , computeEndpoint string , computeEnvironment string ) ( * computebeta. Service , error ) {
202
+ computeOpts , err := getComputeVersion ( ctx , tokenSource , computeEndpoint , computeEnvironment , versionBeta )
203
+ if err != nil {
204
+ klog . Errorf ( "Failed to get compute endpoint: %s" , err )
169
205
}
170
206
service , err := computebeta .NewService (ctx , computeOpts ... )
171
207
if err != nil {
@@ -175,28 +211,39 @@ func createBetaCloudService(ctx context.Context, vendorVersion string, tokenSour
175
211
return service , nil
176
212
}
177
213
178
- func createCloudService (ctx context.Context , vendorVersion string , tokenSource oauth2.TokenSource , computeEndpoint string ) (* compute.Service , error ) {
179
- svc , err := createCloudServiceWithDefaultServiceAccount (ctx , vendorVersion , tokenSource , computeEndpoint )
180
- return svc , err
214
+ func createCloudService (ctx context.Context , vendorVersion string , tokenSource oauth2.TokenSource , computeEndpoint string , computeEnvironment string ) (* compute.Service , error ) {
215
+ computeOpts , err := getComputeVersion (ctx , tokenSource , computeEndpoint , computeEnvironment , versionV1 )
216
+ if err != nil {
217
+ klog .Errorf ("Failed to get compute endpoint: %s" , err )
218
+ }
219
+ service , err := compute .NewService (ctx , computeOpts ... )
220
+ if err != nil {
221
+ return nil , err
222
+ }
223
+ service .UserAgent = fmt .Sprintf ("GCE CSI Driver/%s (%s %s)" , vendorVersion , runtime .GOOS , runtime .GOARCH )
224
+ return service , nil
181
225
}
182
226
183
- func createCloudServiceWithDefaultServiceAccount (ctx context.Context , vendorVersion string , tokenSource oauth2.TokenSource , computeEndpoint string ) (* compute. Service , error ) {
227
+ func getComputeVersion (ctx context.Context , tokenSource oauth2.TokenSource , computeEndpoint string , computeEnvironment string , computeVersion string ) ([]option. ClientOption , error ) {
184
228
client , err := newOauthClient (ctx , tokenSource )
185
229
if err != nil {
186
230
return nil , err
187
231
}
188
-
232
+ computeEnvironmentSuffix , ok := computeVersionMap [googleEnv ][computeEnvironment ][computeVersion ]
233
+ if ! ok {
234
+ return nil , errors .New ("Unable to fetch compute endpoint" )
235
+ }
189
236
computeOpts := []option.ClientOption {option .WithHTTPClient (client )}
190
237
if computeEndpoint != "" {
191
- v1Endpoint := fmt .Sprintf ("%s/compute/v1/" , computeEndpoint )
192
- computeOpts = append (computeOpts , option .WithEndpoint (v1Endpoint ))
193
- }
194
- service , err := compute .NewService (ctx , computeOpts ... )
195
- if err != nil {
196
- return nil , err
238
+ endpoint := fmt .Sprintf ("%s%s" , computeEndpoint , computeEnvironmentSuffix )
239
+ klog .Infof ("Got compute endpoint %s" , endpoint )
240
+ _ , err := url .ParseRequestURI (endpoint )
241
+ if err != nil {
242
+ klog .Fatalf ("Error parsing compute endpoint %s" , endpoint )
243
+ }
244
+ computeOpts = append (computeOpts , option .WithEndpoint (endpoint ))
197
245
}
198
- service .UserAgent = fmt .Sprintf ("GCE CSI Driver/%s (%s %s)" , vendorVersion , runtime .GOOS , runtime .GOARCH )
199
- return service , nil
246
+ return computeOpts , nil
200
247
}
201
248
202
249
func newOauthClient (ctx context.Context , tokenSource oauth2.TokenSource ) (* http.Client , error ) {
0 commit comments