0

我想编写一个 Rego 规则,根据模板中声明的标签检查 Kubernetes 部署选择器。如果存在的每个键/值spec.selector.matchLabels都存在于spec.template.metadata.labels.

如果我用 Javascript 编写它,它看起来像这样:

for(let key of input.spec.selector.matchLabels) {
  assert(input.spec.selector.matchLabels[key] === input.spec.template.metadata.labels[key], `${key} doesn't match`)
}

我不确定如何在 Rego 中编写等价物。我想出了一种方法来检查键是否存在,但我不知道如何检查值。这是我到目前为止所拥有的:

selector_match_labels {
    # keys in matchLabels are present in the template labels
    matchLabels := { label | input.spec.selector.matchLabels[label] }
    labels := { label | input.spec.template.metadata.labels[label] }
    count(matchLabels - labels) == 0
    # How to check the values of each key matches?
}
4

2 回答 2

1

您快到了。只需创建一组键值对而不是一组键。

matchLabels := { [label, value] | some label; value := input.spec.selector.matchLabels[label] }
labels := { [label, value] | some label; value := input.spec.template.metadata.labels[label] }
count(matchLabels - labels) == 0
于 2020-08-08T16:23:21.317 回答
0

这是另一种找到任何不匹配值的解决方案。

deny[msg] {
    some label
    val := input.spec.selector.matchLabels[label]
    val != input.spec.template.metadata.labels[label]
    msg = sprintf("template label %s must match selector", [ label ])
}

此解决方案用于some查找任何不匹配的密钥。这足以创建拒绝规则。这与“如果所有键/值匹配则允许”相反,后者对于拒绝规则来说足够好。

于 2020-08-08T18:45:45.097 回答