Skip to content

Commit 3096c41

Browse files
authored
Merge pull request #1463 from k8s-infra-cherrypick-robot/cherry-pick-1461-to-release-1.24
[release-1.24] feat: add tag value delimiter
2 parents b1ca10c + ffeda94 commit 3096c41

File tree

4 files changed

+54
-24
lines changed

4 files changed

+54
-24
lines changed

pkg/blob/blob.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ const (
153153
defaultStorageEndPointSuffix = "core.windows.net"
154154

155155
FSGroupChangeNone = "None"
156+
// define tag value delimiter and default is comma
157+
tagValueDelimiterField = "tagValueDelimiter"
156158
)
157159

158160
var (

pkg/blob/controllerserver.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
9696
if parameters == nil {
9797
parameters = make(map[string]string)
9898
}
99-
var storageAccountType, subsID, resourceGroup, location, account, containerName, containerNamePrefix, protocol, customTags, secretName, secretNamespace, pvcNamespace string
99+
var storageAccountType, subsID, resourceGroup, location, account, containerName, containerNamePrefix, protocol, customTags, secretName, secretNamespace, pvcNamespace, tagValueDelimiter string
100100
var isHnsEnabled, requireInfraEncryption, enableBlobVersioning, createPrivateEndpoint, enableNfsV3 *bool
101101
var vnetResourceGroup, vnetName, subnetName, accessTier, networkEndpointType, storageEndpointSuffix, fsGroupChangePolicy string
102102
var matchTags, useDataPlaneAPI, getLatestAccountKey bool
@@ -213,6 +213,8 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
213213
useDataPlaneAPI = strings.EqualFold(v, trueValue)
214214
case fsGroupChangePolicyField:
215215
fsGroupChangePolicy = v
216+
case tagValueDelimiterField:
217+
tagValueDelimiter = v
216218
default:
217219
return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("invalid parameter %q in storage class", k))
218220
}
@@ -299,7 +301,7 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
299301
}
300302
}
301303

302-
tags, err := util.ConvertTagsToMap(customTags)
304+
tags, err := util.ConvertTagsToMap(customTags, tagValueDelimiter)
303305
if err != nil {
304306
return nil, status.Errorf(codes.InvalidArgument, err.Error())
305307
}

pkg/util/util.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
const (
4040
GiB = 1024 * 1024 * 1024
4141
TiB = 1024 * GiB
42-
tagsDelimiter = ","
4342
tagKeyValueDelimiter = "="
4443
)
4544

@@ -157,20 +156,23 @@ func (lm *LockMap) unlockEntry(entry string) {
157156
lm.mutexMap[entry].Unlock()
158157
}
159158

160-
func ConvertTagsToMap(tags string) (map[string]string, error) {
159+
func ConvertTagsToMap(tags string, tagsDelimiter string) (map[string]string, error) {
161160
m := make(map[string]string)
162161
if tags == "" {
163162
return m, nil
164163
}
164+
if tagsDelimiter == "" {
165+
tagsDelimiter = ","
166+
}
165167
s := strings.Split(tags, tagsDelimiter)
166168
for _, tag := range s {
167-
kv := strings.Split(tag, tagKeyValueDelimiter)
169+
kv := strings.SplitN(tag, tagKeyValueDelimiter, 2)
168170
if len(kv) != 2 {
169-
return nil, fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1,key2=value2'", tags)
171+
return nil, fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1%skey2=value2'", tags, tagsDelimiter)
170172
}
171173
key := strings.TrimSpace(kv[0])
172174
if key == "" {
173-
return nil, fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1,key2=value2'", tags)
175+
return nil, fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1%skey2=value2'", tags, tagsDelimiter)
174176
}
175177
value := strings.TrimSpace(kv[1])
176178
m[key] = value

pkg/util/util_test.go

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -176,33 +176,57 @@ func TestMakeDir(t *testing.T) {
176176

177177
func TestConvertTagsToMap(t *testing.T) {
178178
tests := []struct {
179-
desc string
180-
tags string
181-
expectedOut map[string]string
182-
expectedErr error
179+
desc string
180+
tags string
181+
tagsDelimiter string
182+
expectedOut map[string]string
183+
expectedErr error
183184
}{
184185
{
185-
desc: "Improper KeyValuePair",
186-
tags: "foo=bar=gar,lorem=ipsum",
187-
expectedOut: nil,
188-
expectedErr: fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1,key2=value2'", "foo=bar=gar,lorem=ipsum"),
186+
desc: "Improper KeyValuePair",
187+
tags: "foo,lorem=ipsum",
188+
tagsDelimiter: ",",
189+
expectedOut: nil,
190+
expectedErr: fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1,key2=value2'", "foo,lorem=ipsum"),
189191
},
190192
{
191-
desc: "Missing Key",
192-
tags: "=bar,lorem=ipsum",
193-
expectedOut: nil,
194-
expectedErr: fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1,key2=value2'", "=bar,lorem=ipsum"),
193+
desc: "Missing Key",
194+
tags: "=bar,lorem=ipsum",
195+
tagsDelimiter: ",",
196+
expectedOut: nil,
197+
expectedErr: fmt.Errorf("Tags '%s' are invalid, the format should like: 'key1=value1,key2=value2'", "=bar,lorem=ipsum"),
195198
},
196199
{
197-
desc: "Successful Input/Output",
198-
tags: "foo=bar,lorem=ipsum",
199-
expectedOut: map[string]string{"foo": "bar", "lorem": "ipsum"},
200+
desc: "Successful Input/Output",
201+
tags: "foo=bar,lorem=ipsum",
202+
tagsDelimiter: ",",
203+
expectedOut: map[string]string{"foo": "bar", "lorem": "ipsum"},
204+
expectedErr: nil,
205+
},
206+
{
207+
desc: "should return success for empty tagsDelimiter",
208+
tags: "key1=value1,key2=value2",
209+
tagsDelimiter: "",
210+
expectedOut: map[string]string{
211+
"key1": "value1",
212+
"key2": "value2",
213+
},
214+
expectedErr: nil,
215+
},
216+
{
217+
desc: "should return success for special tagsDelimiter and tag values containing commas and equal sign",
218+
tags: "key1=aGVsbG8=;key2=value-2, value-3",
219+
tagsDelimiter: ";",
220+
expectedOut: map[string]string{
221+
"key1": "aGVsbG8=",
222+
"key2": "value-2, value-3",
223+
},
200224
expectedErr: nil,
201225
},
202226
}
203227

204228
for _, test := range tests {
205-
output, err := ConvertTagsToMap(test.tags)
229+
output, err := ConvertTagsToMap(test.tags, test.tagsDelimiter)
206230
assert.Equal(t, test.expectedOut, output, test.desc)
207231
assert.Equal(t, test.expectedErr, err, test.desc)
208232
}
@@ -241,7 +265,7 @@ func TestConvertTagsToMap2(t *testing.T) {
241265
},
242266
}
243267
for _, test := range tests {
244-
result, err := ConvertTagsToMap(test.tags)
268+
result, err := ConvertTagsToMap(test.tags, "")
245269
if test.err {
246270
assert.NotNil(t, err)
247271
} else {

0 commit comments

Comments
 (0)