Использование содержит в правилах conftest

#open-policy-agent #conftest

Вопрос:

У меня есть следующий XML (это файл проекта dotnet:

 lt;Project Sdk="Microsoft.NET.Sdk"gt;  lt;ItemGroupgt;  lt;None Remove="appsettings.json" /gt;  lt;/ItemGroupgt;  lt;ItemGroupgt;  lt;ProjectReference Include="LoadA1Test" /gt;  lt;/ItemGroupgt; lt;/Projectgt;  

И следовать правилам:

 package main  project_reference = input.Project.ItemGroup[i].ProjectReference  deny[msg] {   not project_reference[i]["-Include"] = "XYZ"  msg = sprintf("in %s works n", [project_reference[i]]) }  deny[msg] {    not contains(project_reference[i]["-Include"],"XYZ")  msg = sprintf("in %s doesn't work n", [project_reference[i]]) }  

Когда я пытаюсь проверить с помощью conftest, первое правило не срабатывает, как ожидалось, но второе проходит. Я перепробовал несколько вариантов, но не знаю, что я делаю не так.

Ответ №1:

Некоторые вещи выглядят немного странно:

  • Итерация по группам элементов должна проходить внутри правил.
  • Используется != x для проверки, не равна ли строка x.

И я не думаю, что вам нужно будет повторно i использовать итератор, так как вы ищете ключ карты в справочнике по проекту. Что-то вроде этого может подойти:

 package main  deny[msg] {  project_reference := input.Project.ItemGroup[_].ProjectReference  project_reference["-Include"] != "XYZ"  msg = sprintf("-Include (%v) != XYZ", [project_reference["-Include"]]) }  deny[msg] {  project_reference := input.Project.ItemGroup[_].ProjectReference  not contains(project_reference["-Include"], "XYZ")  msg = sprintf("-Include: (%v) does not contain XYZ", [project_reference["-Include"]]) }  

Хотя я не уверен в логике, так как у вас всегда будет сбой первого правила, если значение-Include не совсем XYZ, поэтому не было бы особого смысла добавлять еще одно, чтобы запретить также, если-Include не содержало этого значения.