【问题标题】:REGO how to get object (map) keys that match a patternREGO如何获取与模式匹配的对象(映射)键
【发布时间】:2022-01-14 17:53:21
【问题描述】:

使用RegoOpen Policy Agent (OPA)“规则”语言,并给出以下数据:

{
    "x-foo": "a",
    "x-bar": "b",
    "y-foo": "c",
    "y-bar": "d"
}

什么是正确的 Rego 表达式或语句来获取以“x-”开头的键?也就是说,我想要一个数组

[ "x-foo", "x-bar" ]

我知道startswith() 函数,我在comprehensions 上尝试过各种尝试,但无论我尝试什么都无法让它工作。

任何帮助将不胜感激。

【问题讨论】:

    标签: kubernetes opa open-policy-agent rego


    【解决方案1】:

    这可以通过使用如您所建议的理解或 generates a set 的部分规则来完成:

    x_foo_comprehension := [key | object[key]; startswith(key, "x-")]
    
    x_foo_rule[key] {
        object[key]
        startswith(key, "x-")
    }
    

    最后,如果你需要考虑嵌套键,你可以使用内置的 walk 来遍历对象:

    x_foo_rule[key] {
        walk(object, [path, value])
        last := path[count(path) - 1]
        startswith(last, "x-")
        key := concat(".", path)
    }
    
    # x_foo_rule == {
    #     "x-bar",
    #     "x-foo",
    #     "y-bar.x-bar",
    #     "y-bar.x-foo"
    # ]
    

    【讨论】:

    • 谢谢,Devoops,这让我得到了足够的答案,我能够解决我的全部问题。
    • 太棒了!您可以将答案标记为已接受:)
    【解决方案2】:

    理解格式

    mm = {
        "x-foo": "a",
        "x-bar": "b",
        "y-foo": "c",
        "y-bar": "d"
        }
    x_keys = [key for key in mm.keys() if key.startswith('x')]
    print(x_keys)
    

    mm = {
        "x-foo": "a",
        "x-bar": "b",
        "y-foo": "c",
        "y-bar": "d"
        }
    
    for i in mm.keys():
        if i.startswith('x'):
            print(i)
    

    我希望你觉得这很有用。

    【讨论】:

    • 我最初的问题并没有说明我在 OPA Rego 工作,所以这可能使我的问题变得不那么清晰。对于那个很抱歉。除非我弄错了,否则这不是有效的 Rego 语法。我在“opa run”中尝试了它——与你发布的完全一样,并进行了各种修改——我得到一个或多个语法错误。 Rego 是一种声明性语言,我认为它不支持“for”循环。
    • 我正在使用 opa 版本 0.36.1,但仍然遇到语法错误。您是否可能使用较新的版本?或者你做了一个你没有展示的“导入”?谢谢。
    猜你喜欢
    • 2016-04-20
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2016-01-18
    相关资源
    最近更新 更多