provisioning-catalog/providers/hetzner/kcl/defaults_hetzner.k

85 lines
1.9 KiB
Text
Raw Permalink Normal View History

# 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"