Skip to content

Commit 7e7e627

Browse files
authored
Merge pull request #817 from leiyiz/release-1.3
Cherry-pick #813 to release-1.3
2 parents 130c332 + 32d22e4 commit 7e7e627

File tree

5 files changed

+66
-65
lines changed

5 files changed

+66
-65
lines changed

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

+4-36
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
3131

3232
"k8s.io/apimachinery/pkg/util/sets"
33-
"k8s.io/apimachinery/pkg/util/uuid"
3433
)
3534

3635
const (
@@ -115,43 +114,12 @@ func (cloud *FakeCloudProvider) ListZones(ctx context.Context, region string) ([
115114
return []string{cloud.zone, "country-region-fakesecondzone"}, nil
116115
}
117116

118-
func (cloud *FakeCloudProvider) ListDisks(ctx context.Context, maxEntries int64, pageToken string) ([]*computev1.Disk, string, error) {
119-
// Ignore page tokens for now
120-
var seen sets.String
121-
var ok bool
122-
var count int64 = 0
123-
var newToken string
117+
func (cloud *FakeCloudProvider) ListDisks(ctx context.Context) ([]*computev1.Disk, string, error) {
124118
d := []*computev1.Disk{}
125-
126-
if pageToken != "" {
127-
seen, ok = cloud.pageTokens[pageToken]
128-
if !ok {
129-
return nil, "", invalidError()
130-
}
131-
} else {
132-
seen = sets.NewString()
133-
}
134-
135-
if maxEntries == 0 {
136-
maxEntries = 500
137-
}
138-
139-
for name, cd := range cloud.disks {
140-
// Only return v1 disks for simplicity
141-
if !seen.Has(name) {
142-
d = append(d, cd.disk)
143-
seen.Insert(name)
144-
count++
145-
}
146-
147-
if count >= maxEntries {
148-
newToken = string(uuid.NewUUID())
149-
cloud.pageTokens[newToken] = seen
150-
break
151-
}
119+
for _, cd := range cloud.disks {
120+
d = append(d, cd.disk)
152121
}
153-
154-
return d, newToken, nil
122+
return d, "", nil
155123
}
156124

157125
func (cloud *FakeCloudProvider) ListSnapshots(ctx context.Context, filter string, maxEntries int64, pageToken string) ([]*computev1.Snapshot, string, error) {

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

+22-10
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ type GCECompute interface {
6464
GetDiskTypeURI(project string, volKey *meta.Key, diskType string) string
6565
WaitForAttach(ctx context.Context, project string, volKey *meta.Key, instanceZone, instanceName string) error
6666
ResizeDisk(ctx context.Context, project string, volKey *meta.Key, requestBytes int64) (int64, error)
67-
ListDisks(ctx context.Context, maxEntries int64, pageToken string) ([]*computev1.Disk, string, error)
67+
ListDisks(ctx context.Context) ([]*computev1.Disk, string, error)
6868
// Regional Disk Methods
6969
GetReplicaZoneURI(project string, zone string) string
7070
// Instance Methods
@@ -89,19 +89,31 @@ func (cloud *CloudProvider) GetDefaultZone() string {
8989

9090
// ListDisks lists disks based on maxEntries and pageToken only in the project
9191
// and zone that the driver is running in.
92-
func (cloud *CloudProvider) ListDisks(ctx context.Context, maxEntries int64, pageToken string) ([]*computev1.Disk, string, error) {
93-
lCall := cloud.service.Disks.List(cloud.project, cloud.zone)
94-
if maxEntries != 0 {
95-
lCall = lCall.MaxResults(maxEntries)
96-
}
97-
if len(pageToken) != 0 {
98-
lCall = lCall.PageToken(pageToken)
92+
func (cloud *CloudProvider) ListDisks(ctx context.Context) ([]*computev1.Disk, string, error) {
93+
region, err := common.GetRegionFromZones([]string{cloud.zone})
94+
if err != nil {
95+
return nil, "", fmt.Errorf("failed to get region from zones: %v", err)
9996
}
100-
diskList, err := lCall.Do()
97+
zones, err := cloud.ListZones(ctx, region)
10198
if err != nil {
10299
return nil, "", err
103100
}
104-
return diskList.Items, diskList.NextPageToken, nil
101+
items := []*computev1.Disk{}
102+
103+
for _, zone := range zones {
104+
lCall := cloud.service.Disks.List(cloud.project, zone)
105+
nextPageToken := "pageToken"
106+
for nextPageToken != "" {
107+
diskList, err := lCall.Do()
108+
if err != nil {
109+
return nil, "", err
110+
}
111+
items = append(items, diskList.Items...)
112+
nextPageToken = diskList.NextPageToken
113+
lCall.PageToken(nextPageToken)
114+
}
115+
}
116+
return items, "", nil
105117
}
106118

107119
// RepairUnderspecifiedVolumeKey will query the cloud provider and check each zone for the disk specified

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

+36-12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"google.golang.org/grpc/codes"
3030
"google.golang.org/grpc/status"
3131
"k8s.io/apimachinery/pkg/util/sets"
32+
"k8s.io/apimachinery/pkg/util/uuid"
3233
"k8s.io/klog"
3334

3435
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
@@ -39,6 +40,9 @@ type GCEControllerServer struct {
3940
Driver *GCEDriver
4041
CloudProvider gce.GCECompute
4142

43+
disks []*compute.Disk
44+
seen map[string]int
45+
4246
// A map storing all volumes with ongoing operations so that additional
4347
// operations for that same volume (as defined by Volume Key) return an
4448
// Aborted error
@@ -524,22 +528,36 @@ func (gceCS *GCEControllerServer) ListVolumes(ctx context.Context, req *csi.List
524528
// https://cloud.google.com/compute/docs/reference/beta/disks/list
525529
if req.MaxEntries < 0 {
526530
return nil, status.Error(codes.InvalidArgument, fmt.Sprintf(
527-
"ListVolumes got max entries request %v. GCE only supports values between 0-500", req.MaxEntries))
528-
}
529-
var maxEntries int64 = int64(req.MaxEntries)
530-
if maxEntries > 500 {
531-
klog.Warningf("ListVolumes requested max entries of %v, GCE only supports values <=500 so defaulting value back to 500", maxEntries)
532-
maxEntries = 500
531+
"ListVolumes got max entries request %v. GCE only supports values >0", req.MaxEntries))
533532
}
534-
diskList, nextToken, err := gceCS.CloudProvider.ListDisks(ctx, maxEntries, req.StartingToken)
535-
if err != nil {
536-
if gce.IsGCEInvalidError(err) {
537-
return nil, status.Error(codes.Aborted, fmt.Sprintf("ListVolumes error with invalid request: %v", err))
533+
534+
offset := 0
535+
var ok bool
536+
if req.StartingToken == "" {
537+
diskList, _, err := gceCS.CloudProvider.ListDisks(ctx)
538+
if err != nil {
539+
if gce.IsGCEInvalidError(err) {
540+
return nil, status.Error(codes.Aborted, fmt.Sprintf("ListVolumes error with invalid request: %v", err))
541+
}
542+
return nil, status.Error(codes.Internal, fmt.Sprintf("Unknown list disk error: %v", err))
538543
}
539-
return nil, status.Error(codes.Internal, fmt.Sprintf("Unknown list disk error: %v", err))
544+
gceCS.disks = diskList
545+
gceCS.seen = map[string]int{}
546+
} else {
547+
offset, ok = gceCS.seen[req.StartingToken]
548+
if !ok {
549+
return nil, status.Error(codes.Aborted, fmt.Sprintf("ListVolumes error with invalid startingToken: %s", req.StartingToken))
550+
}
551+
}
552+
553+
var maxEntries int = int(req.MaxEntries)
554+
if maxEntries == 0 {
555+
maxEntries = len(gceCS.disks)
540556
}
557+
541558
entries := []*csi.ListVolumesResponse_Entry{}
542-
for _, d := range diskList {
559+
for i := 0; i+offset < len(gceCS.disks) && i < maxEntries; i++ {
560+
d := gceCS.disks[i+offset]
543561
users := []string{}
544562
for _, u := range d.Users {
545563
users = append(users, cleanSelfLink(u))
@@ -554,6 +572,12 @@ func (gceCS *GCEControllerServer) ListVolumes(ctx context.Context, req *csi.List
554572
})
555573
}
556574

575+
nextToken := ""
576+
if len(entries)+offset < len(gceCS.disks) {
577+
nextToken = string(uuid.NewUUID())
578+
gceCS.seen[nextToken] = len(entries) + offset
579+
}
580+
557581
return &csi.ListVolumesResponse{
558582
Entries: entries,
559583
NextToken: nextToken,

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

+3-7
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,7 @@ func TestCreateVolumeArguments(t *testing.T) {
771771
}
772772

773773
func TestListVolumeArgs(t *testing.T) {
774+
diskCount := 600
774775
testCases := []struct {
775776
name string
776777
maxEntries int32
@@ -779,18 +780,13 @@ func TestListVolumeArgs(t *testing.T) {
779780
}{
780781
{
781782
name: "normal",
782-
expectedEntries: 500,
783+
expectedEntries: diskCount,
783784
},
784785
{
785786
name: "fine amount of entries",
786787
maxEntries: 420,
787788
expectedEntries: 420,
788789
},
789-
{
790-
name: "too many entries, but defaults to 500",
791-
maxEntries: 501,
792-
expectedEntries: 500,
793-
},
794790
{
795791
name: "negative entries",
796792
maxEntries: -1,
@@ -802,7 +798,7 @@ func TestListVolumeArgs(t *testing.T) {
802798
t.Run(tc.name, func(t *testing.T) {
803799
// Setup new driver each time so no interference
804800
var d []*gce.CloudDisk
805-
for i := 0; i < 600; i++ {
801+
for i := 0; i < diskCount; i++ {
806802
// Create 600 dummy disks
807803
d = append(d, gce.CloudDiskFromV1(&compute.Disk{Name: fmt.Sprintf("%v", i)}))
808804
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ func NewControllerServer(gceDriver *GCEDriver, cloudProvider gce.GCECompute) *GC
151151
return &GCEControllerServer{
152152
Driver: gceDriver,
153153
CloudProvider: cloudProvider,
154+
seen: map[string]int{},
154155
volumeLocks: common.NewVolumeLocks(),
155156
}
156157
}

0 commit comments

Comments
 (0)