- Control requires
ConnectionStrings:Redisoutside theDevelopmentenvironment. - Set
ManagementApi:Tokenusing an environment variable or a secret store. - Set each
Clusters:Nodes:{node}:Rpc:Tokenusing an environment variable or a secret store. - Cluster requires Linux
libvirt,qemu-img,genisoimage,websockify,ip,nft, and optionallyovs-vsctl. - Cluster network changes are deny-by-default. Configure
Network:AllowedBridgePrefixes,Network:AllowedPorts, and the NAT CIDR allowlists before use. - VM creation is deny-by-default for bridges until
Provisioning:AllowedBridgesis configured.
Do not commit development tokens. Set them for a local shell, for example:
Control:
ManagementApi__Token=<local-secret>
Clusters__Nodes__local__Rpc__Token=<local-secret>
ConnectionStrings__Redis=localhost:6379,abortConnect=false
Cluster:
Rpc__Token=<same-local-secret>
- Use HTTPS for the Control-to-Cluster address. Cleartext
http://node addresses are rejected. - For a self-signed Cluster certificate, set
Clusters:Nodes:{node}:AllowSelfSignedCertificate=true; certificate hostname validation remains enabled.
Run the executable checks (no additional test-framework packages):
dotnet run --project Tests/Kvm.RegressionTestsThe default run checks in-memory operation idempotency, payload conflicts, node case normalization, and single-use VNC tickets. To also exercise the production Redis Lua and GETDEL paths, use a disposable test Redis instance:
$env:KVM_TEST_REDIS = 'localhost:6379,abortConnect=true'
try {
dotnet run --project Tests/Kvm.RegressionTests
} finally {
Remove-Item Env:KVM_TEST_REDIS -ErrorAction SilentlyContinue
}Redis checks use two independent service instances sharing a unique per-run key
prefix. They delete only their own operation keys; they never flush the database.
These are executable regression checks, not a dotnet test test project. A failed
assertion exits nonzero. Without KVM_TEST_REDIS, Redis checks explicitly print
SKIP; memory-only success does not verify Redis or Linux/KVM integration.