OPAのSlackでやりとりされている内容とかが流れていってしまうのが勿体無いので残していこうと思います。(将来的に索引にできたら良いかなと)

上図のようなパターンを考えてみましょう。文で表現すると以下のとおりです。
p1, p2, p3, additional_pがすべてtrueの場合に許可する。additional_pはp9またはp10がtrueであれば良い。
これをRegoで書くと次のようになります。
package play
default allow = false
# this rule says "allow is true if p1 and p2 and p3 and additional_p"
allow {
p1
p2
p3
additional_p
}
p1 { input.x == 1 }
p2 { input.y == 2 }
p3 { input.z == 3 }
# additional_p is true if p9 or p10
additional_p {
p9
}
additional_p {
p10
}
p9 {
input.a == "foo"
}
p10 {
input.a == "bar"
}
ポイントは以下のとおりかと!
- ルールから別のルールを参照できる
- ルールの中身に書いた式は暗黙的にANDとして扱われる(allowの中のp1, p2, p3, additional_p)
- 同名のルールは暗黙的にORとして扱われる(additional_p)
試してみましょう!
次のJSONをInputに入れてみます。
{ "a": "bar", "x": 1, "y": 2, "z": 3 }
そうするとOutputは次のようになります。
{ "result": { "additional_p": true, "allow": true, "p1": true, "p10": true, "p2": true, "p3": true } }
true の結果が全部返ってくるのでちょっと見づらいですけど、 allow が true なのがわかります。
Inputの "a": "foo" とした場合でも allow は true です!
なぜなら p9 OR p10 であれば( input.a が foo または bar であれば ) additional_p は true だからです。
Rego Playgroundは下になりますので実際にInputを変えてみてOutputを確認してみると動きの違いを実際にみることができます!
おわりに
- PolicyのORやANDは暗黙的に行われる
- ルールの中からルールを呼び出すことでルールを整理できる