Skip to content

Commit 68cdfa9

Browse files
committed
Add option to specify extra PD labels for the provisioned disk.
1 parent 0747042 commit 68cdfa9

30 files changed

+1256
-954
lines changed

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
"k8s.io/klog"
2626

27+
cliflag "k8s.io/component-base/cli/flag"
2728
gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute"
2829
metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata"
2930
driver "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-pd-csi-driver"
@@ -35,6 +36,7 @@ var (
3536
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
3637
runControllerService = flag.Bool("run-controller-service", true, "If set to false then the CSI driver does not activate its controller service (default: true)")
3738
runNodeService = flag.Bool("run-node-service", true, "If set to false then the CSI driver does not activate its node service (default: true)")
39+
extraVolumeLabels map[string]string
3840
version string
3941
)
4042

@@ -53,6 +55,7 @@ func init() {
5355
}
5456

5557
func main() {
58+
flag.Var(cliflag.NewMapStringString(&extraVolumeLabels), "extra-labels", "Extra labels to attach to each PD created. It is a comma separated list of key value pairs like '<key1>=<value1>,<key2>=<value2>'")
5659
flag.Parse()
5760
rand.Seed(time.Now().UnixNano())
5861
handle()
@@ -104,7 +107,7 @@ func handle() {
104107
nodeServer = driver.NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
105108
}
106109

107-
err = gceDriver.SetupGCEDriver(driverName, version, identityServer, controllerServer, nodeServer)
110+
err = gceDriver.SetupGCEDriver(driverName, version, extraVolumeLabels, identityServer, controllerServer, nodeServer)
108111
if err != nil {
109112
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
110113
}

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
gopkg.in/warnings.v0 v0.1.2 // indirect
2424
k8s.io/apimachinery v0.18.0
2525
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
26+
k8s.io/component-base v0.18.0
2627
k8s.io/klog v1.0.0
2728
k8s.io/kubernetes v1.18.0
2829
k8s.io/test-infra v0.0.0-20200115230622-70a5174aa78d

go.sum

+1-3
Original file line numberDiff line numberDiff line change
@@ -476,9 +476,6 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
476476
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
477477
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
478478
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
479-
github.com/kubernetes-csi/csi-proxy v0.2.2 h1:LqablYFEGw7FYBjwoh5TeXFzlcx8C+YQjKfGy6fFWJs=
480-
github.com/kubernetes-csi/csi-proxy/client v0.2.1 h1:n21d2U9HvgQ6jfJayafRv8kXXtLvnRNEqoD0mQNucKc=
481-
github.com/kubernetes-csi/csi-proxy/client v0.2.1/go.mod h1:6ptQQmti5QHwBxSsh8Cy00oGdogj0JXewFnu8FFjgOs=
482479
github.com/kubernetes-csi/csi-proxy/client v0.2.2 h1:VpMddHnbYA1oBeU5nrisdyrpOAAT0HqME7fsTi6BG2w=
483480
github.com/kubernetes-csi/csi-proxy/client v0.2.2/go.mod h1:6ptQQmti5QHwBxSsh8Cy00oGdogj0JXewFnu8FFjgOs=
484481
github.com/kubernetes-csi/csi-test/v3 v3.0.0 h1:mVsfA4J67uNm8fdF/Pr84oMqL92qjIhjWbEUH8zv1fU=
@@ -1149,6 +1146,7 @@ k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
11491146
k8s.io/cloud-provider v0.18.0/go.mod h1:ZBq1FhoJ+XoQ8JYBYoyx81LS3JV0RAW/UmHf/6w9E6k=
11501147
k8s.io/cluster-bootstrap v0.18.0/go.mod h1:xSe+bOZ3asS/ciT91ESQYGhjOql43aBETfvbCzNvad8=
11511148
k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
1149+
k8s.io/component-base v0.18.0 h1:I+lP0fNfsEdTDpHaL61bCAqTZLoiWjEEP304Mo5ZQgE=
11521150
k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c=
11531151
k8s.io/cri-api v0.18.0/go.mod h1:OJtpjDvfsKoLGhvcc0qfygved0S0dGX56IJzPbqTG1s=
11541152
k8s.io/csi-translation-lib v0.18.0/go.mod h1:iF8TE4ACSaPqN1qxmiIjvcU1A8VgkOrpcFGD7Z0hVu0=

pkg/common/parameters.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,20 @@ type DiskParameters struct {
5454
// Values: {map[string]string}
5555
// Default: ""
5656
Tags map[string]string
57+
// Values: {map[string]string}
58+
// Default: ""
59+
Labels map[string]string
5760
}
5861

5962
// ExtractAndDefaultParameters will take the relevant parameters from a map and
6063
// put them into a well defined struct making sure to default unspecified fields
61-
func ExtractAndDefaultParameters(parameters map[string]string, driverName string) (DiskParameters, error) {
64+
func ExtractAndDefaultParameters(parameters map[string]string, driverName string, extraVolumeLabels map[string]string) (DiskParameters, error) {
6265
p := DiskParameters{
6366
DiskType: "pd-standard", // Default
6467
ReplicationType: replicationTypeNone, // Default
6568
DiskEncryptionKMSKey: "", // Default
6669
Tags: make(map[string]string), // Default
70+
Labels: make(map[string]string), // Default
6771
}
6872

6973
for k, v := range parameters {
@@ -96,5 +100,8 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
96100
if len(p.Tags) > 0 {
97101
p.Tags[tagKeyCreatedBy] = driverName
98102
}
103+
for k, v := range extraVolumeLabels {
104+
p.Labels[k] = v
105+
}
99106
return p, nil
100107
}

pkg/common/parameters_test.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -25,79 +25,105 @@ func TestExtractAndDefaultParameters(t *testing.T) {
2525
tests := []struct {
2626
name string
2727
parameters map[string]string
28+
labels map[string]string
2829
expectParams DiskParameters
2930
expectErr bool
3031
}{
3132
{
3233
name: "defaults",
3334
parameters: map[string]string{},
35+
labels: map[string]string{},
3436
expectParams: DiskParameters{
3537
DiskType: "pd-standard",
3638
ReplicationType: "none",
3739
DiskEncryptionKMSKey: "",
3840
Tags: make(map[string]string),
41+
Labels: make(map[string]string),
3942
},
4043
},
4144
{
4245
name: "specified empties",
4346
parameters: map[string]string{ParameterKeyType: "", ParameterKeyReplicationType: "", ParameterKeyDiskEncryptionKmsKey: ""},
47+
labels: map[string]string{},
4448
expectParams: DiskParameters{
4549
DiskType: "pd-standard",
4650
ReplicationType: "none",
4751
DiskEncryptionKMSKey: "",
4852
Tags: make(map[string]string),
53+
Labels: make(map[string]string),
4954
},
5055
},
5156
{
5257
name: "random keys",
5358
parameters: map[string]string{ParameterKeyType: "", "foo": "", ParameterKeyDiskEncryptionKmsKey: ""},
59+
labels: map[string]string{},
5460
expectErr: true,
5561
},
5662
{
5763
name: "real values",
5864
parameters: map[string]string{ParameterKeyType: "pd-ssd", ParameterKeyReplicationType: "regional-pd", ParameterKeyDiskEncryptionKmsKey: "foo/key"},
65+
labels: map[string]string{},
5966
expectParams: DiskParameters{
6067
DiskType: "pd-ssd",
6168
ReplicationType: "regional-pd",
6269
DiskEncryptionKMSKey: "foo/key",
6370
Tags: make(map[string]string),
71+
Labels: make(map[string]string),
6472
},
6573
},
6674
{
6775
name: "real values, checking balanced pd",
6876
parameters: map[string]string{ParameterKeyType: "pd-balanced", ParameterKeyReplicationType: "regional-pd", ParameterKeyDiskEncryptionKmsKey: "foo/key"},
77+
labels: map[string]string{},
6978
expectParams: DiskParameters{
7079
DiskType: "pd-balanced",
7180
ReplicationType: "regional-pd",
7281
DiskEncryptionKMSKey: "foo/key",
7382
Tags: make(map[string]string),
83+
Labels: make(map[string]string),
7484
},
7585
},
7686
{
7787
name: "partial spec",
7888
parameters: map[string]string{ParameterKeyDiskEncryptionKmsKey: "foo/key"},
89+
labels: map[string]string{},
7990
expectParams: DiskParameters{
8091
DiskType: "pd-standard",
8192
ReplicationType: "none",
8293
DiskEncryptionKMSKey: "foo/key",
8394
Tags: make(map[string]string),
95+
Labels: make(map[string]string),
8496
},
8597
},
8698
{
8799
name: "tags",
88100
parameters: map[string]string{ParameterKeyPVCName: "testPVCName", ParameterKeyPVCNamespace: "testPVCNamespace", ParameterKeyPVName: "testPVName"},
101+
labels: map[string]string{},
89102
expectParams: DiskParameters{
90103
DiskType: "pd-standard",
91104
ReplicationType: "none",
92105
DiskEncryptionKMSKey: "",
93106
Tags: map[string]string{tagKeyCreatedForClaimName: "testPVCName", tagKeyCreatedForClaimNamespace: "testPVCNamespace", tagKeyCreatedForVolumeName: "testPVName", tagKeyCreatedBy: "testDriver"},
107+
Labels: make(map[string]string),
108+
},
109+
},
110+
{
111+
name: "labels",
112+
parameters: map[string]string{},
113+
labels: map[string]string{"label-1": "label-value-1", "label-2": "label-value-2"},
114+
expectParams: DiskParameters{
115+
DiskType: "pd-standard",
116+
ReplicationType: "none",
117+
DiskEncryptionKMSKey: "",
118+
Tags: map[string]string{},
119+
Labels: map[string]string{"label-1": "label-value-1", "label-2": "label-value-2"},
94120
},
95121
},
96122
}
97123

98124
for _, tc := range tests {
99125
t.Run(tc.name, func(t *testing.T) {
100-
p, err := ExtractAndDefaultParameters(tc.parameters, "testDriver")
126+
p, err := ExtractAndDefaultParameters(tc.parameters, "testDriver", tc.labels)
101127
if gotErr := err != nil; gotErr != tc.expectErr {
102128
t.Fatalf("ExtractAndDefaultParameters(%+v) = %v; expectedErr: %v", tc.parameters, err, tc.expectErr)
103129
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ func (cloud *CloudProvider) insertZonalDisk(
477477
SizeGb: common.BytesToGbRoundUp(capBytes),
478478
Description: description,
479479
Type: cloud.GetDiskTypeURI(volKey, params.DiskType),
480+
Labels: params.Labels,
480481
}
481482

482483
if snapshotID != "" {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
107107

108108
// Apply Parameters (case-insensitive). We leave validation of
109109
// the values to the cloud provider.
110-
params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name)
110+
params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraVolumeLabels)
111111
if err != nil {
112112
return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err)
113113
}
@@ -475,7 +475,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
475475
}
476476

477477
// Validate the disk parameters match the disk we GET
478-
params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name)
478+
params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraVolumeLabels)
479479
if err != nil {
480480
return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err)
481481
}

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ import (
2929
)
3030

3131
type GCEDriver struct {
32-
name string
33-
vendorVersion string
32+
name string
33+
vendorVersion string
34+
extraVolumeLabels map[string]string
3435

3536
ids *GCEIdentityServer
3637
ns *GCENodeServer
@@ -45,7 +46,7 @@ func GetGCEDriver() *GCEDriver {
4546
return &GCEDriver{}
4647
}
4748

48-
func (gceDriver *GCEDriver) SetupGCEDriver(name, vendorVersion string, identityServer *GCEIdentityServer, controllerServer *GCEControllerServer, nodeServer *GCENodeServer) error {
49+
func (gceDriver *GCEDriver) SetupGCEDriver(name, vendorVersion string, extraVolumeLabels map[string]string, identityServer *GCEIdentityServer, controllerServer *GCEControllerServer, nodeServer *GCENodeServer) error {
4950
if name == "" {
5051
return fmt.Errorf("Driver name missing")
5152
}
@@ -77,6 +78,7 @@ func (gceDriver *GCEDriver) SetupGCEDriver(name, vendorVersion string, identityS
7778

7879
gceDriver.name = name
7980
gceDriver.vendorVersion = vendorVersion
81+
gceDriver.extraVolumeLabels = extraVolumeLabels
8082
gceDriver.ids = identityServer
8183
gceDriver.cs = controllerServer
8284
gceDriver.ns = nodeServer

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func initGCEDriverWithCloudProvider(t *testing.T, cloudProvider gce.GCECompute)
4444
vendorVersion := "test-vendor"
4545
gceDriver := GetGCEDriver()
4646
controllerServer := NewControllerServer(gceDriver, cloudProvider)
47-
err := gceDriver.SetupGCEDriver(driver, vendorVersion, nil, controllerServer, nil)
47+
err := gceDriver.SetupGCEDriver(driver, vendorVersion, nil, nil, controllerServer, nil)
4848
if err != nil {
4949
t.Fatalf("Failed to setup GCE Driver: %v", err)
5050
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestGetPluginInfo(t *testing.T) {
2626
vendorVersion := "test-vendor"
2727
gceDriver := GetGCEDriver()
2828
identityServer := NewIdentityServer(gceDriver)
29-
err := gceDriver.SetupGCEDriver(driver, vendorVersion, identityServer, nil, nil)
29+
err := gceDriver.SetupGCEDriver(driver, vendorVersion, nil, identityServer, nil, nil)
3030
if err != nil {
3131
t.Fatalf("Failed to setup GCE Driver: %v", err)
3232
}
@@ -49,7 +49,7 @@ func TestGetPluginInfo(t *testing.T) {
4949
func TestGetPluginCapabilities(t *testing.T) {
5050
gceDriver := GetGCEDriver()
5151
identityServer := NewIdentityServer(gceDriver)
52-
err := gceDriver.SetupGCEDriver(driver, "test-vendor", identityServer, nil, nil)
52+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, identityServer, nil, nil)
5353
if err != nil {
5454
t.Fatalf("Failed to setup GCE Driver: %v", err)
5555
}
@@ -82,7 +82,7 @@ func TestGetPluginCapabilities(t *testing.T) {
8282
func TestProbe(t *testing.T) {
8383
gceDriver := GetGCEDriver()
8484
identityServer := NewIdentityServer(gceDriver)
85-
err := gceDriver.SetupGCEDriver(driver, "test-vendor", identityServer, nil, nil)
85+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, identityServer, nil, nil)
8686
if err != nil {
8787
t.Fatalf("Failed to setup GCE Driver: %v", err)
8888
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func getTestGCEDriverWithCustomMounter(t *testing.T, mounter *mount.SafeFormatAn
4343
func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils, metaService metadataservice.MetadataService) *GCEDriver {
4444
gceDriver := GetGCEDriver()
4545
nodeServer := NewNodeServer(gceDriver, mounter, deviceUtils, metaService, mountmanager.NewFakeStatter(mounter))
46-
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nodeServer)
46+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nil, nodeServer)
4747
if err != nil {
4848
t.Fatalf("Failed to setup GCE Driver: %v", err)
4949
}
@@ -54,7 +54,7 @@ func getTestBlockingGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *
5454
gceDriver := GetGCEDriver()
5555
mounter := mountmanager.NewFakeSafeBlockingMounter(readyToExecute)
5656
nodeServer := NewNodeServer(gceDriver, mounter, mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter))
57-
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nodeServer)
57+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nil, nodeServer)
5858
if err != nil {
5959
t.Fatalf("Failed to setup GCE Driver: %v", err)
6060
}

test/sanity/sanity_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func TestSanity(t *testing.T) {
3939
zone := "country-region-zone"
4040
vendorVersion := "test-version"
4141
tmpDir := "/tmp/csi"
42+
extraLabels := map[string]string{"test-label": "test-label-value"}
4243
endpoint := fmt.Sprintf("unix:%s/csi.sock", tmpDir)
4344
mountPath := path.Join(tmpDir, "mount")
4445
stagePath := path.Join(tmpDir, "stage")
@@ -57,7 +58,7 @@ func TestSanity(t *testing.T) {
5758
identityServer := driver.NewIdentityServer(gceDriver)
5859
controllerServer := driver.NewControllerServer(gceDriver, cloudProvider)
5960
nodeServer := driver.NewNodeServer(gceDriver, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter))
60-
err = gceDriver.SetupGCEDriver(driverName, vendorVersion, identityServer, controllerServer, nodeServer)
61+
err = gceDriver.SetupGCEDriver(driverName, vendorVersion, extraLabels, identityServer, controllerServer, nodeServer)
6162
if err != nil {
6263
t.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
6364
}

0 commit comments

Comments
 (0)