Skip to content

Commit 4b73ba3

Browse files
Add two-variable comprehension support to cel-policy (#1074)
* Add two-variable comprehension support to cel-policy * Fix bazel BUILD dep to include comprehensions and additional tests
1 parent ba74bf6 commit 4b73ba3

7 files changed

Lines changed: 21 additions & 14 deletions

File tree

ext/BUILD.bazel

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ go_library(
88
name = "go_default_library",
99
srcs = [
1010
"bindings.go",
11+
"comprehensions.go",
1112
"encoders.go",
1213
"formatting.go",
1314
"guards.go",
@@ -45,7 +46,9 @@ go_test(
4546
name = "go_default_test",
4647
size = "small",
4748
srcs = [
48-
"encoders_test.go",
49+
"bindings_test.go",
50+
"comprehensions_test.go",
51+
"encoders_test.go",
4952
"lists_test.go",
5053
"math_test.go",
5154
"native_test.go",

policy/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,7 @@ var extFactories = map[string]ExtensionFactory{
287287
"strings": func(version uint32) cel.EnvOption {
288288
return ext.Strings(ext.StringsVersion(version))
289289
},
290+
"two-var-comprehensions": func(version uint32) cel.EnvOption {
291+
return ext.TwoVarComprehensions()
292+
},
290293
}

policy/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/google/cel-go/policy
33
go 1.22
44

55
require (
6-
github.com/google/cel-go v0.21.0
6+
github.com/google/cel-go v0.22.0
77
google.golang.org/protobuf v1.34.2
88
gopkg.in/yaml.v3 v3.0.1
99
)

policy/helper_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@ var (
118118
cel.@block([
119119
spec.labels,
120120
@index0.filter(l, !(l in resource.labels)),
121-
resource.labels.filter(l, l in @index0 && @index0[l] != resource.labels[l])],
122-
(@index1.size() > 0)
123-
? optional.of("missing one or more required labels: %s".format([@index1]))
124-
: ((@index2.size() > 0)
125-
? optional.of("invalid values provided on one or more labels: %s".format([@index2]))
126-
: optional.none()))`,
121+
resource.labels.transformList(l, value, l in @index0 && value != @index0[l], l)],
122+
(@index1.size() > 0)
123+
? optional.of("missing one or more required labels: %s".format([@index1]))
124+
: ((@index2.size() > 0)
125+
? optional.of("invalid values provided on one or more labels: %s".format([@index2]))
126+
: optional.none()))`,
127127
},
128128
{
129129
name: "restricted_destinations",

policy/parser.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -472,17 +472,17 @@ func (parser *Parser) Parse(src *Source) (*Policy, *cel.Issues) {
472472
errs := common.NewErrors(src)
473473
iss := cel.NewIssuesWithSourceInfo(errs, info)
474474
p := newParserImpl(parser.TagVisitor, info, src, iss)
475-
policy := p.parseYaml(src)
475+
policy := p.parseYAML(src)
476476
if iss.Err() != nil {
477477
return nil, iss
478478
}
479479
return policy, nil
480480
}
481481

482-
func (p *parserImpl) parseYaml(src *Source) *Policy {
482+
func (p *parserImpl) parseYAML(src *Source) *Policy {
483483
// Parse yaml representation from the source to an object model.
484484
var docNode yaml.Node
485-
err := sourceToYaml(src, &docNode)
485+
err := sourceToYAML(src, &docNode)
486486
if err != nil {
487487
p.iss.ReportErrorAtID(0, err.Error())
488488
return nil
@@ -491,7 +491,7 @@ func (p *parserImpl) parseYaml(src *Source) *Policy {
491491
return p.ParsePolicy(p, docNode.Content[0])
492492
}
493493

494-
func sourceToYaml(src *Source, docNode *yaml.Node) error {
494+
func sourceToYAML(src *Source, docNode *yaml.Node) error {
495495
err := yaml.Unmarshal([]byte(src.Content()), docNode)
496496
if err != nil {
497497
return err

policy/testdata/required_labels/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ extensions:
1717
- name: "bindings"
1818
- name: "strings"
1919
version: 2
20+
- name: "two-var-comprehensions"
2021
variables:
2122
- name: "spec"
2223
type:

policy/testdata/required_labels/policy.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ rule:
2121
expression: variables.want.filter(l, !(l in resource.labels))
2222
- name: invalid
2323
expression: >
24-
resource.labels.filter(l,
25-
l in variables.want && variables.want[l] != resource.labels[l])
24+
resource.labels.transformList(l, value,
25+
l in variables.want && value != variables.want[l], l)
2626
match:
2727
- condition: variables.missing.size() > 0
2828
output: |

0 commit comments

Comments
 (0)