Target Components
Other Component Details
Copilot instructions, agent files, learning katas, scripts, sitemap, and Go test utilities.
Problem Statement
The full-single-node-cluster and full-multi-node-cluster blueprints share ~90% of their Terraform and Bicep code but diverge in multi-node support, Arc machine integration, and a handful of variables. Both blueprints must be kept in sync whenever components change, creating maintenance burden, code duplication, and frequent drift. The single-node blueprint has historically been the "default" recommendation for getting started, yet the multi-node variant adds only ~14 extra variables and conditional VM/Arc logic. There is no technical reason to maintain two separate blueprints when a single configurable blueprint can serve both use cases.
Proposed Solution
Consolidate both blueprints into a single full-multi-node-cluster blueprint that supports single-node and multi-node deployments via a configurable nodes count variable (defaulting to 1).
The work proceeds in five phases:
- Backport unique multi-node features into
full-single-node-cluster (14 variables, Arc machine data sources, conditional VM host creation, multi-node cluster slicing, server token generation)
- Delete the current
full-multi-node-cluster and rename full-single-node-cluster to full-multi-node-cluster
- Update all ~195 references across ~58 files in documentation, copilot instructions, agents, learning content, application READMEs, sidebars, scripts, and sitemap
- Update documentation language so the unified blueprint is the recommended starting point with guidance: "Set nodes to 1 for single-node deployments (default). Increase to support multi-node clusters."
- Validate no orphaned references remain, Terraform validates, and Bicep builds pass
Benefits
- Eliminates code duplication and blueprint drift between single-node and multi-node variants
- Reduces ongoing maintenance burden when components change (update one blueprint instead of two)
- Provides a single entry point for all "full" deployments, simplifying the getting started experience
- Makes the single-node experience a natural subset of multi-node without losing any functionality
- Simplifies documentation by removing the need to describe and distinguish two overlapping blueprints
Alternative Solutions
- Keep both blueprints and use shared modules. This reduces duplication in IaC code but does not eliminate the documentation and reference sprawl across ~58 files. Both blueprints would still need independent testing and validation.
- Create a third "unified" blueprint alongside the existing two. This avoids breaking existing references but adds a third blueprint to maintain and creates confusion about which one to use.
Implementation Ideas
Phase 1 — Backport unique multi-node capabilities
Terraform variables only in full-multi-node-cluster (14 variables):
| Variable |
Purpose |
should_use_arc_machines |
Toggle Arc machine mode vs. VM-hosted nodes |
arc_machine_count |
Number of pre-existing Arc machines to use |
arc_machine_name_prefix |
Naming prefix for Arc machine lookups |
arc_machine_resource_group_name |
Resource group containing Arc machines |
host_machine_count |
Number of VMs to create (multi-node) |
cluster_server_ip |
Explicit server IP override |
cluster_server_host_machine_username |
SSH username for cluster server |
onboard_identity_type |
Identity type for Arc onboarding |
enable_auto_scaling |
AKS auto-scaling toggle |
min_count / max_count |
AKS auto-scaling bounds |
dns_prefix |
AKS DNS prefix |
subnet_address_prefixes_aks |
AKS subnet CIDR |
subnet_address_prefixes_aks_pod |
AKS pod subnet CIDR |
aks_private_dns_zone_id |
Private DNS zone for AKS |
should_enable_otel_collector |
OpenTelemetry collector for edge IoT Ops |
Terraform main.tf logic only in full-multi-node-cluster:
- Arc machine data sources (
data "azurerm_arc_machine") and deferred prefix computation
- Conditional VM host creation (
count = local.should_use_arc_machines ? 0 : 1)
- Multi-node cluster machine slicing for server vs. worker nodes
cluster_node_machine / cluster_node_machine_count parameters to edge_cncf_cluster
should_generate_cluster_server_token for multi-node join
arc_onboarding_principal_ids for Arc machine identities
Logic to keep from full-single-node-cluster:
should_deploy_aio conditional gating on IoT Ops, assets, messaging modules
should_create_secret_sync_identity linked to should_deploy_aio
should_create_schema_registry and should_create_adr_namespace conditionals in cloud_data
tags variable passed to cloud_ai_foundry
- All connector
.tfvars.example files (dataflow, REST, ONVIF, SSE, Avro-to-JSON, Foundry)
Bicep: Unify main.bicep, main.bicepparam, and types.core.bicep similarly.
Example files to consolidate: simple.tfvars.example and simple-arc.tfvars.example from multi-node plus all .tfvars.example files from single-node.
Phase 2 — Rename
- Delete
blueprints/full-multi-node-cluster/
- Rename
blueprints/full-single-node-cluster/ → blueprints/full-multi-node-cluster/
- Update blueprint tag
"full-single-cluster" → "full-multi-cluster"
- Update module doc comment header
- Update
tests/go.mod module path and Go test file package comments
Phase 3 — Update all references (~58 files, ~195 references)
.github/ (instructions, agents, prompts) — 9 files, ~15 refs:
| File |
Change |
.github/copilot-instructions.md (6 refs) |
Replace all paths; merge "Complete Deployments" entry; update examples |
.github/agents/security-plan-creator.agent.md (2 refs) |
Merge single/multi blueprint descriptions |
.github/agents/learning-content-creator.agent.md (1 ref) |
Update main.tf path |
.github/agents/wasm-operator-builder.agent.md (1 ref) |
Update .tfvars.example path |
.github/instructions/wasm-build-deploy.instructions.md |
Update .tfvars.example path |
.github/instructions/wasm-operator-templates.instructions.md |
Update .tfvars.example path |
.github/instructions/README.md |
Update bicep file path example |
.github/prompts/terraform-from-blueprint.prompt.md |
Update example blueprint name |
.github/prompts/iotops-version-upgrade.prompt.md |
Update main.tf path |
copilot/ — 4 files, ~5 refs:
| File |
Change |
copilot/getting-started.md |
Change default blueprint name |
copilot/deploy.md |
Change suggested blueprint name |
copilot/bicep/bicep.md |
Verify reference (already multi) |
copilot/terraform/terraform.md |
Update directory listing |
docs/ — 16 files, ~55 refs:
| File |
Change |
docs/getting-started/general-user.md (8 refs) |
Merge table rows, update tree/commands/links |
docs/getting-started/blueprint-developer.md (8 refs) |
Update cp command and test reference links |
docs/contributing/testing-validation.md (4 refs) |
Update test paths and cd commands |
docs/contributing/documentation-development.md (1 ref) |
Update sidebar loading example |
docs/_sidebar.md (6 refs) |
Remove duplicate entries; point to unified |
docs/_parts/_sidebar.md (6 refs) |
Same |
docs/_parts/blueprints-sidebar.md (6 refs) |
Same |
docs/_parts/_navbar.md (2 refs) |
Merge into single entry |
docs/solution-adr-library/sse-connector-real-time-event-streaming.md (2 refs) |
Update paths |
docs/solution-adr-library/edge-video-streaming-and-image-capture.md (1 ref) |
Update blueprint name |
docs/solution-adr-library/akri-connector-component-organization.md (2 refs) |
Update name and test reference |
docs/solution-adr-library/onvif-connector-camera-integration.md (2 refs) |
Update paths |
docs/project-planning/scenarios/packaging-line-performance-optimization/prerequisites.md |
Merge table rows; update link defs |
docs/project-planning/scenarios/yield-process-optimization/prerequisites.md |
Same |
docs/project-planning/scenarios/operational-performance-monitoring/prerequisites.md |
Same |
docs/project-planning/scenarios/quality-process-optimization-automation/prerequisites.md |
Same |
docs/project-planning/scenarios/predictive-maintenance/prerequisites.md |
Same |
blueprints/ (cross-references) — 8 files, ~20 refs:
| File |
Change |
blueprints/README.md (6 refs) |
Merge two rows; update all paths |
blueprints/only-output-cncf-cluster-script/README.md |
Verify link (already correct after rename) |
blueprints/only-edge-iot-ops/README.md (2 refs) |
Remove single-node line or point to unified |
blueprints/only-cloud-single-node-cluster/README.md |
Same |
blueprints/partial-single-node-cluster/README.md |
Update comparison reference |
blueprints/fabric/README.md |
Update blueprint name |
blueprints/fabric-rti/README.md |
Update prerequisite blueprint name |
src/500-application/ — 7 files, ~45 refs:
| File |
Change |
src/500-application/505-akri-rest-http-connector/README.md (11 refs) |
Rename all paths, commands, descriptions |
src/500-application/508-media-connector/README.md (8 refs) |
Same |
src/500-application/508-media-connector/.nobuild (1 ref) |
Update comment |
src/500-application/509-sse-connector/README.md (8 refs) |
Same |
src/500-application/510-onvif-connector/README.md (8 refs) |
Same |
src/500-application/511-rust-embedded-wasm-provider/README.md (7 refs) |
Same |
src/500-application/512-avro-to-json/README.md (2 refs) |
Same |
src/ (other) — 3 files, ~25 refs:
| File |
Change |
src/000-cloud/085-ai-foundry/README.md |
Update blueprint names |
src/100-edge/README.md (2 refs) |
Update "Choose Blueprint" links |
src/900-tools-utilities/904-test-utilities/README.md (20+ refs) |
Update all test reference paths |
learning/ — 8 files, ~25 refs:
| File |
Change |
learning/katas/ai-assisted-engineering/100-getting-started-basics.md |
Update blueprint name and link |
learning/katas/ai-assisted-engineering/100-ai-development-fundamentals.md |
Update prompt example |
learning/katas/edge-deployment/README.md |
Update link definition |
learning/katas/fabric-integration/200-prerequisite-full-deployment.md |
Bulk rename all paths/descriptions |
learning/katas/fabric-integration/README.md |
Update blueprint reference |
learning/katas/troubleshooting/400-multi-component-debugging.md |
Update all paths |
learning/katas/troubleshooting/400-performance-optimization.md |
Update prerequisite |
learning/katas/troubleshooting/README.md |
Update blueprint reference |
Root files — 3 files, ~5 refs:
| File |
Change |
sitemap.xml (2 refs) |
Update both URLs |
scripts/location-check.sh |
Verify reference (already multi) |
scripts/build/Detect-Folder-Changes.ps1 |
Update example comments |
Phase 4 — Documentation language
Update all references previously describing full-single-node-cluster as "the recommended starting blueprint" to describe full-multi-node-cluster with guidance:
Set the nodes count to 1 for single-node deployments (default). Increase to support multi-node clusters.
Key docs: copilot/getting-started.md, copilot/deploy.md, docs/getting-started/general-user.md, learning/katas/ai-assisted-engineering/100-getting-started-basics.md, blueprints/README.md.
Phase 5 — Validation
Potential Challenges
- ~195 cross-references across ~58 files require careful bulk renaming; a missed reference will produce broken links or incorrect documentation.
- Bicep unification requires merging two separate
main.bicep / main.bicepparam / types.core.bicep files, which may have diverged differently than Terraform.
- Go test module path in
tests/go.mod and all _test.go package comments must be updated consistently to avoid build failures.
- Blueprint layering documentation (e.g.,
fabric-rti layered on top of full-single-node-cluster) must be updated to reference the new name while preserving the layering semantics.
- Users with existing deployments using
full-single-node-cluster will need to be aware of the path change if they reference the blueprint by directory path.
Additional Context
Reference count summary:
| Category |
Files Affected |
Approximate Reference Count |
.github/ (instructions, agents, prompts) |
9 |
~15 |
copilot/ |
4 |
~5 |
docs/ |
16 |
~55 |
blueprints/ (cross-references) |
8 |
~20 |
src/500-application/ |
7 |
~45 |
src/ (other) |
3 |
~25 |
learning/ |
8 |
~25 |
Root files (sitemap.xml, scripts) |
3 |
~5 |
| Total |
~58 files |
~195 references |
Acceptance criteria:
Target Components
Other Component Details
Copilot instructions, agent files, learning katas, scripts, sitemap, and Go test utilities.
Problem Statement
The
full-single-node-clusterandfull-multi-node-clusterblueprints share ~90% of their Terraform and Bicep code but diverge in multi-node support, Arc machine integration, and a handful of variables. Both blueprints must be kept in sync whenever components change, creating maintenance burden, code duplication, and frequent drift. The single-node blueprint has historically been the "default" recommendation for getting started, yet the multi-node variant adds only ~14 extra variables and conditional VM/Arc logic. There is no technical reason to maintain two separate blueprints when a single configurable blueprint can serve both use cases.Proposed Solution
Consolidate both blueprints into a single
full-multi-node-clusterblueprint that supports single-node and multi-node deployments via a configurablenodescount variable (defaulting to1).The work proceeds in five phases:
full-single-node-cluster(14 variables, Arc machine data sources, conditional VM host creation, multi-node cluster slicing, server token generation)full-multi-node-clusterand renamefull-single-node-clustertofull-multi-node-clusterBenefits
Alternative Solutions
Implementation Ideas
Phase 1 — Backport unique multi-node capabilities
Terraform variables only in
full-multi-node-cluster(14 variables):should_use_arc_machinesarc_machine_countarc_machine_name_prefixarc_machine_resource_group_namehost_machine_countcluster_server_ipcluster_server_host_machine_usernameonboard_identity_typeenable_auto_scalingmin_count/max_countdns_prefixsubnet_address_prefixes_akssubnet_address_prefixes_aks_podaks_private_dns_zone_idshould_enable_otel_collectorTerraform
main.tflogic only infull-multi-node-cluster:data "azurerm_arc_machine") and deferred prefix computationcount = local.should_use_arc_machines ? 0 : 1)cluster_node_machine/cluster_node_machine_countparameters toedge_cncf_clustershould_generate_cluster_server_tokenfor multi-node joinarc_onboarding_principal_idsfor Arc machine identitiesLogic to keep from
full-single-node-cluster:should_deploy_aioconditional gating on IoT Ops, assets, messaging modulesshould_create_secret_sync_identitylinked toshould_deploy_aioshould_create_schema_registryandshould_create_adr_namespaceconditionals incloud_datatagsvariable passed tocloud_ai_foundry.tfvars.examplefiles (dataflow, REST, ONVIF, SSE, Avro-to-JSON, Foundry)Bicep: Unify
main.bicep,main.bicepparam, andtypes.core.bicepsimilarly.Example files to consolidate:
simple.tfvars.exampleandsimple-arc.tfvars.examplefrom multi-node plus all.tfvars.examplefiles from single-node.Phase 2 — Rename
blueprints/full-multi-node-cluster/blueprints/full-single-node-cluster/→blueprints/full-multi-node-cluster/"full-single-cluster"→"full-multi-cluster"tests/go.modmodule path and Go test file package commentsPhase 3 — Update all references (~58 files, ~195 references)
.github/(instructions, agents, prompts) — 9 files, ~15 refs:.github/copilot-instructions.md(6 refs).github/agents/security-plan-creator.agent.md(2 refs).github/agents/learning-content-creator.agent.md(1 ref)main.tfpath.github/agents/wasm-operator-builder.agent.md(1 ref).tfvars.examplepath.github/instructions/wasm-build-deploy.instructions.md.tfvars.examplepath.github/instructions/wasm-operator-templates.instructions.md.tfvars.examplepath.github/instructions/README.md.github/prompts/terraform-from-blueprint.prompt.md.github/prompts/iotops-version-upgrade.prompt.mdmain.tfpathcopilot/— 4 files, ~5 refs:copilot/getting-started.mdcopilot/deploy.mdcopilot/bicep/bicep.mdcopilot/terraform/terraform.mddocs/— 16 files, ~55 refs:docs/getting-started/general-user.md(8 refs)docs/getting-started/blueprint-developer.md(8 refs)cpcommand and test reference linksdocs/contributing/testing-validation.md(4 refs)cdcommandsdocs/contributing/documentation-development.md(1 ref)docs/_sidebar.md(6 refs)docs/_parts/_sidebar.md(6 refs)docs/_parts/blueprints-sidebar.md(6 refs)docs/_parts/_navbar.md(2 refs)docs/solution-adr-library/sse-connector-real-time-event-streaming.md(2 refs)docs/solution-adr-library/edge-video-streaming-and-image-capture.md(1 ref)docs/solution-adr-library/akri-connector-component-organization.md(2 refs)docs/solution-adr-library/onvif-connector-camera-integration.md(2 refs)docs/project-planning/scenarios/packaging-line-performance-optimization/prerequisites.mddocs/project-planning/scenarios/yield-process-optimization/prerequisites.mddocs/project-planning/scenarios/operational-performance-monitoring/prerequisites.mddocs/project-planning/scenarios/quality-process-optimization-automation/prerequisites.mddocs/project-planning/scenarios/predictive-maintenance/prerequisites.mdblueprints/(cross-references) — 8 files, ~20 refs:blueprints/README.md(6 refs)blueprints/only-output-cncf-cluster-script/README.mdblueprints/only-edge-iot-ops/README.md(2 refs)blueprints/only-cloud-single-node-cluster/README.mdblueprints/partial-single-node-cluster/README.mdblueprints/fabric/README.mdblueprints/fabric-rti/README.mdsrc/500-application/— 7 files, ~45 refs:src/500-application/505-akri-rest-http-connector/README.md(11 refs)src/500-application/508-media-connector/README.md(8 refs)src/500-application/508-media-connector/.nobuild(1 ref)src/500-application/509-sse-connector/README.md(8 refs)src/500-application/510-onvif-connector/README.md(8 refs)src/500-application/511-rust-embedded-wasm-provider/README.md(7 refs)src/500-application/512-avro-to-json/README.md(2 refs)src/(other) — 3 files, ~25 refs:src/000-cloud/085-ai-foundry/README.mdsrc/100-edge/README.md(2 refs)src/900-tools-utilities/904-test-utilities/README.md(20+ refs)learning/— 8 files, ~25 refs:learning/katas/ai-assisted-engineering/100-getting-started-basics.mdlearning/katas/ai-assisted-engineering/100-ai-development-fundamentals.mdlearning/katas/edge-deployment/README.mdlearning/katas/fabric-integration/200-prerequisite-full-deployment.mdlearning/katas/fabric-integration/README.mdlearning/katas/troubleshooting/400-multi-component-debugging.mdlearning/katas/troubleshooting/400-performance-optimization.mdlearning/katas/troubleshooting/README.mdRoot files — 3 files, ~5 refs:
sitemap.xml(2 refs)scripts/location-check.shscripts/build/Detect-Folder-Changes.ps1Phase 4 — Documentation language
Update all references previously describing
full-single-node-clusteras "the recommended starting blueprint" to describefull-multi-node-clusterwith guidance:Key docs:
copilot/getting-started.md,copilot/deploy.md,docs/getting-started/general-user.md,learning/katas/ai-assisted-engineering/100-getting-started-basics.md,blueprints/README.md.Phase 5 — Validation
full-single-node-cluster(checked: none in.azdo/orazure-pipelines.yml).copilot-tracking/research documents are internal (advisory only, no updates required)tests/go.modmodule path updated along with all_test.gofilesgrep -r "full-single-node-cluster" .after all changes to catch remaining referencesPotential Challenges
main.bicep/main.bicepparam/types.core.bicepfiles, which may have diverged differently than Terraform.tests/go.modand all_test.gopackage comments must be updated consistently to avoid build failures.fabric-rtilayered on top offull-single-node-cluster) must be updated to reference the new name while preserving the layering semantics.full-single-node-clusterwill need to be aware of the path change if they reference the blueprint by directory path.Additional Context
Reference count summary:
.github/(instructions, agents, prompts)copilot/docs/blueprints/(cross-references)src/500-application/src/(other)learning/sitemap.xml, scripts)Acceptance criteria:
blueprints/full-single-node-cluster/directory no longer existsblueprints/full-multi-node-cluster/contains the unified blueprint with all features from both predecessorsnodes = 1(or the equivalent default) produces identical behavior to the oldfull-single-node-clusterhost_machine_count > 1, worker node slicing) function correctly.tfvars.examplefiles from both blueprints are present in the unified blueprintfull-single-node-clusterremain in the repository