From: Lucas Di Pentima Date: Tue, 9 Nov 2021 21:45:31 +0000 (-0300) Subject: 17944: Adds a case-insensitive check for key/value against labels. X-Git-Tag: 2.4.0~173^2~7 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/f827088cc812a217bfb46aca66be62b79b7ed973 17944: Adds a case-insensitive check for key/value against labels. Also, improves tests. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- diff --git a/sdk/go/arvados/vocabulary.go b/sdk/go/arvados/vocabulary.go index 4edc9e83d5..dc31b998f6 100644 --- a/sdk/go/arvados/vocabulary.go +++ b/sdk/go/arvados/vocabulary.go @@ -146,6 +146,7 @@ func (v *Vocabulary) getLabelsToValues(key string) (labels map[string]string) { labels = make(map[string]string) if _, ok := v.Tags[key]; ok { for val := range v.Tags[key].Values { + labels[strings.ToLower(val)] = val for _, tagLbl := range v.Tags[key].Values[val].Labels { label := strings.ToLower(tagLbl.Label) labels[label] = val diff --git a/sdk/go/arvados/vocabulary_test.go b/sdk/go/arvados/vocabulary_test.go index 4756e720e3..050d5ea762 100644 --- a/sdk/go/arvados/vocabulary_test.go +++ b/sdk/go/arvados/vocabulary_test.go @@ -66,22 +66,108 @@ func (s *VocabularySuite) TestCheck(c *check.C) { strictVoc bool props string expectSuccess bool + errMatches string }{ // Check succeeds - {"Known key, known value", false, `{"IDTAGANIMALS":"IDVALANIMAL1"}`, true}, - {"Unknown non-alias key on non-strict vocabulary", false, `{"foo":"bar"}`, true}, - {"Known non-strict key, unknown non-alias value", false, `{"IDTAGANIMALS":"IDVALANIMAL3"}`, true}, - {"Undefined but reserved key on strict vocabulary", true, `{"reservedKey":"bar"}`, true}, - {"Known key, list of known values", false, `{"IDTAGANIMALS":["IDVALANIMAL1","IDVALANIMAL2"]}`, true}, - {"Known non-strict key, list of unknown non-alias values", false, `{"IDTAGCOMMENT":["hello world","lorem ipsum"]}`, true}, + { + "Known key, known value", + false, + `{"IDTAGANIMALS":"IDVALANIMAL1"}`, + true, + "", + }, + { + "Unknown non-alias key on non-strict vocabulary", + false, + `{"foo":"bar"}`, + true, + "", + }, + { + "Known non-strict key, unknown non-alias value", + false, + `{"IDTAGANIMALS":"IDVALANIMAL3"}`, + true, + "", + }, + { + "Undefined but reserved key on strict vocabulary", + true, + `{"reservedKey":"bar"}`, + true, + "", + }, + { + "Known key, list of known values", + false, + `{"IDTAGANIMALS":["IDVALANIMAL1","IDVALANIMAL2"]}`, + true, + "", + }, + { + "Known non-strict key, list of unknown non-alias values", + false, + `{"IDTAGCOMMENT":["hello world","lorem ipsum"]}`, + true, + "", + }, // Check fails - {"Known first key & value; known 2nd key, unknown 2nd value", false, `{"IDTAGANIMALS":"IDVALANIMAL1", "IDTAGIMPORTANCE": "blah blah"}`, false}, - {"Unknown non-alias key on strict vocabulary", true, `{"foo":"bar"}`, false}, - {"Known non-strict key, known value alias", false, `{"IDTAGANIMALS":"Loxodonta"}`, false}, - {"Known strict key, unknown non-alias value", false, `{"IDTAGIMPORTANCE":"Unimportant"}`, false}, - {"Known strict key, known value alias", false, `{"IDTAGIMPORTANCE":"High"}`, false}, - {"Known strict key, list of known alias values", false, `{"IDTAGIMPORTANCE":["Unimportant","High"]}`, false}, - {"Known strict key, list of unknown non-alias values", false, `{"IDTAGIMPORTANCE":["foo","bar"]}`, false}, + { + "Known first key & value; known 2nd key, unknown 2nd value", + false, + `{"IDTAGANIMALS":"IDVALANIMAL1", "IDTAGIMPORTANCE": "blah blah"}`, + false, + "tag value.*is not valid for key.*", + }, + { + "Unknown non-alias key on strict vocabulary", + true, + `{"foo":"bar"}`, + false, + "tag key.*is not defined in the vocabulary", + }, + { + "Known non-strict key, known value alias", + false, + `{"IDTAGANIMALS":"Loxodonta"}`, + false, + "tag value.*for key.* is an alias, must be provided as.*", + }, + { + "Known strict key, unknown non-alias value", + false, + `{"IDTAGIMPORTANCE":"Unimportant"}`, + false, + "tag value.*is not valid for key.*", + }, + { + "Known strict key, lowercase value regarded as alias", + false, + `{"IDTAGIMPORTANCE":"idval1"}`, + false, + "tag value.*for key.* is an alias, must be provided as.*", + }, + { + "Known strict key, known value alias", + false, + `{"IDTAGIMPORTANCE":"High"}`, + false, + "tag value.* for key.*is an alias, must be provided as.*", + }, + { + "Known strict key, list of known alias values", + false, + `{"IDTAGIMPORTANCE":["High", "Low"]}`, + false, + "tag value.*for key.*is an alias, must be provided as.*", + }, + { + "Known strict key, list of unknown non-alias values", + false, + `{"IDTAGIMPORTANCE":["foo","bar"]}`, + false, + "tag value.*is not valid for key.*", + }, } for _, tt := range tests { c.Log(c.TestName()+" ", tt.name) @@ -95,6 +181,7 @@ func (s *VocabularySuite) TestCheck(c *check.C) { c.Assert(err, check.IsNil) } else { c.Assert(err, check.NotNil) + c.Assert(err.Error(), check.Matches, tt.errMatches) } } }