Skip to content

Commit 6a7990d

Browse files
committed
update driver to support staging compute
1 parent 016f84d commit 6a7990d

File tree

3 files changed

+72
-24
lines changed

3 files changed

+72
-24
lines changed

cmd/gce-pd-csi-driver/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ var (
6666

6767
maxConcurrentFormatAndMount = flag.Int("max-concurrent-format-and-mount", 1, "If set then format and mount operations are serialized on each node. This is stronger than max-concurrent-format as it includes fsck and other mount operations")
6868
formatAndMountTimeout = flag.Duration("format-and-mount-timeout", 1*time.Minute, "The maximum duration of a format and mount operation before another such operation will be started. Used only if --serialize-format-and-mount")
69+
computeEnvironment = flag.String("compute-environment", "prod", "Sets the compute environment")
6970

7071
fallbackRequisiteZonesFlag = flag.String("fallback-requisite-zones", "", "Comma separated list of requisite zones that will be used if there are not sufficient zones present in requisite topologies when provisioning a disk")
7172

@@ -137,7 +138,7 @@ func handle() {
137138
// Initialize requirements for the controller service
138139
var controllerServer *driver.GCEControllerServer
139140
if *runControllerService {
140-
cloudProvider, err := gce.CreateCloudProvider(ctx, version, *cloudConfigFilePath, *computeEndpoint)
141+
cloudProvider, err := gce.CreateCloudProvider(ctx, version, *cloudConfigFilePath, *computeEndpoint, *computeEnvironment)
141142
if err != nil {
142143
klog.Fatalf("Failed to get cloud provider: %v", err.Error())
143144
}

pkg/gce-cloud-provider/compute/gce.go

+69-22
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"errors"
2020
"fmt"
2121
"net/http"
22+
"net/url"
2223
"os"
2324
"runtime"
2425
"time"
@@ -29,6 +30,7 @@ import (
2930

3031
"cloud.google.com/go/compute/metadata"
3132
"golang.org/x/oauth2"
33+
computealpha "google.golang.org/api/compute/v0.alpha"
3234
computebeta "google.golang.org/api/compute/v0.beta"
3335
"google.golang.org/api/compute/v1"
3436
"google.golang.org/api/googleapi"
@@ -46,8 +48,27 @@ const (
4648
regionURITemplate = "projects/%s/regions/%s"
4749

4850
replicaZoneURITemplateSingleZone = "projects/%s/zones/%s" // {gce.projectID}/zones/{disk.Zone}
51+
versionV1 = "v1"
52+
versionBeta = "beta"
53+
versionAlpha = "alpha"
54+
googleEnv = "googleapis"
4955
)
5056

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+
5172
type CloudProvider struct {
5273
service *compute.Service
5374
betaService *computebeta.Service
@@ -70,7 +91,7 @@ type ConfigGlobal struct {
7091
Zone string `gcfg:"zone"`
7192
}
7293

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) {
7495
configFile, err := readConfig(configPath)
7596
if err != nil {
7697
return nil, err
@@ -85,15 +106,23 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
85106
return nil, err
86107
}
87108

88-
svc, err := createCloudService(ctx, vendorVersion, tokenSource, computeEndpoint)
109+
svc, err := createCloudService(ctx, vendorVersion, tokenSource, computeEndpoint, computeEnvironment)
89110
if err != nil {
90111
return nil, err
91112
}
113+
klog.Infof("Compute endpoint for V1 version: %s", svc.BasePath)
92114

93-
betasvc, err := createBetaCloudService(ctx, vendorVersion, tokenSource, computeEndpoint)
115+
betasvc, err := createBetaCloudService(ctx, vendorVersion, tokenSource, computeEndpoint, computeEnvironment)
94116
if err != nil {
95117
return nil, err
96118
}
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)
97126

98127
project, zone, err := getProjectAndZone(configFile)
99128
if err != nil {
@@ -156,16 +185,23 @@ func readConfig(configPath string) (*ConfigFile, error) {
156185
return cfg, nil
157186
}
158187

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...)
161194
if err != nil {
162195
return nil, err
163196
}
197+
service.UserAgent = fmt.Sprintf("GCE CSI Driver/%s (%s %s)", vendorVersion, runtime.GOOS, runtime.GOARCH)
198+
return service, nil
199+
}
164200

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)
169205
}
170206
service, err := computebeta.NewService(ctx, computeOpts...)
171207
if err != nil {
@@ -175,28 +211,39 @@ func createBetaCloudService(ctx context.Context, vendorVersion string, tokenSour
175211
return service, nil
176212
}
177213

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
181225
}
182226

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) {
184228
client, err := newOauthClient(ctx, tokenSource)
185229
if err != nil {
186230
return nil, err
187231
}
188-
232+
computeEnvironmentSuffix, ok := computeVersionMap[googleEnv][computeEnvironment][computeVersion]
233+
if !ok {
234+
return nil, errors.New("Unable to fetch compute endpoint")
235+
}
189236
computeOpts := []option.ClientOption{option.WithHTTPClient(client)}
190237
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))
197245
}
198-
service.UserAgent = fmt.Sprintf("GCE CSI Driver/%s (%s %s)", vendorVersion, runtime.GOOS, runtime.GOARCH)
199-
return service, nil
246+
return computeOpts, nil
200247
}
201248

202249
func newOauthClient(ctx context.Context, tokenSource oauth2.TokenSource) (*http.Client, error) {

pkg/gce-pd-csi-driver/controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ const (
156156
)
157157

158158
var (
159-
validResourceApiVersions = map[string]bool{"v1": true, "alpha": true, "beta": true}
159+
validResourceApiVersions = map[string]bool{"v1": true, "alpha": true, "beta": true, "staging_v1": true, "staging_beta": true, "staging_alpha": true}
160160
)
161161

162162
func isDiskReady(disk *gce.CloudDisk) (bool, error) {

0 commit comments

Comments
 (0)