From 0cb852b98a2620a13973795866a7a5e56330879d Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Fri, 24 Jul 2020 15:22:36 -0700 Subject: [PATCH] support slash in path --- api/filters/fieldspec/fieldspec.go | 17 +++++++- api/filters/fieldspec/fieldspec_test.go | 54 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/api/filters/fieldspec/fieldspec.go b/api/filters/fieldspec/fieldspec.go index 61a0d9c40..6d6575702 100644 --- a/api/filters/fieldspec/fieldspec.go +++ b/api/filters/fieldspec/fieldspec.go @@ -37,7 +37,7 @@ func (fltr Filter) Filter(obj *yaml.RNode) (*yaml.RNode, error) { if match, err := isMatchGVK(fltr.FieldSpec, obj); !match || err != nil { return obj, errors.Wrap(err) } - fltr.path = strings.Split(fltr.FieldSpec.Path, "/") + fltr.path = splitPath(fltr.FieldSpec.Path) if err := fltr.filter(obj); err != nil { s, _ := obj.String() return nil, errors.WrapPrefixf(err, @@ -159,3 +159,18 @@ func isMatchGVK(fs types.FieldSpec, obj *yaml.RNode) (bool, error) { return true, nil } + +func splitPath(path string) []string { + ps := strings.Split(path, "/") + var res []string + res = append(res, ps[0]) + for i := 1; i < len(ps); i++ { + lastIndex := len(res) - 1 + if strings.HasSuffix(res[lastIndex], "\\") { + res[lastIndex] = strings.TrimSuffix(res[lastIndex], "\\") + "/" + ps[i] + } else { + res = append(res, ps[i]) + } + } + return res +} diff --git a/api/filters/fieldspec/fieldspec_test.go b/api/filters/fieldspec/fieldspec_test.go index 852fba6a9..4c135ac82 100644 --- a/api/filters/fieldspec/fieldspec_test.go +++ b/api/filters/fieldspec/fieldspec_test.go @@ -435,6 +435,60 @@ spec: }, error: "obj '' at path 'spec/containers/image': expected sequence or mapping node", }, + { + name: "filedname with slash '/'", + fieldSpec: ` +path: a/b\/c/d +version: v1 +kind: Bar +`, + input: ` +apiVersion: v1 +kind: Bar +a: + b/c: + d: foo +`, + expected: ` +apiVersion: v1 +kind: Bar +a: + b/c: + d: bar +`, + filter: fieldspec.Filter{ + SetValue: filtersutil.SetScalar("bar"), + CreateKind: yaml.ScalarNode, + }, + }, + { + name: "filedname with multiple '/'", + fieldSpec: ` +path: a/b\/c/d\/e/f +version: v1 +kind: Bar +`, + input: ` +apiVersion: v1 +kind: Bar +a: + b/c: + d/e: + f: foo +`, + expected: ` +apiVersion: v1 +kind: Bar +a: + b/c: + d/e: + f: bar +`, + filter: fieldspec.Filter{ + SetValue: filtersutil.SetScalar("bar"), + CreateKind: yaml.ScalarNode, + }, + }, } func TestFilter_Filter(t *testing.T) {