ИЛИ в агенте открытой политики (поведение объединения) - PullRequest
0 голосов
/ 10 октября 2019

В OPA ясно, как сделать запрос к condition AND condition:

values := {
  "value1": {
    "a": "one"
  },
  "value2": {
    "a": "one",
    "b": "two"
  },
  "value3": {
    "a": "one",
    "b": "one"
  }
}

goodValues = [name |
  value = values[name]
  value.a == "one"
  value.b == "one"
]

Так что goodValues здесь будет содержать только value3.

Но как запросить condition OR condition, так что goodValues будет содержать все 3 значения, потому что они имеют либо value.a == "one" ИЛИ value.b == "one"?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Объединение нескольких выражений вместе выражает логическое И. Для выражения логического ИЛИ вы определяете несколько правил или функций с одним и тем же именем. Есть несколько способов, которыми это может работать. Это рассматривается во введении к OPA: https://www.openpolicyagent.org/docs/latest/#logical-or.

Вариант 1: Понимания и функции

Условия, которые вы хотите выразить по отношению к значению, могут быть учтены во вспомогательных функциях, а затем в пониманиизапрос может ссылаться на функцию.

goodValues = [name |
  value := values[name]
  value_match(value)
]

value_match(v) {
  v.a == "one"
}

value_match(v) {
  v.b = "two"
}

Опция 2: инкрементные правила

В OPA / Rego инкрементальные правила присваивают набор значений переменной. Определение правила предоставляет логику для генерации установленных значений. В отличие от пониманий, вы можете перегрузить определение правила (предоставив несколько с одним и тем же именем) и выразить логическое ИЛИ, как объясняет другой ответ.

0 голосов
/ 10 октября 2019

До сих пор нашел некрасивый ответ через инкрементальный набор :

goodValues[name] {
  value = values[name]
  value.a == "one"
}

goodValues[name] {
  value = values[name]
  value.b == "one"
}

Но что, если это общее условие value = values[name] усложняется? Нужно ли будет извлекать его в отдельную переменную (и повторять в каждой инструкции условия)? Есть лучшее решение?

...