provisioning-code/templates/workspace/nickel/main.ncl

76 lines
2.5 KiB
Text

# Workspace Factory Configuration
# Generates merged workspace config from defaults + mode + user overrides
#
# Usage (in user workspace config.ncl):
# let factory = import "provisioning/templates/workspace/nickel/main.ncl" in
# factory.generate {
# workspace_name = "librecloud_hetzner",
# deployment_mode = "solo",
# provider = "hetzner",
# }
let lib = import "schemas/lib.ncl" in
let helpers = import "./lib/helpers.ncl" in
{
# Factory function to generate workspace config
generate | doc "Generate complete workspace config from composition of defaults, mode config, and user overrides"
= fun config_overrides => (
let workspace_name = config_overrides.workspace_name or "unnamed_workspace" in
let mode = config_overrides.deployment_mode or "solo" in
let provider = config_overrides.provider or "generic" in
# Load mode-specific defaults
let mode_defaults = (
if mode == "solo" then
import "schemas/deployment/modes/solo/defaults.ncl"
else if mode == "multiuser" then
import "schemas/deployment/modes/multiuser/defaults.ncl"
else if mode == "cicd" then
import "schemas/deployment/modes/cicd_enterprise/defaults.ncl"
else
import "schemas/deployment/modes/base/defaults.ncl"
) in
# Load provider defaults
let provider_defaults = (
if provider == "hetzner" then
{
provider = "hetzner",
cloud_api_enabled = true,
region = "eu-central",
}
else if provider == "upcloud" then
{
provider = "upcloud",
cloud_api_enabled = true,
region = "pl-waw",
}
else if provider == "oci" then
{
provider = "oci",
cloud_api_enabled = true,
region = "eu-zurich-1",
}
else
{
provider = provider,
cloud_api_enabled = false,
}
) in
# Compose: base defaults → mode defaults → provider defaults → user overrides
# Using helpers.compose_config for proper deep merge
helpers.compose_config
mode_defaults
provider_defaults
(config_overrides & {workspace_name = workspace_name})
),
# Composition helper for deep merging
compose | doc "Deep merge records preserving nested structures"
= fun base => fun mode_config => fun user_overrides => (
# Use helpers.compose_config (recursive deep merge)
helpers.compose_config base mode_config user_overrides
),
}