Skip to content

Commit cca1768

Browse files
author
Mike Swantek
committed
Update Fabric automation
Allow for BYO workspace and capacity Allow no workspace or capacity Allow creation of workspace or capacity
1 parent fe20dc5 commit cca1768

24 files changed

Lines changed: 400 additions & 50 deletions

azure.yaml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,18 @@ metadata:
1515
# Pre/Post-provision automation hooks
1616
hooks:
1717
preprovision:
18-
# AI Landing Zone preprovision: generates submodule deploy/ files and (optionally) Template Specs.
18+
# Integrated preprovision:
19+
# - Runs AI Landing Zone preprovision to generate deploy/ files and Template Specs
20+
# - Ensures our wrapper points to deploy/main.bicep (Template Spec-based) to avoid ARM 4MB template limit
1921
# On Windows, `shell: sh` may not be available; fall back to the PowerShell script.
2022
- shell: sh
21-
run: ./submodules/ai-landing-zone/bicep/scripts/preprovision.sh
22-
interactive: true
23+
run: ./scripts/preprovision-integrated.sh
24+
interactive: false
2325
continueOnError: true
2426

2527
- shell: pwsh
26-
run: ./submodules/ai-landing-zone/bicep/scripts/preprovision.ps1
27-
interactive: true
28+
run: ./scripts/preprovision-integrated.ps1
29+
interactive: false
2830
continueOnError: false
2931

3032
postprovision:

docs/automation-outputs-mapping.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ The postprovision automation scripts consume deployment outputs via the `AZURE_O
2020

2121
| Bicep Output | Script Variable | Used By | Purpose |
2222
|-------------|-----------------|---------|---------|
23-
| `fabricCapacityMode` | `fabricCapacityMode` | Multiple Fabric scripts | Whether capacity is `create`, `byo`, or `none` |
24-
| `fabricWorkspaceMode` | `fabricWorkspaceMode` | Multiple Fabric scripts | Whether workspace is `create`, `byo`, or `none` |
23+
| `fabricCapacityModeOut` | `fabricCapacityMode` | Multiple Fabric scripts | Whether capacity is `create`, `byo`, or `none` |
24+
| `fabricWorkspaceModeOut` | `fabricWorkspaceMode` | Multiple Fabric scripts | Whether workspace is `create`, `byo`, or `none` |
2525
| `fabricCapacityId` | `FABRIC_CAPACITY_ID` | `ensure_active_capacity.ps1` | ARM resource ID of Fabric capacity |
26-
| `fabricCapacityResourceId` | `fabricCapacityId` | `create_fabric_workspace.ps1` | Resource ID for capacity assignment |
27-
| `fabricWorkspaceId` | `FABRIC_WORKSPACE_ID` | Multiple Fabric scripts | Existing or created Fabric workspace ID |
28-
| `fabricWorkspaceName` | `FABRIC_WORKSPACE_NAME` | Multiple Fabric scripts | Target workspace name |
26+
| `fabricCapacityResourceIdOut` | `fabricCapacityId` | `create_fabric_workspace.ps1` | Resource ID for capacity assignment |
27+
| `fabricWorkspaceIdOut` | `FABRIC_WORKSPACE_ID` | Multiple Fabric scripts | Existing or created Fabric workspace ID |
28+
| `fabricWorkspaceNameOut` | `FABRIC_WORKSPACE_NAME` | Multiple Fabric scripts | Target workspace name |
2929
| `desiredFabricWorkspaceName` | `FABRIC_WORKSPACE_NAME` | Multiple Fabric scripts | Back-compat alias for `fabricWorkspaceName` |
3030
| `desiredFabricDomainName` | `domainName` | `create_fabric_domain.ps1` | Target domain name |
3131
| `fabricCapacityName` | - | - | Display name (optional) |
@@ -83,10 +83,10 @@ When `azd up` completes, it sets:
8383
```bash
8484
export AZURE_OUTPUTS_JSON='{
8585
"fabricCapacityId": {"type":"String","value":"/subscriptions/.../fabricCapacities/fabric-xyz"},
86-
"fabricCapacityMode": {"type":"String","value":"create"},
87-
"fabricWorkspaceMode": {"type":"String","value":"create"},
88-
"fabricWorkspaceName": {"type":"String","value":"workspace-myenv"},
89-
"fabricWorkspaceId": {"type":"String","value":""},
86+
"fabricCapacityModeOut": {"type":"String","value":"create"},
87+
"fabricWorkspaceModeOut": {"type":"String","value":"create"},
88+
"fabricWorkspaceNameOut": {"type":"String","value":"workspace-myenv"},
89+
"fabricWorkspaceIdOut": {"type":"String","value":""},
9090
"desiredFabricWorkspaceName": {"type":"String","value":"workspace-myenv"},
9191
"aiSearchName": {"type":"String","value":"search-xyz"},
9292
"aiSearchResourceGroup": {"type":"String","value":"rg-ai-landing-zone"},
@@ -101,7 +101,7 @@ Scripts parse this JSON:
101101
if (-not $WorkspaceName -and $env:AZURE_OUTPUTS_JSON) {
102102
try {
103103
$out = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json
104-
$WorkspaceName = $out.fabricWorkspaceName.value
104+
$WorkspaceName = $out.fabricWorkspaceNameOut.value
105105
if (-not $WorkspaceName) {
106106
$WorkspaceName = $out.desiredFabricWorkspaceName.value
107107
}
@@ -127,6 +127,8 @@ azd env get-values
127127

128128
# View specific output
129129
azd env get-value fabricCapacityId
130+
azd env get-value fabricCapacityModeOut
131+
azd env get-value fabricWorkspaceModeOut
130132
azd env get-value aiSearchName
131133
```
132134

infra/main.bicep

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,15 @@
77
// ================================================
88

99
targetScope = 'resourceGroup'
10-
11-
12-
metadata name = 'AI Landing Zone + Fabric Deployment'
1310
metadata description = 'Deploys AI Landing Zone with Fabric capacity extension'
14-
15-
// Import types from AI Landing Zone
1611
import * as types from '../submodules/ai-landing-zone/bicep/infra/common/types.bicep'
1712

1813
// ========================================
1914
// PARAMETERS - AI LANDING ZONE (Required)
2015
// ========================================
2116

22-
@description('Required. Per-service deployment toggles.')
23-
param deployToggles types.deployTogglesType
17+
@description('Per-service deployment toggles for the AI Landing Zone submodule.')
18+
param deployToggles object = {}
2419

2520
@description('Optional. Enable platform landing zone integration.')
2621
param flagPlatformLandingZone bool = false
@@ -190,8 +185,8 @@ output jumpboxSubnetResourceId string = '${aiLandingZone.outputs.virtualNetworkR
190185
output agentSubnetResourceId string = '${aiLandingZone.outputs.virtualNetworkResourceId}/subnets/agent-subnet'
191186

192187
// Fabric outputs
193-
output fabricCapacityMode string = effectiveFabricCapacityMode
194-
output fabricWorkspaceMode string = effectiveFabricWorkspaceMode
188+
output fabricCapacityModeOut string = effectiveFabricCapacityMode
189+
output fabricWorkspaceModeOut string = effectiveFabricWorkspaceMode
195190

196191
var effectiveFabricCapacityResourceId = effectiveFabricCapacityMode == 'create'
197192
? fabricCapacity!.outputs.resourceId
@@ -201,7 +196,7 @@ var effectiveFabricCapacityName = effectiveFabricCapacityMode == 'create'
201196
? fabricCapacity!.outputs.name
202197
: (!empty(effectiveFabricCapacityResourceId) ? last(split(effectiveFabricCapacityResourceId, '/')) : '')
203198

204-
output fabricCapacityResourceId string = effectiveFabricCapacityResourceId
199+
output fabricCapacityResourceIdOut string = effectiveFabricCapacityResourceId
205200
output fabricCapacityName string = effectiveFabricCapacityName
206201
output fabricCapacityId string = effectiveFabricCapacityResourceId
207202

@@ -211,8 +206,8 @@ var effectiveFabricWorkspaceName = effectiveFabricWorkspaceMode == 'byo'
211206

212207
var effectiveFabricWorkspaceId = effectiveFabricWorkspaceMode == 'byo' ? fabricWorkspaceId : ''
213208

214-
output fabricWorkspaceName string = effectiveFabricWorkspaceName
215-
output fabricWorkspaceId string = effectiveFabricWorkspaceId
209+
output fabricWorkspaceNameOut string = effectiveFabricWorkspaceName
210+
output fabricWorkspaceIdOut string = effectiveFabricWorkspaceId
216211

217212
output desiredFabricDomainName string = !empty(environmentName) ? 'domain-${environmentName}' : 'domain-${baseName}'
218213
output desiredFabricWorkspaceName string = effectiveFabricWorkspaceName

infra/main.bicepparam

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,38 @@ param aiSearchAdditionalAccessObjectIds = []
8383
// FABRIC CAPACITY PARAMETERS
8484
// ========================================
8585

86-
// Deploy Fabric capacity.
87-
param deployFabricCapacity = true
86+
// Preferred configuration: pick presets instead of uncommenting multiple params.
87+
//
88+
// fabricCapacityPreset:
89+
// - 'create' => provision Fabric capacity in infra
90+
// - 'byo' => reuse existing Fabric capacity (provide fabricCapacityResourceId)
91+
// - 'none' => no Fabric capacity
92+
//
93+
// fabricWorkspacePreset:
94+
// - 'create' => postprovision creates/configures workspace
95+
// - 'byo' => reuse existing workspace (provide fabricWorkspaceId and optionally fabricWorkspaceName)
96+
// - 'none' => no Fabric workspace automation, and OneLake indexing will be skipped
97+
//
98+
// Common setups:
99+
// - Full setup: fabricCapacityPreset='create', fabricWorkspacePreset='create'
100+
// - No Fabric: fabricCapacityPreset='none', fabricWorkspacePreset='none'
101+
// - BYO both: fabricCapacityPreset='byo', fabricWorkspacePreset='byo'
102+
var fabricCapacityPreset = 'create'
103+
var fabricWorkspacePreset = fabricCapacityPreset
104+
105+
// Legacy toggle retained for back-compat with older docs/scripts
106+
// Mode params below are the authoritative settings.
107+
param deployFabricCapacity = fabricCapacityPreset != 'none'
108+
109+
param fabricCapacityMode = fabricCapacityPreset
110+
param fabricCapacityResourceId = '' // required when fabricCapacityPreset='byo'
111+
112+
param fabricWorkspaceMode = fabricWorkspacePreset
113+
param fabricWorkspaceId = '' // required when fabricWorkspacePreset='byo'
114+
param fabricWorkspaceName = '' // optional (helpful for naming/UX)
88115

89116
// Fabric capacity SKU.
117+
90118
param fabricCapacitySku = 'F8'
91119

92120
// Fabric capacity admin members (email addresses or object IDs).

scripts/automationScripts/FabricPurviewAutomation/connect_log_analytics.ps1

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,20 @@ function Warn([string]$m){ Write-Warning "[fabric-loganalytics] $m" }
2424
# Skip when Fabric workspace automation is disabled
2525
$fabricWorkspaceMode = $env:fabricWorkspaceMode
2626
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
27-
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch { }
27+
try {
28+
$out0 = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
29+
if ($out0.fabricWorkspaceModeOut -and $out0.fabricWorkspaceModeOut.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceModeOut.value }
30+
elseif ($out0.fabricWorkspaceMode -and $out0.fabricWorkspaceMode.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceMode.value }
31+
} catch { }
2832
}
2933
if (-not $fabricWorkspaceMode) {
3034
try {
31-
$azdMode = & azd env get-value fabricWorkspaceMode 2>$null
35+
$azdMode = & azd env get-value fabricWorkspaceModeOut 2>$null
3236
if ($LASTEXITCODE -eq 0 -and $azdMode) { $fabricWorkspaceMode = $azdMode.Trim() }
37+
if (-not $fabricWorkspaceMode) {
38+
$azdMode = & azd env get-value fabricWorkspaceMode 2>$null
39+
if ($LASTEXITCODE -eq 0 -and $azdMode) { $fabricWorkspaceMode = $azdMode.Trim() }
40+
}
3341
} catch { }
3442
}
3543
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {

scripts/automationScripts/FabricPurviewAutomation/create_purview_collection.ps1

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,19 @@ function Fail([string]$m){ Write-Error "[script] $m"; Clear-SensitiveVariables -
1919

2020
# Skip when Fabric workspace automation is disabled
2121
$fabricWorkspaceMode = $env:fabricWorkspaceMode
22+
if (-not $fabricWorkspaceMode) { $fabricWorkspaceMode = $env:fabricWorkspaceModeOut }
23+
if (-not $fabricWorkspaceMode) {
24+
try {
25+
$azdMode = & azd env get-value fabricWorkspaceModeOut 2>$null
26+
if ($azdMode) { $fabricWorkspaceMode = $azdMode.ToString().Trim() }
27+
} catch { }
28+
}
2229
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
23-
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch { }
30+
try {
31+
$out0 = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
32+
if ($out0.fabricWorkspaceModeOut -and $out0.fabricWorkspaceModeOut.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceModeOut.value }
33+
elseif ($out0.fabricWorkspaceMode -and $out0.fabricWorkspaceMode.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceMode.value }
34+
} catch { }
2435
}
2536
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {
2637
Warn "Fabric workspace mode is 'none'; skipping Purview collection setup."

scripts/automationScripts/FabricPurviewAutomation/trigger_purview_scan_for_fabric_workspace.ps1

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,19 @@ function Fail([string]$m){ Write-Error "[script] $m"; Clear-SensitiveVariables -
2828

2929
# Skip when Fabric workspace automation is disabled
3030
$fabricWorkspaceMode = $env:fabricWorkspaceMode
31+
if (-not $fabricWorkspaceMode) { $fabricWorkspaceMode = $env:fabricWorkspaceModeOut }
32+
if (-not $fabricWorkspaceMode) {
33+
try {
34+
$azdMode = & azd env get-value fabricWorkspaceModeOut 2>$null
35+
if ($azdMode) { $fabricWorkspaceMode = $azdMode.ToString().Trim() }
36+
} catch { }
37+
}
3138
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
32-
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch { }
39+
try {
40+
$out0 = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
41+
if ($out0.fabricWorkspaceModeOut -and $out0.fabricWorkspaceModeOut.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceModeOut.value }
42+
elseif ($out0.fabricWorkspaceMode -and $out0.fabricWorkspaceMode.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceMode.value }
43+
} catch { }
3344
}
3445
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {
3546
Warn "Fabric workspace mode is 'none'; skipping Purview scan trigger."

scripts/automationScripts/FabricWorkspace/CreateWorkspace/assign_workspace_to_domain.ps1

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,19 @@ function Fail([string]$m){ Write-Error "[assign-domain] $m"; Clear-SensitiveVari
2121

2222
# Skip when Fabric workspace automation is disabled or BYO
2323
$fabricWorkspaceMode = $env:fabricWorkspaceMode
24+
if (-not $fabricWorkspaceMode) { $fabricWorkspaceMode = $env:fabricWorkspaceModeOut }
25+
if (-not $fabricWorkspaceMode) {
26+
try {
27+
$azdMode = & azd env get-value fabricWorkspaceModeOut 2>$null
28+
if ($azdMode) { $fabricWorkspaceMode = $azdMode.ToString().Trim() }
29+
} catch {}
30+
}
2431
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
25-
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch {}
32+
try {
33+
$out0 = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
34+
if ($out0.fabricWorkspaceModeOut -and $out0.fabricWorkspaceModeOut.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceModeOut.value }
35+
elseif ($out0.fabricWorkspaceMode -and $out0.fabricWorkspaceMode.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceMode.value }
36+
} catch {}
2637
}
2738
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -ne 'create') {
2839
Warn "Fabric workspace mode is '$fabricWorkspaceMode'; skipping assign-to-domain step."

scripts/automationScripts/FabricWorkspace/CreateWorkspace/create_fabric_domain.ps1

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,19 @@ function Fail([string]$m){ Write-Error "[fabric-domain] $m"; Clear-SensitiveVari
1919

2020
# Skip when Fabric workspace automation is disabled or BYO
2121
$fabricWorkspaceMode = $env:fabricWorkspaceMode
22+
if (-not $fabricWorkspaceMode) { $fabricWorkspaceMode = $env:fabricWorkspaceModeOut }
23+
if (-not $fabricWorkspaceMode) {
24+
try {
25+
$azdMode = & azd env get-value fabricWorkspaceModeOut 2>$null
26+
if ($azdMode) { $fabricWorkspaceMode = $azdMode.ToString().Trim() }
27+
} catch {}
28+
}
2229
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
23-
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch {}
30+
try {
31+
$out0 = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
32+
if ($out0.fabricWorkspaceModeOut -and $out0.fabricWorkspaceModeOut.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceModeOut.value }
33+
elseif ($out0.fabricWorkspaceMode -and $out0.fabricWorkspaceMode.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceMode.value }
34+
} catch {}
2435
}
2536
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -ne 'create') {
2637
Warn "Fabric workspace mode is '$fabricWorkspaceMode'; skipping domain creation."

scripts/automationScripts/FabricWorkspace/CreateWorkspace/create_fabric_workspace.ps1

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,19 @@ function Fail([string]$m){ Write-Error "[fabric-workspace] $m"; Clear-SensitiveV
2323

2424
# Skip or BYO handling based on deployment outputs
2525
$fabricWorkspaceMode = $env:fabricWorkspaceMode
26+
if (-not $fabricWorkspaceMode) { $fabricWorkspaceMode = $env:fabricWorkspaceModeOut }
27+
if (-not $fabricWorkspaceMode) {
28+
try {
29+
$azdMode = & azd env get-value fabricWorkspaceModeOut 2>$null
30+
if ($azdMode) { $fabricWorkspaceMode = $azdMode.ToString().Trim() }
31+
} catch {}
32+
}
2633
if (-not $fabricWorkspaceMode -and $env:AZURE_OUTPUTS_JSON) {
27-
try { $fabricWorkspaceMode = ($env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop).fabricWorkspaceMode.value } catch {}
34+
try {
35+
$out0 = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
36+
if ($out0.fabricWorkspaceModeOut -and $out0.fabricWorkspaceModeOut.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceModeOut.value }
37+
elseif ($out0.fabricWorkspaceMode -and $out0.fabricWorkspaceMode.value) { $fabricWorkspaceMode = $out0.fabricWorkspaceMode.value }
38+
} catch {}
2839
}
2940
if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'none') {
3041
Warn "Fabric workspace mode is 'none'; skipping workspace creation."
@@ -38,7 +49,9 @@ if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInva
3849
if ($env:AZURE_OUTPUTS_JSON) {
3950
try {
4051
$out = $env:AZURE_OUTPUTS_JSON | ConvertFrom-Json -ErrorAction Stop
52+
if (-not $byoWorkspaceId -and $out.fabricWorkspaceIdOut -and $out.fabricWorkspaceIdOut.value) { $byoWorkspaceId = $out.fabricWorkspaceIdOut.value }
4153
if (-not $byoWorkspaceId -and $out.fabricWorkspaceId -and $out.fabricWorkspaceId.value) { $byoWorkspaceId = $out.fabricWorkspaceId.value }
54+
if (-not $byoWorkspaceName -and $out.fabricWorkspaceNameOut -and $out.fabricWorkspaceNameOut.value) { $byoWorkspaceName = $out.fabricWorkspaceNameOut.value }
4255
if (-not $byoWorkspaceName -and $out.fabricWorkspaceName -and $out.fabricWorkspaceName.value) { $byoWorkspaceName = $out.fabricWorkspaceName.value }
4356
if (-not $byoWorkspaceName -and $out.desiredFabricWorkspaceName -and $out.desiredFabricWorkspaceName.value) { $byoWorkspaceName = $out.desiredFabricWorkspaceName.value }
4457
} catch {}
@@ -65,7 +78,25 @@ if ($fabricWorkspaceMode -and $fabricWorkspaceMode.ToString().Trim().ToLowerInva
6578

6679
# Fallback to azd output variable names (lowercase)
6780
if (-not $WorkspaceName -and $env:desiredFabricWorkspaceName) { $WorkspaceName = $env:desiredFabricWorkspaceName }
81+
if (-not $WorkspaceName -and $env:fabricWorkspaceNameOut) { $WorkspaceName = $env:fabricWorkspaceNameOut }
6882
if (-not $CapacityId -and $env:fabricCapacityId) { $CapacityId = $env:fabricCapacityId }
83+
if (-not $CapacityId -and $env:fabricCapacityResourceIdOut) { $CapacityId = $env:fabricCapacityResourceIdOut }
84+
85+
# Fallback: try azd env get-value (common in azd hook execution where AZURE_OUTPUTS_JSON is not present)
86+
if (-not $WorkspaceName) {
87+
try {
88+
$azdWorkspaceName = & azd env get-value desiredFabricWorkspaceName 2>$null
89+
if (-not $azdWorkspaceName) { $azdWorkspaceName = & azd env get-value fabricWorkspaceNameOut 2>$null }
90+
if ($azdWorkspaceName) { $WorkspaceName = $azdWorkspaceName.ToString().Trim() }
91+
} catch {}
92+
}
93+
if (-not $CapacityId) {
94+
try {
95+
$azdCapacityId = & azd env get-value fabricCapacityResourceIdOut 2>$null
96+
if (-not $azdCapacityId) { $azdCapacityId = & azd env get-value fabricCapacityId 2>$null }
97+
if ($azdCapacityId) { $CapacityId = $azdCapacityId.ToString().Trim() }
98+
} catch {}
99+
}
69100

70101
# Resolve from AZURE_OUTPUTS_JSON if present
71102
if (-not $WorkspaceName -and $env:AZURE_OUTPUTS_JSON) {
@@ -118,6 +149,14 @@ if (-not $WorkspaceName -and (Test-Path 'infra/main-orchestrator.bicep')) {
118149

119150
if (-not $WorkspaceName) { Fail 'FABRIC_WORKSPACE_NAME unresolved (no outputs/env/bicep).' }
120151

152+
# If we are in create mode, fail fast when Fabric capacity wasn't provided.
153+
# This avoids creating an orphaned workspace and then failing later when we try to assign a capacity.
154+
if ((-not $fabricWorkspaceMode) -or ($fabricWorkspaceMode.ToString().Trim().ToLowerInvariant() -eq 'create')) {
155+
if (-not $CapacityId) {
156+
Fail "FABRIC_CAPACITY_ID unresolved. Either set Fabric to 'none' (fabricWorkspaceModeOut=none) or provide/provision a capacity (fabricCapacityModeOut=create/byo and fabricCapacityResourceIdOut)."
157+
}
158+
}
159+
121160
# Acquire tokens securely
122161
try {
123162
Log "Acquiring Power BI API token..."

0 commit comments

Comments
 (0)