Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
86 lines
3.6 KiB
Django/Jinja
86 lines
3.6 KiB
Django/Jinja
"""
|
|
Main deployment configuration for {{ deployment.project.name }}
|
|
|
|
Root module combining all deployment elements: services, databases, cache, and presets.
|
|
This is the primary configuration consumed by provisioning, provctl, and the installer.
|
|
|
|
Architecture:
|
|
- schemas.k: Type definitions and validation rules
|
|
- defaults.k: Default service/database/cache/preset instances
|
|
- services.k: Active services list (filtered by user selection)
|
|
- presets.k: Deployment presets (local, dev, staging, production)
|
|
- deployment.k: Root configuration (this file)
|
|
|
|
Extends: provisioning.extensions.taskservs pattern
|
|
References: All other modules
|
|
Consumed by: provisioning, provctl, installer, dashboard
|
|
"""
|
|
|
|
import .schemas as s
|
|
import .defaults as d
|
|
import .services as svc
|
|
import .presets as p
|
|
|
|
# Root deployment configuration
|
|
deployment = s.Deployment {
|
|
project = d.project
|
|
services = svc.services
|
|
databases = svc.databases
|
|
cache = svc.cache
|
|
presets = p.presets
|
|
default_database = svc.default_database
|
|
default_cache = {% if deployment.cache_enabled %}"redis"{% else %}None{% endif %}
|
|
}
|
|
|
|
# Module exports for consumption by other tools
|
|
# provisioning uses this to understand service topology
|
|
# provctl uses this to manage service lifecycle
|
|
# installer uses presets to offer deployment options
|
|
|
|
# Export services by type for easy reference
|
|
{literal}cli_services = [s for s in deployment.services if s.service_type == "cli"]
|
|
tui_services = [s for s in deployment.services if s.service_type == "tui"]
|
|
api_services = [s for s in deployment.services if s.service_type == "server"]
|
|
web_services = [s for s in deployment.services if s.service_type == "web"]
|
|
|
|
# Export presets by complexity
|
|
manual_presets = [p for p in deployment.presets if p.manager == "manual"]
|
|
orchestrated_presets = [p for p in deployment.presets if p.manager in ["provctl", "provisioning"]]{/literal}
|
|
|
|
# Validation checks
|
|
{literal}assert len(deployment.services) > 0, "Deployment must include at least one service"
|
|
assert len(deployment.presets) > 0, "Deployment must include at least one preset"
|
|
|
|
# Service requirement checks
|
|
for preset in deployment.presets:
|
|
for service_name in preset.services_enabled:
|
|
required_service = any svc in deployment.services if svc.name == service_name
|
|
assert required_service, "Preset '${preset.name}' requires service '${service_name}' which is not enabled"
|
|
|
|
# Dependency resolution checks
|
|
for service in deployment.services if service.enabled:
|
|
for dependency in service.requires:
|
|
dependent_service = any svc in deployment.services if svc.name == dependency and svc.enabled
|
|
assert dependent_service, \
|
|
"Service '${service.name}' requires '${dependency}' which is not available or enabled"
|
|
|
|
# Database availability checks
|
|
for service in deployment.services if service.database_required:
|
|
for required_db_type in service.database_types:
|
|
available_db = any db in deployment.databases if db.type == required_db_type
|
|
assert available_db, \
|
|
"Service '${service.name}' requires database type '${required_db_type}' which is not configured"{/literal}
|
|
|
|
# Metadata for tooling integration
|
|
metadata = {
|
|
"generated_at": "{{ generated_at | default(value="2025-11-20") }}"
|
|
"generated_by": "provctl gen deployment"
|
|
"project_name": deployment.project.name
|
|
"project_version": deployment.project.version
|
|
"service_count": len(deployment.services)
|
|
"database_types": [db.type for db in deployment.databases]
|
|
"cache_enabled": deployment.default_cache is not None
|
|
"preset_count": len(deployment.presets)
|
|
"high_availability": any preset in deployment.presets if preset.high_availability
|
|
}
|