diff --git a/Modules/VMware.vSphere.SsoAdmin/VMware.vSphere.SsoAdmin.psm1 b/Modules/VMware.vSphere.SsoAdmin/VMware.vSphere.SsoAdmin.psm1 index 92e4915..0bb6dca 100644 --- a/Modules/VMware.vSphere.SsoAdmin/VMware.vSphere.SsoAdmin.psm1 +++ b/Modules/VMware.vSphere.SsoAdmin/VMware.vSphere.SsoAdmin.psm1 @@ -174,7 +174,8 @@ function Disconnect-SsoAdminServer { ValueFromPipelineByPropertyName = $false, HelpMessage = 'SsoAdminServer object')] [ValidateNotNull()] - [VMware.vSphere.SsoAdminClient.DataTypes.SsoAdminServer] + [VMware.vSphere.SsoAdmin.Utils.StirngToSsoAdminServerArgumentTransformationAttribute()] + [VMware.vSphere.SsoAdminClient.DataTypes.SsoAdminServer[]] $Server ) @@ -192,12 +193,14 @@ function Disconnect-SsoAdminServer { } } - if ($global:DefaultSsoAdminServers.Contains($Server)) { - $global:DefaultSsoAdminServers.Remove($Server) | Out-Null - } - - if ($Server.IsConnected) { - $Server.Disconnect() + foreach ($requestedServer in $Server) { + if ($global:DefaultSsoAdminServers.Contains($requestedServer)) { + $global:DefaultSsoAdminServers.Remove($requestedServer) | Out-Null + } + + if ($requestedServer.IsConnected) { + $requestedServer.Disconnect() + } } } } diff --git a/Modules/VMware.vSphere.SsoAdmin/net45/VMware.vSphere.SsoAdmin.Utils.dll b/Modules/VMware.vSphere.SsoAdmin/net45/VMware.vSphere.SsoAdmin.Utils.dll index c18d76e..405d8fa 100644 Binary files a/Modules/VMware.vSphere.SsoAdmin/net45/VMware.vSphere.SsoAdmin.Utils.dll and b/Modules/VMware.vSphere.SsoAdmin/net45/VMware.vSphere.SsoAdmin.Utils.dll differ diff --git a/Modules/VMware.vSphere.SsoAdmin/netcoreapp2.0/VMware.vSphere.SsoAdmin.Utils.dll b/Modules/VMware.vSphere.SsoAdmin/netcoreapp2.0/VMware.vSphere.SsoAdmin.Utils.dll index 2a9fe1b..0013f38 100644 Binary files a/Modules/VMware.vSphere.SsoAdmin/netcoreapp2.0/VMware.vSphere.SsoAdmin.Utils.dll and b/Modules/VMware.vSphere.SsoAdmin/netcoreapp2.0/VMware.vSphere.SsoAdmin.Utils.dll differ diff --git a/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/StirngToSsoAdminServerArgumentTransformationAttribute.cs b/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/StirngToSsoAdminServerArgumentTransformationAttribute.cs new file mode 100644 index 0000000..5d8c885 --- /dev/null +++ b/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/StirngToSsoAdminServerArgumentTransformationAttribute.cs @@ -0,0 +1,54 @@ +// ************************************************************************** +// Copyright 2020 VMware, Inc. +// ************************************************************************** + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation; +using System.Management.Automation.Runspaces; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using VMware.vSphere.SsoAdminClient.DataTypes; + +namespace VMware.vSphere.SsoAdmin.Utils +{ + public class StirngToSsoAdminServerArgumentTransformationAttribute : ArgumentTransformationAttribute + { + public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) { + object result = inputData; + + if (inputData is string obnValue && + !string.IsNullOrEmpty(obnValue)) { + // Adopt PowerShell regex chars + var csharpObnValue = obnValue.Replace("*", ".*").Replace("?", ".?"); + result = null; + + var obnMatchingServers = new List(); + + var ssoAdminServerVariable = engineIntrinsics.SessionState.PSVariable.GetValue("DefaultSsoAdminServers"); + + if (ssoAdminServerVariable is PSObject ssoAdminServersPsObj && + ssoAdminServersPsObj.BaseObject is List connectedServers) { + foreach (var server in connectedServers) { + if (!string.IsNullOrEmpty(Regex.Match(server.ToString(), csharpObnValue)?.Value)) { + obnMatchingServers.Add(server); + } + } + } + + if (obnMatchingServers.Count > 0) { + result = obnMatchingServers.ToArray(); + } else { + // Non-terminating error for not matching value + engineIntrinsics.Host.UI.WriteErrorLine($"'{obnValue}' doesn't match any objects in $global:DefaultSsoAdminServers variable"); + } + + } + + return result; + } + } +} diff --git a/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/VMware.vSphere.SsoAdmin.Utils.csproj b/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/VMware.vSphere.SsoAdmin.Utils.csproj index 631cd09..9e947ce 100644 --- a/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/VMware.vSphere.SsoAdmin.Utils.csproj +++ b/Modules/VMware.vSphere.SsoAdmin/src/VMware.vSphere.SsoAdmin.Client/VMware.vSphere.SsoAdmin.Utils/VMware.vSphere.SsoAdmin.Utils.csproj @@ -21,5 +21,9 @@ + + + + \ No newline at end of file diff --git a/Modules/VMware.vSphere.SsoAdmin/src/test/ConnectDisconnect.Tests.ps1 b/Modules/VMware.vSphere.SsoAdmin/src/test/ConnectDisconnect.Tests.ps1 index 53ef770..e7ee61c 100644 --- a/Modules/VMware.vSphere.SsoAdmin/src/test/ConnectDisconnect.Tests.ps1 +++ b/Modules/VMware.vSphere.SsoAdmin/src/test/ConnectDisconnect.Tests.ps1 @@ -114,7 +114,7 @@ Describe "Connect-SsoAdminServer and Disconnect-SsoAdminServer Tests" { -SkipCertificateCheck) # Act - + # Assert {Disconnect-SsoAdminServer} | should -Throw 'Connected to more than 1 SSO server, please specify a SSO server via -Server parameter' (Compare-Object $global:DefaultSsoAdminServers $expected -IncludeEqual).Count | Should Be 2 @@ -159,5 +159,60 @@ Describe "Connect-SsoAdminServer and Disconnect-SsoAdminServer Tests" { $global:DefaultSsoAdminServers | Should Not Contain $expected $expected.IsConnected | Should Be $false } + + It 'Disconnects DefaultSsoAdminServers when * is specified on -Server parameter' { + # Arrange + $expected = Connect-SsoAdminServer ` + -Server $VcAddress ` + -User $User ` + -Password $Password ` + -SkipCertificateCheck + + # Act + Disconnect-SsoAdminServer -Server "*" + + + # Assert + $global:DefaultSsoAdminServers.Count | Should Be 0 + $expected.IsConnected | Should Be $false + } + + It 'Disconnects server specified as string that is equal to VC Address' { + # Arrange + $expected = Connect-SsoAdminServer ` + -Server $VcAddress ` + -User $User ` + -Password $Password ` + -SkipCertificateCheck + + # Act + Disconnect-SsoAdminServer -Server $VcAddress + + + # Assert + $global:DefaultSsoAdminServers.Count | Should Be 0 + $expected.IsConnected | Should Be $false + } + + It 'Disconnect-SsoAdminServer fails when string that does not match any servers is specified' { + # Arrange + $expected = Connect-SsoAdminServer ` + -Server $VcAddress ` + -User $User ` + -Password $Password ` + -SkipCertificateCheck + + # Act + { Disconnect-SsoAdminServer -Server "testserver" } | Should Throw + + + # Assert + $global:DefaultSsoAdminServers.Count | Should Be 1 + $global:DefaultSsoAdminServers[0] | Should Be $expected + $expected.IsConnected | Should Be $true + + # Cleanup + Disconnect-SsoAdminServer -Server $expected + } } } \ No newline at end of file