diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md new file mode 100644 index 0000000..5da7ae8 --- /dev/null +++ b/CONTRIBUTE.md @@ -0,0 +1,66 @@ +# Developper documentation + +The zuul operator is a container application that manages a +zuul service described by a high level description (named CR). +Its goal is to create the kubernetes resources and to perform +the runtime operations. + +To describe the kubernetes resources such as Deployment and Service, +the zuul operator uses the Dhall language to convert the CR input +into the kubernetes resources. + +To apply and manage the resources, the zuul operator uses Ansible +through the operator-framework to execute the roles/zuul when +a Zuul CR is requested. + +The following sections explain how to evaluate the Dhall configuration +and the Ansible task locally, outside of a kubernetes pod. +This simplifies the development and contribution process. + + +## Setup tools + +Install the `dhall-to-yaml` and `yaml-to-dhall` tool by following this tutorial: +https://docs.dhall-lang.org/tutorials/Getting-started_Generate-JSON-or-YAML.html#installation + +Or use the zuul-operator image: + +```bash +CR="podman" +alias dhall-to-yaml="$CR run --rm --entrypoint dhall-to-yaml -i docker.io/zuul/zuul-operator" +alias yaml-to-dhall="$CR run --rm --entrypoint yaml-to-dhall -i docker.io/zuul/zuul-operator" +``` + +## Evaluate the dhall expression manually: + +First you need to convert a CR spec to a dhall record, for example using the test file `playbooks/files/cr_spec.yaml`: + +```bash +INPUT=$(yaml-to-dhall "(./conf/zuul/input.dhall).Input.Type" < playbooks/files/cr_spec.yaml) +``` + +Then you can evaluate the resources function, for example to get the scheduler service: + +```bash +dhall-to-yaml --omit-empty --explain <<< "(./conf/zuul/resources.dhall ($INPUT)).Components.Zuul.Scheduler" +``` + +Or get all the kubernetes resources: + +```bash +dhall-to-yaml --omit-empty <<< "(./conf/zuul/resources.dhall ($INPUT)).List" +``` + +## Run the ansible roles locally + +Given a working `~/.kube/config` context, you can execute the Ansible roles directly using: + +```bash +ansible-playbook -v playbooks/files/local.yaml +``` + +Then cleanup the resources using: + +```bash +ansible-playbook -v playbooks/files/local.yaml -e k8s_state=absent +```