Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/SignalR/SignalR.Test/ScenarioTests/AzureRmSignalRTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,17 @@ public void TestAzureRmSignalRUpdate() =>
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestAzureRmSignalRCustomCertificateAndCustomDomain() =>
TestRunner.RunTestScript("Test-AzureRmSignalRCustomCertificateAndCustomDomain");

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestAzSignalRReplica() =>
TestRunner.RunTestScript("Test-AzSignalRReplica");

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestAzSignalRNetworkIpRule()
{
TestRunner.RunTestScript("Test-AzSignalRNetworkIpRule");
}
}
}
184 changes: 176 additions & 8 deletions src/SignalR/SignalR.Test/ScenarioTests/AzureRmSignalRTests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -498,43 +498,43 @@ function Test-AzureRmSignalRCustomCertificateAndCustomDomain

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

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

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

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

# ====== Remove cert =====

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

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

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

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

} finally
Expand All @@ -544,6 +544,136 @@ function Test-AzureRmSignalRCustomCertificateAndCustomDomain
}
}

<#
.SYNOPSIS
Test replica cmdlets for SignalR.
#>
function Test-AzSignalRReplica
{
$location = Get-ProviderLocation "Microsoft.SignalRService/SignalR"
$nameSuffix = "replica-test"
$resourceGroupName = "powershellsignalrreplicatest"
$signalrName = "powershellsignalrreplicatest1"
$replicaName1 = "replica1-11111"
$replicaName2 = "replica2-22222"

try
{
# Setup - Create resource group and SignalR service (Premium required for replicas)
# 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.
$signalr = New-AzSignalR -ResourceGroupName $resourceGroupName -Name $signalrName -Sku "Premium_P1" -Location $location

# Test Create replica using SignalR object parameter set
$replica1 = $signalr | New-AzSignalRReplica -Name $replicaName1 -Location "West US 2" -UnitCount 2
Assert-NotNull $replica1
Assert-AreEqual $replicaName1 $replica1.Name
Assert-LocationEqual "West US 2" $replica1.Location
Assert-AreEqual 2 $replica1.Sku.Capacity

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

$replica2 = $signalr | New-AzSignalRReplica -Name $replicaName2 -Location "East US 2"
Assert-NotNull $replica2
Assert-AreEqual $replicaName2 $replica2.Name
Assert-AreEqual 1 $replica2.Sku.Capacity

# Test Get replica using SignalR object parameter set
$retrievedReplica = $signalr | Get-AzSignalRReplica -Name $replicaName1
Assert-NotNull $retrievedReplica
Assert-AreEqual $replicaName1 $retrievedReplica.Name

# Test List all replicas using SignalR object parameter set
$replicas = $signalr | Get-AzSignalRReplica
Assert-NotNull $replicas
Assert-AreEqual 2 $replicas.Count

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Test Update replica using InputObject parameter set
$updatedReplica = $replica1 | Update-AzSignalRReplica -RegionEndpointEnabled "Disabled"
Assert-AreEqual "Disabled" $updatedReplica.RegionEndpointEnabled

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Test Stop replica using InputObject parameter set
$result = $replica1 | Stop-AzSignalRReplica -PassThru
Assert-True { $result }

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Test Start replica using InputObject parameter set
$stoppedReplica = Get-AzSignalRReplica -ResourceGroupName $resourceGroupName -SignalRName $signalrName -Name $replicaName1
$result = $stoppedReplica | Start-AzSignalRReplica -PassThru
Assert-True { $result }

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Test Restart replica using InputObject parameter set
$result = $replica2 | Restart-AzSignalRReplica -PassThru
Assert-True { $result }

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Test Remove replica using InputObject parameter set
$result = $replica1 | Remove-AzSignalRReplica -PassThru
Assert-True { $result }

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Test Remove replica using SignalR object parameter set
$result = $signalr | Remove-AzSignalRReplica -Name $replicaName2 -PassThru
Assert-True { $result }

# Replica may be in "updating" internally, wait until update finishes.
if( $env:AZURE_TEST_MODE -eq "Record")
{
Start-Sleep -Seconds 120
}

# Verify replicas are removed
$replicas = Get-AzSignalRReplica -ResourceGroupName $resourceGroupName -SignalRName $signalrName
Assert-AreEqual 0 $replicas.Count

} finally
{
# Cleanup - Remove any remaining resources
try {
# Get-AzSignalRReplica -ResourceGroupName $resourceGroupName -SignalRName $signalrName | Remove-AzSignalRReplica
} catch {
# Ignore cleanup errors
}
# Remove-AzResourceGroup -Name $resourceGroupName -Force
}
}

function New-Environment
{
param (
Expand Down Expand Up @@ -626,4 +756,42 @@ function Remove-Environment
[string] $resourceGroupName
)
Remove-AzResourceGroup -Name $resourceGroupName
}

<#!
.SYNOPSIS
Test IP rule cmdlets for SignalR (New/Add/Remove-AzSignalRNetworkIpRule).
#>
function Test-AzSignalRNetworkIpRule
{
$location = Get-ProviderLocation "Microsoft.SignalRService/SignalR"
$nameSuffix = "iprule-test"
$resourceGroupName = Get-RandomResourceGroupName $nameSuffix
$signalrName = Get-RandomSignalRName $nameSuffix

New-AzResourceGroup -Name $resourceGroupName -Location $location
$signalr = New-AzSignalR -ResourceGroupName $resourceGroupName -Name $signalrName -Sku "Premium_P1"

# Create IP rule objects
$rule1 = New-AzSignalRNetworkIpRuleObject -Value "10.1.0.0/16" -Action Allow
$rule2 = New-AzSignalRNetworkIpRuleObject -Value "20.2.2.2" -Action Deny

# a. Add via resource group parameter set
$acls = Add-AzSignalRNetworkIpRule -ResourceGroupName $resourceGroupName -Name $signalrName -IpRule $rule1, $rule2
Assert-NotNull $acls
Assert-AreEqual 4 $acls.IPRules.Count
Assert-True { $acls.IPRules | Where-Object { $_.Value -eq "10.1.0.0/16" -and $_.Action -eq "Allow" } }
Assert-True { $acls.IPRules | Where-Object { $_.Value -eq "20.2.2.2" -and $_.Action -eq "Deny" } }

# Remove one via resource group parameter set
$acls = Remove-AzSignalRNetworkIpRule -ResourceGroupName $resourceGroupName -Name $signalrName -IpRule $rule1
Assert-AreEqual 3 $acls.IPRules.Count
Assert-False { $acls.IPRules | Where-Object { $_.Value -eq "10.1.0.0/16" } }

# Remove one via resource ID parameter set
$signalr = Get-AzSignalR -ResourceGroupName $resourceGroupName -Name $signalrName
$acls = Remove-AzSignalRNetworkIpRule -ResourceId $signalr.Id -IpRule $rule2
Assert-AreEqual 2 $acls.IPRules.Count
Assert-False { $acls.IPRules | Where-Object { $_.Value -eq "20.2.2.2" } }

}
2 changes: 1 addition & 1 deletion src/SignalR/SignalR.Test/ScenarioTests/Common.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,4 @@ function Get-ProviderLocation([string]$provider)
}

return "East US"
}
}

Large diffs are not rendered by default.

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions src/SignalR/SignalR/Az.SignalR.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,10 @@ CmdletsToExport = 'Get-AzSignalR', 'Get-AzSignalRKey', 'Get-AzSignalRUsage',
'New-AzSignalR', 'New-AzSignalRKey', 'Remove-AzSignalR',
'Restart-AzSignalR', 'Set-AzSignalRUpstream', 'Test-AzSignalRName',
'Update-AzSignalR', 'Update-AzSignalRNetworkAcl',
'New-AzSignalRCustomDomain', 'Get-AzSignalRCustomDomain',
'Remove-AzSignalRCustomDomain', 'Update-AzSignalRCustomDomain',
'New-AzSignalRCustomCertificate', 'Get-AzSignalRCustomCertificate',
'Remove-AzSignalRCustomCertificate'
'New-AzSignalRCustomDomain', 'Get-AzSignalRCustomDomain', 'Remove-AzSignalRCustomDomain', 'Update-AzSignalRCustomDomain',
'New-AzSignalRCustomCertificate', 'Get-AzSignalRCustomCertificate', 'Remove-AzSignalRCustomCertificate',
'Get-AzSignalRReplica', 'New-AzSignalRReplica', 'Remove-AzSignalRReplica', 'Restart-AzSignalRReplica', 'Start-AzSignalRReplica', 'Stop-AzSignalRReplica', 'Update-AzSignalRReplica',
'New-AzSignalRNetworkIpRuleObject', 'Remove-AzSignalRNetworkIpRule', 'Add-AzSignalRNetworkIpRule'

# Variables to export from this module
# VariablesToExport = @()
Expand Down
12 changes: 12 additions & 0 deletions src/SignalR/SignalR/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@
- Additional information about change #1
-->
## Upcoming Release
* Added cmdlets for managing replicas:
- Get-AzSignalRReplica: get replica(s) for SignalR
- New-AzSignalRReplica: create a new replica for SignalR
- Remove-AzSignalRReplica: remove a replica from SignalR
- Restart-AzSignalRReplica: restart a SignalR replica
- Start-AzSignalRReplica: start a SignalR replica
- Stop-AzSignalRReplica: stop a SignalR replica
- Update-AzSignalRReplica: update a SignalR replica
* Added cmdlets for managing network IP rules
- New-AzSignalRNetworkIpRuleObject: create a new network IP rule object for SignalR
- Add-AzSignalRNetworkIpRule: add network IP rule(s) to SignalR
- Remove-AzSignalRNetworkIpRule: remove network IP rule(s) from SignalR

## Version 2.2.0
* Added cmdlets for managing custom domains: `New-AzSignalRCustomDomain`, `Get-AzSignalRCustomDomain`, `Remove-AzSignalRCustomDomain`, `Update-AzSignalRCustomDomain`
Expand Down
91 changes: 91 additions & 0 deletions src/SignalR/SignalR/Cmdlets/AddAzureRmSignalRNetworkIpRule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// ----------------------------------------------------------------------------------
//
// Copyright Microsoft Corporation
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Management.Automation;
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
using Microsoft.Azure.Commands.SignalR.Models;
using Microsoft.Azure.Commands.SignalR.Properties;
using Microsoft.Azure.Management.SignalR;

namespace Microsoft.Azure.Commands.SignalR.Cmdlets
{
[Cmdlet("Add", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "SignalRNetworkIpRule", SupportsShouldProcess = true, DefaultParameterSetName = ResourceGroupParameterSet)]
[OutputType(typeof(PSSignalRNetworkAcls))]
public class AddAzureRmSignalRNetworkIpRule : SignalRCmdletBase, IWithResourceId, IWithSignalRInputObject
{
[Parameter(Mandatory = false, ParameterSetName = ResourceGroupParameterSet, HelpMessage = "The resource group name. The default one will be used if not specified.")]
[ResourceGroupCompleter]
[ValidateNotNullOrEmpty]
public override string ResourceGroupName { get; set; }

[Parameter(Mandatory = true, Position = 0, ParameterSetName = ResourceGroupParameterSet, HelpMessage = "The SignalR service name.")]
[ValidateNotNullOrEmpty]
[ResourceNameCompleter(Constants.SignalRResourceType, nameof(ResourceGroupName))]
public string Name { get; set; }

[Parameter(Mandatory = true, ParameterSetName = ResourceIdParameterSet, ValueFromPipelineByPropertyName = true, HelpMessage = "The SignalR service resource ID.")]
[ValidateNotNullOrEmpty]
public string ResourceId { get; set; }

[Parameter(Mandatory = true, ParameterSetName = InputObjectParameterSet, ValueFromPipeline = true, HelpMessage = "The SignalR resource object.")]
[ValidateNotNull]
public PSSignalRResource InputObject { get; set; }

[Parameter(Mandatory = true, ParameterSetName = ResourceIdParameterSet, ValueFromPipeline = true, HelpMessage = "IP rule object(s) created by New-AzSignalRNetworkIpRule.")]
[Parameter(Mandatory = true, ParameterSetName = ResourceGroupParameterSet, ValueFromPipeline = true, HelpMessage = "IP rule object(s) created by New-AzSignalRNetworkIpRule.")]
[Parameter(Mandatory = true, ParameterSetName = InputObjectParameterSet, ValueFromPipeline = true, HelpMessage = "IP rule object(s) created by New-AzSignalRNetworkIpRule.")]
[ValidateNotNull]
public PSIpRule[] IpRule { get; set; }

public override void ExecuteCmdlet()
{
base.ExecuteCmdlet();

RunCmdlet(() =>
{
switch (ParameterSetName)
{
case ResourceGroupParameterSet:
ResolveResourceGroupName();
break;
case ResourceIdParameterSet:
this.LoadFromResourceId();
break;
case InputObjectParameterSet:
this.LoadFromSignalRInputObject();
break;
default:
throw new ArgumentException(Resources.ParameterSetError);
}
if (ShouldProcess($"SignalR service {ResourceGroupName}/{Name}", "add network IP rule(s)"))
{
var signalr = Client.SignalR.Get(ResourceGroupName, Name);
var networkACLs = signalr.NetworkAcLs;
if (networkACLs.IPRules == null)
{
networkACLs.IPRules = new List<Microsoft.Azure.Management.SignalR.Models.IPRule>();
}
foreach (var rule in IpRule)
{
networkACLs.IPRules.Add(rule.ToSdkModel());
}
signalr = Client.SignalR.Update(ResourceGroupName, Name, signalr);
WriteObject(new PSSignalRNetworkAcls(signalr.NetworkAcLs));
}
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ public override void ExecuteCmdlet()
if (ShouldProcess($"SignalR custom domain {ResourceGroupName}/{SignalRName}/{Name}", "remove"))
{
Microsoft.Azure.Management.SignalR.SignalRCustomDomainsOperationsExtensions.Delete(Client.SignalRCustomDomains, ResourceGroupName, SignalRName, Name);

WriteObject(true);
}
});
Expand Down
Loading