Skip to content

Commit f566801

Browse files
authored
[SignalR] Add cmdlets to managing replicas and IP rules (#28684)
1 parent e096e53 commit f566801

File tree

46 files changed

+8146
-237
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+8146
-237
lines changed

src/SignalR/SignalR.Test/ScenarioTests/AzureRmSignalRTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,17 @@ public void TestAzureRmSignalRUpdate() =>
5252
[Trait(Category.AcceptanceType, Category.CheckIn)]
5353
public void TestAzureRmSignalRCustomCertificateAndCustomDomain() =>
5454
TestRunner.RunTestScript("Test-AzureRmSignalRCustomCertificateAndCustomDomain");
55+
56+
[Fact]
57+
[Trait(Category.AcceptanceType, Category.CheckIn)]
58+
public void TestAzSignalRReplica() =>
59+
TestRunner.RunTestScript("Test-AzSignalRReplica");
60+
61+
[Fact]
62+
[Trait(Category.AcceptanceType, Category.CheckIn)]
63+
public void TestAzSignalRNetworkIpRule()
64+
{
65+
TestRunner.RunTestScript("Test-AzSignalRNetworkIpRule");
66+
}
5567
}
5668
}

src/SignalR/SignalR.Test/ScenarioTests/AzureRmSignalRTests.ps1

Lines changed: 176 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -498,43 +498,43 @@ function Test-AzureRmSignalRCustomCertificateAndCustomDomain
498498

499499
# ===== Remove domain =====
500500
# Remove domain via resource group parameter set
501-
$result = Remove-AzSignalRCustomDomain -ResourceGroupName $resourceGroupName -SignalRName $signalrName -Name "domain1"
501+
$result = Remove-AzSignalRCustomDomain -ResourceGroupName $resourceGroupName -SignalRName $signalrName -Name "domain1" -PassThru
502502
Assert-True { $result }
503503

504504
# Remove domain via SignalR object parameter set
505-
$result = $signalr | Remove-AzSignalRCustomDomain -Name "domain2"
505+
$result = $signalr | Remove-AzSignalRCustomDomain -Name "domain2" -PassThru
506506
Assert-True { $result }
507507

508508
# Remove domain via input object parameter set
509509
$domain3 = $signalr | New-AzSignalRCustomDomain -Name "domain3" -DomainName $customDomainName -CustomCertificateId $cert1.Id
510-
$result = $domain3 | Remove-AzSignalRCustomDomain
510+
$result = $domain3 | Remove-AzSignalRCustomDomain -PassThru
511511
Assert-True { $result }
512512

513513
# Remove domain via Resource ID parameter set
514514
$domain4 = $signalr | New-AzSignalRCustomDomain -Name "domain4" -DomainName $customDomainName -CustomCertificateId $cert1.Id
515515
$domain4Resource = [pscustomobject]@{ResourceId = $domain4.Id }
516-
$result = $domain4Resource | Remove-AzSignalRCustomDomain
516+
$result = $domain4Resource | Remove-AzSignalRCustomDomain -PassThru
517517
Assert-True { $result }
518518

519519
# ====== Remove cert =====
520520

521521
# Remove the certificate via resource group parameter set
522-
$result = Remove-AzSignalRCustomCertificate -ResourceGroupName $resourceGroupName -SignalRName $signalrName -Name "cert1"
522+
$result = Remove-AzSignalRCustomCertificate -ResourceGroupName $resourceGroupName -SignalRName $signalrName -Name "cert1" -PassThru
523523
Assert-True { $result }
524524

525525
# Remove the certificate via SignalR object parameter set
526-
$result = $signalr | Remove-AzSignalRCustomCertificate -Name "cert2"
526+
$result = $signalr | Remove-AzSignalRCustomCertificate -Name "cert2" -PassThru
527527
Assert-True { $result }
528528

529529
# Remove the certificate via input Object parameter set
530530
$cert2 = $signalr | New-AzSignalRCustomCertificate -Name "cert2" -KeyVaultBaseUri $keyVaultBaseUri -KeyVaultSecretName $keyVaultSecretName
531-
$result = $cert2 | Remove-AzSignalRCustomCertificate
531+
$result = $cert2 | Remove-AzSignalRCustomCertificate -PassThru
532532
Assert-True { $result }
533533

534534
# Remove the certificate via Resource ID parameter set
535535
$cert2 = $signalr | New-AzSignalRCustomCertificate -Name "cert2" -KeyVaultBaseUri $keyVaultBaseUri -KeyVaultSecretName $keyVaultSecretName
536536
$certResource3 = [pscustomobject]@{ResourceId = $cert2.Id }
537-
$result = $certResource3 | Remove-AzSignalRCustomCertificate
537+
$result = $certResource3 | Remove-AzSignalRCustomCertificate -PassThru
538538
Assert-True { $result }
539539

540540
} finally
@@ -544,6 +544,136 @@ function Test-AzureRmSignalRCustomCertificateAndCustomDomain
544544
}
545545
}
546546

547+
<#
548+
.SYNOPSIS
549+
Test replica cmdlets for SignalR.
550+
#>
551+
function Test-AzSignalRReplica
552+
{
553+
$location = Get-ProviderLocation "Microsoft.SignalRService/SignalR"
554+
$nameSuffix = "replica-test"
555+
$resourceGroupName = "powershellsignalrreplicatest"
556+
$signalrName = "powershellsignalrreplicatest1"
557+
$replicaName1 = "replica1-11111"
558+
$replicaName2 = "replica2-22222"
559+
560+
try
561+
{
562+
# Setup - Create resource group and SignalR service (Premium required for replicas)
563+
# New-AzResourceGroup -Name $resourceGroupName -Location $location # Don't create resource group in the test, otherwise it would be cleaned up by "ResourceCleanerDelegatingHandler" in Azure PowerShell test framwork. Setup the resource group in advance.
564+
$signalr = New-AzSignalR -ResourceGroupName $resourceGroupName -Name $signalrName -Sku "Premium_P1" -Location $location
565+
566+
# Test Create replica using SignalR object parameter set
567+
$replica1 = $signalr | New-AzSignalRReplica -Name $replicaName1 -Location "West US 2" -UnitCount 2
568+
Assert-NotNull $replica1
569+
Assert-AreEqual $replicaName1 $replica1.Name
570+
Assert-LocationEqual "West US 2" $replica1.Location
571+
Assert-AreEqual 2 $replica1.Sku.Capacity
572+
573+
# Replica may be in "updating" internally, wait until update finishes.
574+
if( $env:AZURE_TEST_MODE -eq "Record")
575+
{
576+
Start-Sleep -Seconds 120
577+
}
578+
579+
$replica2 = $signalr | New-AzSignalRReplica -Name $replicaName2 -Location "East US 2"
580+
Assert-NotNull $replica2
581+
Assert-AreEqual $replicaName2 $replica2.Name
582+
Assert-AreEqual 1 $replica2.Sku.Capacity
583+
584+
# Test Get replica using SignalR object parameter set
585+
$retrievedReplica = $signalr | Get-AzSignalRReplica -Name $replicaName1
586+
Assert-NotNull $retrievedReplica
587+
Assert-AreEqual $replicaName1 $retrievedReplica.Name
588+
589+
# Test List all replicas using SignalR object parameter set
590+
$replicas = $signalr | Get-AzSignalRReplica
591+
Assert-NotNull $replicas
592+
Assert-AreEqual 2 $replicas.Count
593+
594+
# Replica may be in "updating" internally, wait until update finishes.
595+
if( $env:AZURE_TEST_MODE -eq "Record")
596+
{
597+
Start-Sleep -Seconds 120
598+
}
599+
600+
# Test Update replica using InputObject parameter set
601+
$updatedReplica = $replica1 | Update-AzSignalRReplica -RegionEndpointEnabled "Disabled"
602+
Assert-AreEqual "Disabled" $updatedReplica.RegionEndpointEnabled
603+
604+
# Replica may be in "updating" internally, wait until update finishes.
605+
if( $env:AZURE_TEST_MODE -eq "Record")
606+
{
607+
Start-Sleep -Seconds 120
608+
}
609+
610+
# Test Stop replica using InputObject parameter set
611+
$result = $replica1 | Stop-AzSignalRReplica -PassThru
612+
Assert-True { $result }
613+
614+
# Replica may be in "updating" internally, wait until update finishes.
615+
if( $env:AZURE_TEST_MODE -eq "Record")
616+
{
617+
Start-Sleep -Seconds 120
618+
}
619+
620+
# Test Start replica using InputObject parameter set
621+
$stoppedReplica = Get-AzSignalRReplica -ResourceGroupName $resourceGroupName -SignalRName $signalrName -Name $replicaName1
622+
$result = $stoppedReplica | Start-AzSignalRReplica -PassThru
623+
Assert-True { $result }
624+
625+
# Replica may be in "updating" internally, wait until update finishes.
626+
if( $env:AZURE_TEST_MODE -eq "Record")
627+
{
628+
Start-Sleep -Seconds 120
629+
}
630+
631+
# Test Restart replica using InputObject parameter set
632+
$result = $replica2 | Restart-AzSignalRReplica -PassThru
633+
Assert-True { $result }
634+
635+
# Replica may be in "updating" internally, wait until update finishes.
636+
if( $env:AZURE_TEST_MODE -eq "Record")
637+
{
638+
Start-Sleep -Seconds 120
639+
}
640+
641+
# Test Remove replica using InputObject parameter set
642+
$result = $replica1 | Remove-AzSignalRReplica -PassThru
643+
Assert-True { $result }
644+
645+
# Replica may be in "updating" internally, wait until update finishes.
646+
if( $env:AZURE_TEST_MODE -eq "Record")
647+
{
648+
Start-Sleep -Seconds 120
649+
}
650+
651+
# Test Remove replica using SignalR object parameter set
652+
$result = $signalr | Remove-AzSignalRReplica -Name $replicaName2 -PassThru
653+
Assert-True { $result }
654+
655+
# Replica may be in "updating" internally, wait until update finishes.
656+
if( $env:AZURE_TEST_MODE -eq "Record")
657+
{
658+
Start-Sleep -Seconds 120
659+
}
660+
661+
# Verify replicas are removed
662+
$replicas = Get-AzSignalRReplica -ResourceGroupName $resourceGroupName -SignalRName $signalrName
663+
Assert-AreEqual 0 $replicas.Count
664+
665+
} finally
666+
{
667+
# Cleanup - Remove any remaining resources
668+
try {
669+
# Get-AzSignalRReplica -ResourceGroupName $resourceGroupName -SignalRName $signalrName | Remove-AzSignalRReplica
670+
} catch {
671+
# Ignore cleanup errors
672+
}
673+
# Remove-AzResourceGroup -Name $resourceGroupName -Force
674+
}
675+
}
676+
547677
function New-Environment
548678
{
549679
param (
@@ -626,4 +756,42 @@ function Remove-Environment
626756
[string] $resourceGroupName
627757
)
628758
Remove-AzResourceGroup -Name $resourceGroupName
759+
}
760+
761+
<#!
762+
.SYNOPSIS
763+
Test IP rule cmdlets for SignalR (New/Add/Remove-AzSignalRNetworkIpRule).
764+
#>
765+
function Test-AzSignalRNetworkIpRule
766+
{
767+
$location = Get-ProviderLocation "Microsoft.SignalRService/SignalR"
768+
$nameSuffix = "iprule-test"
769+
$resourceGroupName = Get-RandomResourceGroupName $nameSuffix
770+
$signalrName = Get-RandomSignalRName $nameSuffix
771+
772+
New-AzResourceGroup -Name $resourceGroupName -Location $location
773+
$signalr = New-AzSignalR -ResourceGroupName $resourceGroupName -Name $signalrName -Sku "Premium_P1"
774+
775+
# Create IP rule objects
776+
$rule1 = New-AzSignalRNetworkIpRuleObject -Value "10.1.0.0/16" -Action Allow
777+
$rule2 = New-AzSignalRNetworkIpRuleObject -Value "20.2.2.2" -Action Deny
778+
779+
# a. Add via resource group parameter set
780+
$acls = Add-AzSignalRNetworkIpRule -ResourceGroupName $resourceGroupName -Name $signalrName -IpRule $rule1, $rule2
781+
Assert-NotNull $acls
782+
Assert-AreEqual 4 $acls.IPRules.Count
783+
Assert-True { $acls.IPRules | Where-Object { $_.Value -eq "10.1.0.0/16" -and $_.Action -eq "Allow" } }
784+
Assert-True { $acls.IPRules | Where-Object { $_.Value -eq "20.2.2.2" -and $_.Action -eq "Deny" } }
785+
786+
# Remove one via resource group parameter set
787+
$acls = Remove-AzSignalRNetworkIpRule -ResourceGroupName $resourceGroupName -Name $signalrName -IpRule $rule1
788+
Assert-AreEqual 3 $acls.IPRules.Count
789+
Assert-False { $acls.IPRules | Where-Object { $_.Value -eq "10.1.0.0/16" } }
790+
791+
# Remove one via resource ID parameter set
792+
$signalr = Get-AzSignalR -ResourceGroupName $resourceGroupName -Name $signalrName
793+
$acls = Remove-AzSignalRNetworkIpRule -ResourceId $signalr.Id -IpRule $rule2
794+
Assert-AreEqual 2 $acls.IPRules.Count
795+
Assert-False { $acls.IPRules | Where-Object { $_.Value -eq "20.2.2.2" } }
796+
629797
}

src/SignalR/SignalR.Test/ScenarioTests/Common.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,4 @@ function Get-ProviderLocation([string]$provider)
7373
}
7474

7575
return "East US"
76-
}
76+
}

src/SignalR/SignalR.Test/SessionRecords/Microsoft.Azure.Commands.SignalR.Test.ScenarioTests.AzureRmSignalRTests/TestAzSignalRNetworkIpRule.json

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

src/SignalR/SignalR.Test/SessionRecords/Microsoft.Azure.Commands.SignalR.Test.ScenarioTests.AzureRmSignalRTests/TestAzSignalRReplica.json

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

src/SignalR/SignalR/Az.SignalR.psd1

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ CmdletsToExport = 'Get-AzSignalR', 'Get-AzSignalRKey', 'Get-AzSignalRUsage',
9292
'New-AzSignalR', 'New-AzSignalRKey', 'Remove-AzSignalR',
9393
'Restart-AzSignalR', 'Set-AzSignalRUpstream', 'Test-AzSignalRName',
9494
'Update-AzSignalR', 'Update-AzSignalRNetworkAcl',
95-
'New-AzSignalRCustomDomain', 'Get-AzSignalRCustomDomain',
96-
'Remove-AzSignalRCustomDomain', 'Update-AzSignalRCustomDomain',
97-
'New-AzSignalRCustomCertificate', 'Get-AzSignalRCustomCertificate',
98-
'Remove-AzSignalRCustomCertificate'
95+
'New-AzSignalRCustomDomain', 'Get-AzSignalRCustomDomain', 'Remove-AzSignalRCustomDomain', 'Update-AzSignalRCustomDomain',
96+
'New-AzSignalRCustomCertificate', 'Get-AzSignalRCustomCertificate', 'Remove-AzSignalRCustomCertificate',
97+
'Get-AzSignalRReplica', 'New-AzSignalRReplica', 'Remove-AzSignalRReplica', 'Restart-AzSignalRReplica', 'Start-AzSignalRReplica', 'Stop-AzSignalRReplica', 'Update-AzSignalRReplica',
98+
'New-AzSignalRNetworkIpRuleObject', 'Remove-AzSignalRNetworkIpRule', 'Add-AzSignalRNetworkIpRule'
9999

100100
# Variables to export from this module
101101
# VariablesToExport = @()

src/SignalR/SignalR/ChangeLog.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Added cmdlets for managing replicas:
22+
- Get-AzSignalRReplica: get replica(s) for SignalR
23+
- New-AzSignalRReplica: create a new replica for SignalR
24+
- Remove-AzSignalRReplica: remove a replica from SignalR
25+
- Restart-AzSignalRReplica: restart a SignalR replica
26+
- Start-AzSignalRReplica: start a SignalR replica
27+
- Stop-AzSignalRReplica: stop a SignalR replica
28+
- Update-AzSignalRReplica: update a SignalR replica
29+
* Added cmdlets for managing network IP rules
30+
- New-AzSignalRNetworkIpRuleObject: create a new network IP rule object for SignalR
31+
- Add-AzSignalRNetworkIpRule: add network IP rule(s) to SignalR
32+
- Remove-AzSignalRNetworkIpRule: remove network IP rule(s) from SignalR
2133

2234
## Version 2.2.0
2335
* Added cmdlets for managing custom domains: `New-AzSignalRCustomDomain`, `Get-AzSignalRCustomDomain`, `Remove-AzSignalRCustomDomain`, `Update-AzSignalRCustomDomain`
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
using System;
16+
using System.Collections.Generic;
17+
using System.Management.Automation;
18+
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
19+
using Microsoft.Azure.Commands.SignalR.Models;
20+
using Microsoft.Azure.Commands.SignalR.Properties;
21+
using Microsoft.Azure.Management.SignalR;
22+
23+
namespace Microsoft.Azure.Commands.SignalR.Cmdlets
24+
{
25+
[Cmdlet("Add", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "SignalRNetworkIpRule", SupportsShouldProcess = true, DefaultParameterSetName = ResourceGroupParameterSet)]
26+
[OutputType(typeof(PSSignalRNetworkAcls))]
27+
public class AddAzureRmSignalRNetworkIpRule : SignalRCmdletBase, IWithResourceId, IWithSignalRInputObject
28+
{
29+
[Parameter(Mandatory = false, ParameterSetName = ResourceGroupParameterSet, HelpMessage = "The resource group name. The default one will be used if not specified.")]
30+
[ResourceGroupCompleter]
31+
[ValidateNotNullOrEmpty]
32+
public override string ResourceGroupName { get; set; }
33+
34+
[Parameter(Mandatory = true, Position = 0, ParameterSetName = ResourceGroupParameterSet, HelpMessage = "The SignalR service name.")]
35+
[ValidateNotNullOrEmpty]
36+
[ResourceNameCompleter(Constants.SignalRResourceType, nameof(ResourceGroupName))]
37+
public string Name { get; set; }
38+
39+
[Parameter(Mandatory = true, ParameterSetName = ResourceIdParameterSet, ValueFromPipelineByPropertyName = true, HelpMessage = "The SignalR service resource ID.")]
40+
[ValidateNotNullOrEmpty]
41+
public string ResourceId { get; set; }
42+
43+
[Parameter(Mandatory = true, ParameterSetName = InputObjectParameterSet, ValueFromPipeline = true, HelpMessage = "The SignalR resource object.")]
44+
[ValidateNotNull]
45+
public PSSignalRResource InputObject { get; set; }
46+
47+
[Parameter(Mandatory = true, ParameterSetName = ResourceIdParameterSet, ValueFromPipeline = true, HelpMessage = "IP rule object(s) created by New-AzSignalRNetworkIpRule.")]
48+
[Parameter(Mandatory = true, ParameterSetName = ResourceGroupParameterSet, ValueFromPipeline = true, HelpMessage = "IP rule object(s) created by New-AzSignalRNetworkIpRule.")]
49+
[Parameter(Mandatory = true, ParameterSetName = InputObjectParameterSet, ValueFromPipeline = true, HelpMessage = "IP rule object(s) created by New-AzSignalRNetworkIpRule.")]
50+
[ValidateNotNull]
51+
public PSIpRule[] IpRule { get; set; }
52+
53+
public override void ExecuteCmdlet()
54+
{
55+
base.ExecuteCmdlet();
56+
57+
RunCmdlet(() =>
58+
{
59+
switch (ParameterSetName)
60+
{
61+
case ResourceGroupParameterSet:
62+
ResolveResourceGroupName();
63+
break;
64+
case ResourceIdParameterSet:
65+
this.LoadFromResourceId();
66+
break;
67+
case InputObjectParameterSet:
68+
this.LoadFromSignalRInputObject();
69+
break;
70+
default:
71+
throw new ArgumentException(Resources.ParameterSetError);
72+
}
73+
if (ShouldProcess($"SignalR service {ResourceGroupName}/{Name}", "add network IP rule(s)"))
74+
{
75+
var signalr = Client.SignalR.Get(ResourceGroupName, Name);
76+
var networkACLs = signalr.NetworkAcLs;
77+
if (networkACLs.IPRules == null)
78+
{
79+
networkACLs.IPRules = new List<Microsoft.Azure.Management.SignalR.Models.IPRule>();
80+
}
81+
foreach (var rule in IpRule)
82+
{
83+
networkACLs.IPRules.Add(rule.ToSdkModel());
84+
}
85+
signalr = Client.SignalR.Update(ResourceGroupName, Name, signalr);
86+
WriteObject(new PSSignalRNetworkAcls(signalr.NetworkAcLs));
87+
}
88+
});
89+
}
90+
}
91+
}

0 commit comments

Comments
 (0)