我想在我的策略失败时返回一个非零退出代码,以便我的CI/CD buildspec停止构建。我还想从我的规则返回一个字符串错误消息。
我注意到opa eval命令的——fail和——fail-defined选项。这些选择看起来很完美。但是,返回一个字符串技术上不是'失败'或返回'未定义'。所以,对我来说,似乎不可能返回字符串错误消息以及一个非零的退出代码,同时不破坏良好的输出字符串和测试用例。
我说的对吗?有没有什么办法可以两全其美呢?我对Rego还是新手
exrego文件:
package play
default hello := "hello failed"
hello := "hello passed" {
input.message == "world"
}
输入:{"message": "world"}
无论如何,运行以下命令将返回一个非零退出码opa eval -i .input.json -d .test_rego.rego 'data.play.hello' --fail-defined -f raw
同样,下面的命令也没有帮助,因为在这种情况下,结果总是被定义的opa eval -i .input.json -d .test_rego.rego 'data.play.hello' --fail -f raw
感谢您的帮助
这是一个有趣的例子。通常你会有布尔规则来工作,或者在你想要返回的情况下,例如一个消息部分集规则,你可以测试空。如果您真的想为失败和成功的情况返回一个字符串,您可以使用not
来实现:
opa eval -d test_rego.rego -i input.json --fail 'not data.play.hello == "hello passed"'
如果使用部分规则,即:
hello["hello passed"] {
input.message == "world"
}
您可以在规则上测试迭代以检查是否为空:
opa eval -d play.rego --fail 'data.play.hello[_]'