Solution Development Standards¶
Canonical reference: Solution Development Standard (full)
Applies to: All AzureLocal solution repositories
Last Updated: 2026-04-02
Solution Repositories¶
Each solution maps to an infrastructure type in the master registry and lives in its own repository:
| Solution | Infrastructure Type | Repository |
|---|---|---|
| Azure Local Platform | azure_local | azurelocal-toolkit |
| Azure Virtual Desktop (cloud) | avd_azure | azurelocal-avd |
| Azure Virtual Desktop (on-prem) | avd_azure_local | azurelocal-avd |
| Scale-Out File Server / FSLogix | sofs_azure_local | azurelocal-sofs-fslogix |
| AKS on Azure Local | aks_azure_local | azurelocal-toolkit |
| Load Testing Tools | loadtools | azurelocal-loadtools |
| VM Conversion Toolkit | vm_conversion | azurelocal-vm-conversion-toolkit |
| AI-Assisted Operations | copilot | azurelocal-copilot |
| Azure Local Ranger | ranger | azurelocal-ranger |
Non-IaC Solutions
Some solutions (e.g. Ranger, Copilot, Load Testing Tools) are operational or diagnostic tools rather than IaC deployment solutions. They follow the same repository management standards but the IaC tool support, parameter derivation, and multi-tool parity sections below do not apply. Their solution-specific architecture is documented in their own repos.
IaC Tool Support¶
Each tool must declare which deployment phases it supports:
| Tool | Azure Resources | Configuration | Networking | Monitoring |
|---|---|---|---|---|
| Terraform | ✅ | Delegates | ✅ | ✅ |
| Bicep | ✅ | Delegates | ✅ | ✅ |
| ARM | ✅ | Delegates | ✅ | ✅ |
| PowerShell | ✅ | ✅ | ✅ | ✅ |
| Ansible | ✅ | ✅ | ✅ | ✅ |
Delegates
"Delegates" means the tool provisions Azure resources but does not configure the guest OS. A separate tool (PowerShell or Ansible) handles guest configuration.
Parameter File Derivation¶
All tool-specific parameter files MUST be derivable from config/variables/variables.yml:
| Tool | Parameter File | Derivation |
|---|---|---|
| Terraform | src/terraform/terraform.tfvars | Map YAML sections to HCL variables |
| Bicep | src/bicep/main.bicepparam | Map YAML sections to Bicep parameters |
| ARM | src/arm/azuredeploy.parameters.json | Map YAML sections to ARM parameter schema |
| PowerShell | (reads config directly) | ConvertFrom-Yaml from config file |
| Ansible | src/ansible/inventory/hosts.yml | Map YAML sections to group_vars |
The central config is the single source of truth. Tool-specific files are convenience copies that should be regenerable.
Conditional Resource Support¶
| Tool | Mechanism | Example |
|---|---|---|
| Terraform | count / for_each | count = var.enable_feature ? 1 : 0 |
| Bicep | if condition | resource res '...' = if (enableFeature) { ... } |
| ARM | condition property | "condition": "[equals(parameters('enableFeature'), 'true')]" |
| PowerShell | switch / if | if ($config.feature_enabled) { ... } |
| Ansible | when: clause | when: enable_feature == true |
All tools must produce identical infrastructure when given the same configuration values.
Multi-Tool Parity¶
- Every supported tool must cover the same set of resources
- Tool-specific parameter files are derived from
config/variables/variables.yml - CI tests validate that each tool's output matches the expected state
- New resources added to one tool must be added to all supported tools