84 lines
1.9 KiB
Text
84 lines
1.9 KiB
Text
# 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"
|