Skip to content

Migrate FrontDoor provisioning generation#60575

Open
ArcturusZhang wants to merge 8 commits into
Azure:mainfrom
ArcturusZhang:provisioning/migrate-frontdoor
Open

Migrate FrontDoor provisioning generation#60575
ArcturusZhang wants to merge 8 commits into
Azure:mainfrom
ArcturusZhang:provisioning/migrate-frontdoor

Conversation

@ArcturusZhang

@ArcturusZhang ArcturusZhang commented Jul 1, 2026

Copy link
Copy Markdown
Member

Migrates Azure.Provisioning.FrontDoor from the reflection-based generator to the TypeSpec provisioning generator.

Spec PRs:

Milestone issue: #57387
Tracking issue: #58753

Changes:

  • Adds tsp-location.yaml and metadata.json for TypeSpec provisioning generation.
  • Regenerates FrontDoor provisioning resources and models with the TypeSpec provisioning emitter.
  • Keeps FrontDoorResource via SDK-side CodeGenType("FrontDoor") customization.
  • Accepts the generated FrontendEndpointData -> FrontendEndpoint API rename and removal of older historical resource-version constants.
  • Restores generated FrontDoorRequiredMinimumTlsVersion.Tls1_0 / Tls1_2 names through the follow-up exact-name spec customization.
  • Updates snippets, README, tests, API listings, and changelog.

Validation:

  • dotnet build sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Azure.Provisioning.FrontDoor.csproj --no-restore
  • dotnet build /t:GenerateCode in sdk/frontdoor/Azure.Provisioning.FrontDoor/src
  • dotnet format src/test projects
  • eng/scripts/Export-API.ps1 frontdoor
  • eng/scripts/Update-Snippets.ps1 frontdoor
  • dotnet test sdk/frontdoor/Azure.Provisioning.FrontDoor/tests/Azure.Provisioning.FrontDoor.Tests.csproj --filter TestCategory!=Live
  • Spot-checked generated FrontDoor resource types against Microsoft.Network Bicep references for 2025-11-01.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ArcturusZhang ArcturusZhang marked this pull request as ready for review July 6, 2026 06:34
Copilot AI review requested due to automatic review settings July 6, 2026 06:34

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates Azure.Provisioning.FrontDoor from the legacy reflection-based provisioning generator to the TypeSpec-based provisioning generator, updating the generated resource/model layer and aligning docs/tests/API listings with the new output.

Changes:

  • Added TypeSpec provisioning generation configuration (tsp-location.yaml, metadata.json).
  • Regenerated FrontDoor provisioning resources/models with the TypeSpec provisioning emitter (including the FrontendEndpointDataFrontendEndpoint API rename).
  • Updated changelog, README samples, tests, and API listing files to match the new generated surface.

Reviewed changes

Copilot reviewed 8 out of 121 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
sdk/frontdoor/Azure.Provisioning.FrontDoor/tsp-location.yaml Adds TypeSpec spec location and emitter config for provisioning generation.
sdk/frontdoor/Azure.Provisioning.FrontDoor/metadata.json Pins provisioning API version metadata for Microsoft.Network.
sdk/frontdoor/Azure.Provisioning.FrontDoor/CHANGELOG.md Documents breaking changes and generator migration.
sdk/frontdoor/Azure.Provisioning.FrontDoor/README.md Updates samples to new API surface (e.g., FrontendEndpoint).
sdk/frontdoor/Azure.Provisioning.FrontDoor/api/Azure.Provisioning.FrontDoor.netstandard2.0.cs Updates public API listing for regenerated surface.
sdk/frontdoor/Azure.Provisioning.FrontDoor/api/Azure.Provisioning.FrontDoor.net8.0.cs Updates public API listing for regenerated surface.
sdk/frontdoor/Azure.Provisioning.FrontDoor/api/Azure.Provisioning.FrontDoor.net10.0.cs Updates public API listing for regenerated surface.
sdk/frontdoor/Azure.Provisioning.FrontDoor/tests/BasicFrontDoorTests.cs Updates tests to compile/validate the new generated surface.
sdk/frontdoor/Azure.Provisioning.FrontDoor/tests/BasicLiveFrontDoorTests.cs Updates live-test scaffolding to the new generated surface.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/FrontDoorResource.cs Regenerated FrontDoorResource and related helpers for TypeSpec provisioning.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/FrontendEndpoint.cs Regenerated FrontendEndpoint as a ProvisionableResource (replacing FrontendEndpointData).
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/FrontDoorWebApplicationFirewallPolicy.cs Regenerated WAF policy resource for TypeSpec provisioning.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/FrontDoorRulesEngine.cs Regenerated rules engine resource/types for TypeSpec provisioning.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/FrontDoorExperiment.cs Regenerated experiment resource/types for TypeSpec provisioning.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/FrontDoorNetworkExperimentProfile.cs Regenerated network experiment profile resource/types.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Internal/CodeGenTypeAttribute.cs Adds generator internal customization attributes (generated).
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Internal/CodeGenMemberAttribute.cs Adds generator internal customization attributes (generated).
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Internal/CodeGenSerializationAttribute.cs Adds generator internal customization attributes (generated).
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Internal/CodeGenSuppressAttribute.cs Adds generator internal customization attributes (generated).
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorRequiredMinimumTlsVersion.cs Regenerated enum used by HTTPS configuration.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontendEndpointCustomHttpsProvisioningState.cs Regenerated model enum for provisioning status.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontendEndpointCustomHttpsProvisioningSubstate.cs Regenerated model enum for provisioning substate.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontendEndpointProperties.cs Regenerated internal properties model for FrontendEndpoint.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RoutingRuleProperties.cs Regenerated internal properties model for routing rules.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RoutingRuleUpdateParametersWebApplicationFirewallPolicyLink.cs Regenerated internal link model for routing rule WAF linkage.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontendEndpointUpdateParametersWebApplicationFirewallPolicyLink.cs Regenerated internal link model for frontend endpoint WAF linkage.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorSubResource.cs Regenerated shared internal subresource reference model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ForwardingConfiguration.cs Regenerated route configuration derived type.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RouteConfiguration.cs Regenerated route configuration base type.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorCacheConfiguration.cs Regenerated cache configuration model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ManagedRuleSet.cs Regenerated WAF managed rule set model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ManagedRuleOverride.cs Regenerated WAF managed rule override model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ManagedRuleGroupOverride.cs Regenerated WAF managed rule group override model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ManagedRuleExclusion.cs Regenerated WAF managed rule exclusion model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ManagedRuleSetList.cs Regenerated internal wrapper list model for managed rule sets/exceptions.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/ManagedRuleSetExceptionList.cs Regenerated internal wrapper list model for rule set exceptions.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorManagedRuleSetException.cs Regenerated managed rule set exception model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorManagedRuleSetScope.cs Regenerated managed rule scope model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorRuleGroupScope.cs Regenerated rule group scope model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/FrontDoorRuleScope.cs Regenerated rule scope model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/WebApplicationRuleMatchCondition.cs Regenerated WAF match condition model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/WebApplicationFirewallPolicyProperties.cs Regenerated internal WAF policy properties model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/WebApplicationFirewallScrubbingRules.cs Regenerated WAF log scrubbing rule model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/PolicySettingsLogScrubbing.cs Regenerated WAF policy log scrubbing settings model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RulesEngineAction.cs Regenerated rules engine action model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RulesEngineHeaderAction.cs Regenerated rules engine header action model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RulesEngineRule.cs Regenerated rules engine rule model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/RulesEngineProperties.cs Regenerated internal rules engine properties model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/BackendPoolsSettings.cs Regenerated backend pools settings model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/BackendPoolProperties.cs Regenerated internal backend pool properties model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/HealthProbeSettingsProperties.cs Regenerated internal health probe settings properties model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/LoadBalancingSettingsProperties.cs Regenerated internal load balancing settings properties model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/KeyVaultCertificateSourceParameters.cs Regenerated Key Vault certificate source parameters model.
sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated/Models/KeyVaultCertificateSourceParametersVault.cs Regenerated Key Vault reference model.

Comment thread sdk/frontdoor/Azure.Provisioning.FrontDoor/tsp-location.yaml Outdated
ArcturusZhang and others added 3 commits July 6, 2026 15:10
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Provisioning schema extractor output

Package: sdk/frontdoor/Azure.Provisioning.FrontDoor

Schema extracted from generated and custom source
# Provisioning Resource Schema

Package: `sdk/frontdoor/Azure.Provisioning.FrontDoor`
Source: `sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated`

## FrontDoorExperiment

- Resource type: `Microsoft.Network/NetworkExperimentProfiles/Experiments`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorExperiment.cs`
- API versions: `2025-11-01`, `2025-10-01`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `ExperimentProperties` | False | False | False |
| `Parent` | `parent` | Resource | `FrontDoorNetworkExperimentProfile` | True | False | True |

## FrontDoorNetworkExperimentProfile

- Resource type: `Microsoft.Network/NetworkExperimentProfiles`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorNetworkExperimentProfile.cs`
- API versions: `2025-11-01`, `2025-10-01`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `ProfileProperties` | False | False | False |
| `ETag` | `etag` | Property | `BicepValue<ETag>` | False | False | False |

## FrontDoorResource

- Resource type: `Microsoft.Network/frontDoors`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorResource.cs`
- Additional source files: `src/Custom/FrontDoorResource.cs`
- API versions: `2025-11-01`, `2025-10-01`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `FrontDoorProperties` | False | False | False |

## FrontDoorRulesEngine

- Resource type: `Microsoft.Network/frontDoors/rulesEngines`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorRulesEngine.cs`
- API versions: `2025-11-01`, `2025-10-01`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Properties` | `properties` | ModelProperty | `RulesEngineProperties` | False | False | False |
| `Parent` | `parent` | Resource | `FrontDoorResource` | True | False | True |

## FrontDoorWebApplicationFirewallPolicy

- Resource type: `Microsoft.Network/FrontDoorWebApplicationFirewallPolicies`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorWebApplicationFirewallPolicy.cs`
- API versions: `2025-11-01`, `2025-10-01`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `WebApplicationFirewallPolicyProperties` | False | False | False |
| `ETag` | `etag` | Property | `BicepValue<ETag>` | False | False | False |
| `Sku` | `sku` | ModelProperty | `FrontDoorSku` | False | False | False |

## FrontendEndpoint ⚠️

- Resource type: `Microsoft.Network/frontDoors/frontendEndpoints`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontendEndpoint.cs`
- API versions: `2025-11-01`, `2025-10-01`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Properties` | `properties` | ModelProperty | `FrontendEndpointProperties` | False | False | False |
| `Parent` | `parent` | Resource | `FrontDoorResource` | True | False | True |

⚠️ **`Name` is Required=True, Output=False** but `Name` property has no public setter.
⚠️ **`HostName`, `SessionAffinityEnabledState`, `SessionAffinityTtlInSeconds`, `WebApplicationFirewallPolicyLinkId`** are writable in `FrontendEndpointProperties` but exposed as getters-only in `FrontendEndpoint`.

Analyzed by provisioning-review workflow.

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28777825134

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Provisioning SDK Review Summary

  • Scope: sdk/frontdoor/Azure.Provisioning.FrontDoor
  • Classification: Regeneration (reflection-based → TypeSpec provisioning generator migration)
  • CI: pass (all check runs succeeded)
  • Schema and metadata: failFrontendEndpoint is missing public setters for all writable properties; FrontDoorWebApplicationFirewallPolicy name requirements regressed
  • Compatibility: not applicable (beta package, breaking changes documented in CHANGELOG)
  • Tests/snippets/docs: pass (snippet regions and Trycep.Compare() pattern present; README references snippet regions)

Two blocking issues require fixes before merge.

1. FrontendEndpoint writable properties have no public setters (blocking)

FrontendEndpoint is a ProvisionableResource for Microsoft.Network/frontDoors/frontendEndpoints. Its provisioning definition marks name as isRequired: true, isOutput: false, and the underlying FrontendEndpointProperties exposes setters for HostName, SessionAffinityEnabledState, SessionAffinityTtlInSeconds, and WebApplicationFirewallPolicyLinkId. However, none of these properties have public setters on the FrontendEndpoint class itself:

  • Name — required, getter-only (inline comment on line 41)
  • HostName, SessionAffinityEnabledState, SessionAffinityTtlInSeconds, WebApplicationFirewallPolicyLinkId — writable per Bicep spec + doc comments say "Gets or sets", but getter-only in practice (inline comment on line 112)

The result is that FrontendEndpoint cannot be configured either as a standalone child resource or as an embedded item in FrontDoorResource.FrontendEndpoints. The tests work around this by never populating FrontDoorResource.FrontendEndpoints and referencing endpoints only by raw resourceId() strings — but that leaves the primary usage path broken.

Root cause is likely in the TypeSpec spec or emitter; the fix must be confirmed in a re-generation cycle.

2. FrontDoorWebApplicationFirewallPolicy.GetResourceNameRequirements() regression (blocking)

The newly generated code returns ResourceNameCharacters.LowercaseLetters only (line 315), replacing the previous LowercaseLetters | UppercaseLetters | Numbers | Hyphen | Underscore | Period | Parentheses. The Bicep reference for Microsoft.Network/FrontDoorWebApplicationFirewallPolicies allows mixed-case letters, digits, and hyphens. Names like "MyWafPolicy1" or "waf-policy-prod" — valid before — would now fail SDK name validation. This needs to be fixed in the spec or emitter before shipping.


Analyzed by provisioning-review workflow: run 28777825134

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28777825134

}

/// <summary> Gets the Name. </summary>
public BicepValue<string> Name

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Provisioning schema] Name is defined as isRequired: true, isOutput: false in DefineProvisionableProperties (line 152), meaning it is a required writable property. However the public Name property only exposes a getter — there is no setter. The doc-comment correctly says "Gets the Name", but that means users have no way to set the name of a FrontendEndpoint resource.

Every other non-singleton ProvisionableResource in this package (FrontDoorResource, FrontDoorRulesEngine, FrontDoorExperiment, FrontDoorNetworkExperimentProfile, FrontDoorWebApplicationFirewallPolicy) exposes Name with a public setter. This one is missing it.

Required fix: add a public setter:

public BicepValue<string> Name
{
    get { Initialize(); return _name; }
    set { Initialize(); _name.Assign(value); }
}

}

/// <summary> Gets or sets the HostName. </summary>
public BicepValue<string> HostName

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Provisioning schema] The doc comments for HostName (line 111), SessionAffinityEnabledState (line 120), SessionAffinityTtlInSeconds (line 129), and WebApplicationFirewallPolicyLinkId (line 138) all say "Gets or sets", but all four properties are getter-only — the underlying FrontendEndpointProperties object has setters for all of them, but they are not tunnelled through here.

This makes FrontendEndpoint unusable in two ways:

  1. As a standalone child resourcehostName is required by the ARM/Bicep spec for Microsoft.Network/frontDoors/frontendEndpoints; without a setter it can never be configured.
  2. As an embedded model in FrontDoorResource.FrontendEndpoints — users who try new FrontendEndpoint { HostName = "...", Name = "..." } will get a compiler error.

The tests avoid using FrontDoorResource.FrontendEndpoints entirely because of this gap, and the generated Bicep examples therefore produce incomplete FrontDoor configurations.

Required fix: add setters that delegate to the underlying Properties object, following the same pattern used for FriendlyName, RoutingRules, etc. on FrontDoorResource:

public BicepValue<string> HostName
{
    get { return Properties.HostName; }
    set { if (Properties is null) { Properties = new FrontendEndpointProperties(); } Properties.HostName = value; }
}

The Properties field will also need an internal setter (currently it only has a getter).

/// <summary> Get the requirements for naming this resource. </summary>
/// <returns> Naming requirements. </returns>
[EditorBrowsable(EditorBrowsableState.Never)]
public override ResourceNameRequirements GetResourceNameRequirements() => new ResourceNameRequirements(1, 128, ResourceNameCharacters.LowercaseLetters);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Provisioning schema] GetResourceNameRequirements() now returns ResourceNameCharacters.LowercaseLetters only. This is a regression: the code that was deleted below (lines ~326–328 in the old file) used LowercaseLetters | UppercaseLetters | Numbers | Hyphen | Underscore | Period | Parentheses.

According to the Azure Bicep reference for Microsoft.Network/FrontDoorWebApplicationFirewallPolicies, the policy name allows letters (upper and lower case), digits, hyphens, and underscores. Restricting to lowercase letters only will cause the SDK to reject valid policy names like "MyWafPolicy1" or "waf-policy-prod".

The fix should restore at minimum: ResourceNameCharacters.LowercaseLetters | ResourceNameCharacters.UppercaseLetters | ResourceNameCharacters.Numbers | ResourceNameCharacters.Hyphen | ResourceNameCharacters.Underscore. This should be corrected in the TypeSpec spec or emitter configuration.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Provisioning schema extractor output

Package: sdk/frontdoor/Azure.Provisioning.FrontDoor

Schema extracted from generated and custom source
# Provisioning Resource Schema

Package: `sdk/frontdoor/Azure.Provisioning.FrontDoor`
Source: `sdk/frontdoor/Azure.Provisioning.FrontDoor/src/Generated`

## FrontDoorExperiment

- Resource type: `Microsoft.Network/NetworkExperimentProfiles/Experiments`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorExperiment.cs`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `ExperimentProperties` | False | False | False |
| `Parent` | `parent` | Resource | `FrontDoorNetworkExperimentProfile` | True | False | True |

## FrontDoorNetworkExperimentProfile

- Resource type: `Microsoft.Network/NetworkExperimentProfiles`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorNetworkExperimentProfile.cs`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `ProfileProperties` | False | False | False |
| `ETag` | `etag` | Property | `BicepValue<ETag>` | False | False | False |

## FrontDoorResource

- Resource type: `Microsoft.Network/frontDoors`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorResource.cs`
- Additional source files: `src/Custom/FrontDoorResource.cs`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `FrontDoorProperties` | False | False | False |

## FrontDoorRulesEngine

- Resource type: `Microsoft.Network/frontDoors/rulesEngines`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorRulesEngine.cs`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Properties` | `properties` | ModelProperty | `RulesEngineProperties` | False | False | False |
| `Parent` | `parent` | Resource | `FrontDoorResource` | True | False | True |

## FrontDoorWebApplicationFirewallPolicy

- Resource type: `Microsoft.Network/FrontDoorWebApplicationFirewallPolicies`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontDoorWebApplicationFirewallPolicy.cs`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Location` | `location` | Property | `BicepValue<AzureLocation>` | False | False | False |
| `Tags` | `tags` | DictionaryProperty | `BicepDictionary<string>` | False | False | False |
| `Properties` | `properties` | ModelProperty | `WebApplicationFirewallPolicyProperties` | False | False | False |
| `ETag` | `etag` | Property | `BicepValue<ETag>` | False | False | False |
| `Sku` | `sku` | ModelProperty | `FrontDoorSku` | False | False | False |

## FrontendEndpoint

- Resource type: `Microsoft.Network/frontDoors/frontendEndpoints`
- Default API version: `2025-11-01`
- Source file: `src/Generated/FrontendEndpoint.cs`

| Property | Path | Kind | Type | Required | Output | Metadata |
| --- | --- | --- | --- | --- | --- | --- |
| `Id` | `id` | Property | `BicepValue<ResourceIdentifier>` | False | True | False |
| `Name` | `name` | Property | `BicepValue<string>` | True | False | False |
| `Properties` | `properties` | ModelProperty | `FrontendEndpointProperties` | False | False | False |
| `Parent` | `parent` | Resource | `FrontDoorResource` | True | False | True |

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28783271077

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Provisioning SDK Review Summary

  • Scope: sdk/frontdoor/Azure.Provisioning.FrontDoor
  • Classification: Regeneration (reflection-based → TypeSpec provisioning generator migration)
  • CI: pass (all check runs succeeded on the latest head commit)
  • Schema and metadata: fail — the two blocking issues from the previous workflow review persist unchanged in this head commit
  • Compatibility: not applicable (beta package, breaking changes documented in CHANGELOG)
  • Tests/snippets/docs: pass

The latest commit (fc80f4151905) only updated tsp-location.yaml to switch from a personal fork to the upstream Azure/azure-rest-api-specs repo — a correct and welcome change. However, the generated C# code was not re-regenerated with this commit, so the two blocking issues flagged in the previous workflow review remain present in the generated source:

  1. FrontendEndpoint.Name has no public setter (see open inline thread on FrontendEndpoint.cs line 41): _name is defined with isRequired: true, isOutput: false, meaning it is a writable required property, but the Name property on FrontendEndpoint only exposes a getter. Every other resource in this package exposes Name with a setter. This prevents object-initializer assignment and is inconsistent with the SDK pattern.

  2. FrontendEndpoint writable properties HostName, SessionAffinityEnabledState, SessionAffinityTtlInSeconds, WebApplicationFirewallPolicyLinkId have no public setters (see open inline thread on FrontendEndpoint.cs line 112): The underlying FrontendEndpointProperties has setters for all four, but they are not tunnelled through the public FrontendEndpoint surface. The doc comments say "Gets or sets" but only a getter is provided, making it impossible to configure these properties via object initializer or assignment syntax.

  3. FrontDoorWebApplicationFirewallPolicy.GetResourceNameRequirements() regression (see open inline thread on FrontDoorWebApplicationFirewallPolicy.cs line 315): The method returns ResourceNameCharacters.LowercaseLetters only. Per the Azure Bicep reference for Microsoft.Network/FrontDoorWebApplicationFirewallPolicies, valid policy names include uppercase letters, digits, hyphens, and underscores. This restriction will cause the SDK to reject valid names like "MyWafPolicy1" or "waf-policy-prod". The fix should restore at minimum: LowercaseLetters | UppercaseLetters | Numbers | Hyphen | Underscore.

All three issues are rooted in the TypeSpec spec or emitter configuration and require a regeneration pass after the upstream spec fix is in place. Please address them before merging.

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28783271077

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28783271077

ArcturusZhang and others added 2 commits July 7, 2026 13:14

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Provisioning SDK Review Summary

  • Scope: sdk/frontdoor/Azure.Provisioning.FrontDoor
  • Classification: Regeneration (reflection-based → TypeSpec provisioning generator migration)
  • CI: pass (all 23 check runs succeeded on head commit a255dd6999c38d48bab51a30bdf7a2df9bc79ca7)
  • Schema and metadata: fail — three blocking issues from prior workflow reviews persist after the generator-update regeneration
  • Compatibility: not applicable (beta package; breaking changes documented in CHANGELOG)
  • Tests/snippets/docs: pass

The latest commit ("Regenerate FrontDoor provisioning after generator update") merged generator prerelease 1.0.0-alpha.20260706.4 and re-ran generation. However, all three blocking issues flagged in the prior two workflow reviews remain in the new generated output, confirmed by direct inspection of the current source files.

Existing open review threads (not outdated, not resolved) that remain blocking:

  1. FrontendEndpoint.Name has no public setterDefineProvisionableProperties registers _name with isRequired: true (writable), but the Name property only exposes a getter. Users cannot assign a name to a FrontendEndpoint resource. Open thread: #discussion_r3527456257 on FrontendEndpoint.cs line 41.

  2. FrontendEndpoint writable properties have no settersHostName, SessionAffinityEnabledState, SessionAffinityTtlInSeconds, and WebApplicationFirewallPolicyLinkId doc-comment as "Gets or sets" but each only exposes a getter, even though FrontendEndpointProperties has setters for all four. This makes it impossible to configure a FrontendEndpoint as either a standalone child resource or an embedded item in FrontDoorResource.FrontendEndpoints. Open thread: #discussion_r3527456269 on FrontendEndpoint.cs line 112.

  3. FrontDoorWebApplicationFirewallPolicy.GetResourceNameRequirements() returns LowercaseLetters only — valid WAF policy names contain uppercase letters, digits, hyphens, and underscores (e.g., "MyWafPolicy1", "waf-policy-prod"), but the current implementation rejects all of these. The fix should restore at minimum LowercaseLetters | UppercaseLetters | Numbers | Hyphen | Underscore. Open thread: #discussion_r3527456271 on FrontDoorWebApplicationFirewallPolicy.cs line 315.

All three issues are rooted in the TypeSpec spec or emitter configuration and require a fix in the spec/emitter followed by regeneration. The generator update in this round did not address them.

Note: Schema extraction via Get-ProvisioningSchema.ps1 could not be run in this environment due to a PowerShell module availability issue (filesystem cmdlets unavailable).

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28844439485

Analyzed by Azure .NET Provisioning SDK PR Review: https://github.com/Azure/azure-sdk-for-net/actions/runs/28844439485

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants