如何编写Rego测试校验serviceA与对应serviceB的bar值匹配?
Rego规则编写:匹配serviceA与对应serviceB的bar值
示例数据
{ "serviceA_primary": { "foo": 1, "bar": 2 }, "serviceA_secondary": { "foo": 1, "bar": 3 }, "serviceB_primary": { "bar": 2 }, "serviceB_secondary": { "bar": 3 } }
需求说明
编写Rego规则,确保所有名称包含serviceA的条目,其bar值与对应serviceB条目的bar值完全匹配。例如serviceA_primary.bar必须等于serviceB_primary.bar,serviceA_secondary.bar必须等于serviceB_secondary.bar。
当前困惑与初步尝试
不清楚正确的实现思路,原本打算先过滤serviceB条目再处理serviceA,但觉得逻辑不通。初步编写的规则代码如下:
deny_due_to_mismatch[res] if { some key, val in input res := {k: v | regex.match(`serviceA`, key) k := mpkhs_coord_name v := mpkhs_coord_info } }
正确实现方案
核心思路是:从serviceA的键名中提取后缀,拼接出对应的serviceB键名,再直接对比两者的bar值。具体代码如下:
deny_due_to_mismatch[result] if { # 遍历所有以serviceA_开头的条目 some serviceA_key, serviceA_val in input regex.match(`^serviceA_`, serviceA_key) # 将serviceA替换为serviceB,得到对应的serviceB键名 serviceB_key := replace(serviceA_key, `^serviceA`, `serviceB`) # 确保对应的serviceB条目存在,避免无匹配项的情况 serviceB_val := input[serviceB_key] # 检查bar值是否不匹配 serviceA_val.bar != serviceB_val.bar # 构造返回结果,清晰展示不匹配的具体情况 result := sprintf("不匹配:%s.bar = %v,%s.bar = %v", [serviceA_key, serviceA_val.bar, serviceB_key, serviceB_val.bar]) }
代码说明
- 筛选serviceA条目:用
regex.match(^serviceA_, serviceA_key)精准匹配以serviceA_开头的键,避免误匹配其他包含serviceA的字符串。 - 生成对应serviceB键名:通过
replace方法把serviceA替换成serviceB,直接得到配对的serviceB键名,比如serviceA_primary转为serviceB_primary。 - 校验条目存在:通过
serviceB_val := input[serviceB_key]确保对应的serviceB条目存在,否则规则不会触发(避免因无对应条目导致的错误)。 - 对比bar值:如果两者的bar值不相等,就生成包含具体信息的拒绝结果,方便定位问题。
测试验证
- 使用提供的示例数据时,所有serviceA和对应serviceB的bar值都匹配,规则不会返回任何拒绝结果。
- 若修改
serviceB_primary的bar值为4,规则会返回:不匹配:serviceA_primary.bar = 2,serviceB_primary.bar = 4。
内容的提问来源于stack exchange,提问作者saxo
相关产品推荐
相关产品推荐

