Skip to content

Commit 7d05ac3

Browse files
Updated Set-AzVirtualNetworkSubnetConfig to allow NSG and Route Table to be removed from subnet (#12351)
* Updated Set-AzVirtualNetworkSubnetConfig to allow NSG and Route Table to be removed from subnet * Update ChangeLog.md * Edited to set NSG and route table properties to null if explictly set in parameters * Removed unneeded using directive and used BoundParameters.ContainsKey * Added ScenarioTests: Test-subnetNetworkSecurityGroupCRUD and Test-subnetRouteTableCRUD * Fixed ScenarioTests and added SessionRecords .json files * Added reference to resolved issue #9718 in ChangeLog.md Co-authored-by: Yunchi Wang <[email protected]>
1 parent bbd46f0 commit 7d05ac3

File tree

6 files changed

+8130
-1
lines changed

6 files changed

+8130
-1
lines changed

src/Network/Network.Test/ScenarioTests/VirtualNetworkTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,22 @@ public void TestVirtualNetworkSubnetDelegationCRUD()
6666
TestRunner.RunTestScript("Test-subnetDelegationCRUD");
6767
}
6868

69+
[Fact]
70+
[Trait(Category.AcceptanceType, Category.CheckIn)]
71+
[Trait(Category.Owner, NrpTeamAlias.sdnnrp)]
72+
public void TestVirtualNetworkSubnetNetworkSecurityGroupCRUD()
73+
{
74+
TestRunner.RunTestScript("Test-subnetNetworkSecurityGroupCRUD");
75+
}
76+
77+
[Fact]
78+
[Trait(Category.AcceptanceType, Category.CheckIn)]
79+
[Trait(Category.Owner, NrpTeamAlias.sdnnrp)]
80+
public void TestVirtualNetworkSubnetRouteTableCRUD()
81+
{
82+
TestRunner.RunTestScript("Test-subnetRouteTableCRUD");
83+
}
84+
6985
[Fact]
7086
[Trait(Category.AcceptanceType, Category.CheckIn)]
7187
[Trait(Category.Owner, NrpTeamAlias.sdnnrp)]

src/Network/Network.Test/ScenarioTests/VirtualNetworkTests.ps1

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,206 @@ function Test-subnetDelegationCRUD
333333
}
334334
}
335335

336+
<#
337+
.SYNOPSIS
338+
Tests creating new virtualNetwork w/ network security group associated and disassociated from subnets.
339+
.DESCRIPTION
340+
SmokeTest
341+
#>
342+
function Test-subnetNetworkSecurityGroupCRUD {
343+
# Setup
344+
$rgname = Get-ResourceGroupName
345+
$vnetName = Get-ResourceName
346+
$subnet1Name = Get-ResourceName
347+
$subnet2Name = Get-ResourceName
348+
$subnet3Name = Get-ResourceName
349+
$networkSecurityGroupName = Get-ResourceName
350+
$rglocation = Get-ProviderLocation ResourceManagement
351+
$resourceTypeParent = "Microsoft.Network/virtualNetworks"
352+
$location = Get-ProviderLocation $resourceTypeParent
353+
354+
try {
355+
# Create the resource group
356+
$resourceGroup = New-AzResourceGroup -Name $rgname -Location $rglocation -Tags @{ testtag = "testval" }
357+
358+
# Create a network security group
359+
$networkSecurityGroup = New-AzNetworkSecurityGroup -Name $networkSecurityGroupName -ResourceGroupName $rgname -Location $location
360+
361+
# Create the Virtual Network
362+
$subnet = New-AzVirtualNetworkSubnetConfig -Name $subnet1Name -AddressPrefix 10.0.1.0/24 -NetworkSecurityGroup $networkSecurityGroup
363+
New-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname -Location $location -AddressPrefix 10.0.0.0/16 -Subnet $subnet
364+
$vnet = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
365+
366+
# Add subnets
367+
$vnet | Add-AzVirtualNetworkSubnetConfig -Name $subnet2Name -AddressPrefix 10.0.2.0/24
368+
$vnet | Add-AzVirtualNetworkSubnetConfig -Name $subnet3Name -AddressPrefix 10.0.3.0/24
369+
370+
# Set VirtualNetwork
371+
$vnet | Set-AzVirtualNetwork
372+
373+
# Get VirtualNetwork
374+
$vnetExpected = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
375+
376+
Assert-AreEqual 3 $vnetExpected.Subnets.Count
377+
Assert-AreEqual $subnet1Name $vnetExpected.Subnets[0].Name
378+
Assert-AreEqual 1 $vnetExpected.Subnets[0].NetworkSecurityGroup.Count
379+
Assert-AreEqual $subnet2Name $vnetExpected.Subnets[1].Name
380+
Assert-AreEqual 0 $vnetExpected.Subnets[1].NetworkSecurityGroup.Count
381+
Assert-AreEqual $subnet3Name $vnetExpected.Subnets[2].Name
382+
Assert-AreEqual 0 $vnetExpected.Subnets[2].NetworkSecurityGroup.Count
383+
384+
# Associate a network security group to a subnet using the NetworkSecurityGroup parameter
385+
Set-AzVirtualNetworkSubnetConfig -Name $subnet2Name -VirtualNetwork $vnet -AddressPrefix 10.0.2.0/24 -NetworkSecurityGroup $networkSecurityGroup
386+
Set-AzVirtualNetwork -VirtualNetwork $vnet
387+
388+
# Associate a network security group to a subnet using the NetworkSecurityGroupId parameter
389+
Set-AzVirtualNetworkSubnetConfig -Name $subnet3Name -VirtualNetwork $vnet -AddressPrefix 10.0.3.0/24 -NetworkSecurityGroupId $networkSecurityGroup.Id
390+
Set-AzVirtualNetwork -VirtualNetwork $vnet
391+
392+
$vnetExpected = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
393+
Assert-AreEqual 3 $vnetExpected.Subnets.Count
394+
Assert-AreEqual 1 $vnetExpected.Subnets[0].NetworkSecurityGroup.Count
395+
Assert-AreEqual $networkSecurityGroup.Id $vnetExpected.Subnets[0].NetworkSecurityGroup.Id
396+
Assert-AreEqual 1 $vnetExpected.Subnets[1].NetworkSecurityGroup.Count
397+
Assert-AreEqual $networkSecurityGroup.Id $vnetExpected.Subnets[1].NetworkSecurityGroup.Id
398+
Assert-AreEqual 1 ($vnetExpected.Subnets[2].NetworkSecurityGroup).Count
399+
Assert-AreEqual $networkSecurityGroup.Id $vnetExpected.Subnets[2].NetworkSecurityGroup.Id
400+
401+
# Get subnets
402+
$subnet1 = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig -Name $subnet1Name
403+
Assert-AreEqual 1 $subnet1.NetworkSecurityGroup.Count
404+
$subnet2 = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig -Name $subnet2Name
405+
Assert-AreEqual 1 $subnet2.NetworkSecurityGroup.Count
406+
$subnet3 = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig -Name $subnet3Name
407+
Assert-AreEqual 1 $subnet3.NetworkSecurityGroup.Count
408+
$subnetAll = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig
409+
410+
Assert-AreEqual 3 $subnetAll.Count
411+
412+
# Disassociate a network security group with the NetworkSecurityGroup parameter as $null
413+
Set-AzVirtualNetworkSubnetConfig -Name $subnet1Name -VirtualNetwork $vnet -AddressPrefix 10.0.1.0/24 -NetworkSecurityGroup $null
414+
Set-AzVirtualNetwork -VirtualNetwork $vnet
415+
416+
# Disassociate a network security group with the NetworkSecurityGroupId parameter as $null
417+
Set-AzVirtualNetworkSubnetConfig -Name $subnet2Name -VirtualNetwork $vnet -AddressPrefix 10.0.2.0/24 -NetworkSecurityGroupId $null
418+
Set-AzVirtualNetwork -VirtualNetwork $vnet
419+
420+
# Disassociate a network security group with the NetworkSecurityGroupId parameter as an empty string
421+
Set-AzVirtualNetworkSubnetConfig -Name $subnet3Name -VirtualNetwork $vnet -AddressPrefix 10.0.3.0/24 -NetworkSecurityGroupId ""
422+
Set-AzVirtualNetwork -VirtualNetwork $vnet
423+
424+
$vnetExpected = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
425+
Assert-AreEqual 3 $vnetExpected.Subnets.Count
426+
Assert-AreEqual 0 $vnetExpected.Subnets[0].NetworkSecurityGroup.Count
427+
Assert-AreEqual 0 $vnetExpected.Subnets[1].NetworkSecurityGroup.Count
428+
Assert-AreEqual 0 $vnetExpected.Subnets[2].NetworkSecurityGroup.Count
429+
}
430+
finally {
431+
# Cleanup
432+
Clean-ResourceGroup $rgname
433+
}
434+
}
435+
436+
<#
437+
.SYNOPSIS
438+
Tests creating new virtualNetwork w/ route table associated and disassoicated from subnets.
439+
.DESCRIPTION
440+
SmokeTest
441+
#>
442+
function Test-subnetRouteTableCRUD {
443+
# Setup
444+
$rgname = Get-ResourceGroupName
445+
$vnetName = Get-ResourceName
446+
$subnet1Name = Get-ResourceName
447+
$subnet2Name = Get-ResourceName
448+
$subnet3Name = Get-ResourceName
449+
$routeTableName = Get-ResourceName
450+
$rglocation = Get-ProviderLocation ResourceManagement
451+
$resourceTypeParent = "Microsoft.Network/virtualNetworks"
452+
$location = Get-ProviderLocation $resourceTypeParent
453+
454+
try {
455+
# Create the resource group
456+
$resourceGroup = New-AzResourceGroup -Name $rgname -Location $rglocation -Tags @{ testtag = "testval" }
457+
458+
# Create a route table
459+
$routeTable = New-AzRouteTable -Name $routeTableName -ResourceGroupName $rgname -Location $location
460+
461+
# Create the Virtual Network
462+
$subnet = New-AzVirtualNetworkSubnetConfig -Name $subnet1Name -AddressPrefix 10.0.1.0/24 -RouteTable $routeTable
463+
New-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname -Location $location -AddressPrefix 10.0.0.0/16 -Subnet $subnet
464+
$vnet = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
465+
466+
# Add subnets
467+
$vnet | Add-AzVirtualNetworkSubnetConfig -Name $subnet2Name -AddressPrefix 10.0.2.0/24
468+
$vnet | Add-AzVirtualNetworkSubnetConfig -Name $subnet3Name -AddressPrefix 10.0.3.0/24
469+
470+
# Set VirtualNetwork
471+
$vnet | Set-AzVirtualNetwork
472+
473+
# Get VirtualNetwork
474+
$vnetExpected = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
475+
476+
Assert-AreEqual 3 $vnetExpected.Subnets.Count
477+
Assert-AreEqual $subnet1Name $vnetExpected.Subnets[0].Name
478+
Assert-AreEqual 1 $vnetExpected.Subnets[0].RouteTable.Count
479+
Assert-AreEqual $subnet2Name $vnetExpected.Subnets[1].Name
480+
Assert-AreEqual 0 $vnetExpected.Subnets[1].RouteTable.Count
481+
Assert-AreEqual $subnet3Name $vnetExpected.Subnets[2].Name
482+
Assert-AreEqual 0 $vnetExpected.Subnets[2].RouteTable.Count
483+
484+
# Associate a route table to a subnet using the RouteTable parameter
485+
Set-AzVirtualNetworkSubnetConfig -Name $subnet2Name -VirtualNetwork $vnet -AddressPrefix 10.0.2.0/24 -RouteTable $routeTable
486+
Set-AzVirtualNetwork -VirtualNetwork $vnet
487+
488+
# Associate a route table to a subnet using the RouteTableId parameter
489+
Set-AzVirtualNetworkSubnetConfig -Name $subnet3Name -VirtualNetwork $vnet -AddressPrefix 10.0.3.0/24 -RouteTableId $routeTable.Id
490+
Set-AzVirtualNetwork -VirtualNetwork $vnet
491+
492+
$vnetExpected = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
493+
Assert-AreEqual 3 $vnetExpected.Subnets.Count
494+
Assert-AreEqual 1 $vnetExpected.Subnets[0].RouteTable.Count
495+
Assert-AreEqual $routeTable.Id $vnetExpected.Subnets[0].RouteTable.Id
496+
Assert-AreEqual 1 $vnetExpected.Subnets[1].RouteTable.Count
497+
Assert-AreEqual $routeTable.Id $vnetExpected.Subnets[1].RouteTable.Id
498+
Assert-AreEqual 1 $vnetExpected.Subnets[2].RouteTable.Count
499+
Assert-AreEqual $routeTable.Id $vnetExpected.Subnets[2].RouteTable.Id
500+
501+
# Get subnets
502+
$subnet1 = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig -Name $subnet1Name
503+
Assert-AreEqual 1 $subnet1.RouteTable.Count
504+
$subnet2 = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig -Name $subnet2Name
505+
Assert-AreEqual 1 $subnet2.RouteTable.Count
506+
$subnet3 = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig -Name $subnet3Name
507+
Assert-AreEqual 1 $subnet3.RouteTable.Count
508+
$subnetAll = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname | Get-AzVirtualNetworkSubnetConfig
509+
510+
Assert-AreEqual 3 $subnetAll.Count
511+
512+
# Disassociate a route table with the RouteTable parameter as $null
513+
Set-AzVirtualNetworkSubnetConfig -Name $subnet1Name -VirtualNetwork $vnet -AddressPrefix 10.0.1.0/24 -RouteTable $null
514+
$vnet = Set-AzVirtualNetwork -VirtualNetwork $vnet
515+
516+
# Disassociate a route table with the RouteTableId parameter as $null
517+
Set-AzVirtualNetworkSubnetConfig -Name $subnet2Name -VirtualNetwork $vnet -AddressPrefix 10.0.2.0/24 -RouteTableId $null
518+
Set-AzVirtualNetwork -VirtualNetwork $vnet
519+
520+
# Disassociate a route table with the RouteTableId parameter as an empty string
521+
Set-AzVirtualNetworkSubnetConfig -Name $subnet3Name -VirtualNetwork $vnet -AddressPrefix 10.0.3.0/24 -RouteTableId ""
522+
Set-AzVirtualNetwork -VirtualNetwork $vnet
523+
524+
$vnetExpected = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname
525+
Assert-AreEqual 3 $vnetExpected.Subnets.Count
526+
Assert-AreEqual 0 $vnetExpected.Subnets[0].RouteTable.Count
527+
Assert-AreEqual 0 $vnetExpected.Subnets[1].RouteTable.Count
528+
Assert-AreEqual 0 $vnetExpected.Subnets[2].RouteTable.Count
529+
}
530+
finally {
531+
# Cleanup
532+
Clean-ResourceGroup $rgname
533+
}
534+
}
535+
336536
<#
337537
.SYNOPSIS
338538
Tests creating new simple virtualNetwork and subnets.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.VirtualNetworkTests/TestVirtualNetworkSubnetNetworkSecurityGroupCRUD.json

Lines changed: 3948 additions & 0 deletions
Large diffs are not rendered by default.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.VirtualNetworkTests/TestVirtualNetworkSubnetRouteTableCRUD.json

Lines changed: 3948 additions & 0 deletions
Large diffs are not rendered by default.

src/Network/Network/ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
* Onboarded Application Gateway to Private Link Common Cmdlets
4646
* Onboarded StorageSync to Private Link Common Cmdlets
4747
* Onboarded SignalR to Private Link Common Cmdlets
48+
* Updated `Set-AzVirtualNetworkSubnetConfig`
49+
- Set NSG and Route Table properties of subnet to null if explicitly set in parameters[#1548][#9718]
4850

4951
## Version 3.1.0
5052
* Added support for AddressPrefixType parameter to `Remove-AzExpressRouteCircuitConnectionConfig`

src/Network/Network/VirtualNetwork/Subnet/SetAzureVirtualNetworkSubnetConfigCommand.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
using System.Collections.Generic;
1818
using System.Linq;
1919
using System.Management.Automation;
20-
using Microsoft.WindowsAzure.Commands.Common.CustomAttributes;
2120

2221
namespace Microsoft.Azure.Commands.Network
2322
{
@@ -54,11 +53,19 @@ public override void Execute()
5453
{
5554
this.NetworkSecurityGroupId = this.NetworkSecurityGroup.Id;
5655
}
56+
else if (this.MyInvocation.BoundParameters.ContainsKey("NetworkSecurityGroup"))
57+
{
58+
this.NetworkSecurityGroupId = null;
59+
}
5760

5861
if (this.RouteTable != null)
5962
{
6063
this.RouteTableId = this.RouteTable.Id;
6164
}
65+
else if (this.MyInvocation.BoundParameters.ContainsKey("RouteTable"))
66+
{
67+
this.RouteTableId = null;
68+
}
6269
}
6370

6471
subnet.AddressPrefix = this.AddressPrefix?.ToList();
@@ -76,12 +83,20 @@ public override void Execute()
7683
subnet.NetworkSecurityGroup = new PSNetworkSecurityGroup();
7784
subnet.NetworkSecurityGroup.Id = this.NetworkSecurityGroupId;
7885
}
86+
else if (this.MyInvocation.BoundParameters.ContainsKey("NetworkSecurityGroup") || this.MyInvocation.BoundParameters.ContainsKey("NetworkSecurityGroupId"))
87+
{
88+
subnet.NetworkSecurityGroup = null;
89+
}
7990

8091
if (!string.IsNullOrEmpty(this.RouteTableId))
8192
{
8293
subnet.RouteTable = new PSRouteTable();
8394
subnet.RouteTable.Id = this.RouteTableId;
8495
}
96+
else if (this.MyInvocation.BoundParameters.ContainsKey("RouteTable") || this.MyInvocation.BoundParameters.ContainsKey("RouteTableId"))
97+
{
98+
subnet.RouteTable = null;
99+
}
85100

86101
if (this.ServiceEndpoint != null)
87102
{

0 commit comments

Comments
 (0)