WSL/tools/test/setup-vm-for-tests.ps1
Blue e6e380e556 wsla: Refactor API to define wsl prefix on all types (#13410)
* Implement WSLA GPU support

* Spelling

* Fix remaining typos

* More typos

* Merge

* Remove extra logline

* Save state

* Reduce enum name

* Format

* Merge

* Fix merge

* Prepare for PR

* Update nuspec

* Pipeline update
2025-09-24 17:27:41 -07:00

158 lines
6.3 KiB
PowerShell

<#
.SYNOPSIS
Sets up a given Machine for running WSL tests.
.PARAMETER VMName
Name of the VM or Computer to set-up for testing.
.PARAMETER ComputerName
Name of the Computer to set-up for testing.
.PARAMETER IPv6Addr
IPv6 address of the computer to set-up for testing.
.PARAMETER Credential
A credential object to be used for authenticating with New-PSSession.
.PARAMETER Username
Username on the given VM to set-up the tests under.
.PARAMETER Password
Password associated with the Username, if needed.
.PARAMETER ArtifactFolder
Specify when using cmake -S ArtifactFolder.
.PARAMETER BuildType
The type of build to create when compiling the WSL source code. Defaults to "Debug".
.PARAMETER MakeTrusted
An optional switch to add the destination to the TrustedHosts list.
.PARAMETER SkipEnableFeatures
Skip enabling optional Windows features necessary for some tests.
.PARAMETER RemoteFolder
Absolute Path to a folder on the VM to copy requisite files to. Defaults to "C:\Package".
.PARAMETER TaefFolder
Absolute Path to a folder on the VM to copy taef binaries. Defaults to "C:\Taef".
.PARAMETER SkipDistro
Skip copying over the distro.
.PARAMETER TestDistroPath
Path to the distro image to import and use for testing, if needed. Auto filled if left empty.
#>
[CmdletBinding(PositionalBinding=$False, DefaultParameterSetName='vm')]
param (
[Parameter(Mandatory = $true, ParameterSetName='vm')][string]$VMName,
[Parameter(Mandatory = $true, ParameterSetName='hostname')][string]$ComputerName,
[Parameter(Mandatory = $true, ParameterSetName='ipv6')][string]$IPv6Addr,
[System.Management.Automation.PSCredential]$Credential,
[string]$Username,
[string]$Password,
[string]$ArtifactFolder,
[ValidateSet("Debug", "Release")][string]$BuildType = "Debug",
[switch]$MakeTrusted,
[switch]$SkipEnableFeatures,
[string]$RemoteFolder = "C:\Package",
[string]$TaefFolder = "C:\Taef",
[switch]$SkipDistro,
[string]$TestDistroPath
)
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest
if ($Credential -eq $null) {
if ([string]::IsNullOrEmpty($Username)) {
$Credential = Get-Credential
}
else {
if ([string]::IsNullOrEmpty($Password)) {
$SecurePassword = New-Object System.Security.SecureString
}
else {
$SecurePassword = ConvertTo-SecureString "$Password" -AsPlainText -Force
}
$Credential = New-Object System.Management.Automation.PSCredential("$Username", $SecurePassword)
}
}
if ($PSCmdlet.ParameterSetName -eq 'ipv6') {
$ComputerName = $Ipv6Addr.Replace(":", "-")+".ipv6-literal.net"
}
if (![string]::IsNullOrEmpty($ComputerName) -and $MakeTrusted) {
Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Concatenate -Value $ComputerName
}
$Session = switch ($PSCmdlet.ParameterSetName) {
"vm" {
New-PSSession -VMName $VMName -Credential $Credential
}
default {
New-PSSession `
-Authentication Negotiate `
-ComputerName $ComputerName `
-Credential $Credential
}
}
$Arch = Invoke-Command -Session $Session {$env:PROCESSOR_ARCHITECTURE}
$Platform = switch ($Arch) {
"AMD64" {"X64"}
"ARM64" {"arm64"}
default { throw "Architecture $Arch unknown" }
}
if ([string]::IsNullOrEmpty($TestDistroPath)) {
$TestDistroVersion = (Select-Xml -Path "$PSScriptRoot\..\..\packages.config" -XPath '/packages/package[@id=''Microsoft.WSL.TestDistro'']/@version').Node.Value
$TestDistroPath = "$PSScriptRoot\..\..\packages\Microsoft.WSL.TestDistro.$TestDistroVersion\test_distro.tar.xz"
}
if ([string]::IsNullOrEmpty($ArtifactFolder)) {
$ArtifactFolder = "$PSScriptRoot/../.."
}
$Bin = "$((Get-ItemProperty -Path $ArtifactFolder).FullName)/bin/$Platform/$BuildType"
if (!$SkipEnableFeatures) {
$Reboot = Invoke-Command -Session $Session -ScriptBlock {
$RestartNeeded = $false
$OptionalFeatureNames = @(
"VirtualMachinePlatform", # Needed to run V2 tests
"Microsoft-Hyper-V-Management-PowerShell", # Needed for mount tests
"Microsoft-Windows-Subsystem-Linux") # Needed to run V1 tests
foreach ($Name in $OptionalFeatureNames) {
if ((Get-WindowsOptionalFeature -Online -FeatureName $Name).State -ne "Enabled") {
$RestartNeeded = (Enable-WindowsOptionalFeature -Online -All -NoRestart -FeatureName $Name -WarningAction SilentlyContinue).RestartNeeded -or $RestartNeeded
}
}
return $RestartNeeded
}
}
else {
$Reboot = $false
}
Invoke-Command -Session $Session -ArgumentList $RemoteFolder -ScriptBlock {
New-Item -ItemType Directory -Path "$Using:RemoteFolder" -Force
}
Copy-Item -ToSession $Session -Path "$Bin/installer.msix" -Destination $RemoteFolder -Force
Copy-Item -ToSession $Session -Path "$Bin/wsltests.dll" -Destination $RemoteFolder -Force
Copy-Item -ToSession $Session -Path "$Bin/testplugin.dll" -Destination $RemoteFolder -Force
Copy-Item -ToSession $Session -Path "$Bin/wslaclient.dll" -Destination $RemoteFolder -Force
Copy-Item -ToSession $Session -Path "$PSScriptRoot/test-setup.ps1" -Destination $RemoteFolder -Force
Copy-Item -ToSession $Session -Path "$PSScriptRoot/run-tests.ps1" -Destination $RemoteFolder -Force
Copy-Item -ToSession $Session -Path "$PSScriptRoot/../../test/linux/unit_tests" -Destination $RemoteFolder -Recurse -Force
if (!$SkipDistro) {
Copy-Item -ToSession $Session -Path $TestDistroPath -Destination "$RemoteFolder/test_distro.tar.gz" -Force
}
$taefVersion = (Select-Xml -Path "$PSScriptRoot\..\..\packages.config" -XPath '/packages/package[@id=''Microsoft.Taef'']/@version').Node.Value
$taefPackage = "$ArtifactFolder/packages/Microsoft.Taef.$taefVersion/build/Binaries/$Platform"
Copy-Item -ToSession $Session -Path "$taefPackage" -Destination $TaefFolder -Recurse -Force
Invoke-Command -Session $Session -ArgumentList $RemoteFolder -ScriptBlock {
$path = [System.Environment]::GetEnvironmentVariable("PATH", [EnvironmentVariableTarget]::User) -split ";"
if ($path -notcontains $using:TaefFolder) {
$path += $using:TaefFolder
[System.Environment]::SetEnvironmentVariable("PATH", $path -join ";", [EnvironmentVariableTarget]::User)
}
}
if ($Reboot) {
Invoke-Command -Session $Session -ScriptBlock { Start-Process shutdown -ArgumentList "-r","-t 0" }
}