#!/bin/bash # Methods library for fip_controller — sourced by generated run-*.sh scripts. # SCRIPT_DIR must be set before sourcing. set -euo pipefail _kubectl() { if command -v kubectl >/dev/null 2>&1; then command kubectl "$@" elif command -v k0s >/dev/null 2>&1; then k0s kubectl "$@" else echo "ERROR: no kubectl or k0s binary found" >&2; exit 127 fi } _require_env() { local var="$1" if [ -z "${!var:-}" ]; then echo "ERROR: required variable $var is not set" >&2; exit 1 fi } _wait_for_pod() { local timeout="${1:-120}" _kubectl wait pod \ --namespace "${FIP_CONTROLLER_NAMESPACE:-kube-system}" \ --selector "app.kubernetes.io/name=${FIP_CONTROLLER_NAME:-fip-controller}" \ --for=condition=Ready \ --timeout="${timeout}s" } # ── Manifest plan helpers ───────────────────────────────────────────────────── _plan_apply() { local file="$1" local path="$SCRIPT_DIR/manifests/${file}.yaml" [ -f "$path" ] || { echo " [skip] ${file}.yaml not in manifests/"; return 0; } _kubectl apply -f "$path" } _plan_apply_skip() { local file="$1" local path="$SCRIPT_DIR/manifests/${file}.yaml" [ -f "$path" ] || { echo " [skip] ${file}.yaml not in manifests/"; return 0; } if _kubectl get -f "$path" >/dev/null 2>&1; then echo " [skip] ${file} already exists in cluster" return 0 fi _kubectl apply -f "$path" } _plan_rollout_restart() { local file="$1" local path="$SCRIPT_DIR/manifests/${file}.yaml" [ -f "$path" ] || { echo " [skip] ${file}.yaml not in manifests/"; return 0; } _kubectl rollout restart -f "$path" } _plan_delete() { local file="$1" local path="$SCRIPT_DIR/manifests/${file}.yaml" [ -f "$path" ] || { echo " [skip] ${file}.yaml not in manifests/"; return 0; } _kubectl delete -f "$path" --ignore-not-found } _plan_recreate() { local file="$1" local path="$SCRIPT_DIR/manifests/${file}.yaml" [ -f "$path" ] || { echo " [skip] ${file}.yaml not in manifests/"; return 0; } _kubectl delete -f "$path" --ignore-not-found _kubectl apply -f "$path" } # ── Component methods ───────────────────────────────────────────────────────── _method_create-credentials() { [ -f "${SCRIPT_DIR}/_credentials.env" ] && set -a && source "${SCRIPT_DIR}/_credentials.env" && set +a _require_env HCLOUD_TOKEN _kubectl create secret generic "${FIP_CONTROLLER_NAME:-fip-controller}-secret" \ --namespace "${FIP_CONTROLLER_NAMESPACE:-kube-system}" \ --from-literal=HCLOUD_TOKEN="$HCLOUD_TOKEN" \ --dry-run=client -o yaml | _kubectl apply -f - echo " [ok] secret '${FIP_CONTROLLER_NAME:-fip-controller}-secret' created in ${FIP_CONTROLLER_NAMESPACE:-kube-system}" } _method_delete-credentials() { _kubectl delete secret "${FIP_CONTROLLER_NAME:-fip-controller}-secret" \ --namespace "${FIP_CONTROLLER_NAMESPACE:-kube-system}" \ --ignore-not-found echo " [ok] secret '${FIP_CONTROLLER_NAME:-fip-controller}-secret' deleted from ${FIP_CONTROLLER_NAMESPACE:-kube-system}" } _method_wait-ready() { _wait_for_pod 120 }