Skip to content

Commit cd8a6d2

Browse files
authored
Merge pull request #1077 from judemars/endpoint_flag
Add compute-endpoint flag to pdcsi driver
2 parents d54ea89 + 524e963 commit cd8a6d2

File tree

7 files changed

+134
-25
lines changed

7 files changed

+134
-25
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
var (
3737
cloudConfigFilePath = flag.String("cloud-config", "", "Path to GCE cloud provider config")
3838
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
39+
computeEndpoint = flag.String("compute-endpoint", "", "If set, used as the endpoint for the GCE API.")
3940
runControllerService = flag.Bool("run-controller-service", true, "If set to false then the CSI driver does not activate its controller service (default: true)")
4041
runNodeService = flag.Bool("run-node-service", true, "If set to false then the CSI driver does not activate its node service (default: true)")
4142
httpEndpoint = flag.String("http-endpoint", "", "The TCP network address where the prometheus metrics endpoint will listen (example: `:8080`). The default is empty string, which means metrics endpoint is disabled.")
@@ -117,7 +118,7 @@ func handle() {
117118
//Initialize requirements for the controller service
118119
var controllerServer *driver.GCEControllerServer
119120
if *runControllerService {
120-
cloudProvider, err := gce.CreateCloudProvider(ctx, version, *cloudConfigFilePath)
121+
cloudProvider, err := gce.CreateCloudProvider(ctx, version, *cloudConfigFilePath, *computeEndpoint)
121122
if err != nil {
122123
klog.Fatalf("Failed to get cloud provider: %v", err)
123124
}

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

+19-13
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ const (
4444

4545
regionURITemplate = "projects/%s/regions/%s"
4646

47-
GCEComputeAPIEndpoint = "https://www.googleapis.com/compute/v1/"
48-
GCEComputeBetaAPIEndpoint = "https://www.googleapis.com/compute/beta/"
49-
GCEComputeAlphaAPIEndpoint = "https://www.googleapis.com/compute/alpha/"
50-
5147
replicaZoneURITemplateSingleZone = "projects/%s/zones/%s" // {gce.projectID}/zones/{disk.Zone}
5248
)
5349

@@ -73,7 +69,7 @@ type ConfigGlobal struct {
7369
Zone string `gcfg:"zone"`
7470
}
7571

76-
func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath string) (*CloudProvider, error) {
72+
func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath string, computeEndpoint string) (*CloudProvider, error) {
7773
configFile, err := readConfig(configPath)
7874
if err != nil {
7975
return nil, err
@@ -88,12 +84,12 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
8884
return nil, err
8985
}
9086

91-
svc, err := createCloudService(ctx, vendorVersion, tokenSource)
87+
svc, err := createCloudService(ctx, vendorVersion, tokenSource, computeEndpoint)
9288
if err != nil {
9389
return nil, err
9490
}
9591

96-
betasvc, err := createBetaCloudService(ctx, vendorVersion, tokenSource)
92+
betasvc, err := createBetaCloudService(ctx, vendorVersion, tokenSource, computeEndpoint)
9793
if err != nil {
9894
return nil, err
9995
}
@@ -159,30 +155,40 @@ func readConfig(configPath string) (*ConfigFile, error) {
159155
return cfg, nil
160156
}
161157

162-
func createBetaCloudService(ctx context.Context, vendorVersion string, tokenSource oauth2.TokenSource) (*computebeta.Service, error) {
158+
func createBetaCloudService(ctx context.Context, vendorVersion string, tokenSource oauth2.TokenSource, computeEndpoint string) (*computebeta.Service, error) {
163159
client, err := newOauthClient(ctx, tokenSource)
164160
if err != nil {
165161
return nil, err
166162
}
167-
service, err := computebeta.NewService(ctx, option.WithHTTPClient(client))
163+
164+
computeOpts := []option.ClientOption{option.WithHTTPClient(client)}
165+
if computeEndpoint != "" {
166+
computeOpts = append(computeOpts, option.WithEndpoint(computeEndpoint))
167+
}
168+
service, err := computebeta.NewService(ctx, computeOpts...)
168169
if err != nil {
169170
return nil, err
170171
}
171172
service.UserAgent = fmt.Sprintf("GCE CSI Driver/%s (%s %s)", vendorVersion, runtime.GOOS, runtime.GOARCH)
172173
return service, nil
173174
}
174175

175-
func createCloudService(ctx context.Context, vendorVersion string, tokenSource oauth2.TokenSource) (*compute.Service, error) {
176-
svc, err := createCloudServiceWithDefaultServiceAccount(ctx, vendorVersion, tokenSource)
176+
func createCloudService(ctx context.Context, vendorVersion string, tokenSource oauth2.TokenSource, computeEndpoint string) (*compute.Service, error) {
177+
svc, err := createCloudServiceWithDefaultServiceAccount(ctx, vendorVersion, tokenSource, computeEndpoint)
177178
return svc, err
178179
}
179180

180-
func createCloudServiceWithDefaultServiceAccount(ctx context.Context, vendorVersion string, tokenSource oauth2.TokenSource) (*compute.Service, error) {
181+
func createCloudServiceWithDefaultServiceAccount(ctx context.Context, vendorVersion string, tokenSource oauth2.TokenSource, computeEndpoint string) (*compute.Service, error) {
181182
client, err := newOauthClient(ctx, tokenSource)
182183
if err != nil {
183184
return nil, err
184185
}
185-
service, err := compute.New(client)
186+
187+
computeOpts := []option.ClientOption{option.WithHTTPClient(client)}
188+
if computeEndpoint != "" {
189+
computeOpts = append(computeOpts, option.WithEndpoint(computeEndpoint))
190+
}
191+
service, err := compute.NewService(ctx, computeOpts...)
186192
if err != nil {
187193
return nil, err
188194
}

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import (
1818
"context"
1919
"fmt"
2020
"math/rand"
21+
"regexp"
2122
"sort"
22-
"strings"
2323
"time"
2424

2525
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
@@ -1526,9 +1526,8 @@ func generateCreateVolumeResponse(disk *gce.CloudDisk, zones []string) *csi.Crea
15261526
}
15271527

15281528
func cleanSelfLink(selfLink string) string {
1529-
temp := strings.TrimPrefix(selfLink, gce.GCEComputeAPIEndpoint)
1530-
temp = strings.TrimPrefix(temp, gce.GCEComputeBetaAPIEndpoint)
1531-
return strings.TrimPrefix(temp, gce.GCEComputeAlphaAPIEndpoint)
1529+
r, _ := regexp.Compile("https:\\/\\/www.*apis.com\\/.*(v1|beta|alpha)\\/")
1530+
return r.ReplaceAllString(selfLink, "")
15321531
}
15331532

15341533
func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name string, zones []string, params common.DiskParameters, capacityRange *csi.CapacityRange, capBytes int64, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool) (*gce.CloudDisk, error) {

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

+65
Original file line numberDiff line numberDiff line change
@@ -2294,6 +2294,71 @@ func TestControllerPublishBackoffMissingInstance(t *testing.T) {
22942294
})
22952295
}
22962296

2297+
func TestCleanSelfLink(t *testing.T) {
2298+
testCases := []struct {
2299+
name string
2300+
in string
2301+
want string
2302+
}{
2303+
{
2304+
name: "v1 full standard w/ endpoint prefix",
2305+
in: "https://www.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk",
2306+
want: "projects/project/zones/zone/disks/disk",
2307+
},
2308+
{
2309+
name: "beta full standard w/ endpoint prefix",
2310+
in: "https://www.googleapis.com/compute/beta/projects/project/zones/zone/disks/disk",
2311+
want: "projects/project/zones/zone/disks/disk",
2312+
},
2313+
{
2314+
name: "alpha full standard w/ endpoint prefix",
2315+
in: "https://www.googleapis.com/compute/alpha/projects/project/zones/zone/disks/disk",
2316+
want: "projects/project/zones/zone/disks/disk",
2317+
},
2318+
{
2319+
name: "no prefix",
2320+
in: "projects/project/zones/zone/disks/disk",
2321+
want: "projects/project/zones/zone/disks/disk",
2322+
},
2323+
2324+
{
2325+
name: "no prefix + project omitted",
2326+
in: "zones/zone/disks/disk",
2327+
want: "zones/zone/disks/disk",
2328+
},
2329+
{
2330+
name: "Compute prefix, google api",
2331+
in: "https://www.compute.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk",
2332+
want: "projects/project/zones/zone/disks/disk",
2333+
},
2334+
{
2335+
name: "Compute prefix, partner api",
2336+
in: "https://www.compute.PARTNERapis.com/compute/v1/projects/project/zones/zone/disks/disk",
2337+
want: "projects/project/zones/zone/disks/disk",
2338+
},
2339+
{
2340+
name: "Partner beta api",
2341+
in: "https://www.PARTNERapis.com/compute/beta/projects/project/zones/zone/disks/disk",
2342+
want: "projects/project/zones/zone/disks/disk",
2343+
},
2344+
{
2345+
name: "Partner alpha api",
2346+
in: "https://www.partnerapis.com/compute/alpha/projects/project/zones/zone/disks/disk",
2347+
want: "projects/project/zones/zone/disks/disk",
2348+
},
2349+
}
2350+
2351+
// Run test cases
2352+
for _, tc := range testCases {
2353+
t.Run(tc.name, func(t *testing.T) {
2354+
got := cleanSelfLink(tc.in)
2355+
if got != tc.want {
2356+
t.Errorf("Expected cleaned self link: %v, got: %v", tc.want, got)
2357+
}
2358+
})
2359+
}
2360+
}
2361+
22972362
func backoffTesterForPublish(t *testing.T, config *backoffTesterConfig) {
22982363
readyToExecute := make(chan chan gce.Signal)
22992364
cloudDisks := []*gce.CloudDisk{

test/e2e/tests/setup_e2e_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ var _ = BeforeSuite(func() {
116116

117117
klog.Infof("Creating new driver and client for node %s\n", i.GetName())
118118
// Create new driver and client
119-
testContext, err := testutils.GCEClientAndDriverSetup(i)
119+
testContext, err := testutils.GCEClientAndDriverSetup(i, "")
120120
if err != nil {
121121
klog.Fatalf("Failed to set up Test Context for instance %v: %v", i.GetName(), err)
122122
}

test/e2e/tests/single_zone_e2e_test.go

+37-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"fmt"
2020
"path/filepath"
21+
"regexp"
2122
"strings"
2223
"time"
2324

@@ -1123,6 +1124,40 @@ var _ = Describe("GCE PD CSI Driver", func() {
11231124
Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found")
11241125
}()
11251126
})
1127+
1128+
It("Should pass/fail if valid/invalid compute endpoint is passed in", func() {
1129+
// gets instance set up w/o compute-endpoint set from test setup
1130+
_, err := getRandomTestContext().Client.ListVolumes()
1131+
Expect(err).To(BeNil(), "no error expected when passed valid compute url")
1132+
1133+
zone := "us-central1-c"
1134+
nodeID := fmt.Sprintf("gce-pd-csi-e2e-%s", zone)
1135+
i, err := remote.SetupInstance(*project, *architecture, zone, nodeID, *machineType, *serviceAccount, *imageURL, computeService)
1136+
1137+
if err != nil {
1138+
klog.Fatalf("Failed to setup instance %v: %v", nodeID, err)
1139+
}
1140+
1141+
klog.Infof("Creating new driver and client for node %s\n", i.GetName())
1142+
1143+
// Create new driver and client w/ invalid endpoint
1144+
tcInvalid, err := testutils.GCEClientAndDriverSetup(i, "invalid-string")
1145+
if err != nil {
1146+
klog.Fatalf("Failed to set up Test Context for instance %v: %v", i.GetName(), err)
1147+
}
1148+
1149+
_, err = tcInvalid.Client.ListVolumes()
1150+
Expect(err.Error()).To(ContainSubstring("no such host"), "expected error when passed invalid compute url")
1151+
1152+
// Create new driver and client w/ valid, passed-in endpoint
1153+
tcValid, err := testutils.GCEClientAndDriverSetup(i, "https://compute.googleapis.com/compute/v1/")
1154+
if err != nil {
1155+
klog.Fatalf("Failed to set up Test Context for instance %v: %v", i.GetName(), err)
1156+
}
1157+
_, err = tcValid.Client.ListVolumes()
1158+
1159+
Expect(err).To(BeNil(), "no error expected when passed valid compute url")
1160+
})
11261161
})
11271162

11281163
func equalWithinEpsilon(a, b, epsiolon int64) bool {
@@ -1204,7 +1239,6 @@ func createAndValidateUniqueZonalMultiWriterDisk(client *remote.CsiClient, proje
12041239
}
12051240

12061241
func cleanSelfLink(selfLink string) string {
1207-
temp := strings.TrimPrefix(selfLink, gce.GCEComputeAPIEndpoint)
1208-
temp = strings.TrimPrefix(temp, gce.GCEComputeBetaAPIEndpoint)
1209-
return strings.TrimPrefix(temp, gce.GCEComputeAlphaAPIEndpoint)
1242+
r, _ := regexp.Compile("https:\\/\\/www.*apis.com\\/.*(v1|beta|alpha)\\/")
1243+
return r.ReplaceAllString(selfLink, "")
12101244
}

test/e2e/utils/utils.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ var (
4343
boskos, _ = boskosclient.NewClient(os.Getenv("JOB_NAME"), "http://boskos", "", "")
4444
)
4545

46-
func GCEClientAndDriverSetup(instance *remote.InstanceInfo) (*remote.TestContext, error) {
46+
func GCEClientAndDriverSetup(instance *remote.InstanceInfo, computeEndpoint string) (*remote.TestContext, error) {
4747
port := fmt.Sprintf("%v", 1024+rand.Intn(10000))
4848
goPath, ok := os.LookupEnv("GOPATH")
4949
if !ok {
@@ -53,10 +53,14 @@ func GCEClientAndDriverSetup(instance *remote.InstanceInfo) (*remote.TestContext
5353
binPath := path.Join(pkgPath, "bin/gce-pd-csi-driver")
5454

5555
endpoint := fmt.Sprintf("tcp://localhost:%s", port)
56+
computeFlag := ""
57+
if computeEndpoint != "" {
58+
computeFlag = fmt.Sprintf("--compute-endpoint %s", computeEndpoint)
59+
}
5660

5761
workspace := remote.NewWorkspaceDir("gce-pd-e2e-")
58-
driverRunCmd := fmt.Sprintf("sh -c '/usr/bin/nohup %s/gce-pd-csi-driver -v=4 --endpoint=%s --extra-labels=%s=%s 2> %s/prog.out < /dev/null > /dev/null &'",
59-
workspace, endpoint, DiskLabelKey, DiskLabelValue, workspace)
62+
driverRunCmd := fmt.Sprintf("sh -c '/usr/bin/nohup %s/gce-pd-csi-driver -v=4 --endpoint=%s %s --extra-labels=%s=%s 2> %s/prog.out < /dev/null > /dev/null &'",
63+
workspace, endpoint, computeFlag, DiskLabelKey, DiskLabelValue, workspace)
6064

6165
config := &remote.ClientConfig{
6266
PkgPath: pkgPath,

0 commit comments

Comments
 (0)