Skip to content

Commit 58011dc

Browse files
authored
Merge pull request #415 from nikhilkathare/shared-pd
Add support for multi-writer PD
2 parents 492957b + 9e7eb61 commit 58011dc

17 files changed

+708
-110
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
kind: PersistentVolumeClaim
2+
apiVersion: v1
3+
metadata:
4+
name: podpvc
5+
spec:
6+
accessModes:
7+
- ReadWriteMany
8+
volumeMode: Block
9+
storageClassName: csi-gce-pd
10+
resources:
11+
requests:
12+
storage: 200Gi
13+
14+
---
15+
16+
apiVersion: apps/v1
17+
kind: Deployment
18+
metadata:
19+
name: web-server
20+
spec:
21+
selector:
22+
matchLabels:
23+
app: web
24+
replicas: 2
25+
template:
26+
metadata:
27+
labels:
28+
app: web
29+
spec:
30+
affinity:
31+
podAntiAffinity:
32+
requiredDuringSchedulingIgnoredDuringExecution:
33+
- labelSelector:
34+
matchExpressions:
35+
- key: app
36+
operator: In
37+
values:
38+
- web
39+
topologyKey: "kubernetes.io/hostname"
40+
containers:
41+
- name: web-server
42+
image: nginx
43+
volumeDevices:
44+
- name: mypvc
45+
devicePath: /dev/mypvc
46+
volumes:
47+
- name: mypvc
48+
persistentVolumeClaim:
49+
claimName: podpvc
50+
readOnly: false

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

+91-5
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ package gcecloudprovider
1717
import (
1818
"strings"
1919

20+
computealpha "google.golang.org/api/compute/v0.alpha"
2021
computev1 "google.golang.org/api/compute/v1"
2122
)
2223

2324
type CloudDisk struct {
24-
ZonalDisk *computev1.Disk
25-
RegionalDisk *computev1.Disk
25+
ZonalDisk *computev1.Disk
26+
RegionalDisk *computev1.Disk
27+
ZonalAlphaDisk *computealpha.Disk
28+
RegionalAlphaDisk *computealpha.Disk
2629
}
2730

2831
type CloudDiskType string
@@ -32,6 +35,10 @@ const (
3235
Zonal = "zonal"
3336
// Regional key type.
3437
Regional = "regional"
38+
// ZonalAlpha key type.
39+
ZonalAlpha = "zonalAlpha"
40+
// RegionalAlpha key type.
41+
RegionalAlpha = "regionalAlpha"
3542
// Global key type.
3643
Global = "global"
3744
)
@@ -48,12 +55,28 @@ func RegionalCloudDisk(disk *computev1.Disk) *CloudDisk {
4855
}
4956
}
5057

58+
func ZonalAlphaCloudDisk(disk *computealpha.Disk) *CloudDisk {
59+
return &CloudDisk{
60+
ZonalAlphaDisk: disk,
61+
}
62+
}
63+
64+
func RegionalAlphaCloudDisk(disk *computealpha.Disk) *CloudDisk {
65+
return &CloudDisk{
66+
RegionalAlphaDisk: disk,
67+
}
68+
}
69+
5170
func (d *CloudDisk) Type() CloudDiskType {
5271
switch {
5372
case d.ZonalDisk != nil:
5473
return Zonal
5574
case d.RegionalDisk != nil:
5675
return Regional
76+
case d.ZonalAlphaDisk != nil:
77+
return ZonalAlpha
78+
case d.RegionalAlphaDisk != nil:
79+
return RegionalAlpha
5780
default:
5881
return Global
5982
}
@@ -65,6 +88,10 @@ func (d *CloudDisk) GetUsers() []string {
6588
return d.ZonalDisk.Users
6689
case Regional:
6790
return d.RegionalDisk.Users
91+
case ZonalAlpha:
92+
return d.ZonalAlphaDisk.Users
93+
case RegionalAlpha:
94+
return d.RegionalAlphaDisk.Users
6895
default:
6996
return nil
7097
}
@@ -76,6 +103,10 @@ func (d *CloudDisk) GetName() string {
76103
return d.ZonalDisk.Name
77104
case Regional:
78105
return d.RegionalDisk.Name
106+
case ZonalAlpha:
107+
return d.ZonalAlphaDisk.Name
108+
case RegionalAlpha:
109+
return d.RegionalAlphaDisk.Name
79110
default:
80111
return ""
81112
}
@@ -87,6 +118,10 @@ func (d *CloudDisk) GetKind() string {
87118
return d.ZonalDisk.Kind
88119
case Regional:
89120
return d.RegionalDisk.Kind
121+
case ZonalAlpha:
122+
return d.ZonalAlphaDisk.Kind
123+
case RegionalAlpha:
124+
return d.RegionalAlphaDisk.Kind
90125
default:
91126
return ""
92127
}
@@ -98,6 +133,10 @@ func (d *CloudDisk) GetStatus() string {
98133
return d.ZonalDisk.Status
99134
case Regional:
100135
return d.RegionalDisk.Status
136+
case ZonalAlpha:
137+
return d.ZonalAlphaDisk.Status
138+
case RegionalAlpha:
139+
return d.RegionalAlphaDisk.Status
101140
default:
102141
return "Unknown"
103142
}
@@ -113,6 +152,10 @@ func (d *CloudDisk) GetPDType() string {
113152
pdType = d.ZonalDisk.Type
114153
case Regional:
115154
pdType = d.RegionalDisk.Type
155+
case ZonalAlpha:
156+
pdType = d.ZonalAlphaDisk.Type
157+
case RegionalAlpha:
158+
pdType = d.RegionalAlphaDisk.Type
116159
default:
117160
return ""
118161
}
@@ -126,6 +169,10 @@ func (d *CloudDisk) GetSelfLink() string {
126169
return d.ZonalDisk.SelfLink
127170
case Regional:
128171
return d.RegionalDisk.SelfLink
172+
case ZonalAlpha:
173+
return d.ZonalAlphaDisk.SelfLink
174+
case RegionalAlpha:
175+
return d.RegionalAlphaDisk.SelfLink
129176
default:
130177
return ""
131178
}
@@ -137,6 +184,10 @@ func (d *CloudDisk) GetSizeGb() int64 {
137184
return d.ZonalDisk.SizeGb
138185
case Regional:
139186
return d.RegionalDisk.SizeGb
187+
case ZonalAlpha:
188+
return d.ZonalAlphaDisk.SizeGb
189+
case RegionalAlpha:
190+
return d.RegionalAlphaDisk.SizeGb
140191
default:
141192
return -1
142193
}
@@ -150,6 +201,10 @@ func (d *CloudDisk) setSizeGb(size int64) {
150201
d.ZonalDisk.SizeGb = size
151202
case Regional:
152203
d.RegionalDisk.SizeGb = size
204+
case ZonalAlpha:
205+
d.ZonalAlphaDisk.SizeGb = size
206+
case RegionalAlpha:
207+
d.RegionalAlphaDisk.SizeGb = size
153208
}
154209
}
155210

@@ -159,6 +214,10 @@ func (d *CloudDisk) GetZone() string {
159214
return d.ZonalDisk.Zone
160215
case Regional:
161216
return d.RegionalDisk.Zone
217+
case ZonalAlpha:
218+
return d.ZonalAlphaDisk.Zone
219+
case RegionalAlpha:
220+
return d.RegionalAlphaDisk.Zone
162221
default:
163222
return ""
164223
}
@@ -170,23 +229,50 @@ func (d *CloudDisk) GetSnapshotId() string {
170229
return d.ZonalDisk.SourceSnapshotId
171230
case Regional:
172231
return d.RegionalDisk.SourceSnapshotId
232+
case ZonalAlpha:
233+
return d.ZonalAlphaDisk.SourceSnapshotId
234+
case RegionalAlpha:
235+
return d.RegionalAlphaDisk.SourceSnapshotId
173236
default:
174237
return ""
175238
}
176239
}
177240

178241
func (d *CloudDisk) GetKMSKeyName() string {
179242
var dek *computev1.CustomerEncryptionKey
243+
var dekAlpha *computealpha.CustomerEncryptionKey
180244
switch d.Type() {
181245
case Zonal:
182246
dek = d.ZonalDisk.DiskEncryptionKey
183247
case Regional:
184248
dek = d.RegionalDisk.DiskEncryptionKey
249+
case ZonalAlpha:
250+
dekAlpha = d.ZonalAlphaDisk.DiskEncryptionKey
251+
case RegionalAlpha:
252+
dekAlpha = d.RegionalAlphaDisk.DiskEncryptionKey
185253
default:
186254
return ""
187255
}
188-
if dek == nil {
189-
return ""
256+
257+
if dek != nil {
258+
return dek.KmsKeyName
259+
} else if dekAlpha != nil {
260+
return dekAlpha.KmsKeyName
261+
}
262+
return ""
263+
}
264+
265+
func (d *CloudDisk) GetMultiWriter() bool {
266+
switch d.Type() {
267+
case Zonal:
268+
return false
269+
case Regional:
270+
return false
271+
case ZonalAlpha:
272+
return d.ZonalAlphaDisk.MultiWriter
273+
case RegionalAlpha:
274+
return d.RegionalAlphaDisk.MultiWriter
275+
default:
276+
return false
190277
}
191-
return dek.KmsKeyName
192278
}

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

+19-4
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,15 @@ func (cloud *FakeCloudProvider) ListSnapshots(ctx context.Context, filter string
212212
}
213213

214214
// Disk Methods
215-
func (cloud *FakeCloudProvider) GetDisk(ctx context.Context, volKey *meta.Key) (*CloudDisk, error) {
215+
func (cloud *FakeCloudProvider) GetDisk(ctx context.Context, volKey *meta.Key, api GCEAPIVersion) (*CloudDisk, error) {
216216
disk, ok := cloud.disks[volKey.Name]
217217
if !ok {
218218
return nil, notFoundError()
219219
}
220220
return disk, nil
221221
}
222222

223-
func (cloud *FakeCloudProvider) ValidateExistingDisk(ctx context.Context, resp *CloudDisk, params common.DiskParameters, reqBytes, limBytes int64) error {
223+
func (cloud *FakeCloudProvider) ValidateExistingDisk(ctx context.Context, resp *CloudDisk, params common.DiskParameters, reqBytes, limBytes int64, multiWriter bool) error {
224224
if resp == nil {
225225
return fmt.Errorf("disk does not exist")
226226
}
@@ -232,14 +232,29 @@ func (cloud *FakeCloudProvider) ValidateExistingDisk(ctx context.Context, resp *
232232
reqBytes, common.GbToBytes(resp.GetSizeGb()), limBytes)
233233
}
234234

235+
respType := strings.Split(resp.GetPDType(), "/")
236+
typeMatch := strings.TrimSpace(respType[len(respType)-1]) == strings.TrimSpace(params.DiskType)
237+
typeDefault := params.DiskType == "" && strings.TrimSpace(respType[len(respType)-1]) == "pd-standard"
238+
if !typeMatch && !typeDefault {
239+
return fmt.Errorf("disk already exists with incompatible type. Need %v. Got %v",
240+
params.DiskType, respType[len(respType)-1])
241+
}
242+
243+
// We are assuming here that a multiWriter disk could be used as non-multiWriter
244+
if multiWriter && !resp.GetMultiWriter() {
245+
return fmt.Errorf("disk already exists with incompatible capability. Need MultiWriter. Got non-MultiWriter")
246+
}
247+
248+
klog.V(4).Infof("Compatible disk already exists")
235249
return ValidateDiskParameters(resp, params)
236250
}
237251

238-
func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, volKey *meta.Key, params common.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string) error {
252+
func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, volKey *meta.Key, params common.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, multiWriter bool) error {
239253
if disk, ok := cloud.disks[volKey.Name]; ok {
240254
err := cloud.ValidateExistingDisk(ctx, disk, params,
241255
int64(capacityRange.GetRequiredBytes()),
242-
int64(capacityRange.GetLimitBytes()))
256+
int64(capacityRange.GetLimitBytes()),
257+
multiWriter)
243258
if err != nil {
244259
return err
245260
}

0 commit comments

Comments
 (0)