provisioning-catalog/providers/hetzner/templates/hetzner_networks.j2

108 lines
3.6 KiB
Text
Raw Normal View History

# 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 %}