From 9c95b56f9a5389a214db22fd3a2d9f4e328e071b Mon Sep 17 00:00:00 2001 From: Vincent Dai <23257217+vidai-msft@users.noreply.github.com> Date: Sun, 8 Sep 2024 19:53:16 -0700 Subject: [PATCH] Refactor live test scenarios to use new password generation function (#26037) --- .../LiveTests/Compute/TestLiveScenarios.ps1 | 34 ++++++++--------- tools/TestFx/Live/InvokeLiveTestScenarios.ps1 | 36 +++++++++--------- tools/TestFx/Live/LiveTestUtility.psm1 | 38 +++++++++++++++++++ 3 files changed, 73 insertions(+), 35 deletions(-) diff --git a/src/Compute/LiveTests/Compute/TestLiveScenarios.ps1 b/src/Compute/LiveTests/Compute/TestLiveScenarios.ps1 index 7582ae618a00..655b0e0151dc 100644 --- a/src/Compute/LiveTests/Compute/TestLiveScenarios.ps1 +++ b/src/Compute/LiveTests/Compute/TestLiveScenarios.ps1 @@ -5,16 +5,15 @@ Invoke-LiveTestScenario -Name "Creates a virtual machine." -Description "Test cr $rgName = $rg.ResourceGroupName $name = New-LiveTestResourceName - $VMLocalAdminUser = New-LiveTestResourceName; - $VMLocalAdminSecurePassword = ConvertTo-SecureString "Aalexwdy5#" -AsPlainText -Force; - $LocationName = "eastus"; - $domainNameLabel = New-LiveTestResourceName; - $Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword); - $text = New-LiveTestResourceName; - $bytes = [System.Text.Encoding]::Unicode.GetBytes($text); - $userData = [Convert]::ToBase64String($bytes); + $VMLocalAdminUser = New-LiveTestResourceName + $VMLocalAdminSecurePassword = ConvertTo-SecureString (New-LiveTestPassword) -AsPlainText -Force + $domainNameLabel = New-LiveTestResourceName + $Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword) + $text = New-LiveTestResourceName + $bytes = [System.Text.Encoding]::Unicode.GetBytes($text) + $userData = [Convert]::ToBase64String($bytes) - $actual = New-AzVM -ResourceGroupName $rgName -Name $name -Credential $Credential -DomainNameLabel $domainNameLabel -UserData $userData; + $actual = New-AzVM -ResourceGroupName $rgName -Name $name -Credential $Credential -DomainNameLabel $domainNameLabel -UserData $userData -OpenPorts @() Assert-AreEqual $name $actual.Name # Assert-AreEqual "Succeeded" Label $actual.ProvisioningState @@ -28,16 +27,15 @@ Invoke-LiveTestScenario -Name "Removes a virtual machine from Azure" -Descriptio $rgName = $rg.ResourceGroupName $name = New-LiveTestResourceName - $VMLocalAdminUser = New-LiveTestResourceName; - $VMLocalAdminSecurePassword = ConvertTo-SecureString "Aalexwdy5#" -AsPlainText -Force; - $LocationName = "eastus"; - $domainNameLabel = New-LiveTestResourceName; - $Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword); - $text = New-LiveTestResourceName; - $bytes = [System.Text.Encoding]::Unicode.GetBytes($text); - $userData = [Convert]::ToBase64String($bytes); + $VMLocalAdminUser = New-LiveTestResourceName + $VMLocalAdminSecurePassword = ConvertTo-SecureString (New-LiveTestPassword) -AsPlainText -Force + $domainNameLabel = New-LiveTestResourceName + $Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword) + $text = New-LiveTestResourceName + $bytes = [System.Text.Encoding]::Unicode.GetBytes($text) + $userData = [Convert]::ToBase64String($bytes) - New-AzVM -ResourceGroupName $rgName -Name $name -Credential $Credential -DomainNameLabel $domainNameLabel -UserData $userData; + New-AzVM -ResourceGroupName $rgName -Name $name -Credential $Credential -DomainNameLabel $domainNameLabel -UserData $userData -OpenPorts @() Remove-AzVM -ResourceGroupName $rgName -Name $name -Force $removedVM = Get-AzVM -ResourceGroupName $rgName -Name $name -ErrorAction SilentlyContinue diff --git a/tools/TestFx/Live/InvokeLiveTestScenarios.ps1 b/tools/TestFx/Live/InvokeLiveTestScenarios.ps1 index dd5444d937e5..481ecb39afa8 100644 --- a/tools/TestFx/Live/InvokeLiveTestScenarios.ps1 +++ b/tools/TestFx/Live/InvokeLiveTestScenarios.ps1 @@ -13,7 +13,7 @@ param ( ) $srcDir = Join-Path -Path ${env:BUILD_SOURCESDIRECTORY} -ChildPath "src" -$liveScenarios = Get-ChildItem -Path $srcDir -Directory -Exclude "Accounts" -ErrorAction SilentlyContinue | Get-ChildItem -Directory -Filter "LiveTests" -Recurse | Get-ChildItem -File -Filter "TestLiveScenarios.ps1" | Select-Object -ExpandProperty FullName +$liveScenarios = Get-ChildItem -Path $srcDir -Directory -Exclude "Accounts" -ErrorAction SilentlyContinue | Get-ChildItem -Directory -Filter "LiveTests" -Recurse | Get-ChildItem -File -Filter "TestLiveScenarios.ps1" -Recurse | Select-Object -ExpandProperty FullName $maxRunspaces = 9 [void][int]::TryParse(${env:RSPTHROTTLE}, [ref]$maxRunspaces) @@ -27,16 +27,17 @@ $liveJobs = $liveScenarios | ForEach-Object { $ps = [powershell]::Create() $ps.RunspacePool = $rsp [void]$ps.AddScript({ - param ( - [string] $Module, - [string] $RunPlatform, - [string] $LiveScenarioScript - ) - - Import-Module "./tools/TestFx/Assert.ps1" -Force - Import-Module "./tools/TestFx/Live/LiveTestUtility.psd1" -ArgumentList $Module, $RunPlatform, ${env:DATALOCATION} -Force - . $LiveScenarioScript - }).AddParameter("Module", $module).AddParameter("RunPlatform", $RunPlatform).AddParameter("LiveScenarioScript", $_) + param ( + [string] $Module, + [string] $RunPlatform, + [string] $LiveScenarioScript + ) + + Import-Module "./tools/TestFx/Assert.ps1" -Force + Import-Module "./tools/TestFx/Live/LiveTestUtility.psd1" -ArgumentList $Module, $RunPlatform, ${env:DATALOCATION} -Force + . $LiveScenarioScript + } + ).AddParameter("Module", $module).AddParameter("RunPlatform", $RunPlatform).AddParameter("LiveScenarioScript", $_) [PSCustomObject]@{ Id = $ps.InstanceId @@ -136,7 +137,7 @@ while ($queuedJobs.Count -gt 0) { } $accountsDir = Join-Path -Path $srcDir -ChildPath "Accounts" -$accountsLiveScenario = Get-ChildItem -Path $accountsDir -Directory -Filter "LiveTests" -Recurse -ErrorAction SilentlyContinue | Get-ChildItem -File -Filter "TestLiveScenarios.ps1" | Select-Object -ExpandProperty FullName +$accountsLiveScenario = Get-ChildItem -Path $accountsDir -Directory -Filter "LiveTests" -Recurse -ErrorAction SilentlyContinue | Get-ChildItem -File -Filter "TestLiveScenarios.ps1" -Recurse | Select-Object -ExpandProperty FullName if ($null -ne $accountsLiveScenario) { Write-Output "" Write-Output "##[section]Live test run for module `"Accounts`"." @@ -150,11 +151,12 @@ $liveJobs | ForEach-Object { if ($null -ne $_.Instance) { $_.Instance.Commands.Clear() [void]$_.Instance.AddScript({ - $cleanupJobs = Get-Job - $cleanupJobs | Wait-Job | Out-Null - $cleanupJobs | Select-Object Name, Command, State, PSBeginTime, PSEndTime, Output - $cleanupJobs | Remove-Job - }) + $cleanupJobs = Get-Job + $cleanupJobs | Wait-Job | Out-Null + $cleanupJobs | Select-Object Name, Command, State, PSBeginTime, PSEndTime, Output + $cleanupJobs | Remove-Job + } + ) $_.AsyncHandle = $_.Instance.BeginInvoke() } } diff --git a/tools/TestFx/Live/LiveTestUtility.psm1 b/tools/TestFx/Live/LiveTestUtility.psm1 index 6bcce7ee7471..eb0e5756e936 100644 --- a/tools/TestFx/Live/LiveTestUtility.psm1 +++ b/tools/TestFx/Live/LiveTestUtility.psm1 @@ -172,6 +172,44 @@ function New-LiveTestStorageAccountName { $saFullName } +function New-LiveTestPassword { + [CmdletBinding()] + [OutputType([string])] + param ( + [Parameter()] + [ValidateRange(12, 123)] + [int] $MaxLength = 16 + ) + + $lowercase = 'abcdefghijklmnopqrstuvwxyz' + $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + $numbers = '0123456789' + $special = '!@#$%^&*()-_=+[]{}|;:,.<>?' + $allCharacters = $lowercase + $uppercase + $numbers + $special + + # Ensure at least three of the required character types + $password = @() + $characterTypes = @($lowercase, $uppercase, $numbers, $special) + $selectedTypes = Get-Random -InputObject $characterTypes -Count 3 + + foreach ($type in $selectedTypes) { + $password += $type[(Get-Random -Minimum 0 -Maximum $type.Length)] + } + + # Ensure the first character is not a special character + $nonSpecialCharacters = $lowercase + $uppercase + $numbers + $firstChar = $nonSpecialCharacters[(Get-Random -Minimum 0 -Maximum $nonSpecialCharacters.Length)] + $password = @($firstChar) + $password + + # Fill the rest of the password length with random characters from all sets + $remainingLength = $MaxLength - $password.Length + $password += (1..$remainingLength | ForEach-Object { $allCharacters[(Get-Random -Minimum 0 -Maximum $allCharacters.Length)] }) + + # Shuffle the password to ensure randomness, excluding the first character + $password = $password[0] + ( -join ($password[1..($password.Length - 1)] | Get-Random -Count ($password.Length - 1))) + return -join $password +} + function Invoke-LiveTestCommand { [CmdletBinding()] param (