#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 не содержало этого значения.