344 lines
9.9 KiB
Markdown
Raw Normal View History

# 11. Provisioning Generator
**Complete provisioning infrastructure generation from multiple input sources**
Demonstrates the `typedialog-provisioning-gen` tool that generates a complete 7-layer validation architecture for configuration management, supporting multiple input modes and producing TypeDialog forms, Nickel schemas, validators, and orchestration scripts.
## Quick Start
### Pick Your Input Mode
**Mode A: Analyze Cargo.toml** (Automatic Detection)
```bash
# Auto-detect features from dependencies
typedialog-provisioning-gen cargo \
--input mode-a-cargo/Cargo.toml \
--output /tmp/my-provisioning
```
→ See [`mode-a-cargo/README.md`](mode-a-cargo/) for details
**Mode B: Config File** (Explicit Specification)
```bash
# Define all features in TOML config
typedialog-provisioning-gen config \
--input mode-b-config/project-spec.toml \
--output /tmp/my-provisioning
```
→ See [`mode-b-config/README.md`](mode-b-config/) for details
**Mode C: Interactive Wizard** (Conversational)
```bash
# Step-by-step guidance with AI suggestions
typedialog-provisioning-gen wizard \
--project my-service \
--output /tmp/my-provisioning
```
→ See [`mode-c-wizard/README.md`](mode-c-wizard/) for details
**Mode D: Nickel Schema** (Migration)
```bash
# Convert existing Nickel schema
typedialog-provisioning-gen nickel \
--input mode-d-nickel/existing-config.ncl \
--output /tmp/my-provisioning
```
→ See [`mode-d-nickel/README.md`](mode-d-nickel/) for details
## What Gets Generated
All modes produce the same 7-layer structure:
```
provisioning/
├── constraints.toml # Layer 1: Validation bounds (single source of truth)
├── schemas/ # Layer 2: Type contracts (Nickel)
├── validators/ # Layer 3: Validation logic
├── defaults/ # Layer 4: Default values
├── fragments/ # Layer 5: TypeDialog forms
├── scripts/ # Layer 6: Orchestration scripts
└── config.ncl # Layer 7: Master configuration
```
→ See [`output-example/README.md`](output-example/) for detailed structure explanation
## Key Features
### ✅ 4 Input Modes
- **Cargo.toml Analysis**: Automatic feature detection from dependencies
- **Config File**: Explicit specification with full control
- **Interactive Wizard**: Conversational guidance with AI suggestions
- **Nickel Schema**: Convert existing Nickel to provisioning structure
### ✅ 7-Layer Validation
- **Constraints** (single source of truth)
- **Schemas** (Nickel type contracts)
- **Validators** (validation logic)
- **Defaults** (sensible defaults)
- **Fragments** (TypeDialog forms)
- **Scripts** (orchestration)
- **Master Config** (integration point)
### ✅ Domain Features
Each mode discovers or defines domain features:
| Feature | Fields | Example |
|---------|--------|---------|
| http_server | bind_address, timeout_seconds | REST API |
| database | host, port, username, password | PostgreSQL, MySQL |
| authentication | jwt_secret, expiry | JWT tokens |
| caching | cache_enabled, ttl | Redis layer |
| monitoring | prometheus_url, retention | Observability |
### ✅ Multiple Field Types
- Text, Number, Password, Confirm
- Select, MultiSelect
- Editor, Date
- RepeatingGroup (arrays)
### ✅ Sensitive Data Handling
Automatic encryption for sensitive fields:
- `age` (modern encryption)
- `sops` (Mozilla SOPS)
- `secretumvault` (integration ready)
- `aws-kms`, `gcp-kms`, `azure-kms`
### ✅ Constraint Interpolation
Single source of truth - define constraints once, use everywhere:
- In validators (Nickel)
- In forms (TypeDialog)
- In documentation
- In validation scripts
## Complete Workflow
### 1. Generate from Cargo.toml
```bash
cd my-rust-service
typedialog-provisioning-gen cargo --output ./provisioning
```
### 2. Test Form Interactively
```bash
typedialog provisioning/fragments/http_server-section.toml --backend cli
```
### 3. Validate Configuration
```bash
./provisioning/scripts/validate-nickel.sh < config.ncl
```
### 4. Use in Application
```rust
let config = nickel::eval_file("provisioning/config.ncl")?;
```
## Directory Guide
| Path | Purpose |
|------|---------|
| [`mode-a-cargo/`](mode-a-cargo/) | Cargo.toml introspection example |
| [`mode-b-config/`](mode-b-config/) | Config file specification example |
| [`mode-c-wizard/`](mode-c-wizard/) | Interactive wizard example |
| [`mode-d-nickel/`](mode-d-nickel/) | Nickel schema conversion example |
| [`output-example/`](output-example/) | Complete generated output structure |
## Examples by Scenario
### Scenario 1: Existing Rust Project
```bash
# You have a Cargo.toml with dependencies
typedialog-provisioning-gen cargo --output ./infra
# Auto-detects:
# - axum → HTTP server config
# - sqlx → database config
# - redis → caching config
# - prometheus → monitoring
```
Best for: Rust projects, quick setup
### Scenario 2: New Multi-Service Architecture
```bash
# You have a detailed specification
typedialog-provisioning-gen config --input architecture.toml --output ./platform
# Supports:
# - Multiple database types
# - Event streaming setup
# - Monitoring configuration
# - Cloud provider selection
```
Best for: Complex systems, cross-team coordination
### Scenario 3: Interactive Setup
```bash
# You want guidance through the process
typedialog-provisioning-gen wizard --project my-service
# Walks through:
# - Project type selection
# - Infrastructure requirements
# - Feature selection
# - Field configuration
# - AI-powered suggestions
```
Best for: First-time users, exploring options
### Scenario 4: Legacy System Migration
```bash
# You have existing Nickel schemas
typedialog-provisioning-gen nickel --input config.ncl --output ./new-provisioning
# Converts:
# - Type definitions → schemas
# - Records → domain features
# - Fields → form fragments
```
Best for: System modernization, adding forms to existing configs
## Using Generated Artifacts
### TypeDialog Forms
```bash
# Display configuration form
typedialog provisioning/fragments/database-section.toml --backend cli
# Web interface
typedialog-web provisioning/fragments/*.toml --port 3000
```
### Nickel Validation
```bash
# Validate syntax
./provisioning/scripts/validate-nickel.sh
# Use in config
nickel eval provisioning/config.ncl
```
### Scripts
```bash
# Master orchestrator
./provisioning/scripts/config.sh
# Format conversion
./provisioning/scripts/json-to-nickel.sh < input.json
./provisioning/scripts/nickel-to-json.sh < config.ncl
```
### Application Integration
```rust
// Load provisioning config
let config = provisioning::load("provisioning/config.ncl")?;
```
## What This Demonstrates
### Core Concepts
✅ Multi-mode input pipeline normalization
✅ 7-layer validation architecture
✅ Constraint interpolation (single source of truth)
✅ Template-based code generation
✅ Domain-driven feature extraction
### Integration Points
✅ TypeDialog forms generation
✅ Nickel schema contracts
✅ Sensitive data encryption
✅ Cross-format conversion (JSON ↔ Nickel)
✅ Orchestration scripts (bash + nushell)
### Advanced Features
✅ Cargo.toml dependency analysis
✅ Project type inference
✅ Infrastructure requirement detection
✅ AI-powered wizard with RAG retrieval
✅ Reusable template library
✅ Custom field types and validation
## Next Steps
### Try Each Mode
1. **Start with Mode A**: `cd mode-a-cargo && cat README.md`
2. **Explore Mode B**: `cd mode-b-config && cat README.md`
3. **Test Mode C**: `cd mode-c-wizard && cat README.md`
4. **Learn Mode D**: `cd mode-d-nickel && cat README.md`
### Understand the Output
- **View Structure**: `cd output-example && cat README.md`
- **Study Layers**: Examine each generated directory (schemas/, validators/, etc.)
- **Test Interactively**: Run TypeDialog on generated fragments
### Build Your Own
1. **Pick a mode** based on your needs
2. **Generate** from your input
3. **Customize** the generated structure
4. **Deploy** using generated scripts
5. **Iterate** as your requirements evolve
## More Information
- **TypeDialog Docs**: Form UI and integration
- **Nickel Docs**: Type-safe configuration language
- **Encryption**: Secrets management with age, sops, KMS
- **Scripts**: Bash and Nushell orchestration
## Testing All Examples
```bash
# Run Mode A
cargo run -p typedialog-provisioning-gen -- cargo \
--input examples/11-provisioning-generation/mode-a-cargo/Cargo.toml \
--output /tmp/mode-a-output
# Run Mode B
cargo run -p typedialog-provisioning-gen -- config \
--input examples/11-provisioning-generation/mode-b-config/project-spec.toml \
--output /tmp/mode-b-output
# Run Mode D
cargo run -p typedialog-provisioning-gen -- nickel \
--input examples/11-provisioning-generation/mode-d-nickel/existing-config.ncl \
--output /tmp/mode-d-output
# Run Mode C (interactive)
cargo run -p typedialog-provisioning-gen -- wizard \
--project test-service \
--output /tmp/mode-c-output
```
## Key Files
### Example Inputs
- `mode-a-cargo/Cargo.toml` - Real Cargo.toml with dependencies
- `mode-b-config/project-spec.toml` - Complete feature specification
- `mode-d-nickel/existing-config.ncl` - Nickel schema example
### Documentation
- `mode-a-cargo/README.md` - Cargo.toml analysis details
- `mode-b-config/README.md` - Config specification format
- `mode-c-wizard/README.md` - Wizard interaction flow
- `mode-d-nickel/README.md` - Nickel schema conversion
- `output-example/README.md` - Generated structure explanation
## Summary
The Provisioning Generator provides a complete solution for infrastructure-as-code configuration:
- **Flexible Input**: 4 modes for different scenarios
- **Type-Safe Output**: Nickel schemas with validation
- **User-Friendly Forms**: TypeDialog for interactive setup
- **Production-Ready**: Scripts for deployment and orchestration
- **Extensible**: Template library and custom domain features
Perfect for:
- Microservice configuration
- Infrastructure setup automation
- Configuration management at scale
- DevOps tooling
- SaaS platform provisioning