首页 > 解决方案 > 从一个集合中检索一个值,其中密钥来自开放策略代理 (OPA) 中的另一个集合

问题描述

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

我有两套:

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

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

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

我正在尝试这个:

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

但是 OPA 到处都是。在我看来它是可行的,但在为此制定规则方面没有任何成功。谢谢!

标签: opaopen-policy-agent

解决方案


servers[input.server]将返回一个列表 ( [ "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" }[ ]如果你想要那些。


推荐阅读