107 lines
3.6 KiB
Django/Jinja
107 lines
3.6 KiB
Django/Jinja
# Load previous state (SSH keys)
|
|
if [ -f "$STATE_DIR/.env" ]; then
|
|
source "$STATE_DIR/.env"
|
|
fi
|
|
|
|
# Network Configuration
|
|
{%- if network %}
|
|
echo ""
|
|
echo "=== Managing Network ==="
|
|
|
|
NETWORK_NAME="{{ network.name }}"
|
|
NETWORK_IP_RANGE="{{ network.ip_range }}"
|
|
SUBNET_IP_RANGE="{{ network.subnet_range }}"
|
|
NETWORK_ZONE="{{ network.zone | default(value='eu-central') }}"
|
|
|
|
# Validate zone is properly set
|
|
if [ -z "$NETWORK_ZONE" ] || [ "$NETWORK_ZONE" = "null" ]; then
|
|
echo "ERROR: Network zone not set or invalid"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Network config validated: $NETWORK_IP_RANGE with subnet $SUBNET_IP_RANGE in zone $NETWORK_ZONE"
|
|
|
|
# Check if network already exists
|
|
echo "Checking if network '$NETWORK_NAME' exists..."
|
|
|
|
if hcloud network describe "$NETWORK_NAME" > /dev/null 2>&1; then
|
|
# Network already exists
|
|
NETWORK_ID=$(hcloud network describe "$NETWORK_NAME" -o yaml 2>/dev/null | grep ^id: | cut -f2 -d":" | sed "s/ //g")
|
|
echo "✓ Network '$NETWORK_NAME' already exists with ID: $NETWORK_ID"
|
|
|
|
# Ensure the required subnet exists — it may have been skipped on a previous run
|
|
EXISTING_SUBNET=$(HJSON="$(hcloud network describe "$NETWORK_NAME" -o json 2>/dev/null)" \
|
|
nu -c '$env.HJSON | from json | get -o subnets | default [] | where ip_range == "'"$SUBNET_IP_RANGE"'" | get -o 0.ip_range | default ""' 2>/dev/null || true)
|
|
if [ -z "$EXISTING_SUBNET" ]; then
|
|
echo " Subnet $SUBNET_IP_RANGE missing — adding to network $NETWORK_NAME..."
|
|
set +e
|
|
hcloud network add-subnet "$NETWORK_ID" \
|
|
--type cloud \
|
|
--network-zone "$NETWORK_ZONE" \
|
|
--ip-range "$SUBNET_IP_RANGE" > /tmp/_subnet_add.txt 2>&1
|
|
_subnet_exit=$?
|
|
set -e
|
|
if [ $_subnet_exit -eq 0 ]; then
|
|
echo " ✓ Subnet $SUBNET_IP_RANGE added"
|
|
else
|
|
echo " ✗ Failed to add subnet (exit $_subnet_exit): $(cat /tmp/_subnet_add.txt)"
|
|
echo " --- hcloud network describe $NETWORK_NAME ---"
|
|
hcloud network describe "$NETWORK_NAME" -o json 2>&1 || true
|
|
echo " --- end describe ---"
|
|
fi
|
|
else
|
|
echo " ✓ Subnet $SUBNET_IP_RANGE already present"
|
|
fi
|
|
else
|
|
# Create new network using hcloud CLI
|
|
echo "Creating network '$NETWORK_NAME' with IP range $NETWORK_IP_RANGE..."
|
|
|
|
NETWORK_ID=$(hcloud network create \
|
|
--name "$NETWORK_NAME" \
|
|
--ip-range "$NETWORK_IP_RANGE" \
|
|
--label "cluster={{ cluster_name }}" \
|
|
--label "provider=hetzner" \
|
|
--label "managed_by=provisioning" \
|
|
2>/dev/null | grep ^Network | cut -f2 -d" " | sed "s/ //g")
|
|
|
|
if [ -z "$NETWORK_ID" ]; then
|
|
echo "ERROR: Failed to create network"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "${HETZNER_NETWORK_DELETE_PROTECTION:-false}" = "true" ]; then
|
|
hcloud network enable-protection "$NETWORK_NAME" delete > /dev/null 2>&1
|
|
echo "✓ Network '$NETWORK_NAME' created with ID: $NETWORK_ID (delete protection enabled)"
|
|
else
|
|
echo "✓ Network '$NETWORK_NAME' created with ID: $NETWORK_ID"
|
|
fi
|
|
|
|
# Create subnet using hcloud CLI
|
|
echo "Creating subnet with IP range $SUBNET_IP_RANGE in network zone $NETWORK_ZONE..."
|
|
|
|
hcloud network add-subnet "$NETWORK_ID" \
|
|
--type cloud \
|
|
--network-zone "$NETWORK_ZONE" \
|
|
--ip-range "$SUBNET_IP_RANGE"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: Failed to create subnet"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ Subnet created with IP range $SUBNET_IP_RANGE"
|
|
fi
|
|
|
|
# Export NETWORK_ID for next provisioning steps
|
|
echo "NETWORK_ID=$NETWORK_ID" >> "$STATE_DIR/.env"
|
|
echo "NETWORK_NAME=$NETWORK_NAME" >> "$STATE_DIR/.env"
|
|
|
|
echo ""
|
|
echo "=== Network Management Complete ==="
|
|
echo "NETWORK_ID: $NETWORK_ID"
|
|
echo "NETWORK_NAME: $NETWORK_NAME"
|
|
echo "Environment exported to: $STATE_DIR/.env"
|
|
|
|
{%- else %}
|
|
echo "WARNING: No network configuration provided"
|
|
{%- endif %}
|