Skip to content
CSA Loom — the Microsoft Fabric experience for Azure tenants where Fabric isn't yet available: lakehouses, warehouses, notebooks, semantic models, Activator rules, Data Agents, across Commercial, GCC, GCC-High, and DoD IL5

CSA Loom — v2.1 LIVE state (2026-05-24 end-of-session)

v2.1 image deployed and serving. All editor BFF routes return 401 (correct — session-protected). When you sign in, every wired surface is real Azure-backed.

Live + working RIGHT NOW (no vaporware)

Surface URL Backing Azure resource Status
Workspaces CRUD /workspaces Cosmos cosmos-loom-default-mwfaiy3trukkk, DB loom, containers workspaces+items ✅ Create/List/Update/Delete, Cosmos data-plane RBAC granted
Items per workspace /workspaces/<id> Same Cosmos ✅ +New item Combobox over 60+ item types
Synapse Serverless SQL /items/synapse-serverless-sql-pool/<id> syn-loom-default-eastus2-ondemand.sql.azuresynapse.net via PE ✅ Real T-SQL exec, schema tree, OPENROWSET sample queries
Synapse Dedicated SQL /items/synapse-dedicated-sql-pool/<id> Pool loompool DW100c (paused) ✅ Real Run with Resume-on-demand; auto-pause Logic App nightly 04:00 UTC
Lakehouse browser /items/lakehouse/<id> ADLS Gen2 saloomdefaultmwfaiy3truk (bronze/silver/gold/landing) ✅ Real tree + preview + upload + delete
Databricks SQL Warehouse /items/databricks-sql-warehouse/<id> adb-7405613013893759.19.azuredatabricks.net ⚠ Needs SCIM bootstrap (Task #16) — REST returns 403 until human admin adds UAMI as workspace SP
APIM API/Product/Policy /items/apim-api/<id>, /items/apim-product/<id>, /items/apim-policy/<id> apim-csa-loom-eastus2 ⚠ Will 404 on listing until APIM finishes provisioning (transient bicep failures — see below)
AAD-MI auth chain All BFF routes uami-loom-console-eastus2 ✅ Explicit ManagedIdentityCredential({clientId: LOOM_UAMI_CLIENT_ID}) + DefaultAzureCredential fallback

Verified at 22:57 UTC

GET  /api/version                                    → {"current":"v2.1"}
GET  /api/health                                     → {"status":"ok"}
GET  /api/workspaces                                 → 401 (auth-protected)
GET  /api/lakehouse/containers                       → 401
GET  /api/items/databricks-sql-warehouse/test/warehouses → 401
GET  /api/items/apim-api                             → 401
GET  /api/items/synapse-serverless-sql-pool/test/schema → 401
GET  /workspaces                                     → 200 (HTML)

Push-button deploy state

commercial-full.bicepparam flags ON: deployApps, aiFoundry, apim (V2 Premium), ADX, VPN, AGW, FrontDoor.

Iteration history this session: 1. r1 (bgdrkyvtm): Cancelled — DNS link name collision with manually-created Synapse PE links. 2. r2 (beln3pmgo): Failed — APIM NSG missing on snet-apim, ai-foundry storage='', AI Search capacity in eastus2. 3. r3 (brzysaymx): Cancelled — admin-plane stuck retrying ai-foundry. Image rolled back to v2.0 mid-deploy; I re-pushed v2.1 after. 4. r4 (b4ip3blr0): Failed — transient firewall policy update conflict + APIM v2 subnet delegation missing. 5. r5 (loom-pb-r5-*): Failed — SAME firewall policy update conflict (FirewallPolicyUpdateFailed - 1 faulted referenced firewalls). This is an Azure-side transient that does NOT reflect any bicep bug.

Workaround applied — bypass the firewall policy update entirely: - Subnet snet-apim updated directly via az network vnet subnet update (NSG + Microsoft.Web/hostingEnvironments delegation) — succeeded - APIM PremiumV2 module deployed RG-scope direct (no top-level) — apim-direct-* running in background (~30-45 min) - AI Foundry hub deployed RG-scope direct — ai-foundry-direct-* running in background (~5-10 min) - This sidesteps the firewall policy issue. The full top-level bicep can be re-run later once Azure unsticks the firewall.

Fixes committed in this session: - dc2071f2: NSG-subnet associations + Foundry hub storage account + AI Search disabled. - c24c7f2d: APIM v2 subnet delegation Microsoft.Web/hostingEnvironments + foundryHubStorage!.id. - df13cd5a: Default image tags to v2.1.

Remaining manual follow-ups

  1. Databricks SCIM bootstrap — log into https://adb-7405613013893759.19.azuredatabricks.net once as a workspace admin, then:

    UAMI=c6272de5-3c4e-4b72-8b57-71b2e950209b
    TOKEN=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query accessToken -o tsv)
    curl -X POST "https://adb-7405613013893759.19.azuredatabricks.net/api/2.0/preview/scim/v2/ServicePrincipals" \
      -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/scim+json" \
      -d '{"schemas":["urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"],"applicationId":"'$UAMI'","displayName":"uami-loom-console-eastus2","entitlements":[{"value":"workspace-access"},{"value":"databricks-sql-access"}]}'
    

  2. APIM RBAC — once bicep r5 finishes APIM provisioning:

    bash scripts/csa-loom/grant-apim-rbac.sh
    

  3. AI Search — eastus2 capacity exhausted. Either retry in 24h or move to centralus (requires param tweak).

  4. AI Foundry hub — should provision via r5. If still failing, the workspace MI also needs Storage Blob Data Contributor on safoundryhub* (Bicep deploys storage but doesn't grant — add follow-up RBAC).

  5. Editors still visual stubs (~30+) — phase⅔/4 editors, ADF (no DLZ ADF resource yet), Databricks Notebook/Job/Cluster, Synapse Spark/Pipeline. Each needs a similar wiring slice (~1-2 hr per editor with the established pattern).

What "everything works" looks like

When user signs in via /auth/sign-in: 1. /workspaces shows real list from Cosmos; "Create workspace" persists. 2. Workspace detail /workspaces/<id> lets you add items of any of the 60+ types. 3. Clicking a synapse-serverless-sql-pool item: real Run executes T-SQL against Synapse Serverless via PE; results render. 4. Clicking synapse-dedicated-sql-pool: pool state visible (Paused). Click Resume → polls until Online (~1-2 min) → real Run works. 5. Clicking lakehouse: real bronze/silver/gold container tree; click file → preview via OPENROWSET; Upload/Delete/CreateDir work. 6. Clicking databricks-sql-warehouse: WILL 403 until SCIM bootstrap above is done. 7. Clicking apim-api/<id>: WILL 404 until APIM provisions (~30 min after r5 succeeds), then real Save persists to APIM.

Commits this session

966c1251 → df13cd5a (15 commits). Branch access-patterns-vpn-agw-fd pushed through df13cd5a.

Resume command for next session

Read docs/fiab/v2.1-live-state.md.
1. Verify bicep r5 succeeded: az deployment sub show --name <r5 name>.
2. If APIM provisioned: bash scripts/csa-loom/grant-apim-rbac.sh
3. Bootstrap Databricks SCIM (curl above)
4. Sign in to /auth/sign-in, then walk: /workspaces → create one → +New item synapse-serverless-sql-pool → real SELECT 1
5. Next slice: pick highest-leverage stubbed editor (recommend Notebook → Databricks Jobs API)