76 lines
2.5 KiB
Text
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
|
|
),
|
|
}
|