The configuration system is the backbone of the Azure Local Load Testing Framework. It ensures that nothing is hardcoded and every value is parameterizable.
Configuration Hierarchy
config/
├── variables/
│ ├── master-environment.yml ← Single source of truth for ALL variables
│ ├── schema.json ← JSON Schema for validation
│ └── solutions/ ← Generated per-solution config files
│ ├── vmfleet.json
│ ├── fio.json
│ └── ...
├── clusters/ ← Per-cluster connection configs
│ └── example-cluster.yml
├── profiles/ ← Workload test profiles
│ ├── vmfleet/
│ └── ...
└── credentials/
└── keyvault-config.yml ← Key Vault connection settings
The master-environment.yml file contains every variable used across all solutions. Each variable is tagged with the solutions that consume it.
Variable Structure
variables:
- name: vm_count_per_node
value: 10
type: integer
required: true
description: "Number of fleet VMs to deploy per cluster node"
solutions: [vmfleet]
category: deploymentVariable Properties
| Property | Description | Required |
|---|---|---|
name |
Unique variable identifier (snake_case) | Yes |
value |
Default value | Yes |
type |
Data type: string, integer, boolean, array | Yes |
required |
Whether the variable must have a non-empty value | Yes |
description |
Human-readable description | Yes |
solutions |
Array of solution tags: vmfleet, fio, iperf, hammerdb, stress-ng | Yes |
category |
Logical grouping: cluster, deployment, testing, monitoring, reporting | No |
sensitive |
If true, value should come from Key Vault (never stored in YAML) | No |
The ConfigManager module reads the master environment, filters by solution tag, and writes JSON:
# Generate VMFleet-specific configuration
Import-Module ./common/modules/ConfigManager/ConfigManager.psm1
Export-SolutionConfig -Solution "vmfleet" `
-MasterConfigPath "./config/variables/master-environment.yml" `
-OutputPath "./config/variables/solutions/vmfleet.json"The generated vmfleet.json contains only variables tagged with vmfleet:
{
"vm_count_per_node": 10,
"vm_vcpu_count": 2,
"vm_memory_gb": 2,
"test_duration_seconds": 300,
"warmup_seconds": 60
}Every script supports a three-level override chain:
- Explicit Parameter — Highest priority. Pass
-VmCountPerNode 20to any script. - Solution JSON — Read from
config/variables/solutions/{solution}.json - Master Default — Fallback value from
master-environment.yml
# Override chain example:
# 1. Explicit parameter wins
Start-VMFleetTest -VmCountPerNode 20
# 2. Without parameter, reads from vmfleet.json
Start-VMFleetTest
# 3. If vmfleet.json missing, falls back to master-environment.yml defaultCluster configs in config/clusters/ define target cluster details. To switch clusters, change the -ClusterConfig parameter:
# Target different clusters by swapping config files
.\Invoke-VMFleetPipeline.ps1 -ClusterConfig "config/clusters/prod-cluster.yml"
.\Invoke-VMFleetPipeline.ps1 -ClusterConfig "config/clusters/dev-cluster.yml"Each solution has predefined workload profiles in config/profiles/{solution}/:
# config/profiles/vmfleet/general.yml
profile:
name: "General"
description: "Balanced read/write workload for general validation"
parameters:
block_size: "8k"
write_ratio: 30
random_ratio: 70
outstanding_io: 8
threads_per_vm: 2
duration_seconds: 300
warmup_seconds: 60The keyvault-config.yml maps logical credential names to Key Vault secrets:
keyvault:
name: "my-keyvault-name"
resource_group: "my-rg"
secrets:
cluster_admin_password: "hci-cluster-admin-pwd"
cluster_admin_username: "hci-cluster-admin-user"
azure_client_secret: "sp-client-secret"Scripts use CredentialManager to retrieve credentials without knowing the storage mechanism:
$cred = Get-ManagedCredential -Name "cluster_admin" -Source KeyVaultSee Credential Management for full details on the three credential modes.
Choose a tool to get started:
- VMFleet Guide — Storage load testing
- fio Guide — Flexible I/O benchmarking
- iPerf3 Guide — Network testing