@@ -4,7 +4,7 @@ metadata:
4
4
name : k8srequiredlabels
5
5
annotations :
6
6
metadata.gatekeeper.sh/title : " Required Labels"
7
- metadata.gatekeeper.sh/version : 1.0.1
7
+ metadata.gatekeeper.sh/version : 1.1.0
8
8
description : >-
9
9
Requires resources to contain specified labels, with values matching
10
10
provided regular expressions.
@@ -38,31 +38,42 @@ spec:
38
38
the regular expression.
39
39
targets :
40
40
- target : admission.k8s.gatekeeper.sh
41
- rego : |
42
- package k8srequiredlabels
41
+ code :
42
+ - engine : K8sNativeValidation
43
+ source :
44
+ validations :
45
+ - expression : ' (has(object.metadata) && variables.params.labels.all(entry, has(object.metadata.labels) && entry.key in object.metadata.labels))'
46
+ messageExpression : ' "missing required label, requires all of: " + variables.params.labels.map(entry, entry.key).join(", ")'
47
+ - expression : ' (has(object.metadata) && variables.params.labels.all(entry, has(object.metadata.labels) && entry.key in object.metadata.labels && string(object.metadata.labels[entry.key]).matches(string(entry.allowedRegex))))'
48
+ message : " regex mismatch"
49
+ - engine : Rego
50
+ source :
51
+ rego : |
52
+ package k8srequiredlabels
43
53
44
- get_message(parameters, _default) := _default {
45
- not parameters.message
46
- }
54
+ get_message(parameters, _default) := _default {
55
+ not parameters.message
56
+ }
47
57
48
- get_message(parameters, _) := parameters.message
58
+ get_message(parameters, _) := parameters.message
49
59
50
- violation[{"msg": msg, "details": {"missing_labels": missing}}] {
51
- provided := {label | input.review.object.metadata.labels[label]}
52
- required := {label | label := input.parameters.labels[_].key}
53
- missing := required - provided
54
- count(missing) > 0
55
- def_msg := sprintf("you must provide labels: %v", [missing])
56
- msg := get_message(input.parameters, def_msg)
57
- }
60
+ violation[{"msg": msg, "details": {"missing_labels": missing}}] {
61
+ provided := {label | input.review.object.metadata.labels[label]}
62
+ required := {label | label := input.parameters.labels[_].key}
63
+ missing := required - provided
64
+ count(missing) > 0
65
+ def_msg := sprintf("you must provide labels: %v", [missing])
66
+ msg := get_message(input.parameters, def_msg)
67
+ }
68
+
69
+ violation[{"msg": msg}] {
70
+ value := input.review.object.metadata.labels[key]
71
+ expected := input.parameters.labels[_]
72
+ expected.key == key
73
+ # do not match if allowedRegex is not defined, or is an empty string
74
+ expected.allowedRegex != ""
75
+ not regex.match(expected.allowedRegex, value)
76
+ def_msg := sprintf("Label <%v: %v> does not satisfy allowed regex: %v", [key, value, expected.allowedRegex])
77
+ msg := get_message(input.parameters, def_msg)
78
+ }
58
79
59
- violation[{"msg": msg}] {
60
- value := input.review.object.metadata.labels[key]
61
- expected := input.parameters.labels[_]
62
- expected.key == key
63
- # do not match if allowedRegex is not defined, or is an empty string
64
- expected.allowedRegex != ""
65
- not regex.match(expected.allowedRegex, value)
66
- def_msg := sprintf("Label <%v: %v> does not satisfy allowed regex: %v", [key, value, expected.allowedRegex])
67
- msg := get_message(input.parameters, def_msg)
68
- }
0 commit comments