Skip to content

Commit 17dd55b

Browse files
committed
Add support for addition of ResoureManagerTags to GCP Compute Disk, Image, Snapshot resources
1 parent b67b1eb commit 17dd55b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+33156
-29
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ See Github [Issues](https://github.com/kubernetes-sigs/gcp-compute-persistent-di
6060
| labels | `key1=value1,key2=value2` | | Labels allow you to assign custom [GCE Disk labels](https://cloud.google.com/compute/docs/labeling-resources). |
6161
| provisioned-iops-on-create | string (int64 format). Values typically between 10,000 and 120,000 | | Indicates how many IOPS to provision for the disk. See the [Extreme persistent disk documentation](https://cloud.google.com/compute/docs/disks/extreme-persistent-disk) for details, including valid ranges for IOPS. |
6262
| provisioned-throughput-on-create | string (int64 format). Values typically between 1 and 7,124 mb per second | | Indicates how much throughput to provision for the disk. See the [hyperdisk documentation]([TBD](https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/hyperdisk#create)) for details, including valid ranges for throughput. |
63+
| resource-tags | `<parent_id1>/<tag_key1>/<tag_value1>,<parent_id2>/<tag_key2>/<tag_value2>` | | Resource tags allow you to attach user-defined tags to each Compute Disk, Image and Snapshot. See [Tags overview](https://cloud.google.com/resource-manager/docs/tags/tags-overview), [Creating and managing tags](https://cloud.google.com/resource-manager/docs/tags/tags-creating-and-managing). |
6364

6465
### Topology
6566

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ var (
8181

8282
useInstanceAPIOnWaitForAttachDiskTypesFlag = flag.String("use-instance-api-to-poll-attachment-disk-types", "", "Comma separated list of disk types that should use instances.get API when polling for disk attach during ControllerPublish")
8383

84+
extraTagsStr = flag.String("extra-tags", "", "Extra tags to attach to each Compute Disk, Image, Snapshot created. It is a comma separated list of parent id, key and value like '<parent_id1>/<tag_key1>/<tag_value1>,...,<parent_idN>/<tag_keyN>/<tag_valueN>'. parent_id is the Organization or the Project ID or Project name where the tag key and the tag value resources exist. A maximum of 50 tags bindings is allowed for a resource. See https://cloud.google.com/resource-manager/docs/tags/tags-overview, https://cloud.google.com/resource-manager/docs/tags/tags-creating-and-managing for details")
85+
8486
version string
8587
)
8688

@@ -153,6 +155,14 @@ func handle() {
153155
klog.Fatalf("Bad extra volume labels: %v", err.Error())
154156
}
155157

158+
if len(*extraTagsStr) > 0 && !*runControllerService {
159+
klog.Fatalf("Extra tags provided but not running controller")
160+
}
161+
extraTags, err := common.ConvertTagsStringToMap(*extraTagsStr)
162+
if err != nil {
163+
klog.Fatalf("Bad extra tags: %v", err.Error())
164+
}
165+
156166
ctx, cancel := context.WithCancel(context.Background())
157167
defer cancel()
158168

@@ -211,7 +221,7 @@ func handle() {
211221
}
212222
}
213223

214-
err = gceDriver.SetupGCEDriver(driverName, version, extraVolumeLabels, identityServer, controllerServer, nodeServer)
224+
err = gceDriver.SetupGCEDriver(driverName, version, extraVolumeLabels, extraTags, identityServer, controllerServer, nodeServer)
215225
if err != nil {
216226
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err.Error())
217227
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: storage.k8s.io/v1
2+
kind: StorageClass
3+
metadata:
4+
name: csi-gce-pd-with-resource-tags
5+
provisioner: pd.csi.storage.gke.io
6+
parameters:
7+
resource-tags: parent1/key1/value1,parent2/key2/value2
8+
volumeBindingMode: WaitForFirstConsumer
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: snapshot.storage.k8s.io/v1beta1
2+
kind: VolumeSnapshotClass
3+
metadata:
4+
name: csi-gce-pd-snapshot-class-with-resource-tags
5+
parameters:
6+
resource-tags: parent1/key1/value1,parent2/key2/value2
7+
driver: pd.csi.storage.gke.io
8+
deletionPolicy: Delete

go.mod

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ go 1.20
55
require (
66
cloud.google.com/go/compute/metadata v0.2.3
77
cloud.google.com/go/kms v1.15.8
8+
cloud.google.com/go/resourcemanager v1.9.6
89
github.com/GoogleCloudPlatform/k8s-cloud-provider v1.24.0
910
github.com/container-storage-interface/spec v1.6.0
1011
github.com/google/go-cmp v0.6.0
1112
github.com/google/uuid v1.6.0
13+
github.com/googleapis/gax-go/v2 v2.12.3
1214
github.com/kubernetes-csi/csi-proxy/client v1.1.3
1315
github.com/kubernetes-csi/csi-test/v4 v4.4.0
1416
github.com/onsi/ginkgo/v2 v2.17.1
@@ -20,6 +22,7 @@ require (
2022
go.opentelemetry.io/otel/sdk v1.22.0
2123
golang.org/x/oauth2 v0.18.0
2224
golang.org/x/sys v0.18.0
25+
golang.org/x/time v0.5.0
2326
google.golang.org/api v0.172.0
2427
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de
2528
google.golang.org/grpc v1.63.2
@@ -37,8 +40,10 @@ require (
3740
)
3841

3942
require (
43+
cloud.google.com/go v0.112.1 // indirect
4044
cloud.google.com/go/compute v1.25.1 // indirect
4145
cloud.google.com/go/iam v1.1.7 // indirect
46+
cloud.google.com/go/longrunning v0.5.5 // indirect
4247
github.com/Microsoft/go-winio v0.6.1 // indirect
4348
github.com/PuerkitoBio/purell v1.1.1 // indirect
4449
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
@@ -65,7 +70,6 @@ require (
6570
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
6671
github.com/google/s2a-go v0.1.7 // indirect
6772
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
68-
github.com/googleapis/gax-go/v2 v2.12.3 // indirect
6973
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
7074
github.com/hashicorp/errwrap v1.0.0 // indirect
7175
github.com/hashicorp/go-multierror v1.1.0 // indirect
@@ -99,7 +103,6 @@ require (
99103
golang.org/x/sync v0.6.0 // indirect
100104
golang.org/x/term v0.18.0 // indirect
101105
golang.org/x/text v0.14.0 // indirect
102-
golang.org/x/time v0.5.0 // indirect
103106
golang.org/x/tools v0.19.0 // indirect
104107
google.golang.org/appengine v1.6.8 // indirect
105108
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect

go.sum

+5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFO
4848
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
4949
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
5050
cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
51+
cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
5152
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
5253
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
5354
cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
@@ -361,6 +362,8 @@ cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeN
361362
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
362363
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
363364
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
365+
cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg=
366+
cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s=
364367
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
365368
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
366369
cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
@@ -471,6 +474,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L
471474
cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
472475
cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
473476
cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
477+
cloud.google.com/go/resourcemanager v1.9.6 h1:VPfJFbWxrTYQzEXCDbJNpcvSB8eZhTSM0YHH146fIB8=
478+
cloud.google.com/go/resourcemanager v1.9.6/go.mod h1:d+XUOGbxg6Aka3lmC4fDiserslux3d15uX08C6a0MBg=
474479
cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
475480
cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
476481
cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=

pkg/common/parameters.go

+38-2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const (
3232
ParameterAvailabilityClass = "availability-class"
3333
ParameterKeyEnableConfidentialCompute = "enable-confidential-storage"
3434
ParameterKeyStoragePools = "storage-pools"
35+
ParameterKeyResourceTags = "resource-tags"
3536

3637
// Parameters for VolumeSnapshotClass
3738
ParameterKeyStorageLocations = "storage-locations"
@@ -98,6 +99,9 @@ type DiskParameters struct {
9899
// Values: {[]string}
99100
// Default: ""
100101
StoragePools []StoragePool
102+
// Values: {map[string]string}
103+
// Default: ""
104+
ResourceTags map[string]string
101105
}
102106

103107
// SnapshotParameters contains normalized and defaulted parameters for snapshots
@@ -107,6 +111,7 @@ type SnapshotParameters struct {
107111
ImageFamily string
108112
Tags map[string]string
109113
Labels map[string]string
114+
ResourceTags map[string]string
110115
}
111116

112117
type StoragePool struct {
@@ -120,19 +125,24 @@ type StoragePool struct {
120125
// put them into a well defined struct making sure to default unspecified fields.
121126
// extraVolumeLabels are added as labels; if there are also labels specified in
122127
// parameters, any matching extraVolumeLabels will be overridden.
123-
func ExtractAndDefaultParameters(parameters map[string]string, driverName string, extraVolumeLabels map[string]string, enableStoragePools bool) (DiskParameters, error) {
128+
func ExtractAndDefaultParameters(parameters map[string]string, driverName string, extraVolumeLabels map[string]string, enableStoragePools bool, extraTags map[string]string) (DiskParameters, error) {
124129
p := DiskParameters{
125130
DiskType: "pd-standard", // Default
126131
ReplicationType: replicationTypeNone, // Default
127132
DiskEncryptionKMSKey: "", // Default
128133
Tags: make(map[string]string), // Default
129134
Labels: make(map[string]string), // Default
135+
ResourceTags: make(map[string]string), // Default
130136
}
131137

132138
for k, v := range extraVolumeLabels {
133139
p.Labels[k] = v
134140
}
135141

142+
for k, v := range extraTags {
143+
p.ResourceTags[k] = v
144+
}
145+
136146
for k, v := range parameters {
137147
if k == "csiProvisionerSecretName" || k == "csiProvisionerSecretNamespace" {
138148
// These are hardcoded secrets keys required to function but not needed by GCE PD
@@ -208,6 +218,10 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
208218
return p, fmt.Errorf("parameters contain invalid value for %s parameter: %w", ParameterKeyStoragePools, err)
209219
}
210220
p.StoragePools = storagePools
221+
case ParameterKeyResourceTags:
222+
if err := extractResorceTagsParameter(v, p.ResourceTags); err != nil {
223+
return p, err
224+
}
211225
default:
212226
return p, fmt.Errorf("parameters contains invalid option %q", k)
213227
}
@@ -218,13 +232,19 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
218232
return p, nil
219233
}
220234

221-
func ExtractAndDefaultSnapshotParameters(parameters map[string]string, driverName string) (SnapshotParameters, error) {
235+
func ExtractAndDefaultSnapshotParameters(parameters map[string]string, driverName string, extraTags map[string]string) (SnapshotParameters, error) {
222236
p := SnapshotParameters{
223237
StorageLocations: []string{},
224238
SnapshotType: DiskSnapshotType,
225239
Tags: make(map[string]string), // Default
226240
Labels: make(map[string]string), // Default
241+
ResourceTags: make(map[string]string), // Default
242+
}
243+
244+
for k, v := range extraTags {
245+
p.ResourceTags[k] = v
227246
}
247+
228248
for k, v := range parameters {
229249
switch strings.ToLower(k) {
230250
case ParameterKeyStorageLocations:
@@ -256,6 +276,10 @@ func ExtractAndDefaultSnapshotParameters(parameters map[string]string, driverNam
256276
for labelKey, labelValue := range paramLabels {
257277
p.Labels[labelKey] = labelValue
258278
}
279+
case ParameterKeyResourceTags:
280+
if err := extractResorceTagsParameter(v, p.ResourceTags); err != nil {
281+
return p, err
282+
}
259283
default:
260284
return p, fmt.Errorf("parameters contains invalid option %q", k)
261285
}
@@ -265,3 +289,15 @@ func ExtractAndDefaultSnapshotParameters(parameters map[string]string, driverNam
265289
}
266290
return p, nil
267291
}
292+
293+
func extractResorceTagsParameter(tagsString string, resourceTags map[string]string) error {
294+
paramResourceTags, err := ConvertTagsStringToMap(tagsString)
295+
if err != nil {
296+
return fmt.Errorf("parameters contain invalid tags parameter: %w", err)
297+
}
298+
// Override any existing resource tags with those from this parameter.
299+
for tagParentIDKey, tagValue := range paramResourceTags {
300+
resourceTags[tagParentIDKey] = tagValue
301+
}
302+
return nil
303+
}

0 commit comments

Comments
 (0)