...
1
2
3
4
19
20 package labels
21
22 import (
23 "fmt"
24 "sort"
25 "strings"
26 )
27
28
29 type Labels interface {
30
31 Has(label string) (exists bool)
32
33
34 Get(label string) (value string)
35 }
36
37
38 type Set map[string]string
39
40
41
42 func (ls Set) String() string {
43 selector := make([]string, 0, len(ls))
44 for key, value := range ls {
45 selector = append(selector, key+"="+value)
46 }
47
48 sort.StringSlice(selector).Sort()
49 return strings.Join(selector, ",")
50 }
51
52
53 func (ls Set) Has(label string) bool {
54 _, exists := ls[label]
55 return exists
56 }
57
58
59 func (ls Set) Get(label string) string {
60 return ls[label]
61 }
62
63
64
65
66 func (ls Set) AsSelector() Selector {
67 return SelectorFromSet(ls)
68 }
69
70
71
72 func (ls Set) AsValidatedSelector() (Selector, error) {
73 return ValidatedSelectorFromSet(ls)
74 }
75
76
77
78
79
80
81 func (ls Set) AsSelectorPreValidated() Selector {
82 return SelectorFromValidatedSet(ls)
83 }
84
85
86 func FormatLabels(labelMap map[string]string) string {
87 l := Set(labelMap).String()
88 if l == "" {
89 l = "<none>"
90 }
91 return l
92 }
93
94
95
96 func Conflicts(labels1, labels2 Set) bool {
97 small := labels1
98 big := labels2
99 if len(labels2) < len(labels1) {
100 small = labels2
101 big = labels1
102 }
103
104 for k, v := range small {
105 if val, match := big[k]; match {
106 if val != v {
107 return true
108 }
109 }
110 }
111
112 return false
113 }
114
115
116
117 func Merge(labels1, labels2 Set) Set {
118 mergedMap := Set{}
119
120 for k, v := range labels1 {
121 mergedMap[k] = v
122 }
123 for k, v := range labels2 {
124 mergedMap[k] = v
125 }
126 return mergedMap
127 }
128
129
130 func Equals(labels1, labels2 Set) bool {
131 if len(labels1) != len(labels2) {
132 return false
133 }
134
135 for k, v := range labels1 {
136 value, ok := labels2[k]
137 if !ok {
138 return false
139 }
140 if value != v {
141 return false
142 }
143 }
144 return true
145 }
146
147
148
149 func AreLabelsInWhiteList(labels, whitelist Set) bool {
150 if len(whitelist) == 0 {
151 return true
152 }
153
154 for k, v := range labels {
155 value, ok := whitelist[k]
156 if !ok {
157 return false
158 }
159 if value != v {
160 return false
161 }
162 }
163 return true
164 }
165
166
167
168 func ConvertSelectorToLabelsMap(selector string) (Set, error) {
169 labelsMap := Set{}
170
171 if len(selector) == 0 {
172 return labelsMap, nil
173 }
174
175 labels := strings.Split(selector, ",")
176 for _, label := range labels {
177 l := strings.Split(label, "=")
178 if len(l) != 2 {
179 return labelsMap, fmt.Errorf("invalid selector: %s", l)
180 }
181 key := strings.TrimSpace(l[0])
182 if err := validateLabelKey(key); err != nil {
183 return labelsMap, err
184 }
185 value := strings.TrimSpace(l[1])
186 if err := validateLabelValue(key, value); err != nil {
187 return labelsMap, err
188 }
189 labelsMap[key] = value
190 }
191 return labelsMap, nil
192 }
193
View as plain text