17785: Controller forwards apiClientAuthorization requests to remotes.
[arvados.git] / sdk / go / arvados / vocabulary.go
index 4edc9e83d5a5fcd31adab69b1b59bf450946ab34..150091b308505b51f1830d33351cc7a706161650 100644 (file)
@@ -112,13 +112,14 @@ func (v *Vocabulary) validate() error {
                        if tagValues[lcVal] != "" {
                                return fmt.Errorf("duplicate tag value %q for tag %q", val, key)
                        }
+                       // Checks for collisions between labels from different values.
                        tagValues[lcVal] = val
                        for _, tagLbl := range v.Tags[key].Values[val].Labels {
                                label := strings.ToLower(tagLbl.Label)
-                               if tagValues[label] != "" {
-                                       return fmt.Errorf("tag value label %q for pair (%q:%q) already seen as a value key or label", tagLbl.Label, key, val)
+                               if tagValues[label] != "" && tagValues[label] != val {
+                                       return fmt.Errorf("tag value label %q for pair (%q:%q) already seen on value %q", tagLbl.Label, key, val, tagValues[label])
                                }
-                               tagValues[label] = tagLbl.Label
+                               tagValues[label] = val
                        }
                }
        }
@@ -146,6 +147,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
@@ -207,11 +209,11 @@ func (v *Vocabulary) Check(data map[string]interface{}) error {
                                                return err
                                        }
                                default:
-                                       return fmt.Errorf("tag value of type %T for key %q is not a valid", singleVal, key)
+                                       return fmt.Errorf("value list element type for tag key %q was %T, but expected a string", key, singleVal)
                                }
                        }
                default:
-                       return fmt.Errorf("tag value of type %T for key %q is not a valid", val, key)
+                       return fmt.Errorf("value type for tag key %q was %T, but expected a string or list of strings", key, val)
                }
        }
        return nil