Skip to content

Commit 839e488

Browse files
samuhaleZachary Maguire
authored andcommitted
Allow : in Tags with Escape Character
1 parent c2a8461 commit 839e488

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

docs/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,11 +361,11 @@ Enabling the vol-metrics-opt-in parameter activates the gathering of inode and d
361361

362362

363363
### Container Arguments for deployment(controller)
364-
| Parameters | Values | Default | Optional | Description |
365-
|-----------------------------|--------|---------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
366-
| delete-access-point-root-dir| | false | true | Opt in to delete access point root directory by DeleteVolume. By default, DeleteVolume will delete the access point behind Persistent Volume and deleting access point will not delete the access point root directory or its contents. |
367-
| adaptive-retry-mode | | true | true | Opt out to use standard sdk retry mode for EFS API calls. By default, Driver will use adaptive mode for the sdk retry configuration which heavily rate limits EFS API requests to reduce throttling if throttling is observed. |
368-
| tags | | | true | Space separated key:value pairs which will be added as tags for Amazon EFS resources. For example, '--tags=name:efs-tag-test date:Jan24' |
364+
| Parameters | Values | Default | Optional | Description |
365+
|-----------------------------|--------|---------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
366+
| delete-access-point-root-dir| | false | true | Opt in to delete access point root directory by DeleteVolume. By default, DeleteVolume will delete the access point behind Persistent Volume and deleting access point will not delete the access point root directory or its contents. |
367+
| adaptive-retry-mode | | true | true | Opt out to use standard sdk retry mode for EFS API calls. By default, Driver will use adaptive mode for the sdk retry configuration which heavily rate limits EFS API requests to reduce throttling if throttling is observed. |
368+
| tags | | | true | Space separated key:value pairs which will be added as tags for Amazon EFS resources. For example, '--tags=name:efs-tag-test date:Jan24'. To include a ':' in the tag name or value, use \ as an escape character, for example '--tags="tag\:name:tag\:value" |
369369
### Upgrading the Amazon EFS CSI Driver
370370

371371

pkg/driver/controller_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,11 @@ func TestCreateVolume(t *testing.T) {
796796
cloud: mockCloud,
797797
gidAllocator: NewGidAllocator(),
798798
lockManager: NewLockManagerMap(),
799-
tags: parseTagsFromStr("cluster:efs"),
799+
tags: parseTagsFromStr("cluster:efs tag2\\:name2:tag2\\:val2"),
800+
}
801+
802+
if driver.tags["cluster"] != "efs" || driver.tags["tag2:name2"] != "tag2:val2" {
803+
t.Fatalf("Incorrect tags")
800804
}
801805

802806
req := &csi.CreateVolumeRequest{

pkg/driver/driver.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@ import (
2323
"time"
2424

2525
"github.com/container-storage-interface/spec/lib/go/csi"
26-
"google.golang.org/grpc"
27-
"k8s.io/klog/v2"
28-
2926
"github.com/kubernetes-sigs/aws-efs-csi-driver/pkg/cloud"
3027
"github.com/kubernetes-sigs/aws-efs-csi-driver/pkg/util"
28+
"google.golang.org/grpc"
29+
"k8s.io/klog/v2"
3130
)
3231

3332
const (
@@ -155,9 +154,31 @@ func parseTagsFromStr(tagStr string) map[string]string {
155154
return m
156155
}
157156
tagsSplit := strings.Split(tagStr, " ")
158-
for _, pair := range tagsSplit {
159-
p := strings.Split(pair, ":")
160-
m[p[0]] = p[1]
157+
for _, currTag := range tagsSplit {
158+
var nameBuilder strings.Builder
159+
var valBuilder strings.Builder
160+
var currBuilder *strings.Builder = &nameBuilder
161+
162+
for i := 0; i < len(currTag); i++ {
163+
if currTag[i] == ':' {
164+
if currBuilder == &valBuilder {
165+
break
166+
} else {
167+
currBuilder = &valBuilder
168+
continue
169+
}
170+
}
171+
172+
// Handle escape character
173+
if currTag[i] == byte('\\') && currTag[i+1] == byte(':') {
174+
currBuilder.WriteRune(':')
175+
i++ // Skip an extra character
176+
continue
177+
}
178+
179+
currBuilder.WriteByte(currTag[i])
180+
}
181+
m[nameBuilder.String()] = valBuilder.String()
161182
}
162183
return m
163184
}

0 commit comments

Comments
 (0)