September 2, 2022

Проверка на дублирование 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.