Rego函数定义变量

Rego function to define variables

对于多个规则,我们需要定义同一组变量。在示例中,这些是“ns”、“externaldns”、“svc”、“nssvc”。我们如何将这些定义从每个规则中取出,也许放入一个函数中,然后在每个规则中只调用一次该函数?

    violation[{"msg": msg}] {
      ns := input.review.object.metadata.namespace
      externaldns := input.review.object.metadata.annotations["external-dns.alpha.kubernetes.io/hostname"]
      svc := input.review.object.metadata.name
      nssvc := sprintf("%v-%v", [ns,svc])
      not startswith(externaldns, svc)
      startswith(svc, ns)
      not endswith(ns, "-system")
      msg := "some message"
    }

您可以将常见的 variables/rules 移出规则主体,例如:

ns := input.review.object.metadata.namespace
externaldns := input.review.object.metadata.annotations["external-dns.alpha.kubernetes.io/hostname"]
svc := input.review.object.metadata.name
nssvc := sprintf("%v-%v", [ns,svc])

violation[{"msg": msg}] {
    not startswith(externaldns, svc)
    startswith(svc, ns)
    not endswith(ns, "-system")
    msg := "some message"
}

如果你想将一些移动到函数中,那也是可行的,即:

annotation(key) = value {
    value = input.review.object.metadata.annotations[key]
}

violation[{"msg": msg}] {
    externaldns := annotation("external-dns.alpha.kubernetes.io/hostname")
    # ...
}