diff --git a/Makefile.custom.mk b/Makefile.custom.mk index e8b77cb8..99f8b3d7 100644 --- a/Makefile.custom.mk +++ b/Makefile.custom.mk @@ -34,6 +34,9 @@ docker-compose: ## Download docker-compose locally if necessary. curl -sL "https://github.com/docker/compose/releases/download/$(LATEST_RELEASE)/docker-compose-linux-x86_64" -o $(DOCKER_COMPOSE) chmod +x $(DOCKER_COMPOSE) +local: + ./hack/bin/run-local.sh + # go-get-tool will 'go get' any package $2 and install it to $1. PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) define go-get-tool diff --git a/README.md b/README.md index b702bf9c..9ddf1460 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ make See `make help` for help. +If you want to run the operator locally against an existing cluster, you can use `make local` which will use `hack/bin/run-local.sh` to setup a local instance for the operator. + ## Architecture TODO(atlas): Fill this out diff --git a/hack/bin/run-local.sh b/hack/bin/run-local.sh new file mode 100755 index 00000000..dedcc2bf --- /dev/null +++ b/hack/bin/run-local.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# When developing the observability-operator, it is useful to run it locally against a real cluster. +# This script sets up the environment and runs the operator locally. + +NAMESPACE="monitoring" +declare -a OLLYOPARGS +declare PORTFORWARDPID + + +# Define the arguments for the observability-operator +function defineOLLYOPARGS { + # We take all args from the deployment, except the leader-elect one which we don't want for local development + mapfile -t OLLYOPARGS < <(kubectl -n "$NAMESPACE" get deployment observability-operator -ojson | jq -Mr '.spec.template.spec.containers[0].args[]' | grep -v "leader-elect") +} + +# Populate environment variables +function setEnvFromSecrets { + local specenv envname secretname secretkey envvalue + + for specenv in $(kubectl get deployment -n "$NAMESPACE" observability-operator -ojson | jq -c -M '.spec.template.spec.containers[0].env[]') ; do + envname=$(echo "$specenv" | jq -r '.name') + secretname=$(echo "$specenv" | jq -r '.valueFrom.secretKeyRef.name') + secretkey=$(echo "$specenv" | jq -r '.valueFrom.secretKeyRef.key') + envvalue=$(kubectl get secret -n "$NAMESPACE" "$secretname" -ojson | jq -c -M -r '.data["'"$secretkey"'"]' | base64 -d) + + echo "### setting $envname" + export "$envname"="$envvalue" + + done +} + +# Port-forward the Grafana service +function portForwardGrafana { + kubectl port-forward -n "$NAMESPACE" svc/grafana 3000:80 &>/dev/null & + PORTFORWARDPID="$!" +} + +# Stop the Grafana service port-forward +function stopPortForward { + kill "$PORTFORWARDPID" +} + +# Pause the in-cluster operator +function pauseInClusterOperator { + kubectl -n monitoring scale deployment observability-operator --replicas 0 +} + +# Resume the in-cluster operator +function resumeInClusterOperator { + kubectl -n monitoring scale deployment observability-operator --replicas 1 +} + +# Cleanup function +function cleanupAtExit { + stopPortForward + resumeInClusterOperator +} + + +function main { + + # make sure the script restores cluster at exit + trap cleanupAtExit SIGINT SIGQUIT SIGABRT SIGTERM + + echo "### set env vars set" + setEnvFromSecrets + echo "### define ollyop args" + defineOLLYOPARGS + echo "### ollyorg args set" + + echo "### starting port-forward" + portForwardGrafana + + echo "### Pausing in-cluster operator" + pauseInClusterOperator + + echo "### Running operator" + go run . "${OLLYOPARGS[@]}" -kubeconfig ~/.kube/config + + echo "### Cleanup" +} + +main "$@"