Как я могу проверить нарушения?

Тесты, на которые я наткнулся, похоже, во многом повторяют те же самые.

Я ищу нарушения с Привратником.

Например, эта политика шаблона ограничений будет проверять репо, из которого пришел контейнер:

package k8sallowedrepos

violation[{"msg": msg}] {
  container := input.review.object.spec.containers[_]
  satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
  not any(satisfied)
  msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
}

violation[{"msg": msg}] {
  container := input.review.object.spec.initContainers[_]
  satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
  not any(satisfied)
  msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
}

Где я могу начать тестирование?

1 ответ

Если вы пишете свои собственные шаблоны для OPA Gatekeeper, мы рекомендуем писать тесты для правил в этих шаблонах, как и любые другие правила, которые вы пишете для OPA. В этом случае вы хотите написать тесты для проверки отказа (т. Е. Все утверждения в одном из правил совпадают) и отсутствия результата (т. Е. По крайней мере одно из утверждений в обоих правилах не соответствует). Мы рекомендуем вам максимально использовать возможности OPA для разработки через тестирование (TDD).

package k8sallowedrepos

test_image_safety_positive {
    count(violation) == 1 with input.parameters.repos as ["hooli.com/"]
        with input.review.object.spec.containers as [
            {"name": "ok", "image": "hooli.com/web"},
            {"name": "bad", "image": "badrepo.com/web"},
        ]
}

test_image_safety_negative {
    count(violation) == 0 with input.parameters.repos as ["hooli.com/"]
        with input.review.object.spec.containers as [
            {"name": "ok", "image": "hooli.com/web"},
        ]
}

test_image_safety_init_container_positive {
    count(violation) == 1 with input.parameters.repos as ["hooli.com/"]
        with input.review.object.spec.initContainers as [
            {"name": "ok", "image": "hooli.com/web"},
            {"name": "bad", "image": "badrepo.com/web"},
        ]
}

test_image_safety_init_container_negative {
    count(violation) == 0 with input.parameters.repos as ["hooli.com/"]
        with input.review.object.spec.initContainers as [
            {"name": "ok", "image": "hooli.com/web"},
        ]
}

Шаблон, который мы использовали в библиотеке OPA Gatekeeper (WIP), заключается в том, чтобы включать тесты в тот же пакет, что и правила, но в отдельный файл в том же каталоге (например, src.rego и src_test.rego). Ссылка: https://github.com/open-policy-agent/gatekeeper/tree/master/library. Обратите внимание, что файл YAML ConstraintTemplate, который в конечном итоге загружает правила в кластер, следует рассматривать как артефакт сборки. Сохраните исходный код в файле.rego на диске (в системе управления версиями), а затем сгенерируйте YAML ContsraintTemplate из этих файлов.

Другие вопросы по тегам