Проверка на дублирование Application в ArgoCD с помощью OPA
Так уж вышло, что в ArgoCD плоская структура для хранения описания приложений - все они живут в одном namespace, а значит должны иметь уникальные имена, чтобы предостеречь себя от разных непонятных ситуаций есть простое решение - проверять, не дублируются ли эти самые имена.
Для реализации проверки будем использовать проверенный инструмент – Open Policy Agent, точнее даже не инструмент, а движок, который это все реализует, для самого запуска проверки будет использоваться conftest.
Для поиска дублей нужно описать политику (policy), она описывается в синтаксисе rego - не самая понятная штука, поэтому моя заметка служит просто готовым решением, детальное описание синтаксиса можно найти на сайте с документацией (есть даже песочница).
В репозитории, где храним спецификации для ArgoCD, создаем каталог policy, в нем файл argocd-applications.rego (например), с таким содержимым:
package main
deny[msg] {
i != j
currentFilePath = input[i].path
input[i].contents.kind == input[j].contents.kind
input[i].contents.metadata.name == input[j].contents.metadata.name
msg := sprintf("Объект с именем %s (kind: %s) из файла %s дублируется в файле %s",
[input[i].contents.metadata.name, input[i].contents.kind, currentFilePath, input[j].path])
}Ну, а дальше встраиваем вызов в нашем CI:
---
stages:
- lint
conftest:
image:
name: openpolicyagent/conftest:v0.34.0
entrypoint: [""]
stage: lint
script:
- conftest test --combine kubernetes/argocd-appsГде kubernetes/argocd-apps - путь до описания ваших Application для ArgoCD.