# Hetzner Cloud provider default schemas import regex import provisioning.lib as lib import provisioning.defaults as defaults # Volume (Block Storage) schema schema Volume_hetzner: """Hetzner Cloud volume (block storage)""" name: str size: int = 10 location?: str format?: str = "ext4" automount?: bool = False delete_on_termination?: bool = False check: size >= 10 and size <= 10000, "Volume size must be 10-10000 GB" len(name) > 0, "Volume name required" # Network schema schema Network_hetzner: """Hetzner Cloud private network""" name?: str ip?: str alias_ips?: [str] check: if ip: regex.match(ip, "^10\\.") or regex.match(ip, "^172\\.(1[6-9]|2[0-9]|3[0-1])\\.") or regex.match(ip, "^192\\.168\\."), "Must be private IP" else: True # Firewall schema schema Firewall_hetzner: """Hetzner Cloud firewall""" name?: str apply_to?: [str] rules?: [any] # Server defaults schema schema ServerDefaults_hetzner(defaults.ServerDefaults): """Hetzner Cloud server defaults""" provider: "hetzner" = "hetzner" # Location (datacenter) location: "fsn1" | "nbg1" | "hel1" | "ash" | "hil" = "nbg1" # Server type server_type: str = "cx11" # Image/OS image: str = "ubuntu-22.04" # SSH keys ssh_keys?: [str] # User data (cloud-init) user_data?: str # Storage volumes volumes?: [Volume_hetzner] # Private networks networks?: [Network_hetzner] # Firewalls firewalls?: [Firewall_hetzner] # Labels/tags labels?: {str: str} # Placement group placement_group?: str # Backups enabled backups?: bool = False # Automount volumes automount?: bool = False check: len(image) > 0, "Image required" len(location) > 0, "Location required" len(server_type) > 0, "Server type required"