From 3d9dd063bfaee90a552e683001e37d8980735f5c Mon Sep 17 00:00:00 2001 From: huimiu Date: Wed, 1 Jul 2026 22:55:16 +0800 Subject: [PATCH 1/3] fix: set brownfield Foundry projectName without ACR --- .impeccable/hook.cache.json | 1 + .../internal/project/foundry_provisioning_provider.go | 6 +++++- ...undry_provisioning_provider_brownfield_acr_test.go | 11 +++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 .impeccable/hook.cache.json diff --git a/.impeccable/hook.cache.json b/.impeccable/hook.cache.json new file mode 100644 index 00000000000..ebc7c5d0eda --- /dev/null +++ b/.impeccable/hook.cache.json @@ -0,0 +1 @@ +{"version":1,"sessions":{}} \ No newline at end of file diff --git a/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider.go b/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider.go index 20429479b9e..de1e07437b7 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider.go +++ b/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider.go @@ -810,11 +810,15 @@ func (p *FoundryProvisioningProvider) brownfieldParams( params := map[string]any{ "accountName": map[string]any{"value": account}, "deployments": map[string]any{"value": p.brownfieldDeployments}, + // projectName is always required: the template unconditionally references + // the existing accounts/projects resource, whose ARM name is + // '/'. Leaving it empty yields a single-segment + // name and an InvalidTemplate error even when no ACR is created. + "projectName": map[string]any{"value": p.brownfieldProjectName()}, } if createACR { params["includeAcr"] = map[string]any{"value": true} params["acrName"] = map[string]any{"value": p.brownfieldACRName(account)} - params["projectName"] = map[string]any{"value": p.brownfieldProjectName()} params["tags"] = map[string]any{"value": map[string]string{"azd-env-name": p.envName}} // Only set location when resolved; an empty value would override the // template default (resourceGroup().location) and fail the deployment. diff --git a/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider_brownfield_acr_test.go b/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider_brownfield_acr_test.go index 8ab5a811a1b..a3ad4b70aa6 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider_brownfield_acr_test.go +++ b/cli/azd/extensions/azure.ai.agents/internal/project/foundry_provisioning_provider_brownfield_acr_test.go @@ -172,13 +172,20 @@ func TestBrownfieldParams(t *testing.T) { deployments := []synthesis.Deployment{{Name: "gpt-4o-mini"}} - t.Run("without ACR carries only account and deployments", func(t *testing.T) { + t.Run("without ACR carries account, deployments and projectName", func(t *testing.T) { t.Parallel() - p := &FoundryProvisioningProvider{envName: "dev", brownfieldDeployments: deployments} + p := &FoundryProvisioningProvider{ + envName: "dev", + brownfieldDeployments: deployments, + brownfieldEndpoint: "https://acct.services.ai.azure.com/api/projects/my-project", + } params := p.brownfieldParams(t.Context(), "acct", "rg", false) assert.Equal(t, map[string]any{"value": "acct"}, params["accountName"]) assert.Equal(t, map[string]any{"value": deployments}, params["deployments"]) + // projectName is always required so the existing accounts/projects + // resource gets a valid two-segment ARM name. + assert.Equal(t, map[string]any{"value": "my-project"}, params["projectName"]) assert.NotContains(t, params, "includeAcr") assert.NotContains(t, params, "acrName") }) From 72db79ee97551350a2a9288967395f910566fdff Mon Sep 17 00:00:00 2001 From: huimiu Date: Wed, 1 Jul 2026 22:56:00 +0800 Subject: [PATCH 2/3] fix: add changelog entry for brownfield projectName fix --- cli/azd/extensions/azure.ai.agents/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/azd/extensions/azure.ai.agents/CHANGELOG.md b/cli/azd/extensions/azure.ai.agents/CHANGELOG.md index b6a8de1a86b..6c735cc08ce 100644 --- a/cli/azd/extensions/azure.ai.agents/CHANGELOG.md +++ b/cli/azd/extensions/azure.ai.agents/CHANGELOG.md @@ -4,6 +4,7 @@ ### Bugs Fixed +- [[#8917]](https://github.com/Azure/azure-dev/pull/8917) Fix an `InvalidTemplate` error when deploying a brownfield (`endpoint:`) Foundry project that declares model deployments without creating a container registry. The `projectName` ARM parameter is now always set, so the referenced `Microsoft.CognitiveServices/accounts/projects` resource gets a valid two-segment name. - [[#8901]](https://github.com/Azure/azure-dev/pull/8901) Remove duplicate service-target provider claims from the `azure.ai.agents` extension manifest for hosts now owned by the split Foundry extensions (`azure.ai.projects`, `azure.ai.connections`, `azure.ai.toolboxes`). Thanks @huimiu for the contribution! ## 1.0.0-beta.1 (2026-06-30) From 362c097e38cd34d8e05555afaa4ef8720b056474 Mon Sep 17 00:00:00 2001 From: huimiu Date: Wed, 1 Jul 2026 23:05:08 +0800 Subject: [PATCH 3/3] fix: remove stray impeccable cache from PR --- .impeccable/hook.cache.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .impeccable/hook.cache.json diff --git a/.impeccable/hook.cache.json b/.impeccable/hook.cache.json deleted file mode 100644 index ebc7c5d0eda..00000000000 --- a/.impeccable/hook.cache.json +++ /dev/null @@ -1 +0,0 @@ -{"version":1,"sessions":{}} \ No newline at end of file