@aifabrix/builder 2.58.0 → 2.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/agent-kit/codex-app-server.js +44 -0
- package/lib/agent-kit/git-identity.js +180 -0
- package/lib/agent-kit/init.js +4 -17
- package/lib/agent-kit/session-report.js +15 -10
- package/lib/agent-kit/setup-auth.js +131 -0
- package/lib/agent-kit/setup-context.js +118 -0
- package/lib/agent-kit/setup-github.js +70 -0
- package/lib/agent-kit/setup-managed.js +79 -0
- package/lib/agent-kit/setup-process.js +42 -0
- package/lib/agent-kit/setup-session.js +53 -0
- package/lib/agent-kit/setup-state.js +52 -0
- package/lib/agent-kit/setup-workspace.js +113 -0
- package/lib/agent-kit/setup.js +87 -0
- package/lib/agent-kit/start.js +48 -3
- package/lib/agent-kit/tmux-sessions.js +20 -3
- package/lib/api/dev.api.js +1 -1
- package/lib/api/miso-health.api.js +26 -0
- package/lib/api/role-assistant-test-job.api.js +60 -0
- package/lib/api/types/dev.types.js +3 -3
- package/lib/api/work-search.api.js +13 -6
- package/lib/app/deploy.js +8 -103
- package/lib/app/show-display.js +1 -0
- package/lib/app/show-online.js +15 -0
- package/lib/build/standard-docker-build.js +4 -1
- package/lib/cli/index.js +4 -0
- package/lib/cli/setup-app.js +14 -1
- package/lib/cli/setup-dev-path-commands.js +4 -0
- package/lib/cli/setup-dev.js +7 -4
- package/lib/cli/setup-help.js +86 -0
- package/lib/cli/setup-onboarding.js +37 -0
- package/lib/cli/setup-utility-repair.js +7 -5
- package/lib/cli/setup-utility.js +24 -1
- package/lib/commands/agent-kit-help.js +21 -7
- package/lib/commands/agent-kit-sessions.js +126 -0
- package/lib/commands/agent-kit-setup.js +44 -0
- package/lib/commands/agent-kit.js +5 -79
- package/lib/commands/dev-init.js +21 -23
- package/lib/commands/dev-refresh.js +2 -2
- package/lib/commands/governance-verify-external.js +12 -5
- package/lib/commands/repair-datasource.js +9 -9
- package/lib/commands/repair.js +45 -8
- package/lib/commands/role-assistant.js +7 -0
- package/lib/commands/upload-qualification-client.js +56 -11
- package/lib/commands/upload-qualification-poll.js +51 -22
- package/lib/commands/wizard-dataplane.js +16 -52
- package/lib/core/env-platform-expand.js +93 -0
- package/lib/core/secrets-env-content.js +37 -3
- package/lib/datasource/datasource-validate-summary.js +8 -5
- package/lib/datasource/sync-defaults.js +53 -0
- package/lib/deployment/installation/azure-infra-stage.js +13 -1
- package/lib/deployment/installation/azure-preflight.js +13 -2
- package/lib/deployment/installation/azure-readiness.js +24 -2
- package/lib/deployment/installation/environment-auth.js +60 -20
- package/lib/deployment/installation/environment-stage.js +9 -5
- package/lib/deployment/installation/infra-catalog.js +10 -7
- package/lib/deployment/installation/infra-manifest.js +5 -0
- package/lib/deployment/installation/registry-auth-mode.js +33 -10
- package/lib/deployment/marketplace-environment.js +26 -1
- package/lib/generator/builders.js +17 -0
- package/lib/generator/helpers.js +23 -2
- package/lib/generator/index.js +33 -18
- package/lib/integration-definition/apply.js +2 -2
- package/lib/internal/fs-real-sync.js +4 -1
- package/lib/programmatic/bearer-auth.js +3 -62
- package/lib/programmatic/builder-api-startup.js +51 -0
- package/lib/programmatic/builder-miso-runtime.js +167 -0
- package/lib/programmatic/openapi-descriptions.js +3 -3
- package/lib/programmatic/openapi-schema-descriptions-core.js +3 -3
- package/lib/programmatic/openapi-spec.js +2 -1
- package/lib/programmatic/route-handler-map.js +3 -2
- package/lib/role-assistant/test-cases-search.js +3 -0
- package/lib/role-assistant/test-job-runner.js +125 -0
- package/lib/role-assistant/test-runner-search.js +44 -2
- package/lib/schema/application-schema.json +193 -2
- package/lib/schema/environment-deploy-request.schema.json +1 -1
- package/lib/schema/external-datasource.schema.json +20 -5
- package/lib/schema/infra-parameter.schema.json +140 -34
- package/lib/schema/infra.parameter.yaml +30 -29
- package/lib/schema/infrastructure-schema.json +133 -14
- package/lib/schema/installation-environment.schema.json +1 -1
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/compose-generate-docker-compose.js +12 -0
- package/lib/utils/config-paths.js +24 -29
- package/lib/utils/config-registry-preference.js +13 -6
- package/lib/utils/dev-init-ssh-merge.js +5 -4
- package/lib/utils/dev-user-groups.js +2 -1
- package/lib/utils/docker-build.js +29 -8
- package/lib/utils/docker-daemon-tls-ca.js +2 -2
- package/lib/utils/docker-manifest-public-port.js +36 -0
- package/lib/utils/error-formatters/validation-errors.js +25 -5
- package/lib/utils/help-builder.js +4 -3
- package/lib/utils/platform-resolution.js +226 -0
- package/lib/utils/resolve-docker-image-ref.js +8 -3
- package/lib/utils/token-manager.js +29 -36
- package/package.json +4 -3
- package/templates/README.md +2 -1
- package/templates/agent-kit/agent-kit.yaml +4 -1
- package/templates/agent-kit/instructions/AGENTKIT.md +40 -3
- package/templates/agent-kit/instructions/root.AGENTS.md +42 -1
- package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +33 -1
- package/templates/agent-kit/skills/aifabrix-connected-system/scripts/delivery-verdict.js +176 -0
- package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +3 -0
- package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +10 -3
- package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +22 -0
- package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +21 -0
- package/templates/agent-kit/skills/shared/feedback.md +31 -0
- package/templates/agent-kit/skills/shared/hosts.md +35 -7
- package/templates/agent-kit/skills/shared/status.md +85 -0
- package/templates/agent-kit/workspace/BUILDER_IMPROVEMENT_FINDINGS.md +27 -0
- package/templates/agent-kit/workspace/README.md +14 -1
- package/templates/applications/builder-api/application.yaml +1 -1
- package/templates/applications/dataplane/application.yaml +30 -2
- package/templates/applications/dataplane/env.template +37 -4
- package/templates/applications/miso-controller/application.yaml +24 -1
- package/templates/applications/miso-controller/env.template +22 -35
- package/templates/external-system/external-datasource.yaml.hbs +7 -6
- package/templates/marketplace/main.json +281 -75
- package/templates/python/Dockerfile.hbs +2 -0
- package/templates/typescript/Dockerfile.hbs +2 -0
- package/templates/typescript/docker-compose.hbs +12 -0
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"_generator": {
|
|
6
6
|
"name": "bicep",
|
|
7
7
|
"version": "0.47.16.16243",
|
|
8
|
-
"templateHash": "
|
|
8
|
+
"templateHash": "6752412774681258733"
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"parameters": {
|
|
@@ -23,6 +23,14 @@
|
|
|
23
23
|
"description": "Azure region for deployment. Default is the managed resource group location; portal may override via createUiDefinition."
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
|
+
"capacityProfile": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"defaultValue": "s",
|
|
29
|
+
"allowedValues": ["s", "m", "l", "xl"],
|
|
30
|
+
"metadata": {
|
|
31
|
+
"description": "Baseline capacity of the Miso/Keycloak foundation: s (B3), m (P2v3), l (P3v3), xl (P3mv3). One compute instance for every profile. Select the purchased capacity independently of licenseEdition; this does not provision workload environment topology."
|
|
32
|
+
}
|
|
33
|
+
},
|
|
26
34
|
"tags": {
|
|
27
35
|
"type": "object",
|
|
28
36
|
"defaultValue": {
|
|
@@ -133,7 +141,14 @@
|
|
|
133
141
|
"type": "bool",
|
|
134
142
|
"defaultValue": true,
|
|
135
143
|
"metadata": {
|
|
136
|
-
"description": "When false, skip ARM role assignments (CI/CD redeploy without roleAssignments/write). RBAC must already exist."
|
|
144
|
+
"description": "When false, skip ARM role assignments in THIS resource group (CI/CD redeploy without roleAssignments/write). RBAC must already exist."
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"deployRegistryRoleAssignment": {
|
|
148
|
+
"type": "bool",
|
|
149
|
+
"defaultValue": "[parameters('deployRoleAssignments')]",
|
|
150
|
+
"metadata": {
|
|
151
|
+
"description": "When false, skip the AcrPull grant on the container registry. That grant lives in the registry's own resource group, which for a customer installation is in the vendor's tenant, where Azure RBAC cannot reach. An installation deployed with registry credentials sets this false and keeps the grants in its own resource group, which it does own."
|
|
137
152
|
}
|
|
138
153
|
},
|
|
139
154
|
"moriBaseUrl": {
|
|
@@ -143,18 +158,18 @@
|
|
|
143
158
|
"description": "Mori base URL for controller tenant activation and Entra handoff (no trailing slash)"
|
|
144
159
|
}
|
|
145
160
|
},
|
|
146
|
-
"
|
|
147
|
-
"type": "
|
|
161
|
+
"moriLicensePublicKey": {
|
|
162
|
+
"type": "string",
|
|
148
163
|
"defaultValue": "",
|
|
149
164
|
"metadata": {
|
|
150
|
-
"description": "
|
|
165
|
+
"description": "Mori licence issuer public key in SPKI PEM form. Empty leaves the installation unpinned, and Miso then refuses a licence rather than trusting a key carried inside it."
|
|
151
166
|
}
|
|
152
167
|
},
|
|
153
|
-
"
|
|
154
|
-
"type": "
|
|
155
|
-
"defaultValue": "",
|
|
168
|
+
"moriLicenseIssuer": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"defaultValue": "mori-controller",
|
|
156
171
|
"metadata": {
|
|
157
|
-
"description": "
|
|
172
|
+
"description": "Expected `iss` claim on a Mori licence."
|
|
158
173
|
}
|
|
159
174
|
},
|
|
160
175
|
"entraIdClientId": {
|
|
@@ -210,15 +225,44 @@
|
|
|
210
225
|
},
|
|
211
226
|
"variables": {
|
|
212
227
|
"infrastructureName": "[if(not(empty(parameters('infrastructureNameOverride'))), parameters('infrastructureNameOverride'), resourceGroup().name)]",
|
|
228
|
+
"capacityProfiles": {
|
|
229
|
+
"s": {
|
|
230
|
+
"computeSku": "B3",
|
|
231
|
+
"postgresSku": "Standard_B2ms",
|
|
232
|
+
"postgresTier": "Burstable",
|
|
233
|
+
"postgresStorageGB": 64
|
|
234
|
+
},
|
|
235
|
+
"m": {
|
|
236
|
+
"computeSku": "P2v3",
|
|
237
|
+
"postgresSku": "Standard_D2ds_v5",
|
|
238
|
+
"postgresTier": "GeneralPurpose",
|
|
239
|
+
"postgresStorageGB": 128
|
|
240
|
+
},
|
|
241
|
+
"l": {
|
|
242
|
+
"computeSku": "P3v3",
|
|
243
|
+
"postgresSku": "Standard_D4ds_v5",
|
|
244
|
+
"postgresTier": "GeneralPurpose",
|
|
245
|
+
"postgresStorageGB": 256
|
|
246
|
+
},
|
|
247
|
+
"xl": {
|
|
248
|
+
"computeSku": "P3mv3",
|
|
249
|
+
"postgresSku": "Standard_D8ds_v5",
|
|
250
|
+
"postgresTier": "GeneralPurpose",
|
|
251
|
+
"postgresStorageGB": 512
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"selectedCapacity": "[variables('capacityProfiles')[parameters('capacityProfile')]]",
|
|
213
255
|
"deploymentLocation": "[parameters('location')]",
|
|
214
256
|
"appInsightsLocation": "[if(equals(variables('deploymentLocation'), 'norwaywest'), 'norwayeast', variables('deploymentLocation'))]",
|
|
215
257
|
"openAiLocationKnown": "[contains(createArray('australiaeast', 'brazilsouth', 'canadaeast', 'eastus', 'eastus2', 'francecentral', 'japaneast', 'koreacentral', 'northcentralus', 'norwayeast', 'polandcentral', 'southafricanorth', 'southcentralus', 'southindia', 'swedencentral', 'switzerlandnorth', 'uksouth', 'westeurope', 'westus', 'westus3'), variables('deploymentLocation'))]",
|
|
216
|
-
"
|
|
258
|
+
"createAzureOpenAI": "[and(and(parameters('enableAzureOpenAI'), variables('openAiLocationKnown')), not(variables('hostedInstallation')))]",
|
|
217
259
|
"subnetBase": "[add(20, mod(length(variables('infrastructureName')), 230))]",
|
|
218
260
|
"registryPasswordConfigured": "[not(empty(parameters('acrAdminPassword')))]",
|
|
219
261
|
"acrRegistryName": "[toLower(last(split(parameters('acrResourceId'), '/')))]",
|
|
220
262
|
"effectiveAcrLoginServer": "[if(empty(parameters('acrLoginServer')), format('{0}{1}', variables('acrRegistryName'), environment().suffixes.acrLoginServer), parameters('acrLoginServer'))]",
|
|
221
263
|
"registryUsername": "[if(variables('registryPasswordConfigured'), if(empty(parameters('acrAdminUsername')), variables('acrRegistryName'), parameters('acrAdminUsername')), '')]",
|
|
264
|
+
"hostedInstallation": "[equals(parameters('onboardingMode'), 'saasDirect')]",
|
|
265
|
+
"effectiveEntraIdTenantId": "[if(variables('hostedInstallation'), '', parameters('entraIdTenantId'))]",
|
|
222
266
|
"keycloakContainerImage": "[format('{0}/aifabrix/keycloak:{1}', variables('effectiveAcrLoginServer'), parameters('keycloakImageTag'))]",
|
|
223
267
|
"misoControllerContainerImage": "[format('{0}/aifabrix/miso-controller:{1}', variables('effectiveAcrLoginServer'), parameters('misoImageTag'))]",
|
|
224
268
|
"keycloakVdirPublic": "/auth",
|
|
@@ -973,7 +1017,7 @@
|
|
|
973
1017
|
]
|
|
974
1018
|
},
|
|
975
1019
|
{
|
|
976
|
-
"condition": "[
|
|
1020
|
+
"condition": "[variables('createAzureOpenAI')]",
|
|
977
1021
|
"type": "Microsoft.Resources/deployments",
|
|
978
1022
|
"apiVersion": "2025-04-01",
|
|
979
1023
|
"name": "azureOpenAI",
|
|
@@ -987,7 +1031,7 @@
|
|
|
987
1031
|
"value": "[variables('infrastructureName')]"
|
|
988
1032
|
},
|
|
989
1033
|
"location": {
|
|
990
|
-
"value": "[variables('
|
|
1034
|
+
"value": "[variables('deploymentLocation')]"
|
|
991
1035
|
},
|
|
992
1036
|
"tags": {
|
|
993
1037
|
"value": "[parameters('tags')]"
|
|
@@ -1432,10 +1476,10 @@
|
|
|
1432
1476
|
"value": "[format('{0}-miso-asp', variables('infrastructureName'))]"
|
|
1433
1477
|
},
|
|
1434
1478
|
"skuDisplay": {
|
|
1435
|
-
"value": "
|
|
1479
|
+
"value": "[variables('selectedCapacity').computeSku]"
|
|
1436
1480
|
},
|
|
1437
1481
|
"capacity": {
|
|
1438
|
-
"value":
|
|
1482
|
+
"value": 1
|
|
1439
1483
|
},
|
|
1440
1484
|
"tags": {
|
|
1441
1485
|
"value": "[parameters('tags')]"
|
|
@@ -1448,7 +1492,7 @@
|
|
|
1448
1492
|
"_generator": {
|
|
1449
1493
|
"name": "bicep",
|
|
1450
1494
|
"version": "0.47.16.16243",
|
|
1451
|
-
"templateHash": "
|
|
1495
|
+
"templateHash": "11613691335280989070"
|
|
1452
1496
|
}
|
|
1453
1497
|
},
|
|
1454
1498
|
"parameters": {
|
|
@@ -1467,20 +1511,7 @@
|
|
|
1467
1511
|
},
|
|
1468
1512
|
"skuDisplay": {
|
|
1469
1513
|
"type": "string",
|
|
1470
|
-
"allowedValues": [
|
|
1471
|
-
"B1",
|
|
1472
|
-
"B2",
|
|
1473
|
-
"B3",
|
|
1474
|
-
"S1",
|
|
1475
|
-
"S2",
|
|
1476
|
-
"S3",
|
|
1477
|
-
"P1v3",
|
|
1478
|
-
"P2v3",
|
|
1479
|
-
"P3v3",
|
|
1480
|
-
"EP1",
|
|
1481
|
-
"EP2",
|
|
1482
|
-
"EP3"
|
|
1483
|
-
],
|
|
1514
|
+
"allowedValues": ["B1", "B2", "B3", "P1v3", "P2v3", "P3v3", "P3mv3"],
|
|
1484
1515
|
"metadata": {
|
|
1485
1516
|
"description": "Select a Linux-compatible App Service Plan SKU with details"
|
|
1486
1517
|
}
|
|
@@ -1507,15 +1538,10 @@
|
|
|
1507
1538
|
"B1": "Basic",
|
|
1508
1539
|
"B2": "Basic",
|
|
1509
1540
|
"B3": "Basic",
|
|
1510
|
-
"S1": "Standard",
|
|
1511
|
-
"S2": "Standard",
|
|
1512
|
-
"S3": "Standard",
|
|
1513
1541
|
"P1v3": "PremiumV3",
|
|
1514
1542
|
"P2v3": "PremiumV3",
|
|
1515
1543
|
"P3v3": "PremiumV3",
|
|
1516
|
-
"
|
|
1517
|
-
"EP2": "ElasticPremium",
|
|
1518
|
-
"EP3": "ElasticPremium"
|
|
1544
|
+
"P3mv3": "PremiumV3"
|
|
1519
1545
|
}
|
|
1520
1546
|
},
|
|
1521
1547
|
"resources": [
|
|
@@ -1755,13 +1781,13 @@
|
|
|
1755
1781
|
"value": "15"
|
|
1756
1782
|
},
|
|
1757
1783
|
"skuName": {
|
|
1758
|
-
"value": "
|
|
1784
|
+
"value": "[variables('selectedCapacity').postgresSku]"
|
|
1759
1785
|
},
|
|
1760
1786
|
"skuTier": {
|
|
1761
|
-
"value": "
|
|
1787
|
+
"value": "[variables('selectedCapacity').postgresTier]"
|
|
1762
1788
|
},
|
|
1763
1789
|
"storageSizeGB": {
|
|
1764
|
-
"value":
|
|
1790
|
+
"value": "[variables('selectedCapacity').postgresStorageGB]"
|
|
1765
1791
|
},
|
|
1766
1792
|
"subnetId": {
|
|
1767
1793
|
"value": "[reference(resourceId('Microsoft.Resources/deployments', 'network'), '2025-04-01').outputs.postgresSubnetId.value]"
|
|
@@ -2190,7 +2216,7 @@
|
|
|
2190
2216
|
"_generator": {
|
|
2191
2217
|
"name": "bicep",
|
|
2192
2218
|
"version": "0.47.16.16243",
|
|
2193
|
-
"templateHash": "
|
|
2219
|
+
"templateHash": "10929433789276981779"
|
|
2194
2220
|
}
|
|
2195
2221
|
},
|
|
2196
2222
|
"parameters": {
|
|
@@ -2491,6 +2517,15 @@
|
|
|
2491
2517
|
},
|
|
2492
2518
|
"encryptionKey": {
|
|
2493
2519
|
"value": "[reference(resourceId('Microsoft.Resources/deployments', 'bootstrapSecrets'), '2025-04-01').outputs.encryptionKey.value]"
|
|
2520
|
+
},
|
|
2521
|
+
"entraIdClientSecret": {
|
|
2522
|
+
"value": "[parameters('entraIdClientSecret')]"
|
|
2523
|
+
},
|
|
2524
|
+
"moriLicensePublicKey": {
|
|
2525
|
+
"value": "[parameters('moriLicensePublicKey')]"
|
|
2526
|
+
},
|
|
2527
|
+
"moriBaseUrl": {
|
|
2528
|
+
"value": "[parameters('moriBaseUrl')]"
|
|
2494
2529
|
}
|
|
2495
2530
|
},
|
|
2496
2531
|
"template": {
|
|
@@ -2500,7 +2535,7 @@
|
|
|
2500
2535
|
"_generator": {
|
|
2501
2536
|
"name": "bicep",
|
|
2502
2537
|
"version": "0.47.16.16243",
|
|
2503
|
-
"templateHash": "
|
|
2538
|
+
"templateHash": "445562478593270876"
|
|
2504
2539
|
}
|
|
2505
2540
|
},
|
|
2506
2541
|
"parameters": {
|
|
@@ -2568,9 +2603,31 @@
|
|
|
2568
2603
|
"metadata": {
|
|
2569
2604
|
"description": "MISO Client Secret (auto-generated if not provided)"
|
|
2570
2605
|
}
|
|
2606
|
+
},
|
|
2607
|
+
"entraIdClientSecret": {
|
|
2608
|
+
"type": "securestring",
|
|
2609
|
+
"defaultValue": "",
|
|
2610
|
+
"metadata": {
|
|
2611
|
+
"description": "Vendor Entra app client secret (ENTRA_ID_CLIENT_SECRET). Placeholder when empty — replace for live Entra flows."
|
|
2612
|
+
}
|
|
2613
|
+
},
|
|
2614
|
+
"moriLicensePublicKey": {
|
|
2615
|
+
"type": "string",
|
|
2616
|
+
"defaultValue": "",
|
|
2617
|
+
"metadata": {
|
|
2618
|
+
"description": "Mori licence issuer public key (SPKI PEM). Empty leaves the installation unpinned."
|
|
2619
|
+
}
|
|
2620
|
+
},
|
|
2621
|
+
"moriBaseUrl": {
|
|
2622
|
+
"type": "string",
|
|
2623
|
+
"defaultValue": "",
|
|
2624
|
+
"metadata": {
|
|
2625
|
+
"description": "Mori base URL, stored so App Service can reference it instead of holding a literal."
|
|
2626
|
+
}
|
|
2571
2627
|
}
|
|
2572
2628
|
},
|
|
2573
2629
|
"variables": {
|
|
2630
|
+
"resolvedEntraIdClientSecret": "[if(not(empty(parameters('entraIdClientSecret'))), parameters('entraIdClientSecret'), format('PLACEHOLDER_ENTRA_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]",
|
|
2574
2631
|
"misoWebAppOrigin": "[if(endsWith(parameters('misoWebAppUrl'), '/'), substring(parameters('misoWebAppUrl'), 0, max(0, sub(length(parameters('misoWebAppUrl')), 1))), parameters('misoWebAppUrl'))]",
|
|
2575
2632
|
"misoVdirSegment": "[if(or(equals(parameters('misoVdirPublic'), ''), equals(parameters('misoVdirPublic'), '/')), '', if(startsWith(parameters('misoVdirPublic'), '/'), parameters('misoVdirPublic'), format('/{0}', parameters('misoVdirPublic'))))]",
|
|
2576
2633
|
"misoWebServerPublicUrl": "[if(empty(variables('misoVdirSegment')), variables('misoWebAppOrigin'), format('{0}{1}', variables('misoWebAppOrigin'), variables('misoVdirSegment')))]",
|
|
@@ -2660,6 +2717,32 @@
|
|
|
2660
2717
|
"properties": {
|
|
2661
2718
|
"value": "[if(not(empty(parameters('misoClientSecret'))), parameters('misoClientSecret'), format('PLACEHOLDER_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]"
|
|
2662
2719
|
}
|
|
2720
|
+
},
|
|
2721
|
+
{
|
|
2722
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
2723
|
+
"apiVersion": "2023-07-01",
|
|
2724
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'entra-client-secretKeyVault')]",
|
|
2725
|
+
"properties": {
|
|
2726
|
+
"value": "[variables('resolvedEntraIdClientSecret')]"
|
|
2727
|
+
}
|
|
2728
|
+
},
|
|
2729
|
+
{
|
|
2730
|
+
"condition": "[not(empty(parameters('moriLicensePublicKey')))]",
|
|
2731
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
2732
|
+
"apiVersion": "2023-07-01",
|
|
2733
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-license-public-keyKeyVault')]",
|
|
2734
|
+
"properties": {
|
|
2735
|
+
"value": "[parameters('moriLicensePublicKey')]"
|
|
2736
|
+
}
|
|
2737
|
+
},
|
|
2738
|
+
{
|
|
2739
|
+
"condition": "[not(empty(parameters('moriBaseUrl')))]",
|
|
2740
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
2741
|
+
"apiVersion": "2023-07-01",
|
|
2742
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-base-urlKeyVault')]",
|
|
2743
|
+
"properties": {
|
|
2744
|
+
"value": "[parameters('moriBaseUrl')]"
|
|
2745
|
+
}
|
|
2663
2746
|
}
|
|
2664
2747
|
]
|
|
2665
2748
|
}
|
|
@@ -2710,6 +2793,12 @@
|
|
|
2710
2793
|
"keycloakWebAppUrl": {
|
|
2711
2794
|
"value": "[reference(resourceId('Microsoft.Resources/deployments', 'keycloakWebApp'), '2025-04-01').outputs.webAppUrl.value]"
|
|
2712
2795
|
},
|
|
2796
|
+
"keycloakVdirPublic": {
|
|
2797
|
+
"value": "[variables('keycloakVdirPublic')]"
|
|
2798
|
+
},
|
|
2799
|
+
"misoVdirPublic": {
|
|
2800
|
+
"value": "/miso"
|
|
2801
|
+
},
|
|
2713
2802
|
"keycloakRealm": {
|
|
2714
2803
|
"value": "aifabrix"
|
|
2715
2804
|
},
|
|
@@ -2755,20 +2844,17 @@
|
|
|
2755
2844
|
"moriBaseUrl": {
|
|
2756
2845
|
"value": "[parameters('moriBaseUrl')]"
|
|
2757
2846
|
},
|
|
2758
|
-
"
|
|
2759
|
-
"value": "[parameters('
|
|
2847
|
+
"moriLicensePublicKey": {
|
|
2848
|
+
"value": "[parameters('moriLicensePublicKey')]"
|
|
2760
2849
|
},
|
|
2761
|
-
"
|
|
2762
|
-
"value": "[parameters('
|
|
2850
|
+
"moriLicenseIssuer": {
|
|
2851
|
+
"value": "[parameters('moriLicenseIssuer')]"
|
|
2763
2852
|
},
|
|
2764
2853
|
"entraIdClientId": {
|
|
2765
2854
|
"value": "[parameters('entraIdClientId')]"
|
|
2766
2855
|
},
|
|
2767
|
-
"entraIdClientSecret": {
|
|
2768
|
-
"value": "[parameters('entraIdClientSecret')]"
|
|
2769
|
-
},
|
|
2770
2856
|
"entraIdTenantId": {
|
|
2771
|
-
"value": "[
|
|
2857
|
+
"value": "[variables('effectiveEntraIdTenantId')]"
|
|
2772
2858
|
},
|
|
2773
2859
|
"licenseEdition": {
|
|
2774
2860
|
"value": "[parameters('licenseEdition')]"
|
|
@@ -2776,6 +2862,9 @@
|
|
|
2776
2862
|
"onboardingMode": {
|
|
2777
2863
|
"value": "[parameters('onboardingMode')]"
|
|
2778
2864
|
},
|
|
2865
|
+
"capacityProfile": {
|
|
2866
|
+
"value": "[parameters('capacityProfile')]"
|
|
2867
|
+
},
|
|
2779
2868
|
"resourceGroupName": {
|
|
2780
2869
|
"value": "[resourceGroup().name]"
|
|
2781
2870
|
},
|
|
@@ -2790,7 +2879,7 @@
|
|
|
2790
2879
|
"_generator": {
|
|
2791
2880
|
"name": "bicep",
|
|
2792
2881
|
"version": "0.47.16.16243",
|
|
2793
|
-
"templateHash": "
|
|
2882
|
+
"templateHash": "13342696621269025420"
|
|
2794
2883
|
}
|
|
2795
2884
|
},
|
|
2796
2885
|
"parameters": {
|
|
@@ -2943,6 +3032,20 @@
|
|
|
2943
3032
|
"description": "MISO controller web app URL (for MISO_WEB_SERVER_URL)"
|
|
2944
3033
|
}
|
|
2945
3034
|
},
|
|
3035
|
+
"keycloakVdirPublic": {
|
|
3036
|
+
"type": "string",
|
|
3037
|
+
"defaultValue": "/auth",
|
|
3038
|
+
"metadata": {
|
|
3039
|
+
"description": "Public virtual-directory path for Keycloak (Front Door /auth/*). Builds KEYCLOAK_SERVER_URL."
|
|
3040
|
+
}
|
|
3041
|
+
},
|
|
3042
|
+
"misoVdirPublic": {
|
|
3043
|
+
"type": "string",
|
|
3044
|
+
"defaultValue": "/miso",
|
|
3045
|
+
"metadata": {
|
|
3046
|
+
"description": "Public virtual-directory path for the controller. Emitted as MISO_RELATIVE_PATH."
|
|
3047
|
+
}
|
|
3048
|
+
},
|
|
2946
3049
|
"enablePostgresPublicAccess": {
|
|
2947
3050
|
"type": "bool",
|
|
2948
3051
|
"defaultValue": false,
|
|
@@ -2972,32 +3075,25 @@
|
|
|
2972
3075
|
"description": "Mori base URL (no trailing slash); used for tenant activation / handoff"
|
|
2973
3076
|
}
|
|
2974
3077
|
},
|
|
2975
|
-
"
|
|
2976
|
-
"type": "
|
|
3078
|
+
"moriLicensePublicKey": {
|
|
3079
|
+
"type": "string",
|
|
2977
3080
|
"defaultValue": "",
|
|
2978
3081
|
"metadata": {
|
|
2979
|
-
"description": "
|
|
3082
|
+
"description": "Mori licence issuer public key (SPKI PEM). Empty leaves this installation unpinned."
|
|
2980
3083
|
}
|
|
2981
3084
|
},
|
|
2982
|
-
"
|
|
2983
|
-
"type": "
|
|
2984
|
-
"defaultValue": "",
|
|
3085
|
+
"moriLicenseIssuer": {
|
|
3086
|
+
"type": "string",
|
|
3087
|
+
"defaultValue": "mori-controller",
|
|
2985
3088
|
"metadata": {
|
|
2986
|
-
"description": "
|
|
3089
|
+
"description": "Expected `iss` claim on a Mori licence."
|
|
2987
3090
|
}
|
|
2988
3091
|
},
|
|
2989
3092
|
"entraIdClientId": {
|
|
2990
3093
|
"type": "string",
|
|
2991
3094
|
"defaultValue": "481251f2-a318-47ba-9ad8-40c36f790df1",
|
|
2992
3095
|
"metadata": {
|
|
2993
|
-
"description": "Vendor multi-tenant Entra app client ID."
|
|
2994
|
-
}
|
|
2995
|
-
},
|
|
2996
|
-
"entraIdClientSecret": {
|
|
2997
|
-
"type": "securestring",
|
|
2998
|
-
"defaultValue": "",
|
|
2999
|
-
"metadata": {
|
|
3000
|
-
"description": "Optional vendor Entra app client secret, supplied through the Miso installation contract."
|
|
3096
|
+
"description": "Vendor multi-tenant Entra app client ID. No longer emitted as an app setting — Miso does not hold provider credentials; Mori does. Retained so the marketplace parameter surface is unchanged."
|
|
3001
3097
|
}
|
|
3002
3098
|
},
|
|
3003
3099
|
"entraIdTenantId": {
|
|
@@ -3022,6 +3118,13 @@
|
|
|
3022
3118
|
"description": "Tenant onboarding mode (ONBOARDING_MODE)."
|
|
3023
3119
|
}
|
|
3024
3120
|
},
|
|
3121
|
+
"capacityProfile": {
|
|
3122
|
+
"type": "string",
|
|
3123
|
+
"defaultValue": "s",
|
|
3124
|
+
"metadata": {
|
|
3125
|
+
"description": "Capacity the installation was provisioned at (s/m/l/xl). Emitted as INSTALLATION_CAPACITY_PROFILE so the controller sizes the platform environment from the installation rather than guessing; without it the controller assumed m and rewrote an S App Service Plan to P2v3."
|
|
3126
|
+
}
|
|
3127
|
+
},
|
|
3025
3128
|
"resourceGroupName": {
|
|
3026
3129
|
"type": "string",
|
|
3027
3130
|
"defaultValue": "[resourceGroup().name]",
|
|
@@ -3035,10 +3138,27 @@
|
|
|
3035
3138
|
"metadata": {
|
|
3036
3139
|
"description": "Mori license JWT for controller. Empty uses Mori subscription validation. DEVELOPMENT is ignored when DEPLOYMENT=azure."
|
|
3037
3140
|
}
|
|
3141
|
+
},
|
|
3142
|
+
"bootstrapAppKeys": {
|
|
3143
|
+
"type": "string",
|
|
3144
|
+
"defaultValue": "dataplane,builder-api,mori-controller",
|
|
3145
|
+
"metadata": {
|
|
3146
|
+
"description": "Workload applications an installer may provision at install time (BOOTSTRAP_APPKEYS)."
|
|
3147
|
+
}
|
|
3038
3148
|
}
|
|
3039
3149
|
},
|
|
3040
3150
|
"variables": {
|
|
3041
3151
|
"shouldDisableRateLimit": "[if(equals(parameters('deploymentEnvironment'), 'prod'), 'false', 'true')]",
|
|
3152
|
+
"misoOriginUrl": "[if(not(empty(parameters('misoControllerUrl'))), parameters('misoControllerUrl'), format('https://{0}.azurewebsites.net', parameters('name')))]",
|
|
3153
|
+
"misoWebAppOrigin": "[if(endsWith(variables('misoOriginUrl'), '/'), substring(variables('misoOriginUrl'), 0, max(0, sub(length(variables('misoOriginUrl')), 1))), variables('misoOriginUrl'))]",
|
|
3154
|
+
"misoVdirSegment": "[if(or(equals(parameters('misoVdirPublic'), ''), equals(parameters('misoVdirPublic'), '/')), '', if(startsWith(parameters('misoVdirPublic'), '/'), parameters('misoVdirPublic'), format('/{0}', parameters('misoVdirPublic'))))]",
|
|
3155
|
+
"misoPublicUrl": "[if(empty(variables('misoVdirSegment')), variables('misoWebAppOrigin'), format('{0}{1}', variables('misoWebAppOrigin'), variables('misoVdirSegment')))]",
|
|
3156
|
+
"misoInternalUrl": "[if(empty(variables('misoVdirSegment')), variables('misoWebAppOrigin'), format('{0}{1}', variables('misoWebAppOrigin'), variables('misoVdirSegment')))]",
|
|
3157
|
+
"misoVdirValue": "[if(empty(variables('misoVdirSegment')), '/', variables('misoVdirSegment'))]",
|
|
3158
|
+
"keycloakWebAppOrigin": "[if(endsWith(parameters('keycloakWebAppUrl'), '/'), substring(parameters('keycloakWebAppUrl'), 0, max(0, sub(length(parameters('keycloakWebAppUrl')), 1))), parameters('keycloakWebAppUrl'))]",
|
|
3159
|
+
"keycloakVdirSegment": "[if(or(equals(parameters('keycloakVdirPublic'), ''), equals(parameters('keycloakVdirPublic'), '/')), '', if(startsWith(parameters('keycloakVdirPublic'), '/'), parameters('keycloakVdirPublic'), format('/{0}', parameters('keycloakVdirPublic'))))]",
|
|
3160
|
+
"keycloakPublicUrl": "[if(empty(variables('keycloakVdirSegment')), variables('keycloakWebAppOrigin'), format('{0}{1}', variables('keycloakWebAppOrigin'), variables('keycloakVdirSegment')))]",
|
|
3161
|
+
"keycloakInternalUrl": "[variables('keycloakPublicUrl')]",
|
|
3042
3162
|
"databaseUrlAppSettingValue": "[if(not(empty(parameters('databaseUrlSecretUriWithVersion'))), format('@Microsoft.KeyVault(SecretUri={0})', parameters('databaseUrlSecretUriWithVersion')), format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-databases-0-urlKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix')))]",
|
|
3043
3163
|
"databaseLogUrlAppSettingValue": "[if(not(empty(parameters('databaseLogUrlSecretUriWithVersion'))), format('@Microsoft.KeyVault(SecretUri={0})', parameters('databaseLogUrlSecretUriWithVersion')), format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-databases-1-urlKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix')))]",
|
|
3044
3164
|
"moriBaseNormalized": "[if(and(greater(length(parameters('moriBaseUrl')), 1), endsWith(parameters('moriBaseUrl'), '/')), substring(parameters('moriBaseUrl'), 0, max(0, sub(length(parameters('moriBaseUrl')), 1))), parameters('moriBaseUrl'))]",
|
|
@@ -3086,7 +3206,7 @@
|
|
|
3086
3206
|
"acrUseManagedIdentityCreds": "[not(parameters('registryPasswordConfigured'))]",
|
|
3087
3207
|
"healthCheckPath": "/health",
|
|
3088
3208
|
"alwaysOn": true,
|
|
3089
|
-
"appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'DATABASE_URL', 'value', variables('databaseUrlAppSettingValue')), createObject('name', 'JWT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-secrets-jwtKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'NODE_ENV', 'value', 'production'), createObject('name', 'LOCATION', 'value', parameters('location')), createObject('name', 'PORT', 'value', '3000'), createObject('name', '
|
|
3209
|
+
"appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'DATABASE_URL', 'value', variables('databaseUrlAppSettingValue')), createObject('name', 'JWT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-secrets-jwtKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'NODE_ENV', 'value', 'production'), createObject('name', 'LOCATION', 'value', parameters('location')), createObject('name', 'PORT', 'value', '3000'), createObject('name', 'ALLOWED_ORIGINS', 'value', format('http://localhost:*,http://127.0.0.1:*,https://{0}.azurewebsites.net', parameters('name'))), createObject('name', 'WEBSITE_VNET_ROUTE_ALL', 'value', if(parameters('enablePostgresPublicAccess'), '0', '1')), createObject('name', 'WEBSITE_DNS_SERVER', 'value', '168.63.129.16'), createObject('name', 'DATABASELOG_URL', 'value', variables('databaseLogUrlAppSettingValue')), createObject('name', 'KEY_VAULT_ENABLED', 'value', 'true'), createObject('name', 'SECURITY_STORAGE_MODE', 'value', 'keyvault'), createObject('name', 'KEY_VAULT_URL', 'value', format('https://{0}.vault.azure.net/', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'ENCRYPTION_KEY', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-encryption-keyKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'AUTO_CREATE_TABLES', 'value', if(parameters('autoCreateTables'), 'true', 'false')), createObject('name', 'KEYCLOAK_REALM', 'value', parameters('keycloakRealm')), createObject('name', 'KEYCLOAK_CLIENT_ID', 'value', parameters('keycloakClientId')), createObject('name', 'KEYCLOAK_ADMIN_USERNAME', 'value', parameters('keycloakAdminUsername')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-keycloak-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'ONBOARDING_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-onboarding-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'KEYCLOAK_SERVER_URL', 'value', variables('keycloakPublicUrl')), createObject('name', 'KEYCLOAK_INTERNAL_SERVER_URL', 'value', variables('keycloakInternalUrl')), createObject('name', 'KEYCLOAK_TOKEN_TIMEOUT', 'value', '5000'), createObject('name', 'KEYCLOAK_VERIFY_AUDIENCE', 'value', if(parameters('keycloakVerifyAudience'), 'true', 'false')), createObject('name', 'DISABLE_RATE_LIMIT', 'value', variables('shouldDisableRateLimit')), createObject('name', 'SKIP_DB_REDEPLOY', 'value', 'true'), createObject('name', 'MISO_WEB_SERVER_URL', 'value', variables('misoPublicUrl')), createObject('name', 'MISO_CONTROLLER_URL', 'value', variables('misoInternalUrl')), createObject('name', 'MISO_RELATIVE_PATH', 'value', variables('misoVdirValue')), createObject('name', 'CONTROLLER_BASE_URL', 'value', if(not(empty(parameters('misoControllerUrl'))), parameters('misoControllerUrl'), format('https://{0}.azurewebsites.net', parameters('name')))), createObject('name', 'AZURE_SUBSCRIPTION_ID', 'value', subscription().subscriptionId), createObject('name', 'TENANT_ID', 'value', subscription().tenantId), createObject('name', 'DEPLOYMENT', 'value', 'azure'), createObject('name', 'AZURE_RESOURCE_GROUP_NAME', 'value', parameters('resourceGroupName')), createObject('name', 'INFRASTRUCTURE_NAME', 'value', parameters('prefix')), createObject('name', 'ENTRA_ID_TENANT_ID', 'value', parameters('entraIdTenantId')), createObject('name', 'MISO_CLIENTID', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-miso-clientIdKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'MISO_CLIENTSECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=miso-controller-client-secretKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_BASE_URL', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-base-urlKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_LICENSE_PUBLIC_KEY', 'value', if(empty(parameters('moriLicensePublicKey')), '', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-license-public-keyKeyVault)', last(split(parameters('keyVaultId'), '/'))))), createObject('name', 'MORI_LICENSE_ISSUER', 'value', parameters('moriLicenseIssuer')), createObject('name', 'ENTRA_GRAPH_DELEGATED_REDIRECT_URI', 'value', variables('moriEntraGraphDelegatedRedirectUri')), createObject('name', 'ENTRA_ID_CENTRAL_CALLBACK_URI', 'value', variables('moriEntraCentralCallbackUri')), createObject('name', 'DOCKER_ENABLE_CI', 'value', 'true'), createObject('name', 'DOCKER_REGISTRY_SERVER_URL', 'value', if(not(empty(parameters('acrLoginServer'))), format('https://{0}', parameters('acrLoginServer')), '')), createObject('name', 'ONBOARDING_CREATE_PIPELINE_CREDENTIALS', 'value', 'true'), createObject('name', 'BOOTSTRAP_APPKEYS', 'value', parameters('bootstrapAppKeys')), createObject('name', 'LICENSE_JWT', 'value', parameters('licenseJwt')), createObject('name', 'LICENSE_EDITION', 'value', parameters('licenseEdition')), createObject('name', 'ONBOARDING_MODE', 'value', parameters('onboardingMode')), createObject('name', 'INSTALLATION_CAPACITY_PROFILE', 'value', parameters('capacityProfile'))), variables('registryCredentialAppSettings'))]",
|
|
3090
3210
|
"vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
|
|
3091
3211
|
},
|
|
3092
3212
|
"vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
|
|
@@ -3192,7 +3312,7 @@
|
|
|
3192
3312
|
"_generator": {
|
|
3193
3313
|
"name": "bicep",
|
|
3194
3314
|
"version": "0.47.16.16243",
|
|
3195
|
-
"templateHash": "
|
|
3315
|
+
"templateHash": "7505559434659026911"
|
|
3196
3316
|
}
|
|
3197
3317
|
},
|
|
3198
3318
|
"parameters": {
|
|
@@ -3210,8 +3330,28 @@
|
|
|
3210
3330
|
"metadata": {
|
|
3211
3331
|
"description": "Object IDs (principalId) of web apps that use Key Vault references"
|
|
3212
3332
|
}
|
|
3333
|
+
},
|
|
3334
|
+
"grantWorkloadVaultAccess": {
|
|
3335
|
+
"type": "bool",
|
|
3336
|
+
"defaultValue": false,
|
|
3337
|
+
"metadata": {
|
|
3338
|
+
"description": "Grant workload web apps direct Key Vault access. Default false: workloads fetch parameters through Miso. Set true only to restore the pre-227.6 behaviour for an installation that needs it."
|
|
3339
|
+
}
|
|
3340
|
+
},
|
|
3341
|
+
"platformPrincipalIds": {
|
|
3342
|
+
"type": "array",
|
|
3343
|
+
"items": {
|
|
3344
|
+
"type": "string"
|
|
3345
|
+
},
|
|
3346
|
+
"defaultValue": [],
|
|
3347
|
+
"metadata": {
|
|
3348
|
+
"description": "Object IDs of platform principals (Miso, Keycloak) that always retain vault access"
|
|
3349
|
+
}
|
|
3213
3350
|
}
|
|
3214
3351
|
},
|
|
3352
|
+
"variables": {
|
|
3353
|
+
"effectivePrincipalIds": "[if(parameters('grantWorkloadVaultAccess'), union(parameters('webAppPrincipalIds'), parameters('platformPrincipalIds')), parameters('platformPrincipalIds'))]"
|
|
3354
|
+
},
|
|
3215
3355
|
"resources": {
|
|
3216
3356
|
"kv": {
|
|
3217
3357
|
"existing": true,
|
|
@@ -3227,10 +3367,10 @@
|
|
|
3227
3367
|
"copy": [
|
|
3228
3368
|
{
|
|
3229
3369
|
"name": "accessPolicies",
|
|
3230
|
-
"count": "[length(
|
|
3370
|
+
"count": "[length(variables('effectivePrincipalIds'))]",
|
|
3231
3371
|
"input": {
|
|
3232
3372
|
"tenantId": "[subscription().tenantId]",
|
|
3233
|
-
"objectId": "[
|
|
3373
|
+
"objectId": "[variables('effectivePrincipalIds')[copyIndex('accessPolicies')]]",
|
|
3234
3374
|
"permissions": {
|
|
3235
3375
|
"secrets": ["get", "list", "set"],
|
|
3236
3376
|
"keys": [],
|
|
@@ -3278,7 +3418,7 @@
|
|
|
3278
3418
|
"_generator": {
|
|
3279
3419
|
"name": "bicep",
|
|
3280
3420
|
"version": "0.47.16.16243",
|
|
3281
|
-
"templateHash": "
|
|
3421
|
+
"templateHash": "8140687320474179352"
|
|
3282
3422
|
}
|
|
3283
3423
|
},
|
|
3284
3424
|
"parameters": {
|
|
@@ -3304,7 +3444,8 @@
|
|
|
3304
3444
|
"variables": {
|
|
3305
3445
|
"readySetting": {
|
|
3306
3446
|
"AIFABRIX_KV_ACCESS_READY": "[parameters('readyStamp')]"
|
|
3307
|
-
}
|
|
3447
|
+
},
|
|
3448
|
+
"misoOnboardingSetting": "[variables('readySetting')]"
|
|
3308
3449
|
},
|
|
3309
3450
|
"resources": [
|
|
3310
3451
|
{
|
|
@@ -3373,7 +3514,7 @@
|
|
|
3373
3514
|
"value": "[parameters('misoWebAppName')]"
|
|
3374
3515
|
},
|
|
3375
3516
|
"appSettings": {
|
|
3376
|
-
"value": "[union(list(resourceId('Microsoft.Web/sites/config', parameters('misoWebAppName'), 'appsettings'), '2022-03-01').properties, variables('
|
|
3517
|
+
"value": "[union(list(resourceId('Microsoft.Web/sites/config', parameters('misoWebAppName'), 'appsettings'), '2022-03-01').properties, variables('misoOnboardingSetting'))]"
|
|
3377
3518
|
}
|
|
3378
3519
|
},
|
|
3379
3520
|
"template": {
|
|
@@ -3460,6 +3601,9 @@
|
|
|
3460
3601
|
},
|
|
3461
3602
|
"encryptionKey": {
|
|
3462
3603
|
"value": "[reference(resourceId('Microsoft.Resources/deployments', 'bootstrapSecrets'), '2025-04-01').outputs.encryptionKey.value]"
|
|
3604
|
+
},
|
|
3605
|
+
"entraIdClientSecret": {
|
|
3606
|
+
"value": "[parameters('entraIdClientSecret')]"
|
|
3463
3607
|
}
|
|
3464
3608
|
},
|
|
3465
3609
|
"template": {
|
|
@@ -3469,7 +3613,7 @@
|
|
|
3469
3613
|
"_generator": {
|
|
3470
3614
|
"name": "bicep",
|
|
3471
3615
|
"version": "0.47.16.16243",
|
|
3472
|
-
"templateHash": "
|
|
3616
|
+
"templateHash": "445562478593270876"
|
|
3473
3617
|
}
|
|
3474
3618
|
},
|
|
3475
3619
|
"parameters": {
|
|
@@ -3537,9 +3681,31 @@
|
|
|
3537
3681
|
"metadata": {
|
|
3538
3682
|
"description": "MISO Client Secret (auto-generated if not provided)"
|
|
3539
3683
|
}
|
|
3684
|
+
},
|
|
3685
|
+
"entraIdClientSecret": {
|
|
3686
|
+
"type": "securestring",
|
|
3687
|
+
"defaultValue": "",
|
|
3688
|
+
"metadata": {
|
|
3689
|
+
"description": "Vendor Entra app client secret (ENTRA_ID_CLIENT_SECRET). Placeholder when empty — replace for live Entra flows."
|
|
3690
|
+
}
|
|
3691
|
+
},
|
|
3692
|
+
"moriLicensePublicKey": {
|
|
3693
|
+
"type": "string",
|
|
3694
|
+
"defaultValue": "",
|
|
3695
|
+
"metadata": {
|
|
3696
|
+
"description": "Mori licence issuer public key (SPKI PEM). Empty leaves the installation unpinned."
|
|
3697
|
+
}
|
|
3698
|
+
},
|
|
3699
|
+
"moriBaseUrl": {
|
|
3700
|
+
"type": "string",
|
|
3701
|
+
"defaultValue": "",
|
|
3702
|
+
"metadata": {
|
|
3703
|
+
"description": "Mori base URL, stored so App Service can reference it instead of holding a literal."
|
|
3704
|
+
}
|
|
3540
3705
|
}
|
|
3541
3706
|
},
|
|
3542
3707
|
"variables": {
|
|
3708
|
+
"resolvedEntraIdClientSecret": "[if(not(empty(parameters('entraIdClientSecret'))), parameters('entraIdClientSecret'), format('PLACEHOLDER_ENTRA_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]",
|
|
3543
3709
|
"misoWebAppOrigin": "[if(endsWith(parameters('misoWebAppUrl'), '/'), substring(parameters('misoWebAppUrl'), 0, max(0, sub(length(parameters('misoWebAppUrl')), 1))), parameters('misoWebAppUrl'))]",
|
|
3544
3710
|
"misoVdirSegment": "[if(or(equals(parameters('misoVdirPublic'), ''), equals(parameters('misoVdirPublic'), '/')), '', if(startsWith(parameters('misoVdirPublic'), '/'), parameters('misoVdirPublic'), format('/{0}', parameters('misoVdirPublic'))))]",
|
|
3545
3711
|
"misoWebServerPublicUrl": "[if(empty(variables('misoVdirSegment')), variables('misoWebAppOrigin'), format('{0}{1}', variables('misoWebAppOrigin'), variables('misoVdirSegment')))]",
|
|
@@ -3629,6 +3795,32 @@
|
|
|
3629
3795
|
"properties": {
|
|
3630
3796
|
"value": "[if(not(empty(parameters('misoClientSecret'))), parameters('misoClientSecret'), format('PLACEHOLDER_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]"
|
|
3631
3797
|
}
|
|
3798
|
+
},
|
|
3799
|
+
{
|
|
3800
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
3801
|
+
"apiVersion": "2023-07-01",
|
|
3802
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'entra-client-secretKeyVault')]",
|
|
3803
|
+
"properties": {
|
|
3804
|
+
"value": "[variables('resolvedEntraIdClientSecret')]"
|
|
3805
|
+
}
|
|
3806
|
+
},
|
|
3807
|
+
{
|
|
3808
|
+
"condition": "[not(empty(parameters('moriLicensePublicKey')))]",
|
|
3809
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
3810
|
+
"apiVersion": "2023-07-01",
|
|
3811
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-license-public-keyKeyVault')]",
|
|
3812
|
+
"properties": {
|
|
3813
|
+
"value": "[parameters('moriLicensePublicKey')]"
|
|
3814
|
+
}
|
|
3815
|
+
},
|
|
3816
|
+
{
|
|
3817
|
+
"condition": "[not(empty(parameters('moriBaseUrl')))]",
|
|
3818
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
3819
|
+
"apiVersion": "2023-07-01",
|
|
3820
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-base-urlKeyVault')]",
|
|
3821
|
+
"properties": {
|
|
3822
|
+
"value": "[parameters('moriBaseUrl')]"
|
|
3823
|
+
}
|
|
3632
3824
|
}
|
|
3633
3825
|
]
|
|
3634
3826
|
}
|
|
@@ -3772,7 +3964,7 @@
|
|
|
3772
3964
|
]
|
|
3773
3965
|
},
|
|
3774
3966
|
{
|
|
3775
|
-
"condition": "[parameters('
|
|
3967
|
+
"condition": "[parameters('deployRegistryRoleAssignment')]",
|
|
3776
3968
|
"type": "Microsoft.Resources/deployments",
|
|
3777
3969
|
"apiVersion": "2025-04-01",
|
|
3778
3970
|
"name": "acrPullRoleAssignment",
|
|
@@ -3801,7 +3993,7 @@
|
|
|
3801
3993
|
"_generator": {
|
|
3802
3994
|
"name": "bicep",
|
|
3803
3995
|
"version": "0.47.16.16243",
|
|
3804
|
-
"templateHash": "
|
|
3996
|
+
"templateHash": "14966069055732756709"
|
|
3805
3997
|
}
|
|
3806
3998
|
},
|
|
3807
3999
|
"parameters": {
|
|
@@ -3821,7 +4013,7 @@
|
|
|
3821
4013
|
}
|
|
3822
4014
|
},
|
|
3823
4015
|
"variables": {
|
|
3824
|
-
"acrPullRoleDefinitionId": "7f951dda-4ed3-4680-a7ca-
|
|
4016
|
+
"acrPullRoleDefinitionId": "7f951dda-4ed3-4680-a7ca-43fe172d538d"
|
|
3825
4017
|
},
|
|
3826
4018
|
"resources": [
|
|
3827
4019
|
{
|
|
@@ -4082,6 +4274,20 @@
|
|
|
4082
4274
|
"portalUrl": {
|
|
4083
4275
|
"type": "string",
|
|
4084
4276
|
"value": "[format('https://portal.azure.com/#@{0}/resource/subscriptions/{1}/resourceGroups/{2}', subscription().tenantId, subscription().subscriptionId, resourceGroup().name)]"
|
|
4277
|
+
},
|
|
4278
|
+
"azureOpenAiCreated": {
|
|
4279
|
+
"type": "string",
|
|
4280
|
+
"metadata": {
|
|
4281
|
+
"description": "`true` when Phase-1 created the Azure OpenAI account in the installation region."
|
|
4282
|
+
},
|
|
4283
|
+
"value": "[if(variables('createAzureOpenAI'), 'true', 'false')]"
|
|
4284
|
+
},
|
|
4285
|
+
"azureOpenAiSkipReason": {
|
|
4286
|
+
"type": "string",
|
|
4287
|
+
"metadata": {
|
|
4288
|
+
"description": "Empty when the account was created; otherwise why it was not."
|
|
4289
|
+
},
|
|
4290
|
+
"value": "[if(variables('createAzureOpenAI'), '', if(parameters('enableAzureOpenAI'), format('Azure OpenAI is not offered in {0}, and it is not relocated to another region automatically. The installation is complete without it: create the account in a supported region yourself, or supply an existing endpoint as an external provider.', variables('deploymentLocation')), 'Azure OpenAI creation was disabled for this installation (enableAzureOpenAI=false).'))]"
|
|
4085
4291
|
}
|
|
4086
4292
|
}
|
|
4087
4293
|
}
|