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