| package labels |
|
|
| import ( |
| "errors" |
| "net/http" |
| "regexp" |
|
|
| api "github.com/openmeterio/openmeter/api/v3" |
| "github.com/openmeterio/openmeter/pkg/framework/commonhttp" |
| "github.com/openmeterio/openmeter/pkg/models" |
| ) |
|
|
| |
| var keyValueFormat = regexp.MustCompile(`^(?:[a-zA-Z0-9](?:[a-zA-Z0-9._-]?[a-zA-Z0-9])?){1,63}$`) |
|
|
| |
| var reservedPrefixMatcher = regexp.MustCompile(`^(_|kong|konnect|insomnia|mesh|kic|kuma|openmeter)`) |
|
|
| func ValidateLabel(k, v string) error { |
| var errs []error |
|
|
| if !keyValueFormat.MatchString(k) { |
| errs = append(errs, models.NewValidationIssue( |
| "invalid_label_key_format", |
| "label key must be in valid format", |
| models.WithFieldString("labels"), |
| models.WithCriticalSeverity(), |
| commonhttp.WithHTTPStatusCodeAttribute(http.StatusBadRequest), |
| )) |
| } |
|
|
| if !keyValueFormat.MatchString(v) { |
| errs = append(errs, models.NewValidationIssue( |
| "invalid_label_value_format", |
| "label value must be in valid format", |
| models.WithFieldString("labels"), |
| models.WithCriticalSeverity(), |
| commonhttp.WithHTTPStatusCodeAttribute(http.StatusBadRequest), |
| )) |
| } |
|
|
| if reservedPrefixMatcher.MatchString(k) { |
| errs = append(errs, models.NewValidationIssue( |
| "invalid_label_key_prefix", |
| "label key must not have reserved prefix", |
| models.WithFieldString("labels"), |
| models.WithCriticalSeverity(), |
| commonhttp.WithHTTPStatusCodeAttribute(http.StatusBadRequest), |
| )) |
| } |
|
|
| return errors.Join(errs...) |
| } |
|
|
| func ValidateLabels(l api.Labels) error { |
| var errs []error |
|
|
| for k, v := range l { |
| if err := ValidateLabel(k, v); err != nil { |
| errs = append(errs, err) |
| } |
| } |
|
|
| return errors.Join(errs...) |
| } |
|
|