Module: Pangea::Kubernetes::BackendRegistry

Defined in:
lib/pangea/kubernetes/backend_registry.rb

Overview

Lazy-loading backend registry. Provider gems are loaded on first use, so users only need the gems for backends they actually reference.

Constant Summary collapse

BACKEND_MAP =

Backend matrix: cloud x tech

Each cloud provider can run multiple Kubernetes technologies:

- Managed K8s (EKS, GKE, AKS) — cloud-native control plane
- NixOS K3s — lightweight K3s on NixOS VMs via blackmatter-kubernetes
- NixOS K8s — vanilla Kubernetes on NixOS VMs (future)

Naming: cloud_tech (e.g., aws_eks, aws_nixos_k3s, gcp_gke) Legacy aliases: :aws → :aws_eks, :aws_nixos → :aws_nixos_k3s

{
  # ── AWS ───────────────────────────────────────────────────────
  aws_eks:        { module_path: 'pangea/kubernetes/backends/aws_eks', class_name: 'AwsEks' },
  aws_nixos_k3s:  { module_path: 'pangea/kubernetes/backends/aws_nixos', class_name: 'AwsNixos' },
  # aws_nixos_k8s: { module_path: 'pangea/kubernetes/backends/aws_nixos_k8s', class_name: 'AwsNixosK8s' },

  # ── GCP ───────────────────────────────────────────────────────
  gcp_gke:        { module_path: 'pangea/kubernetes/backends/gcp_gke', class_name: 'GcpGke' },
  gcp_nixos_k3s:  { module_path: 'pangea/kubernetes/backends/gcp_nixos', class_name: 'GcpNixos' },

  # ── Azure ─────────────────────────────────────────────────────
  azure_aks:      { module_path: 'pangea/kubernetes/backends/azure_aks', class_name: 'AzureAks' },
  azure_nixos_k3s: { module_path: 'pangea/kubernetes/backends/azure_nixos', class_name: 'AzureNixos' },

  # ── Hetzner ──────────────────────────────────────────────────
  hcloud_k3s:     { module_path: 'pangea/kubernetes/backends/hcloud_k3s', class_name: 'HcloudK3s' },
}.freeze
ALIASES =

Legacy aliases — backward compat with existing templates

{
  aws:          :aws_eks,
  aws_nixos:    :aws_nixos_k3s,
  gcp:          :gcp_gke,
  gcp_nixos:    :gcp_nixos_k3s,
  azure:        :azure_aks,
  azure_nixos:  :azure_nixos_k3s,
  hcloud:       :hcloud_k3s,
}.freeze

Class Method Summary collapse

Class Method Details

.all_namesObject

List all names including aliases



89
90
91
# File 'lib/pangea/kubernetes/backend_registry.rb', line 89

def all_names
  (BACKEND_MAP.keys + ALIASES.keys).uniq
end

.available_backendsObject

List all canonical backend names



84
85
86
# File 'lib/pangea/kubernetes/backend_registry.rb', line 84

def available_backends
  BACKEND_MAP.keys
end

.backend_available?(name) ⇒ Boolean

Check if a backend’s provider gem is available

Returns:

  • (Boolean)


94
95
96
97
98
99
# File 'lib/pangea/kubernetes/backend_registry.rb', line 94

def backend_available?(name)
  resolve(name)
  true
rescue LoadError
  false
end

.register(name, backend_module) ⇒ Object

Register a backend module for a given backend name



64
65
66
# File 'lib/pangea/kubernetes/backend_registry.rb', line 64

def register(name, backend_module)
  @backends[name.to_sym] = backend_module
end

.reset!Object

Reset registry (for testing)



102
103
104
# File 'lib/pangea/kubernetes/backend_registry.rb', line 102

def reset!
  @backends = {}
end

.resolve(name) ⇒ Object

Resolve a backend by name, lazy-loading if needed. Supports both canonical names (aws_eks) and legacy aliases (aws).

Raises:

  • (ArgumentError)


70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/pangea/kubernetes/backend_registry.rb', line 70

def resolve(name)
  name = name.to_sym
  # Resolve alias to canonical name
  name = ALIASES[name] if ALIASES.key?(name)

  return @backends[name] if @backends.key?(name)

  entry = BACKEND_MAP[name]
  raise ArgumentError, "Unknown backend: #{name}. Available: #{available_backends.join(', ')}" unless entry

  load_backend(name, entry)
end