从一个集合中检索一个值,其中密钥来自 Open Policy Agent (OPA) 中的另一个集合

Retrieve a value from a set where the key comes from another set in Open Policy Agent (OPA)

我已经通读了 OPA 'Policy Language' 页面,但我的问题只是得到了一定程度的解决...在这里寻找清晰度 ;)

我有两套:

"servers": {
  "server1": [ "silver" ],
  "server2": [ "gold" ]
}

"plan": {
  "gold": [ "1000" ],
  "silver": [ "100" ]
}

在我的数据部分。我需要一个规则,给定 input.server = "server2" 将 return "1000" ...所以设置查找为第二次查找提供密钥。

我正在尝试这个:

rate msg = {
  p := servers[input.server]
  msg := plan[p]
}

但是 OPA 吐了所有的东西。它在我看来是可行的,但在为此制定规则方面没有取得任何成功。谢谢!

servers[input.server] 将要 return 一个列表 ([ "1000" ]) 而不是 "1000",因此如果您需要将项目从列表中取出想用它作为在 plan 对象中查找的键。此外,rate 规则有一些语法错误。这应该有效:

servers := {
    "server1": ["silver"],
    "server2": ["gold"]
}

plan := {
    "gold": ["1000"],
    "silver": ["100"]
}

rate = msg {
    p := servers[input.server][0]
    msg := plan[p]
}

最后,并不是吹毛求疵 :),但您的数据中没有任何 - 只有列表和地图。如果需要,请使用大括号,即 { "1000" } 而不是 [ ]