mirror of
https://github.com/microsoft/WSL.git
synced 2025-12-10 00:44:55 -06:00
* 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
158 lines
6.3 KiB
PowerShell
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" }
|
|
} |