0

在 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 政策中实现这一目标?还是我应该以不同的方式解决问题?或者有没有办法将不同的输入传递给不同的策略?

我知道您可以通过 REST API 将输入发送到特定策略并以这种方式控制它,但在这种情况下,我使用conftest将输入文档(例如 json 文件)传递给已编译的 rego 策略集)通过终端,所以使用 REST API 对我不起作用。

4

1 回答 1

2

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

可以使用理解重写该特定示例:

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关键字临时替换部分datainput文档。例如,如果apps,sites是从包含app_to_hostnames您的文件中的数据下导入的,则可以查询app_to_hostnames如下:

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

这是操场内政策的链接:https ://play.openpolicyagent.org/p/pEp6BLCtgn

于 2019-09-04T14:51:10.087 回答