- Conversion config hardcodée en variables (CLUSTER_NODES) - Détection nœud distant data-driven (extensible à 3+ nœuds) - Tests unitaires BATS avec mocks complets (32 tests) - CI/CD Forgejo avec shellcheck et validation syntaxe - Mode test pour sourcing sans exécution du main
170 lines
4.8 KiB
Bash
170 lines
4.8 KiB
Bash
#!/usr/bin/env bats
|
|
#
|
|
# Tests unitaires pour la configuration des nœuds
|
|
# Test de la logique de découverte du nœud distant
|
|
#
|
|
|
|
load test_helper
|
|
|
|
setup() {
|
|
setup_script_env
|
|
}
|
|
|
|
teardown() {
|
|
cleanup_script_env
|
|
}
|
|
|
|
# ============================================================================
|
|
# Tests: Configuration des nœuds avec CLUSTER_NODES
|
|
# ============================================================================
|
|
|
|
@test "CLUSTER_NODES: contient acemagician et elitedesk" {
|
|
# Vérifier que le tableau associatif est bien défini
|
|
[ -n "${CLUSTER_NODES[acemagician]}" ]
|
|
[ -n "${CLUSTER_NODES[elitedesk]}" ]
|
|
}
|
|
|
|
@test "CLUSTER_NODES: IPs correctes pour chaque nœud" {
|
|
[ "${CLUSTER_NODES[acemagician]}" = "192.168.100.10" ]
|
|
[ "${CLUSTER_NODES[elitedesk]}" = "192.168.100.20" ]
|
|
}
|
|
|
|
# ============================================================================
|
|
# Tests: Détection du nœud distant
|
|
# ============================================================================
|
|
|
|
@test "Nœud distant: elitedesk détecte acemagician" {
|
|
export TEST_HOSTNAME="elitedesk"
|
|
LOCAL_NODE=$(hostname)
|
|
|
|
# Trouver le nœud distant
|
|
REMOTE_NODE_NAME=""
|
|
REMOTE_NODE_IP=""
|
|
for node in "${!CLUSTER_NODES[@]}"; do
|
|
if [[ "$node" != "$LOCAL_NODE" ]]; then
|
|
REMOTE_NODE_NAME="$node"
|
|
REMOTE_NODE_IP="${CLUSTER_NODES[$node]}"
|
|
break
|
|
fi
|
|
done
|
|
|
|
[ "$REMOTE_NODE_NAME" = "acemagician" ]
|
|
[ "$REMOTE_NODE_IP" = "192.168.100.10" ]
|
|
}
|
|
|
|
@test "Nœud distant: acemagician détecte elitedesk" {
|
|
export TEST_HOSTNAME="acemagician"
|
|
LOCAL_NODE=$(hostname)
|
|
|
|
# Trouver le nœud distant
|
|
REMOTE_NODE_NAME=""
|
|
REMOTE_NODE_IP=""
|
|
for node in "${!CLUSTER_NODES[@]}"; do
|
|
if [[ "$node" != "$LOCAL_NODE" ]]; then
|
|
REMOTE_NODE_NAME="$node"
|
|
REMOTE_NODE_IP="${CLUSTER_NODES[$node]}"
|
|
break
|
|
fi
|
|
done
|
|
|
|
[ "$REMOTE_NODE_NAME" = "elitedesk" ]
|
|
[ "$REMOTE_NODE_IP" = "192.168.100.20" ]
|
|
}
|
|
|
|
@test "Nœud distant: erreur si nœud local inconnu" {
|
|
export TEST_HOSTNAME="unknown-node"
|
|
LOCAL_NODE=$(hostname)
|
|
|
|
# Vérifier que le nœud local n'est pas dans la config
|
|
if [[ ! -v "CLUSTER_NODES[$LOCAL_NODE]" ]]; then
|
|
# Comportement attendu : erreur
|
|
run echo "Node not found"
|
|
[ "$status" -eq 0 ]
|
|
else
|
|
# Ne devrait pas arriver ici
|
|
false
|
|
fi
|
|
}
|
|
|
|
@test "Nœud distant: erreur si cluster à 1 seul nœud" {
|
|
# Créer un cluster avec un seul nœud
|
|
declare -A TEST_CLUSTER=(
|
|
["lonely-node"]="192.168.100.99"
|
|
)
|
|
|
|
export TEST_HOSTNAME="lonely-node"
|
|
LOCAL_NODE=$(hostname)
|
|
|
|
# Chercher nœud distant
|
|
REMOTE_NODE_NAME=""
|
|
REMOTE_NODE_IP=""
|
|
for node in "${!TEST_CLUSTER[@]}"; do
|
|
if [[ "$node" != "$LOCAL_NODE" ]]; then
|
|
REMOTE_NODE_NAME="$node"
|
|
REMOTE_NODE_IP="${TEST_CLUSTER[$node]}"
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Aucun nœud distant trouvé
|
|
[ -z "$REMOTE_NODE_NAME" ]
|
|
[ -z "$REMOTE_NODE_IP" ]
|
|
}
|
|
|
|
# ============================================================================
|
|
# Tests: Extension à 3+ nœuds
|
|
# ============================================================================
|
|
|
|
@test "Cluster 3 nœuds: détecte le premier nœud distant disponible" {
|
|
# Créer un cluster avec 3 nœuds
|
|
declare -A EXTENDED_CLUSTER=(
|
|
["node1"]="192.168.100.10"
|
|
["node2"]="192.168.100.20"
|
|
["node3"]="192.168.100.30"
|
|
)
|
|
|
|
export TEST_HOSTNAME="node1"
|
|
LOCAL_NODE=$(hostname)
|
|
|
|
# Trouver le premier nœud distant
|
|
REMOTE_NODE_NAME=""
|
|
REMOTE_NODE_IP=""
|
|
for node in "${!EXTENDED_CLUSTER[@]}"; do
|
|
if [[ "$node" != "$LOCAL_NODE" ]]; then
|
|
REMOTE_NODE_NAME="$node"
|
|
REMOTE_NODE_IP="${EXTENDED_CLUSTER[$node]}"
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Un nœud distant doit être trouvé (node2 ou node3)
|
|
[ -n "$REMOTE_NODE_NAME" ]
|
|
[ -n "$REMOTE_NODE_IP" ]
|
|
[[ "$REMOTE_NODE_NAME" != "node1" ]]
|
|
}
|
|
|
|
# ============================================================================
|
|
# Tests: Validation des variables de configuration
|
|
# ============================================================================
|
|
|
|
@test "Variables de config: ZPOOLS est un tableau non vide" {
|
|
[ "${#ZPOOLS[@]}" -gt 0 ]
|
|
}
|
|
|
|
@test "Variables de config: CTID est défini" {
|
|
[ -n "$CTID" ]
|
|
[ "$CTID" -eq "$CTID" ] 2>/dev/null # Vérifier que c'est un nombre
|
|
}
|
|
|
|
@test "Variables de config: CONTAINER_NAME est défini" {
|
|
[ -n "$CONTAINER_NAME" ]
|
|
}
|
|
|
|
@test "Variables de config: HEALTH_CHECK_MIN_FREE_SPACE valide" {
|
|
[ "$HEALTH_CHECK_MIN_FREE_SPACE" -ge 0 ]
|
|
[ "$HEALTH_CHECK_MIN_FREE_SPACE" -le 100 ]
|
|
}
|
|
|
|
@test "Variables de config: HEALTH_CHECK_ERROR_COOLDOWN valide" {
|
|
[ "$HEALTH_CHECK_ERROR_COOLDOWN" -gt 0 ]
|
|
}
|