#!/usr/bin/env bash # Greatly inspired by https://github.com/k8spatterns/examples/blob/master/advanced/Controller/config-watcher-controller.sh. # API URL setup. Requires an ambassador API proxy running side-by-side on localhost base="http://localhost:8001" ns="namespaces/default" # Main event loop start_event_loop() { # Watch the K8s API on events on service objects echo "::: Starting to wait for events" # Event loop listening for changes in config maps curl -N -s "$base/api/v1/$ns/configmaps?watch=true" | while read -r event do # Event type & name local type=$(echo "${event}" | jq -r .type) local config_map=$(echo "${event}" | jq -r .object.metadata.name) # Fetch annotations of ConfigMap and extract our trigger annotation if any # The extracted pod selector is expected to have # the format "label1=value1,label2=value2,.." local annotations=$(echo "${event}" | jq -r '.object.metadata.annotations') local pod_selector="" if [[ "${annotations}" != "null" ]]; then pod_selector=$(echo ${annotations} | jq -r 'to_entries | .[] | select(.key == "k8spatterns.io/podDeleteSelector") | .value') fi echo "::: ${type} -- ${config_map} -- ${pod_selector}" # Act only when configmap is modified and an annotation has been given if [[ ${type} = "MODIFIED" ]] && [[ -n "${pod_selector}" ]]; then delete_pods_with_selector "${pod_selector}" fi done } # Delete all pods that match a selector delete_pods_with_selector() { local selector=${1} echo "::::: Deleting pods with $selector" # Pick up all pod names which match the given selector local pods=$(curl -s ${base}/api/v1/${ns}/pods?labelSelector=${selector} | \ jq -r .items[].metadata.name) # Delete all pods that matched for pod in ${pods}; do # Delete but also check exit code exit_code=$(curl -s -X DELETE -o /dev/null -w "%{http_code}" ${base}/api/v1/${ns}/pods/${pod}) if [[ ${exit_code} -eq 200 ]]; then echo "::::: Deleted pod $pod" else echo "::::: Error deleting pod $pod: $exit_code" fi done } # ============================================== # Fire up start_event_loop