diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 23a74ca64a..753a7733d0 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Setup .NET uses: actions/setup-dotnet@d4c94342e560b34958eacfc5d055d21461ed1c5d # v5.0.0 @@ -109,7 +109,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Setup .NET uses: actions/setup-dotnet@d4c94342e560b34958eacfc5d055d21461ed1c5d # v5.0.0 @@ -154,7 +154,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: fetch-depth: 0 @@ -191,7 +191,7 @@ jobs: security-events: write steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Run PSRule analysis uses: microsoft/ps-rule@46451b8f5258c41beb5ae69ed7190ccbba84112c # v2.9.0 @@ -202,7 +202,7 @@ jobs: outputPath: reports/ps-rule-results.sarif - name: Upload results to security tab - uses: github/codeql-action/upload-sarif@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 + uses: github/codeql-action/upload-sarif@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4 if: always() with: sarif_file: reports/ps-rule-results.sarif @@ -225,7 +225,7 @@ jobs: security-events: write steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Run DevSkim scanner uses: microsoft/DevSkim-Action@4b5047945a44163b94642a1cecc0d93a3f428cc6 # v1.0.16 @@ -233,7 +233,7 @@ jobs: directory-to-scan: . - name: Upload results to security tab - uses: github/codeql-action/upload-sarif@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 + uses: github/codeql-action/upload-sarif@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4 if: always() with: sarif_file: devskim-results.sarif @@ -256,18 +256,18 @@ jobs: security-events: write steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Initialize CodeQL - uses: github/codeql-action/init@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 + uses: github/codeql-action/init@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4 with: languages: 'csharp' - name: Autobuild - uses: github/codeql-action/autobuild@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 + uses: github/codeql-action/autobuild@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3 + uses: github/codeql-action/analyze@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4 id: codeql-analyze - name: Upload results diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 7e631497da..86b72a4924 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/dependencies.yaml b/.github/workflows/dependencies.yaml index b73dda01a2..094b2c4743 100644 --- a/.github/workflows/dependencies.yaml +++ b/.github/workflows/dependencies.yaml @@ -29,7 +29,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index a46da68126..912ebae3cc 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -26,7 +26,7 @@ jobs: contents: write steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: fetch-depth: 0 @@ -59,7 +59,7 @@ jobs: shell: pwsh - name: Checkout gh-pages - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: ref: refs/heads/gh-pages path: site/ @@ -94,7 +94,7 @@ jobs: id-token: write steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: ref: refs/heads/gh-pages diff --git a/docs/changelog.md b/docs/changelog.md index 2085b9424d..77ec75aff8 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -47,6 +47,9 @@ See [upgrade notes][1] for helpful information when upgrading from previous vers - Data Explorer: - Check that public network access is disabled by @BenjaminEngeset. [#3114](https://github.com/Azure/PSRule.Rules.Azure/issues/3114) + - Event Hub: + - Check that zone redundancy is enabled for Event Hub namespaces in supported regions by @BenjaminEngeset. + [#3029](https://github.com/Azure/PSRule.Rules.Azure/issues/3029) - Managed Grafana: - Check that zone redundancy is enabled for Grafana workspaces in supported regions by @BenjaminEngeset. [#3294](https://github.com/Azure/PSRule.Rules.Azure/issues/3294) diff --git a/docs/en/rules/Azure.EventHub.AvailabilityZone.md b/docs/en/rules/Azure.EventHub.AvailabilityZone.md new file mode 100644 index 0000000000..c71c2ae434 --- /dev/null +++ b/docs/en/rules/Azure.EventHub.AvailabilityZone.md @@ -0,0 +1,109 @@ +--- +reviewed: 2025-11-19 +severity: Important +pillar: Reliability +category: RE:05 Redundancy +resource: Event Hub +resourceType: Microsoft.EventHub/namespaces +online version: https://azure.github.io/PSRule.Rules.Azure/en/rules/Azure.EventHub.AvailabilityZone/ +--- + +# Use zone redundant Event Hub namespaces + +## SYNOPSIS + +Use zone redundant Event Hub namespaces in supported regions to improve reliability. + +## DESCRIPTION + +Azure Event Hubs supports zone redundancy to provide enhanced resiliency and high availability. +When zone redundancy is enabled, Event Hubs automatically replicates namespace metadata +and event data across multiple availability zones within a region. + +Availability zones are unique physical locations within an Azure region. +Each zone is made up of one or more datacenters equipped with independent power, cooling, and networking. +This physical separation protects your Event Hubs namespace from zone-level failures, +ensuring continuous availability even if an entire availability zone experiences an outage. + +With zone redundancy enabled, Azure Event Hubs provides: + +- Synchronous replication of metadata and events across zones. +- Continuous availability during zonal failures. +- Protection against datacenter-level disasters while maintaining low-latency access. + +Zone redundancy must be configured when you create an Event Hub namespace by setting `zoneRedundant` to `true`. +This setting cannot be changed after the namespace is created. +Zone redundancy is only available in regions that support availability zones. + +## RECOMMENDATION + +Consider using using a minimum of Standard Event Hub namespaces configured with zone redundancy to improve workload resiliency. + +## EXAMPLES + +### Configure with Azure template + +To deploy Event Hub namespaces that pass this rule: + +- Set the `properties.zoneRedundant` property to `true`. + +For example: + +```json +{ + "type": "Microsoft.EventHub/namespaces", + "apiVersion": "2024-01-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard", + "tier": "Standard" + }, + "properties": { + "disableLocalAuth": true, + "minimumTlsVersion": "1.2", + "zoneRedundant": true + } +} +``` + +### Configure with Bicep + +To deploy Event Hub namespaces that pass this rule: + +- Set the `properties.zoneRedundant` property to `true`. + +For example: + +```bicep +resource eventHubNamespace 'Microsoft.EventHub/namespaces@2024-01-01' = { + name: name + location: location + sku: { + name: 'Standard' + tier: 'Standard' + } + properties: { + disableLocalAuth: true + minimumTlsVersion: '1.2' + zoneRedundant: true + } +} +``` + + + +## NOTES + +Availability zones is supported on Standard, Premium, and Dedicated tiers. + +For the Dedicated tier, availability zones require a minimum of three capacity units (CUs). + +## LINKS + +- [RE:05 Redundancy](https://learn.microsoft.com/azure/well-architected/reliability/redundancy) +- [Reliability: Level 1](https://learn.microsoft.com/azure/well-architected/reliability/maturity-model?tabs=level1) +- [Architecture strategies for using availability zones and regions](https://learn.microsoft.com/azure/well-architected/reliability/regions-availability-zones) +- [Azure regions with availability zone support](https://learn.microsoft.com/azure/reliability/availability-zones-service-support) +- [High availability with Azure Event Hubs](https://learn.microsoft.com/azure/reliability/reliability-event-hubs) +- [Azure deployment reference](https://learn.microsoft.com/azure/templates/microsoft.eventhub/namespaces) diff --git a/src/PSRule.Rules.Azure/rules/Azure.EventHub.Rule.ps1 b/src/PSRule.Rules.Azure/rules/Azure.EventHub.Rule.ps1 index e09a1714a0..c3867a1782 100644 --- a/src/PSRule.Rules.Azure/rules/Azure.EventHub.Rule.ps1 +++ b/src/PSRule.Rules.Azure/rules/Azure.EventHub.Rule.ps1 @@ -36,6 +36,20 @@ Rule 'Azure.EventHub.Firewall' -Ref 'AZR-000422' -Type 'Microsoft.EventHub/names } } +# Synopsis: Use zone redundant Event Hub namespaces in supported regions to improve reliability. +Rule 'Azure.EventHub.AvailabilityZone' -Ref 'AZR-000532' -Type 'Microsoft.EventHub/namespaces' -Tag @{ release = 'GA'; ruleSet = '2025_12'; 'Azure.WAF/pillar' = 'Reliability'; } -Labels @{ 'Azure.WAF/maturity' = 'L1' } { + # Check for availability zones based on virtual machine scale sets, because it is not exposed through the provider for Event Hub. + $provider = [PSRule.Rules.Azure.Runtime.Helper]::GetResourceType('Microsoft.Compute', 'virtualMachineScaleSets'); + $availabilityZones = GetAvailabilityZone -Location $TargetObject.Location -Zone $provider.ZoneMappings; + + # Don't flag if the region does not support AZ. + if (-not $availabilityZones) { + return $Assert.Pass(); + } + + $Assert.HasFieldValue($TargetObject, 'properties.zoneRedundant', $true); +} + #endregion Rules #region Helper functions diff --git a/tests/PSRule.Rules.Azure.Tests/Azure.EventHub.Tests.ps1 b/tests/PSRule.Rules.Azure.Tests/Azure.EventHub.Tests.ps1 index dfa1d7eb3c..e000ee7660 100644 --- a/tests/PSRule.Rules.Azure.Tests/Azure.EventHub.Tests.ps1 +++ b/tests/PSRule.Rules.Azure.Tests/Azure.EventHub.Tests.ps1 @@ -42,8 +42,8 @@ Describe 'Azure.EventHub' -Tag 'EventHub' { # Fail $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Fail' }); $ruleResult | Should -Not -BeNullOrEmpty; - $ruleResult.Length | Should -Be 5; - $ruleResult.TargetName | Should -BeIn 'hubns-B', 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F'; + $ruleResult.Length | Should -Be 7; + $ruleResult.TargetName | Should -BeIn 'hubns-B', 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F', 'hubns-G', 'hubns-H'; # Pass $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Pass' }); @@ -58,8 +58,8 @@ Describe 'Azure.EventHub' -Tag 'EventHub' { # Fail $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Fail' }); $ruleResult | Should -Not -BeNullOrEmpty; - $ruleResult.Length | Should -Be 5; - $ruleResult.TargetName | Should -BeIn 'hubns-B', 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F'; + $ruleResult.Length | Should -Be 7; + $ruleResult.TargetName | Should -BeIn 'hubns-B', 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F', 'hubns-G', 'hubns-H'; # Pass $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Pass' }); @@ -82,8 +82,8 @@ Describe 'Azure.EventHub' -Tag 'EventHub' { # Pass $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Pass' }); $ruleResult | Should -Not -BeNullOrEmpty; - $ruleResult.Length | Should -Be 4; - $ruleResult.TargetName | Should -BeIn 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F'; + $ruleResult.Length | Should -Be 6; + $ruleResult.TargetName | Should -BeIn 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F', 'hubns-G', 'hubns-H'; } It 'Azure.EventHub.Firewall' { @@ -92,17 +92,35 @@ Describe 'Azure.EventHub' -Tag 'EventHub' { # Fail $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Fail' }); $ruleResult.Length | Should -Be 4; - $ruleResult.TargetName | Should -BeIn 'hubns-B', 'hubns-C', 'hubns-D', 'default-A'; + $ruleResult.TargetName | Should -BeIn 'hubns-B', 'hubns-C', 'hubns-D', 'hubns-X/default-A'; + + $ruleResult[0].Reason | Should -BeExactly "Path properties.publicNetworkAccess: Does not exist."; + $ruleResult[1].Reason | Should -BeIn "Path properties.publicNetworkAccess: Is set to 'Enabled'."; + $ruleResult[2..3].Reason | Should -BeIn "Path properties.publicNetworkAccess: Is set to 'Enabled'.", "Path properties.defaultAction: Is set to 'Allow'." + + # Pass + $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Pass' }); + $ruleResult.Length | Should -Be 7; + $ruleResult.TargetName | Should -BeIn 'hubns-E', 'hubns-F', 'hubns-Y/default-B', 'default-C', 'default-D', 'hubns-G', 'hubns-H'; + } + + It 'Azure.EventHub.AvailabilityZone' { + $filteredResult = $result | Where-Object { $_.RuleName -eq 'Azure.EventHub.AvailabilityZone' }; - $ruleResult[0].Reason | Should -BeExactly "Path properties.publicNetworkAccess: Does not exist." - $ruleResult[1].Reason | Should -BeExactly "Path properties.publicNetworkAccess: Is set to 'Enabled'." - $ruleResult[2].Reason | Should -BeIn "Path properties.publicNetworkAccess: Is set to 'Enabled'.", "Path properties.defaultAction: Is set to 'Allow'." - $ruleResult[3].Reason | Should -BeIn "Path properties.publicNetworkAccess: Is set to 'Enabled'.", "Path properties.defaultAction: Is set to 'Allow'." + # Fail + $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Fail' }); + $ruleResult | Should -Not -BeNullOrEmpty; + $ruleResult.Length | Should -Be 2; + $ruleResult.TargetName | Should -BeIn 'hubns-A', 'hubns-B'; + + $ruleResult[0].Reason | Should -BeExactly "Path properties.zoneRedundant: Does not exist."; + $ruleResult[1].Reason | Should -BeExactly "Path properties.zoneRedundant: Is set to 'False'."; # Pass $ruleResult = @($filteredResult | Where-Object { $_.Outcome -eq 'Pass' }); - $ruleResult.Length | Should -Be 5; - $ruleResult.TargetName | Should -BeIn 'hubns-E', 'hubns-F', 'default-B', 'default-C', 'default-D'; + $ruleResult | Should -Not -BeNullOrEmpty; + $ruleResult.Length | Should -Be 6; + $ruleResult.TargetName | Should -BeIn 'hubns-C', 'hubns-D', 'hubns-E', 'hubns-F', 'hubns-G', 'hubns-H'; } } diff --git a/tests/PSRule.Rules.Azure.Tests/Resources.EventHub.json b/tests/PSRule.Rules.Azure.Tests/Resources.EventHub.json index 3a840ccc5a..26a4f93f53 100644 --- a/tests/PSRule.Rules.Azure.Tests/Resources.EventHub.json +++ b/tests/PSRule.Rules.Azure.Tests/Resources.EventHub.json @@ -76,7 +76,7 @@ "ExtensionResourceName": null, "Properties": { "disableLocalAuth": false, - "zoneRedundant": true, + "zoneRedundant": false, "isAutoInflateEnabled": true, "maximumThroughputUnits": 2, "kafkaEnabled": true, @@ -108,7 +108,7 @@ "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-C", "Identity": null, "Kind": null, - "Location": "East US", + "Location": "West India", "ManagedBy": null, "ResourceName": "hubns-C", "Name": "hubns-C", @@ -116,7 +116,6 @@ "Properties": { "publicNetworkAccess": "Enabled", "disableLocalAuth": false, - "zoneRedundant": true, "isAutoInflateEnabled": true, "maximumThroughputUnits": 2, "kafkaEnabled": true, @@ -147,14 +146,14 @@ "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-D", "Identity": null, "Kind": null, - "Location": "East US", + "Location": "West India", "ManagedBy": null, "ResourceName": "hubns-D", "Name": "hubns-D", "ExtensionResourceName": null, "Properties": { "disableLocalAuth": false, - "zoneRedundant": true, + "zoneRedundant": false, "isAutoInflateEnabled": true, "maximumThroughputUnits": 2, "kafkaEnabled": true, @@ -170,8 +169,8 @@ "ResourceType": "Microsoft.EventHub/namespaces", "ExtensionResourceType": null, "Sku": { - "Name": "Premium", - "Tier": "Premium", + "Name": "Standard", + "Tier": "Standard", "Size": null, "Family": null, "Model": null, @@ -335,14 +334,93 @@ ] }, { - "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-G/networkrulesets/default-A", - "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-G/networkrulesets/default-A", + "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-G", + "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-G", + "Identity": null, + "Kind": null, + "Location": "East US", + "ManagedBy": null, + "ResourceName": "hubns-G", + "Name": "hubns-G", + "ExtensionResourceName": null, + "Properties": { + "publicNetworkAccess": "Disabled", + "disableLocalAuth": false, + "zoneRedundant": true, + "isAutoInflateEnabled": true, + "maximumThroughputUnits": 2, + "kafkaEnabled": true, + "minimumTlsVersion": "1.2", + "provisioningState": "Succeeded", + "createdAt": "2022-01-22T08:53:47.343Z", + "updatedAt": "2022-01-22T08:54:38.617Z", + "serviceBusEndpoint": "https://hubns-G.servicebus.windows.net:443/", + "status": "Active" + }, + "ResourceGroupName": "test-rg", + "Type": "Microsoft.EventHub/namespaces", + "ResourceType": "Microsoft.EventHub/namespaces", + "ExtensionResourceType": null, + "Sku": { + "Name": "Standard", + "Tier": "Standard", + "Size": null, + "Family": null, + "Model": null, + "Capacity": 1 + }, + "Tags": null, + "SubscriptionId": "00000000-0000-0000-0000-000000000000" + }, + { + "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-H", + "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-H", + "Identity": null, + "Kind": null, + "Location": "East US", + "ManagedBy": null, + "ResourceName": "hubns-H", + "Name": "hubns-H", + "ExtensionResourceName": null, + "Properties": { + "publicNetworkAccess": "Disabled", + "disableLocalAuth": false, + "zoneRedundant": true, + "isAutoInflateEnabled": true, + "maximumThroughputUnits": 2, + "kafkaEnabled": true, + "minimumTlsVersion": "1.2", + "provisioningState": "Succeeded", + "createdAt": "2022-01-22T08:53:47.343Z", + "updatedAt": "2022-01-22T08:54:38.617Z", + "serviceBusEndpoint": "https://hubns-H.servicebus.windows.net:443/", + "status": "Active" + }, + "ResourceGroupName": "test-rg", + "Type": "Microsoft.EventHub/namespaces", + "ResourceType": "Microsoft.EventHub/namespaces", + "ExtensionResourceType": null, + "Sku": { + "Name": "Premium", + "Tier": "Premium", + "Size": null, + "Family": null, + "Model": null, + "Capacity": 1 + }, + "Tags": null, + "SubscriptionId": "00000000-0000-0000-0000-000000000000", + "resources": [] + }, + { + "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-X/networkrulesets/default-A", + "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-X/networkrulesets/default-A", "Identity": null, "Kind": null, "Location": "East US", "ManagedBy": null, - "ResourceName": "default-A", - "Name": "default-A", + "ResourceName": "hubns-X/default-A", + "Name": "hubns-X/default-A", "ExtensionResourceName": null, "Properties": { "publicNetworkAccess": "Enabled", @@ -360,14 +438,14 @@ "SubscriptionId": "00000000-0000-0000-0000-000000000000" }, { - "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-H/networkrulesets/default-B", - "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-H/networkrulesets/default-B", + "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-Y/networkrulesets/default-B", + "Id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.EventHub/namespaces/hubns-Y/networkrulesets/default-B", "Identity": null, "Kind": null, "Location": "East US", "ManagedBy": null, - "ResourceName": "default-B", - "Name": "default-B", + "ResourceName": "hubns-Y/default-B", + "Name": "hubns-Y/default-B", "ExtensionResourceName": null, "Properties": { "publicNetworkAccess": "Disabled",