Open policy agent 如何将输入传递到定义集合文档的查询规则

Open policy agent 如何将输入传递到定义集合文档的查询规则,open-policy-agent,Open Policy Agent,在OPA的文档中,有许多用于查询的生成集/数组/对象的示例,例如: app_to_hostnames[app_name] = hostnames { app := apps[_] app_name := app.name hostnames := [hostname | name := app.servers[_] s := sites[_].servers[_]

在OPA的文档中,有许多用于查询的生成集/数组/对象的示例,例如:

app_to_hostnames[app_name] = hostnames {
    app := apps[_]
    app_name := app.name
    hostnames := [hostname | name := app.servers[_]
                            s := sites[_].servers[_]
                            s.name == name
                            hostname := s.hostname]
}
但是,在文档中,所有数据都是静态定义的:在示例中,变量
apps
已经存在,并定义为某个json对象

为了可重用性,我想定义一个返回集合/数组/对象但允许动态传递输入的函数。本质上,我想尝试做以下几点:

app_to_hostnames[app_name](apps) = hostnames {
    app := apps[_]
    app_name := app.name
    hostnames := [hostname | name := app.servers[_]
                            s := sites[_].servers[_]
                            s.name == name
                            hostname := s.hostname]
}
在这种情况下,应用程序作为函数输入传递。有没有办法在Rego政策中实现这一点?或者我应该用另一种方式来处理这个问题?还是有办法将不同的投入传递给不同的政策


我知道您可以通过RESTAPI将输入发送到特定的策略,并以这种方式进行控制,但在本例中,我使用的是传递输入文档的方法(例如json文件)通过终端发送到一组已编译的rego策略),因此使用restapi对我来说不起作用。

输入和
数据
文档是全局的。您始终可以使用
关键字替换给定表达式上的值,但有时将逻辑封装在函数中更为自然

该具体示例可以使用以下理解改写:

app_to_hostnames(apps, sites) = {app_name: hostnames |
    app := apps[_]
    app_name := app.name
    hostnames := [hostname | name := app.servers[_]
                            s := sites[_].servers[_]
                            s.name == name
                            hostname := s.hostname]
}
或者,您可以使用
with
关键字临时替换
数据
输入
文档的部分。例如,如果
应用程序
站点
是从包含
应用程序主机名
的文件中的数据下导入的,您可以查询
应用程序主机名
,如下所示:

mock_apps := [
  {"name": "foo", "servers": ["s1"]},
  {"name": "bar", "servers": ["s2", "s3"]},
]

mock_sites := [
  {"servers": [{"name": "s1", "hostname": "x.com"}]},
  {"servers": [{"name": "s2", "hostname": "y.com"}, {"name": "s3", "hostname": "z.com"}]},
]

app_to_hostnames == {"foo": ["x.com"], "bar": ["y.com", "z.com"]} with data.apps as mock_apps with data.sites as mock_sites

这里有一个指向操场内政策的链接:

输入文件和数据文件是全局文件。您始终可以使用
关键字替换给定表达式上的值,但有时将逻辑封装在函数中更为自然

该具体示例可以使用以下理解改写:

app_to_hostnames(apps, sites) = {app_name: hostnames |
    app := apps[_]
    app_name := app.name
    hostnames := [hostname | name := app.servers[_]
                            s := sites[_].servers[_]
                            s.name == name
                            hostname := s.hostname]
}
或者,您可以使用
with
关键字临时替换
数据
输入
文档的部分。例如,如果
应用程序
站点
是从包含
应用程序主机名
的文件中的数据下导入的,您可以查询
应用程序主机名
,如下所示:

mock_apps := [
  {"name": "foo", "servers": ["s1"]},
  {"name": "bar", "servers": ["s2", "s3"]},
]

mock_sites := [
  {"servers": [{"name": "s1", "hostname": "x.com"}]},
  {"servers": [{"name": "s2", "hostname": "y.com"}, {"name": "s3", "hostname": "z.com"}]},
]

app_to_hostnames == {"foo": ["x.com"], "bar": ["y.com", "z.com"]} with data.apps as mock_apps with data.sites as mock_sites
这里有一个链接指向游乐场内的政策: