2025-12-24 03:11:32 +00:00
..
2025-12-24 03:11:32 +00:00

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

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/