From 349ffd006ea49e2f2d7e766e39aa77ffe07545ef Mon Sep 17 00:00:00 2001 From: juvdiaz Date: Wed, 1 Jul 2026 19:12:37 -0600 Subject: [PATCH] Default cluster workers to Pimox only --- README.md | 9 +++++---- README.md.tmpl | 9 +++++---- docs/jeannie.1.md | 4 +++- jeannie | 29 ++++++++++++++++++++++------- tests/jeannie-unit | 23 ++++++++++++++++++++++- 5 files changed, 57 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index a6238eb..99c8cf8 100644 --- a/README.md +++ b/README.md @@ -802,10 +802,11 @@ select VM workers. Resume the runtime with: ./jeannie start-cluster ``` -To exclude the Raspberry Pi from the Kubernetes cluster, set -`LAB_INCLUDE_RASPBERRY_WORKER=false`. To manage workers manually instead, add -entries to -`bootstrap/cluster/variables.tf` or a `.tfvars` file: +Kubernetes worker generation defaults to automated Pimox workers only. The +Raspberry Pi stays out of the cluster unless `LAB_INCLUDE_RASPBERRY_WORKER=true` +is set. Stale manual workers in `.lab/manual-workers.tsv` are ignored unless +`LAB_INCLUDE_MANUAL_WORKERS=true` is set. To manage workers manually instead, +add entries to `bootstrap/cluster/variables.tf` or a `.tfvars` file: ```hcl worker_nodes = { diff --git a/README.md.tmpl b/README.md.tmpl index 4e6095a..720f8b9 100644 --- a/README.md.tmpl +++ b/README.md.tmpl @@ -802,10 +802,11 @@ select VM workers. Resume the runtime with: ./{{ main_script }} start-cluster ``` -To exclude the Raspberry Pi from the Kubernetes cluster, set -`LAB_INCLUDE_RASPBERRY_WORKER=false`. To manage workers manually instead, add -entries to -`bootstrap/cluster/variables.tf` or a `.tfvars` file: +Kubernetes worker generation defaults to automated Pimox workers only. The +Raspberry Pi stays out of the cluster unless `LAB_INCLUDE_RASPBERRY_WORKER=true` +is set. Stale manual workers in `.lab/manual-workers.tsv` are ignored unless +`LAB_INCLUDE_MANUAL_WORKERS=true` is set. To manage workers manually instead, +add entries to `bootstrap/cluster/variables.tf` or a `.tfvars` file: ```hcl worker_nodes = { diff --git a/docs/jeannie.1.md b/docs/jeannie.1.md index 7760eec..a012b29 100644 --- a/docs/jeannie.1.md +++ b/docs/jeannie.1.md @@ -620,7 +620,9 @@ script name. : Generated Pimox worker inventory. `.lab/manual-workers.tsv` -: User-managed manual worker inventory. +: User-managed manual worker inventory. Ignored by default; set +`LAB_INCLUDE_MANUAL_WORKERS=true` to merge it into the generated cluster worker +var file. `$HOMELAB_STATE_DIR/logs` : Jeannie command logs. diff --git a/jeannie b/jeannie index df20e1f..d7811e9 100755 --- a/jeannie +++ b/jeannie @@ -759,7 +759,10 @@ doctor_versions() { } truthy() { - case "${1,,}" in + local value + + value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" + case "${value}" in 1 | true | yes | on) return 0 ;; @@ -770,7 +773,10 @@ truthy() { } disabled_value() { - case "${1,,}" in + local value + + value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" + case "${value}" in 0 | false | no | off | disabled) return 0 ;; @@ -1745,12 +1751,21 @@ prepare_cluster_worker_var_file() { local manual_spec_file="${REPO_ROOT}/.lab/manual-workers.tsv" local pimox_spec_file="${REPO_ROOT}/.lab/pimox-workers.tsv" local var_file="${REPO_ROOT}/.lab/cluster-workers.auto.tfvars.json" + local include_manual="${LAB_INCLUDE_MANUAL_WORKERS:-false}" + local -a spec_files=() export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-${include_raspberry_default}}" mkdir -p "${REPO_ROOT}/.lab" ensure_static_pimox_worker_spec_file "${pimox_spec_file}" - write_cluster_worker_var_file "${var_file}" "${manual_spec_file}" "${pimox_spec_file}" + if truthy "${include_manual}"; then + spec_files+=("${manual_spec_file}") + elif ! disabled_value "${include_manual}"; then + echo "LAB_INCLUDE_MANUAL_WORKERS must be true or false." >&2 + return 1 + fi + spec_files+=("${pimox_spec_file}") + write_cluster_worker_var_file "${var_file}" "${spec_files[@]}" export LAB_CLUSTER_VAR_FILE="${var_file}" } @@ -4703,7 +4718,7 @@ apps() { ensure_cluster_worker_var_file() { if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then - prepare_cluster_worker_var_file true + prepare_cluster_worker_var_file false fi if truthy "${TF_VAR_allow_empty_worker_nodes:-false}"; then return 0 @@ -4865,7 +4880,7 @@ plan_homelab() { if [[ "${target}" == "all" ]]; then if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then - prepare_cluster_worker_var_file true + prepare_cluster_worker_var_file false fi stacks=( "bootstrap/provisioning" @@ -4877,7 +4892,7 @@ plan_homelab() { else stack="$(tofu_stack_from_plan_target "${target}")" if [[ "${stack}" == "bootstrap/cluster" && -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then - prepare_cluster_worker_var_file true + prepare_cluster_worker_var_file false fi stacks=("${stack}") fi @@ -4893,7 +4908,7 @@ rebuild_cluster() { require_debian_server "rebuild-cluster" export WORKER_SSH_TARGETS="${WORKER_SSH_TARGETS:-}" - export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-true}" + export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-false}" export LAB_PIMOX_TEMPLATE_REPLACE_EXISTING="${LAB_PIMOX_TEMPLATE_REPLACE_EXISTING:-true}" export LAB_PIMOX_WORKER_COUNT="${LAB_PIMOX_WORKER_COUNT:-2}" export LAB_PIMOX_WORKER_REPLACE_EXISTING="${LAB_PIMOX_WORKER_REPLACE_EXISTING:-true}" diff --git a/tests/jeannie-unit b/tests/jeannie-unit index 12e412e..6de7ca0 100755 --- a/tests/jeannie-unit +++ b/tests/jeannie-unit @@ -168,6 +168,7 @@ test_cluster_worker_targets_include_pimox_and_manual_workers() { test_prepare_cluster_worker_var_file_merges_manual_and_pimox_workers() { unset LAB_INCLUDE_RASPBERRY_WORKER + LAB_INCLUDE_MANUAL_WORKERS=true LAB_PIMOX_WORKER_NODE_LABELS_JSON='{"homelab.dev/node-role":"app","homelab.dev/storage":"ssd"}' LAB_MANUAL_WORKER_NODE_LABELS_JSON='{"homelab.dev/node-role":"manual","homelab.dev/storage":"custom"}' prepare_cluster_worker_var_file false @@ -190,7 +191,26 @@ if labels["manual01"]["homelab.dev/node-role"] != "manual": raise SystemExit("manual labels were not applied") PY pass "worker var file merges manual and Pimox workers" - unset LAB_PIMOX_WORKER_NODE_LABELS_JSON LAB_MANUAL_WORKER_NODE_LABELS_JSON LAB_CLUSTER_VAR_FILE LAB_INCLUDE_RASPBERRY_WORKER + unset LAB_INCLUDE_MANUAL_WORKERS LAB_PIMOX_WORKER_NODE_LABELS_JSON LAB_MANUAL_WORKER_NODE_LABELS_JSON LAB_CLUSTER_VAR_FILE LAB_INCLUDE_RASPBERRY_WORKER +} + +test_prepare_cluster_worker_var_file_excludes_manual_by_default() { + unset LAB_INCLUDE_RASPBERRY_WORKER LAB_INCLUDE_MANUAL_WORKERS + prepare_cluster_worker_var_file false + python3 - "${LAB_DIR}/cluster-workers.auto.tfvars.json" <<'PY' +import json +import sys + +with open(sys.argv[1], encoding="utf-8") as handle: + document = json.load(handle) +nodes = document["worker_nodes"] +if "manual01" in nodes: + raise SystemExit("manual worker was included without LAB_INCLUDE_MANUAL_WORKERS=true") +if set(nodes) != {"pimox01", "pimox02", "pimox03"}: + raise SystemExit(f"unexpected worker keys: {sorted(nodes)}") +PY + pass "worker var file excludes manual workers by default" + unset LAB_CLUSTER_VAR_FILE LAB_INCLUDE_RASPBERRY_WORKER LAB_INCLUDE_MANUAL_WORKERS } test_prepare_cluster_worker_var_file_can_include_raspberry_worker() { @@ -380,6 +400,7 @@ test_configured_worker_count_cannot_hide_existing_workers test_configured_worker_count_can_expand_target_set test_cluster_worker_targets_include_pimox_and_manual_workers test_prepare_cluster_worker_var_file_merges_manual_and_pimox_workers +test_prepare_cluster_worker_var_file_excludes_manual_by_default test_prepare_cluster_worker_var_file_can_include_raspberry_worker test_prepare_cluster_worker_var_file_rebuilds_static_pimox_spec test_report_renderer_hides_ok_links