#!/bin/bash
# 실습 #18 ④ — 제약(constraints) + 2-node quorum + 위치 선호
# - colocation : 같은 노드에 묶기 (INFINITY = 절대, score = 가중치)
# - order      : 시작 순서
# - location   : 위치 선호 (prefers / avoids)
# - 2-node quorum: 1/2 = no-quorum 문제. two_node:1 + wait_for_all:1 설정.
set -e

DIR="$(cd "$(dirname "$0")" && pwd)"
COROSYNC_CFG="$DIR/configs/04_corosync_two_node.conf"

# 1) 현재 제약 보기
echo "=== 현재 constraints ==="
sudo pcs constraint
echo

# 2) location 선호 — 가능하면 node1 (score 50)
sudo pcs constraint location web prefers node1=50 2>/dev/null || true

# 3) 절대 회피 (예: maintenance 중인 노드)
# sudo pcs constraint location web avoids node2=INFINITY

# 4) 명시적 colocation·order (group 없이 개별 자원일 때)
# sudo pcs constraint colocation add web_nginx with web_vip INFINITY
# sudo pcs constraint order web_vip then web_nginx

echo "=== 적용 후 ==="
sudo pcs constraint

# 5) 2-node quorum 설정 (corosync.conf)
echo
echo "=== corosync.conf two_node 설정 ==="
sudo cp /etc/corosync/corosync.conf /etc/corosync/corosync.conf.bak.$(date +%Y%m%d%H%M%S)

# quorum 섹션이 이미 두 옵션 다 있으면 skip
if sudo grep -q "two_node: 1" /etc/corosync/corosync.conf; then
    echo "→ two_node:1 이미 설정됨."
else
    # quorum { ... } 블록 안에 추가. 단순화: 별도 drop-in 못 쓰는 경우 수동 알림.
    echo
    echo "→ /etc/corosync/corosync.conf 의 quorum 블록을 다음과 같이 편집:"
    cat "$COROSYNC_CFG"
    echo
    echo "→ 편집 후 양쪽 노드 corosync 재시작:"
    echo "   sudo systemctl restart corosync pacemaker"
fi

# 6) 현재 quorum 상태
echo
echo "=== quorum 상태 ==="
sudo corosync-quorumtool -s 2>/dev/null || sudo pcs quorum status

# 7) 자원 stickiness — 노드 복귀해도 다시 이전 안 함
sudo pcs resource defaults update resource-stickiness=100 2>/dev/null || \
    sudo pcs resource defaults resource-stickiness=100 2>/dev/null || true

echo
echo "=== resource defaults ==="
sudo pcs resource defaults

cat <<'EOF'

관전 포인트:
  - two_node:1     : 2-node 클러스터 전용. 한쪽 죽어도 살아남은 쪽이 자원 가져감.
  - wait_for_all:1 : 초기 부팅은 양쪽 다 살아야 시작 (split-start 방지)
  - resource-stickiness 100 : 자원이 굳이 다른 노드로 안 옮겨감 (불필요한 페일오버 방지)
  - 운영 권장: 3-node 클러스터 + 진짜 STONITH (IPMI/iLO/fence_vmware)
EOF
