Skip to content

Commit 2d73433

Browse files
committed
Allow to label PD disk with k8s cluster ID
1 parent 95ffc20 commit 2d73433

File tree

10 files changed

+59
-14
lines changed

10 files changed

+59
-14
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var (
3535
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
3636
runControllerService = flag.Bool("run-controller-service", true, "If set to false then the CSI driver does not activate its controller service (default: true)")
3737
runNodeService = flag.Bool("run-node-service", true, "If set to false then the CSI driver does not activate its node service (default: true)")
38+
k8sClusterId = flag.String("k8s-tag-cluster-id", "", "ID of the Kubernetes cluster used for labeling provisioned PD volumes (optional).")
3839
version string
3940
)
4041

@@ -104,7 +105,7 @@ func handle() {
104105
nodeServer = driver.NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
105106
}
106107

107-
err = gceDriver.SetupGCEDriver(driverName, version, identityServer, controllerServer, nodeServer)
108+
err = gceDriver.SetupGCEDriver(driverName, version, *k8sClusterId, identityServer, controllerServer, nodeServer)
108109
if err != nil {
109110
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
110111
}

pkg/common/parameters.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ const (
3838
tagKeyCreatedForClaimName = "kubernetes.io/created-for/pvc/name"
3939
tagKeyCreatedForVolumeName = "kubernetes.io/created-for/pv/name"
4040
tagKeyCreatedBy = "storage.gke.io/created-by"
41+
42+
// Tag prefix and tag value used to indicate the provisioned volume is owned
43+
// by the cluster; used only if the k8s-tag-cluster-id CLI option is set.
44+
// The API limitation disallows to use '/' or '.' characters.
45+
labelKeyK8sClusterPrefix = "kubernetes_io_cluster_"
46+
ResourceLifecycleOwned = "owned"
4147
)
4248

4349
// DiskParameters contains normalized and defaulted disk parameters
@@ -54,16 +60,20 @@ type DiskParameters struct {
5460
// Values: {map[string]string}
5561
// Default: ""
5662
Tags map[string]string
63+
// Values: {map[string]string}
64+
// Default: ""
65+
Labels map[string]string
5766
}
5867

5968
// ExtractAndDefaultParameters will take the relevant parameters from a map and
6069
// put them into a well defined struct making sure to default unspecified fields
61-
func ExtractAndDefaultParameters(parameters map[string]string, driverName string) (DiskParameters, error) {
70+
func ExtractAndDefaultParameters(parameters map[string]string, driverName, k8sClusterId string) (DiskParameters, error) {
6271
p := DiskParameters{
6372
DiskType: "pd-standard", // Default
6473
ReplicationType: replicationTypeNone, // Default
6574
DiskEncryptionKMSKey: "", // Default
6675
Tags: make(map[string]string), // Default
76+
Labels: make(map[string]string), // Default
6777
}
6878

6979
for k, v := range parameters {
@@ -93,6 +103,10 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
93103
return p, fmt.Errorf("parameters contains invalid option %q", k)
94104
}
95105
}
106+
if k8sClusterId != "" {
107+
labelK8sClusterId := labelKeyK8sClusterPrefix + k8sClusterId
108+
p.Labels[labelK8sClusterId] = ResourceLifecycleOwned
109+
}
96110
if len(p.Tags) > 0 {
97111
p.Tags[tagKeyCreatedBy] = driverName
98112
}

pkg/common/parameters_test.go

+29-2
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,37 @@ import (
2222
)
2323

2424
func TestExtractAndDefaultParameters(t *testing.T) {
25+
fakeClusterId := "fake-cluster-id"
26+
labelK8sClusterId := labelKeyK8sClusterPrefix + fakeClusterId
2527
tests := []struct {
2628
name string
29+
clusterId string
2730
parameters map[string]string
2831
expectParams DiskParameters
2932
expectErr bool
3033
}{
3134
{
3235
name: "defaults",
36+
clusterId: "",
3337
parameters: map[string]string{},
3438
expectParams: DiskParameters{
3539
DiskType: "pd-standard",
3640
ReplicationType: "none",
3741
DiskEncryptionKMSKey: "",
3842
Tags: make(map[string]string),
43+
Labels: make(map[string]string),
3944
},
4045
},
4146
{
4247
name: "specified empties",
48+
clusterId: "",
4349
parameters: map[string]string{ParameterKeyType: "", ParameterKeyReplicationType: "", ParameterKeyDiskEncryptionKmsKey: ""},
4450
expectParams: DiskParameters{
4551
DiskType: "pd-standard",
4652
ReplicationType: "none",
4753
DiskEncryptionKMSKey: "",
4854
Tags: make(map[string]string),
55+
Labels: make(map[string]string),
4956
},
5057
},
5158
{
@@ -55,49 +62,69 @@ func TestExtractAndDefaultParameters(t *testing.T) {
5562
},
5663
{
5764
name: "real values",
65+
clusterId: "",
5866
parameters: map[string]string{ParameterKeyType: "pd-ssd", ParameterKeyReplicationType: "regional-pd", ParameterKeyDiskEncryptionKmsKey: "foo/key"},
5967
expectParams: DiskParameters{
6068
DiskType: "pd-ssd",
6169
ReplicationType: "regional-pd",
6270
DiskEncryptionKMSKey: "foo/key",
6371
Tags: make(map[string]string),
72+
Labels: make(map[string]string),
6473
},
6574
},
6675
{
6776
name: "real values, checking balanced pd",
77+
clusterId: "",
6878
parameters: map[string]string{ParameterKeyType: "pd-balanced", ParameterKeyReplicationType: "regional-pd", ParameterKeyDiskEncryptionKmsKey: "foo/key"},
6979
expectParams: DiskParameters{
7080
DiskType: "pd-balanced",
7181
ReplicationType: "regional-pd",
7282
DiskEncryptionKMSKey: "foo/key",
7383
Tags: make(map[string]string),
84+
Labels: make(map[string]string),
7485
},
7586
},
7687
{
7788
name: "partial spec",
89+
clusterId: "",
7890
parameters: map[string]string{ParameterKeyDiskEncryptionKmsKey: "foo/key"},
7991
expectParams: DiskParameters{
8092
DiskType: "pd-standard",
8193
ReplicationType: "none",
8294
DiskEncryptionKMSKey: "foo/key",
8395
Tags: make(map[string]string),
96+
Labels: make(map[string]string),
8497
},
8598
},
8699
{
87-
name: "tags",
100+
name: "tags without cluster id",
101+
clusterId: "",
88102
parameters: map[string]string{ParameterKeyPVCName: "testPVCName", ParameterKeyPVCNamespace: "testPVCNamespace", ParameterKeyPVName: "testPVName"},
89103
expectParams: DiskParameters{
90104
DiskType: "pd-standard",
91105
ReplicationType: "none",
92106
DiskEncryptionKMSKey: "",
93107
Tags: map[string]string{tagKeyCreatedForClaimName: "testPVCName", tagKeyCreatedForClaimNamespace: "testPVCNamespace", tagKeyCreatedForVolumeName: "testPVName", tagKeyCreatedBy: "testDriver"},
108+
Labels: make(map[string]string),
109+
},
110+
},
111+
{
112+
name: "tags with cluster id",
113+
clusterId: fakeClusterId,
114+
parameters: map[string]string{ParameterKeyPVCName: "testPVCName", ParameterKeyPVCNamespace: "testPVCNamespace", ParameterKeyPVName: "testPVName"},
115+
expectParams: DiskParameters{
116+
DiskType: "pd-standard",
117+
ReplicationType: "none",
118+
DiskEncryptionKMSKey: "",
119+
Tags: map[string]string{tagKeyCreatedForClaimName: "testPVCName", tagKeyCreatedForClaimNamespace: "testPVCNamespace", tagKeyCreatedForVolumeName: "testPVName", tagKeyCreatedBy: "testDriver"},
120+
Labels: map[string]string{labelK8sClusterId: ResourceLifecycleOwned},
94121
},
95122
},
96123
}
97124

98125
for _, tc := range tests {
99126
t.Run(tc.name, func(t *testing.T) {
100-
p, err := ExtractAndDefaultParameters(tc.parameters, "testDriver")
127+
p, err := ExtractAndDefaultParameters(tc.parameters, "testDriver", tc.clusterId)
101128
if gotErr := err != nil; gotErr != tc.expectErr {
102129
t.Fatalf("ExtractAndDefaultParameters(%+v) = %v; expectedErr: %v", tc.parameters, err, tc.expectErr)
103130
}

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.k8sClusterId)
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.k8sClusterId)
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

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
type GCEDriver struct {
3232
name string
3333
vendorVersion string
34+
k8sClusterId 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, k8sClusterId 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.k8sClusterId = k8sClusterId
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, 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, "", 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", "", 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", "", 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, 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, nodeServer)
5858
if err != nil {
5959
t.Fatalf("Failed to setup GCE Driver: %v", err)
6060
}

test/sanity/sanity_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestSanity(t *testing.T) {
5757
identityServer := driver.NewIdentityServer(gceDriver)
5858
controllerServer := driver.NewControllerServer(gceDriver, cloudProvider)
5959
nodeServer := driver.NewNodeServer(gceDriver, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter))
60-
err = gceDriver.SetupGCEDriver(driverName, vendorVersion, identityServer, controllerServer, nodeServer)
60+
err = gceDriver.SetupGCEDriver(driverName, vendorVersion, "" /* Cluster ID */, identityServer, controllerServer, nodeServer)
6161
if err != nil {
6262
t.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
6363
}

0 commit comments

Comments
 (0)