You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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])
}

代码说明

  1. 筛选serviceA条目:用regex.match(^serviceA_, serviceA_key)精准匹配以serviceA_开头的键,避免误匹配其他包含serviceA的字符串。
  2. 生成对应serviceB键名:通过replace方法把serviceA替换成serviceB,直接得到配对的serviceB键名,比如serviceA_primary转为serviceB_primary。
  3. 校验条目存在:通过serviceB_val := input[serviceB_key]确保对应的serviceB条目存在,否则规则不会触发(避免因无对应条目导致的错误)。
  4. 对比bar值:如果两者的bar值不相等,就生成包含具体信息的拒绝结果,方便定位问题。

测试验证

  • 使用提供的示例数据时,所有serviceA和对应serviceB的bar值都匹配,规则不会返回任何拒绝结果。
  • 若修改serviceB_primary的bar值为4,规则会返回:不匹配:serviceA_primary.bar = 2,serviceB_primary.bar = 4。

内容的提问来源于stack exchange,提问作者saxo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:50:12