127 lines
4.0 KiB
Bash
127 lines
4.0 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
require_debian_server() {
|
|
local command_name="$1"
|
|
local os_id=""
|
|
|
|
if [[ "$(uname -s)" != "Linux" ]]; then
|
|
echo "Refusing to run '${command_name}' from this machine. Run it on the Debian homelab server." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -r /etc/os-release ]]; then
|
|
os_id="$(awk -F= '$1 == "ID" {gsub(/"/, "", $2); print $2; exit}' /etc/os-release)"
|
|
fi
|
|
|
|
if [[ "${os_id}" != "debian" ]]; then
|
|
echo "Refusing to run '${command_name}' on ${os_id:-unknown OS}. Run it on the Debian homelab server." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
tofu_state_has_resource() {
|
|
local stack="$1"
|
|
local resource_address="$2"
|
|
|
|
tofu -chdir="${REPO_ROOT}/${stack}" state show "${resource_address}" >/dev/null 2>&1
|
|
}
|
|
|
|
helm_release_secret_exists() {
|
|
local namespace="$1"
|
|
local release_name="$2"
|
|
local secret_name
|
|
|
|
secret_name="$(kubectl --kubeconfig "${KUBECONFIG_PATH}" -n "${namespace}" get secrets \
|
|
-l "owner=helm,name=${release_name}" \
|
|
-o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true)"
|
|
|
|
[[ -n "${secret_name}" ]]
|
|
}
|
|
|
|
kubernetes_resource_exists() {
|
|
local namespace="$1"
|
|
local resource_kind="$2"
|
|
local resource_name="$3"
|
|
|
|
if [[ -n "${namespace}" ]]; then
|
|
kubectl --kubeconfig "${KUBECONFIG_PATH}" -n "${namespace}" get "${resource_kind}" "${resource_name}" >/dev/null 2>&1
|
|
return $?
|
|
fi
|
|
|
|
kubectl --kubeconfig "${KUBECONFIG_PATH}" get "${resource_kind}" "${resource_name}" >/dev/null 2>&1
|
|
}
|
|
|
|
adopt_tofu_helm_release() {
|
|
local stack="$1"
|
|
local resource_address="$2"
|
|
local namespace="$3"
|
|
local release_name="$4"
|
|
local has_state=false
|
|
local has_release_secret=false
|
|
|
|
if tofu_state_has_resource "${stack}" "${resource_address}"; then
|
|
has_state=true
|
|
fi
|
|
if helm_release_secret_exists "${namespace}" "${release_name}"; then
|
|
has_release_secret=true
|
|
fi
|
|
|
|
if [[ "${has_state}" == "true" && "${has_release_secret}" == "false" ]]; then
|
|
echo "Removing stale Helm release state for ${namespace}/${release_name} from ${stack} (${resource_address}) because no Helm release secret exists..."
|
|
tofu -chdir="${REPO_ROOT}/${stack}" state rm "${resource_address}"
|
|
return 0
|
|
fi
|
|
|
|
if [[ "${has_state}" == "true" ]]; then
|
|
return 0
|
|
fi
|
|
if [[ "${has_release_secret}" == "false" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
echo "Importing existing Helm release ${namespace}/${release_name} into ${stack} state (${resource_address})..."
|
|
tofu -chdir="${REPO_ROOT}/${stack}" import -input=false "${resource_address}" "${namespace}/${release_name}"
|
|
}
|
|
|
|
adopt_tofu_kubernetes_resource() {
|
|
local stack="$1"
|
|
local resource_address="$2"
|
|
local namespace="$3"
|
|
local resource_kind="$4"
|
|
local resource_name="$5"
|
|
local import_id="$6"
|
|
|
|
if tofu_state_has_resource "${stack}" "${resource_address}"; then
|
|
return 0
|
|
fi
|
|
if ! kubernetes_resource_exists "${namespace}" "${resource_kind}" "${resource_name}"; then
|
|
return 0
|
|
fi
|
|
|
|
echo "Importing existing Kubernetes ${resource_kind} ${resource_name} into ${stack} state (${resource_address})..."
|
|
tofu -chdir="${REPO_ROOT}/${stack}" import -input=false "${resource_address}" "${import_id}"
|
|
}
|
|
|
|
adopt_tofu_kubernetes_manifest() {
|
|
local stack="$1"
|
|
local resource_address="$2"
|
|
local namespace="$3"
|
|
local kubectl_kind="$4"
|
|
local api_version="$5"
|
|
local manifest_kind="$6"
|
|
local resource_name="$7"
|
|
local import_id
|
|
|
|
if tofu_state_has_resource "${stack}" "${resource_address}"; then
|
|
return 0
|
|
fi
|
|
if ! kubernetes_resource_exists "${namespace}" "${kubectl_kind}" "${resource_name}"; then
|
|
return 0
|
|
fi
|
|
|
|
import_id="apiVersion=${api_version},kind=${manifest_kind},namespace=${namespace},name=${resource_name}"
|
|
echo "Importing existing Kubernetes ${manifest_kind} ${namespace}/${resource_name} into ${stack} state (${resource_address})..."
|
|
tofu -chdir="${REPO_ROOT}/${stack}" import -input=false "${resource_address}" "${import_id}"
|
|
}
|
|
|