Skip to content

Commit 0c520be

Browse files
andreycppwyunchi-ms
authored andcommitted
Add 'AdditionalProperty' to AzureFirewall cmdlets (Azure#10354)
* Add 'AdditionalProperty' to AzureFirewall cmdlets * Add ChangeLog * Fix broken Assert-AreEqual for Hashtables * Add test recordings * Address feedback: 1) remove local nuget, 2) move hashtable assert helper to Common.ps1 * Update help for *-AzFirewall cmdlets
1 parent c39c2e4 commit 0c520be

17 files changed

+14484
-8264
lines changed

src/Network/Network.Test/ScenarioTests/AzureFirewallTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,12 @@ public void TestAzureFirewallVirtualHubCRUD()
6666
TestRunner.RunTestScript("Test-AzureFirewallVirtualHubCRUD");
6767
}
6868

69+
[Fact]
70+
[Trait(Category.AcceptanceType, Category.CheckIn)]
71+
[Trait(Category.Owner, NrpTeamAlias.azurefirewall)]
72+
public void TestAzureFirewallAdditionalPropertyCRUD()
73+
{
74+
TestRunner.RunTestScript("Test-AzureFirewallAdditionalPropertyCRUD");
75+
}
6976
}
7077
}

src/Network/Network.Test/ScenarioTests/AzureFirewallTests.ps1

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ function Test-AzureFirewallAllocateAndDeallocate {
10281028

10291029
<#
10301030
.SYNOPSIS
1031-
Tests AzureFirewall Set and Remove IpConfiguration
1031+
Tests AzureFirewall VirtualHub integration
10321032
#>
10331033
function Test-AzureFirewallVirtualHubCRUD {
10341034
# Setup
@@ -1078,3 +1078,50 @@ function Test-AzureFirewallVirtualHubCRUD {
10781078
Clean-ResourceGroup $rgname
10791079
}
10801080
}
1081+
1082+
<#
1083+
.SYNOPSIS
1084+
Tests AzureFirewall AdditionalProperty
1085+
#>
1086+
function Test-AzureFirewallAdditionalPropertyCRUD {
1087+
$rgname = Get-ResourceGroupName
1088+
$azureFirewallName = Get-ResourceName
1089+
$resourceTypeParent = "Microsoft.Network/AzureFirewalls"
1090+
$location = Get-ProviderLocation $resourceTypeParent "eastus2euap"
1091+
1092+
$vnetName = Get-ResourceName
1093+
$subnetName = "AzureFirewallSubnet"
1094+
$publicIpName = Get-ResourceName
1095+
1096+
$threatIntelProp1 = @{"ThreatIntel.Whitelist.FQDNs" = "*.microsoft.com, microsoft.com"; "ThreatIntel.Whitelist.IpAddresses" = "8.8.8.8, 1.1.1.1"}
1097+
$threatIntelProp2 = @{"ThreatIntel.Whitelist.IpAddresses" = " 2.2.2.2 , 3.3.3.3 "; "ThreatIntel.Whitelist.FQDNs" = " bing.com , yammer.com "}
1098+
1099+
try {
1100+
# Create the resource group
1101+
$resourceGroup = New-AzResourceGroup -Name $rgname -Location $location
1102+
1103+
# Create the Virtual Network
1104+
$subnet = New-AzVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix 10.0.0.0/24
1105+
$vnet = New-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgname -Location $location -AddressPrefix 10.0.0.0/16 -Subnet $subnet
1106+
1107+
# Create public ip
1108+
$publicip = New-AzPublicIpAddress -ResourceGroupName $rgname -name $publicIpName -location $location -AllocationMethod Static -Sku Standard
1109+
1110+
# Create AzureFirewall
1111+
$azureFirewall = New-AzFirewall -Name $azureFirewallName -ResourceGroupName $rgname -Location $location -AdditionalProperty $threatIntelProp1
1112+
1113+
# Verify
1114+
$getAzureFirewall = Get-AzFirewall -Name $azureFirewallName -ResourceGroupName $rgname
1115+
Assert-AreEqualHashtables $threatIntelProp1 $getAzureFirewall.AdditionalProperty
1116+
1117+
# Modify
1118+
$azureFirewall.AdditionalProperty = $threatIntelProp2
1119+
Set-AzFirewall -AzureFirewall $azureFirewall
1120+
$getAzureFirewall = Get-AzFirewall -Name $azureFirewallName -ResourceGroupName $rgname
1121+
Assert-AreEqualHashtables $threatIntelProp2 $getAzureFirewall.AdditionalProperty
1122+
}
1123+
finally {
1124+
# Cleanup
1125+
Clean-ResourceGroup $rgname
1126+
}
1127+
}

src/Network/Network.Test/ScenarioTests/Common.ps1

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,21 @@ function Start-TestSleep($milliseconds)
102102
Start-Sleep -Milliseconds $milliseconds
103103
}
104104
}
105+
106+
<#
107+
.SYNOPSIS
108+
Assert-AreEqual for Hashtables.
109+
#>
110+
function Assert-AreEqualHashtables {
111+
param (
112+
[Parameter(Mandatory = $true)] [Hashtable]$left,
113+
[Parameter(Mandatory = $true)] [Hashtable]$right
114+
)
115+
116+
Assert-True { $left.Keys.Count -eq $right.Keys.Count } "Different Key counts: $($left.Keys.Count) vs $($right.Keys.Count)"
117+
118+
$left.Keys | % {
119+
Assert-True { $right.ContainsKey($_) } "Keys mismatch: '$_' vs None"
120+
Assert-True { $left[$_] -eq $right[$_] } "Values mismatch for Key '$_': '$($left[$_])' vs '$($right[$_])'"
121+
}
122+
}

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.AzureFirewallTests/TestAzureFirewallAdditionalPropertyCRUD.json

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

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.AzureFirewallTests/TestAzureFirewallAllocateAndDeallocate.json

Lines changed: 2105 additions & 2098 deletions
Large diffs are not rendered by default.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.AzureFirewallTests/TestAzureFirewallCRUD.json

Lines changed: 2049 additions & 1982 deletions
Large diffs are not rendered by default.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.AzureFirewallTests/TestAzureFirewallPIPAndVNETObjectTypeParams.json

Lines changed: 7814 additions & 4159 deletions
Large diffs are not rendered by default.

src/Network/Network/AzureFirewall/AzureFirewallBaseCmdlet.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
// ----------------------------------------------------------------------------------
1515

1616
using System.Net;
17+
using System.Collections;
18+
using System.Linq;
1719
using Microsoft.Azure.Commands.Network.Models;
1820
using Microsoft.Azure.Commands.ResourceManager.Common.Tags;
1921
using Microsoft.Azure.Management.Network;
@@ -88,20 +90,19 @@ public PSAzureFirewall GetAzureFirewall(string resourceGroupName, string name)
8890
{
8991
var azureFirewall = this.AzureFirewallClient.Get(resourceGroupName, name);
9092

91-
var psAzureFirewall = NetworkResourceManagerProfile.Mapper.Map<PSAzureFirewall>(azureFirewall);
93+
var psAzureFirewall = ToPsAzureFirewall(azureFirewall);
9294
psAzureFirewall.ResourceGroupName = resourceGroupName;
93-
psAzureFirewall.Tag = TagsConversionHelper.CreateTagHashtable(azureFirewall.Tags);
9495

9596
return psAzureFirewall;
9697
}
9798

98-
public PSAzureFirewall ToPsAzureFirewall(AzureFirewall firewall)
99+
public PSAzureFirewall ToPsAzureFirewall(AzureFirewall azureFirewall)
99100
{
100-
var azureFirewall = NetworkResourceManagerProfile.Mapper.Map<PSAzureFirewall>(firewall);
101-
102-
azureFirewall.Tag = TagsConversionHelper.CreateTagHashtable(firewall.Tags);
101+
var psAzureFirewall = NetworkResourceManagerProfile.Mapper.Map<PSAzureFirewall>(azureFirewall);
102+
psAzureFirewall.Tag = TagsConversionHelper.CreateTagHashtable(azureFirewall.Tags);
103+
psAzureFirewall.AdditionalProperty = TagsConversionHelper.CreateTagHashtable(azureFirewall.AdditionalProperties);
103104

104-
return azureFirewall;
105+
return psAzureFirewall;
105106
}
106107
}
107108
}

src/Network/Network/AzureFirewall/GetAzureFirewallCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ public override void ExecuteCmdlet()
6060
: this.AzureFirewallClient.List(this.ResourceGroupName);
6161

6262
// Get all resources by polling on next page link
63-
var azureFirewallResponseLIst = ListNextLink<AzureFirewall>.GetAllResourcesByPollingNextLink(azureFirewallPage, this.AzureFirewallClient.ListNext);
63+
var azureFirewallResponseList = ListNextLink<AzureFirewall>.GetAllResourcesByPollingNextLink(azureFirewallPage, this.AzureFirewallClient.ListNext);
6464

65-
var psAzureFirewalls = azureFirewallResponseLIst.Select(firewall =>
65+
var psAzureFirewalls = azureFirewallResponseList.Select(firewall =>
6666
{
6767
var psAzureFirewall = this.ToPsAzureFirewall(firewall);
6868
psAzureFirewall.ResourceGroupName = NetworkBaseCmdlet.GetResourceGroup(firewall.Id);

src/Network/Network/AzureFirewall/NewAzureFirewallCommand.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ public class NewAzureFirewallCommand : AzureFirewallBaseCmdlet
135135
IgnoreCase = false)]
136136
public string ThreatIntelMode { get; set; }
137137

138+
[Parameter(
139+
Mandatory = false,
140+
ValueFromPipelineByPropertyName = true,
141+
HelpMessage = "Additional properties for Azure Firewall.")]
142+
public Hashtable AdditionalProperty { get; set; }
143+
138144
[Parameter(
139145
Mandatory = false,
140146
ValueFromPipelineByPropertyName = true,
@@ -273,6 +279,7 @@ private PSAzureFirewall CreateAzureFirewall()
273279
// Map to the sdk object
274280
var azureFirewallModel = NetworkResourceManagerProfile.Mapper.Map<MNM.AzureFirewall>(firewall);
275281
azureFirewallModel.Tags = TagsConversionHelper.CreateTagDictionary(this.Tag, validate: true);
282+
azureFirewallModel.AdditionalProperties = TagsConversionHelper.CreateTagDictionary(this.AdditionalProperty, validate: true);
276283

277284
// Execute the Create AzureFirewall call
278285
this.AzureFirewallClient.CreateOrUpdate(this.ResourceGroupName, this.Name, azureFirewallModel);

src/Network/Network/AzureFirewall/SetAzureFirewallCommand.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ public override void Execute()
4343
}
4444

4545
// Map to the sdk object
46-
var secureGwModel = NetworkResourceManagerProfile.Mapper.Map<MNM.AzureFirewall>(this.AzureFirewall);
47-
secureGwModel.Tags = TagsConversionHelper.CreateTagDictionary(this.AzureFirewall.Tag, validate: true);
46+
var azureFirewallModel = NetworkResourceManagerProfile.Mapper.Map<MNM.AzureFirewall>(this.AzureFirewall);
47+
azureFirewallModel.Tags = TagsConversionHelper.CreateTagDictionary(this.AzureFirewall.Tag, validate: true);
48+
azureFirewallModel.AdditionalProperties = TagsConversionHelper.CreateTagDictionary(this.AzureFirewall.AdditionalProperty, validate: true);
4849

4950
// Execute the PUT AzureFirewall call
50-
this.AzureFirewallClient.CreateOrUpdate(this.AzureFirewall.ResourceGroupName, this.AzureFirewall.Name, secureGwModel);
51+
this.AzureFirewallClient.CreateOrUpdate(this.AzureFirewall.ResourceGroupName, this.AzureFirewall.Name, azureFirewallModel);
5152

5253
var getAzureFirewall = this.GetAzureFirewall(this.AzureFirewall.ResourceGroupName, this.AzureFirewall.Name);
5354
WriteObject(getAzureFirewall);

src/Network/Network/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
- Introduce new Generations for VirtualNetworkGateways.
3737
- Introduce new high throughput SKUs for VirtualNetworkGateways.
3838
* New cmdlets to support the azure firewall policy
39+
* Add 'AdditionalProperty' to AzureFirewall cmdlets
3940
* Add support for child resource RouteTables of VirtualHub
4041
- New cmdlets added:
4142
- Add-AzVirtualHubRoute

src/Network/Network/Models/AzureFirewall/PSAzureFirewall.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//
1515

1616
using System;
17+
using System.Collections;
1718
using System.Collections.Generic;
1819
using System.Linq;
1920
using Newtonsoft.Json;
@@ -42,10 +43,18 @@ public class PSAzureFirewall : PSTopLevelResource
4243

4344
public string ThreatIntelMode { get; set; }
4445

46+
public Hashtable AdditionalProperty { get; set; }
47+
4548
public string ProvisioningState { get; set; }
4649

4750
public List<string> Zones { get; set; }
4851

52+
[JsonIgnore]
53+
public string AdditionalPropertyText
54+
{
55+
get { return JsonConvert.SerializeObject(AdditionalProperty, Formatting.Indented); }
56+
}
57+
4958
[JsonIgnore]
5059
public string IpConfigurationsText
5160
{

src/Network/Network/Network.format.ps1xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3294,6 +3294,10 @@
32943294
<Label>ThreatIntelMode</Label>
32953295
<PropertyName>ThreatIntelMode</PropertyName>
32963296
</ListItem>
3297+
<ListItem>
3298+
<Label>AdditionalProperty</Label>
3299+
<PropertyName>AdditionalPropertyText</PropertyName>
3300+
</ListItem>
32973301
<ListItem>
32983302
<Label>Sku</Label>
32993303
<PropertyName>Sku</PropertyName>

src/Network/Network/help/Get-AzFirewall.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ Required: False
300300
Position: Named
301301
Default value: None
302302
Accept pipeline input: True (ByPropertyName)
303-
Accept wildcard characters: True
303+
Accept wildcard characters: False
304304
```
305305
306306
### -ResourceGroupName
@@ -315,7 +315,7 @@ Required: False
315315
Position: Named
316316
Default value: None
317317
Accept pipeline input: True (ByPropertyName)
318-
Accept wildcard characters: True
318+
Accept wildcard characters: False
319319
```
320320
321321
### CommonParameters

src/Network/Network/help/New-AzFirewall.md

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ New-AzFirewall -Name <String> -ResourceGroupName <String> -Location <String>
1919
[-ApplicationRuleCollection <PSAzureFirewallApplicationRuleCollection[]>]
2020
[-NatRuleCollection <PSAzureFirewallNatRuleCollection[]>]
2121
[-NetworkRuleCollection <PSAzureFirewallNetworkRuleCollection[]>] [-ThreatIntelMode <String>]
22-
[-Tag <Hashtable>] [-Force] [-AsJob] [-Zone <String[]>] [-Sku <String>] [-VirtualHubId <String>]
23-
[-FirewallPolicyId <String>] [-DefaultProfile <IAzureContextContainer>] [-WhatIf] [-Confirm]
24-
[<CommonParameters>]
22+
[-AdditionalProperty <Hashtable>] [-Tag <Hashtable>] [-Force] [-AsJob] [-Zone <String[]>] [-Sku <String>]
23+
[-VirtualHubId <String>] [-FirewallPolicyId <String>] [-DefaultProfile <IAzureContextContainer>] [-WhatIf]
24+
[-Confirm] [<CommonParameters>]
2525
```
2626

2727
### OldIpConfigurationParameterValues
@@ -30,9 +30,9 @@ New-AzFirewall -Name <String> -ResourceGroupName <String> -Location <String> -Vi
3030
-PublicIpName <String> [-ApplicationRuleCollection <PSAzureFirewallApplicationRuleCollection[]>]
3131
[-NatRuleCollection <PSAzureFirewallNatRuleCollection[]>]
3232
[-NetworkRuleCollection <PSAzureFirewallNetworkRuleCollection[]>] [-ThreatIntelMode <String>]
33-
[-Tag <Hashtable>] [-Force] [-AsJob] [-Zone <String[]>] [-Sku <String>] [-VirtualHubId <String>]
34-
[-FirewallPolicyId <String>] [-DefaultProfile <IAzureContextContainer>] [-WhatIf] [-Confirm]
35-
[<CommonParameters>]
33+
[-AdditionalProperty <Hashtable>] [-Tag <Hashtable>] [-Force] [-AsJob] [-Zone <String[]>] [-Sku <String>]
34+
[-VirtualHubId <String>] [-FirewallPolicyId <String>] [-DefaultProfile <IAzureContextContainer>] [-WhatIf]
35+
[-Confirm] [<CommonParameters>]
3636
```
3737

3838
### IpConfigurationParameterValues
@@ -42,9 +42,9 @@ New-AzFirewall -Name <String> -ResourceGroupName <String> -Location <String> -Vi
4242
[-ApplicationRuleCollection <PSAzureFirewallApplicationRuleCollection[]>]
4343
[-NatRuleCollection <PSAzureFirewallNatRuleCollection[]>]
4444
[-NetworkRuleCollection <PSAzureFirewallNetworkRuleCollection[]>] [-ThreatIntelMode <String>]
45-
[-Tag <Hashtable>] [-Force] [-AsJob] [-Zone <String[]>] [-Sku <String>] [-VirtualHubId <String>]
46-
[-FirewallPolicyId <String>] [-DefaultProfile <IAzureContextContainer>] [-WhatIf] [-Confirm]
47-
[<CommonParameters>]
45+
[-AdditionalProperty <Hashtable>] [-Tag <Hashtable>] [-Force] [-AsJob] [-Zone <String[]>] [-Sku <String>]
46+
[-VirtualHubId <String>] [-FirewallPolicyId <String>] [-DefaultProfile <IAzureContextContainer>] [-WhatIf]
47+
[-Confirm] [<CommonParameters>]
4848
```
4949

5050
## DESCRIPTION
@@ -162,6 +162,21 @@ This example creates a Firewall attached to virtual hub "vHub". A firewall polic
162162

163163
## PARAMETERS
164164

165+
### -AdditionalProperty
166+
Additional properties for Azure Firewall.
167+
168+
```yaml
169+
Type: System.Collections.Hashtable
170+
Parameter Sets: (All)
171+
Aliases:
172+
173+
Required: False
174+
Position: Named
175+
Default value: None
176+
Accept pipeline input: True (ByPropertyName)
177+
Accept wildcard characters: False
178+
```
179+
165180
### -ApplicationRuleCollection
166181
Specifies the collections of application rules for the new Firewall.
167182

src/Network/Network/help/Set-AzFirewall.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ Accept wildcard characters: False
180180
```
181181
182182
### CommonParameters
183-
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).
183+
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
184184
185185
## INPUTS
186186

0 commit comments

Comments
 (0)