9.5 KiB
TypeDialog Provisioning Generator
Infrastructure as Code generation with 7-layer validation (Forms → Constraints → Values → Validators → Schemas → Defaults → JSON).
Overview
The Provisioning Generator (typedialog-prov-gen) generates provisioning directory structures for infrastructure deployment. It creates type-safe configurations using TypeDialog forms + Nickel schemas with multi-layer validation.
Features
- 7-Layer Validation Pipeline: Forms → Constraints → Values → Validators → Schemas → Defaults → JSON
- Infrastructure Templates: Pre-built templates for common cloud providers
- TypeDialog Integration: Interactive forms for configuration collection
- Nickel Schema Generation: Type-safe configuration with contracts
- AI-Assisted Generation: Optional AI-powered template suggestions
- Multi-Provider Support: AWS, GCP, Azure, Hetzner, UpCloud, LXD
Quick Start
Installation
cargo build --release -p typedialog-prov-gen
sudo cp target/release/typedialog-prov-gen /usr/local/bin/
# Or use just
just build::prov-gen
Basic Usage
# Generate provisioning structure
typedialog-prov-gen --name myproject --output ./provisioning
# With specific providers
typedialog-prov-gen --name webapp --providers aws,gcp --output ./infra
# Interactive mode
typedialog-prov-gen --interactive
Generated Structure
When you run typedialog-prov-gen, it creates:
provisioning/
├── constraints/ # Validation constraints (used by forms & validators)
│ ├── network.ncl
│ ├── security.ncl
│ └── resources.ncl
├── schemas/ # Domain-specific type definitions
│ ├── server.ncl
│ ├── database.ncl
│ └── network.ncl
├── validators/ # Validation logic using constraints
│ ├── validate_server.ncl
│ ├── validate_network.ncl
│ └── validate_security.ncl
├── defaults/ # Sensible default values
│ ├── server_defaults.ncl
│ ├── network_defaults.ncl
│ └── security_defaults.ncl
├── fragments/ # Form UI sections (use constraints)
│ ├── server-config.toml
│ ├── network-config.toml
│ └── security-config.toml
├── scripts/ # Orchestration scripts
│ ├── apply.sh
│ ├── destroy.sh
│ ├── validate.nu
│ └── deploy.nu
├── infrastructure/ # Provider-specific templates
│ ├── aws/
│ ├── gcp/
│ └── hetzner/
├── config-form.toml # Main configuration form (assembles fragments)
└── README.md # Generated documentation
7-Layer Validation
Layer 1: Forms (config-form.toml)
Interactive forms for user input collection:
# Uses fragments and constraints
[[fragments]]
path = "fragments/server-config.toml"
[[fragments]]
path = "fragments/network-config.toml"
Layer 2: Constraints (constraints/*.ncl)
Reusable validation rules:
# constraints/network.ncl
{
ValidPort = fun label value =>
if value >= 1 && value <= 65535 then value
else contract.blame_with_message "Invalid port" label,
ValidCIDR = ...
}
Layer 3: Values (User Input)
Values collected from forms, validated by constraints.
Layer 4: Validators (validators/*.ncl)
Complex validation logic combining multiple constraints:
# validators/validate_server.ncl
let constraints = import "../constraints/network.ncl" in
let constraints_security = import "../constraints/security.ncl" in
{
validate_server_config = fun config =>
config
| constraints.ValidPort "ssh_port"
| constraints_security.RequireSSL "ssl_enabled"
}
Layer 5: Schemas (schemas/*.ncl)
Type-safe configuration schemas:
# schemas/server.ncl
{
Server = {
hostname | String,
ip_address | ValidIP,
ssh_port | ValidPort,
ssl_enabled | Bool,
}
}
Layer 6: Defaults (defaults/*.ncl)
Default values for optional fields:
# defaults/server_defaults.ncl
{
ssh_port = 22,
ssl_enabled = true,
max_connections = 100,
}
Layer 7: JSON Output
Final validated configuration in JSON/YAML/TOML:
{
"hostname": "web-server-01",
"ip_address": "10.0.1.100",
"ssh_port": 22,
"ssl_enabled": true
}
Configuration
Project Specification
Create project-spec.toml:
[project]
name = "webapp"
domain = "web-application"
[features]
database = true
caching = true
monitoring = true
[infrastructure]
providers = ["aws", "gcp"]
regions = ["us-east-1", "europe-west1"]
[[servers]]
name = "web"
count = 3
type = "t3.medium"
[[servers]]
name = "db"
count = 2
type = "r5.large"
Run:
typedialog-prov-gen --spec project-spec.toml --output ./provisioning
CLI Commands
# Generate provisioning structure
typedialog-prov-gen --name <project> --output <dir>
# Interactive mode
typedialog-prov-gen --interactive
# From spec file
typedialog-prov-gen --spec project-spec.toml --output ./infra
# With specific providers
typedialog-prov-gen --providers aws,gcp,hetzner
# With AI assistance
typedialog-prov-gen --ai-assist --llm claude-3-5-sonnet-20241022
# Validate existing provisioning
typedialog-prov-gen validate ./provisioning
# List available templates
typedialog-prov-gen templates --list
Provider Templates
AWS
typedialog-prov-gen --providers aws --output ./aws-infra
Generates:
- VPC configuration
- EC2 instances
- RDS databases
- S3 buckets
- IAM roles
- Security groups
GCP
typedialog-prov-gen --providers gcp --output ./gcp-infra
Generates:
- Compute Engine instances
- Cloud SQL databases
- Cloud Storage buckets
- VPC networks
- Firewall rules
Hetzner
typedialog-prov-gen --providers hetzner --output ./hetzner-infra
Generates:
- Cloud servers
- Volumes
- Networks
- Floating IPs
- Load balancers
LXD (Bare Metal)
typedialog-prov-gen --providers lxd --output ./lxd-infra
Generates:
- LXD containers
- Storage pools
- Network bridges
- Profiles
AI-Assisted Generation
Use AI to suggest optimal configurations:
typedialog-prov-gen \
--ai-assist \
--llm claude-3-5-sonnet-20241022 \
--prompt "web application with high availability" \
--output ./infra
AI will:
- Analyze requirements
- Suggest instance types
- Recommend scaling strategies
- Generate security configurations
- Optimize costs
Integration with TypeDialog Forms
Collect Configuration Interactively
# 1. Generate provisioning structure
typedialog-prov-gen --name webapp --output ./provisioning
# 2. Run the configuration form
typedialog -p typedialog-tui -- ./provisioning/config-form.toml
# 3. Apply configuration
cd provisioning
./scripts/apply.sh
Programmatic Usage
use typedialog_prov_gen::{generate, ProjectSpec};
let spec = ProjectSpec {
name: "webapp".to_string(),
domain: "web-application".to_string(),
providers: vec!["aws".to_string()],
..Default::default()
};
generate(spec, "./provisioning").await?;
Use Cases
1. Multi-Cloud Deployment
Generate infrastructure for AWS + GCP with shared configuration:
typedialog-prov-gen \
--name multi-cloud-app \
--providers aws,gcp \
--output ./infra
2. Development → Production
Generate separate provisioning for dev/staging/prod:
typedialog-prov-gen --name myapp --env dev --output ./infra/dev
typedialog-prov-gen --name myapp --env staging --output ./infra/staging
typedialog-prov-gen --name myapp --env production --output ./infra/prod
3. Compliance-Driven Configuration
Generate infrastructure meeting specific compliance requirements:
typedialog-prov-gen \
--name secure-app \
--compliance gdpr,hipaa \
--output ./infra
4. Cost-Optimized Infrastructure
AI-assisted cost optimization:
typedialog-prov-gen \
--ai-assist \
--optimize-for cost \
--budget 500 \
--output ./infra
Validation
Validate Before Apply
# Validate constraints
cd provisioning
nickel eval --format json constraints/network.ncl
# Validate schemas
nickel typecheck schemas/server.ncl
# Run validators
nickel eval validators/validate_server.ncl < config.json
# Full validation pipeline
./scripts/validate.nu
CI/CD Integration
# GitHub Actions
- name: Validate provisioning
run: |
cd provisioning
./scripts/validate.nu
nickel typecheck schemas/*.ncl
Examples
See examples/11-prov-gen/ for:
- Basic provisioning generation
- Multi-provider setup
- AI-assisted configuration
- Compliance templates
- Cost optimization
Related Documentation
- Configuration - General configuration guide
- Nickel Integration - Nickel schema documentation
- AI Backend - AI-assisted generation
- Examples - Working examples
Troubleshooting
"Constraint validation failed"
Check constraint definitions:
nickel eval constraints/network.ncl
"Template not found"
List available templates:
typedialog-prov-gen templates --list
"Provider not supported"
Supported providers: aws, gcp, azure, hetzner, lxd
typedialog-prov-gen --providers aws,gcp
"Nickel evaluation error"
Ensure Nickel CLI is installed:
nickel --version
# Install: cargo install nickel-lang-cli
Ready to start? See examples/11-prov-gen/