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")
# ...
}
对于多个规则,我们需要定义同一组变量。在示例中,这些是“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")
# ...
}