344 lines
9.9 KiB
Markdown
344 lines
9.9 KiB
Markdown
|
|
# 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
|