Skip to content
Draft
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
50 changes: 27 additions & 23 deletions Tests/BuildkitTools.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,25 @@ Describe "BuildkitTools.psm1" {
# Mock functions
function Test-ServiceRegistered { }
Mock Test-ServiceRegistered -ModuleName 'BuildkitTools' -MockWith { return $true }

function CleanupTestDrive {
Get-ChildItem -Path "$TestDrive" -Force -ErrorAction SilentlyContinue | `
Remove-Item -Recurse -Force -Confirm:$false -ErrorAction SilentlyContinue
}
}

BeforeEach {
Remove-Item -Path "$TestDrive" -Re -Force -ErrorAction Ignore
CleanupTestDrive
}

AfterEach {
$ENV:PESTER = $false
Remove-Item -Path "$TestDrive" -Re -Force -ErrorAction Ignore

CleanupTestDrive
}

AfterAll {
Remove-Module -Name "$ModuleParentPath\Private\CommonToolUtilities.psm1" -Force -ErrorAction Ignore
Remove-Module -Name "$ModuleParentPath\Public\BuildkitTools.psm1" -Force -ErrorAction Ignore
CleanupTestDrive
}

Context "Install-Buildkit" -Tag "Install-Buildkit" {
Expand All @@ -63,7 +68,7 @@ Describe "BuildkitTools.psm1" {
}

AfterEach {
Remove-Item -Path "TestDrive:\" -Force -ErrorAction Ignore
CleanupTestDrive
}

It 'Should not process on implicit request for validation (WhatIfPreference)' {
Expand Down Expand Up @@ -104,10 +109,10 @@ Describe "BuildkitTools.psm1" {
}

It "Should call function with user-specified values" {
$customPath = "TestDrive:\Downloads\buildkit-v0.2.3.windows-amd64.tar.gz"
$customPath = "$TestDrive\Downloads\buildkit-v0.2.3.windows-amd64.tar.gz"
Mock Get-InstallationFile -ModuleName 'BuildkitTools' -MockWith { return $customPath }

Install-Buildkit -Version '0.2.3' -InstallPath 'TestDrive:\BuildKit' -DownloadPath 'TestDrive:\Downloads' -OSArchitecture "arm64" -Force -Confirm:$false
Install-Buildkit -Version '0.2.3' -InstallPath "$TestDrive\BuildKit" -DownloadPath "$TestDrive\Downloads" -OSArchitecture "arm64" -Force -Confirm:$false

Should -Invoke Uninstall-Buildkit -ModuleName 'BuildkitTools' -Times 0 -Exactly -Scope It
Should -Invoke Get-InstallationFile -ModuleName 'BuildkitTools' -ParameterFilter {
Expand All @@ -116,9 +121,9 @@ Describe "BuildkitTools.psm1" {
}
Should -Invoke Install-RequiredFeature -ModuleName 'BuildkitTools' -ParameterFilter {
$Feature -eq "Buildkit" -and
$InstallPath -eq 'TestDrive:\BuildKit' -and
$InstallPath -eq "$TestDrive\BuildKit" -and
$SourceFile -eq "$customPath" -and
$EnvPath -eq 'TestDrive:\Buildkit\bin' -and
$EnvPath -eq "$TestDrive\Buildkit\bin" -and
$cleanup -eq $true
}
}
Expand All @@ -130,10 +135,10 @@ Describe "BuildkitTools.psm1" {

Should -Invoke Register-BuildkitdService -Times 1 -Exactly -Scope It -ModuleName 'BuildkitTools' `
-ParameterFilter {
$BuildKitPath -eq "$Env:ProgramFiles\Buildkit" -and
$WinCNIPath -eq "$ENV:ProgramFiles\Containerd\cni"
$Start -eq $true
}
$BuildKitPath -eq "$Env:ProgramFiles\Buildkit" -and
$WinCNIPath -eq "$ENV:ProgramFiles\Containerd\cni"
$Start -eq $true
}
}

It "Should uninstall tool if it is already installed" {
Expand Down Expand Up @@ -222,7 +227,6 @@ Describe "BuildkitTools.psm1" {

$expectedExecutablePath = "$MockBuildKitPath\bin\buildkitd.exe"
$expectedCommandArguments = "--register-service --debug --containerd-worker=true --containerd-cni-config-path=`"$MockCniConfPath`" --containerd-cni-binary-dir=`"$MockCniBinDir`" --service-name buildkitd"
Write-Host "'$expectedCommandArguments'" -ForegroundColor Magenta
Should -Invoke Invoke-ExecutableCommand -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter {
($Executable -eq $expectedExecutablePath ) -and
Expand Down Expand Up @@ -304,7 +308,7 @@ Describe "BuildkitTools.psm1" {

Context "Uninstall-Buildkit" -Tag "Uninstall-Buildkit" {
BeforeAll {
Mock Get-DefaultInstallPath -ModuleName 'BuildkitTools' -MockWith { return 'TestDrive:\Program Files\Buildkit' }
Mock Get-DefaultInstallPath -ModuleName 'BuildkitTools' -MockWith { return "$TestDrive\Program Files\Buildkit" }
Mock Test-EmptyDirectory -ModuleName 'BuildkitTools' -MockWith { return $false }
Mock Stop-BuildkitdService -ModuleName 'BuildkitTools'
Mock Unregister-Buildkitd -ModuleName 'BuildkitTools'
Expand All @@ -314,15 +318,15 @@ Describe "BuildkitTools.psm1" {
}

It "Should successfully uninstall Buildkit" {
Uninstall-Buildkit -Path 'TestDrive:\Custom\Buildkit\' -Confirm:$false -Force
Uninstall-Buildkit -Path "$TestDrive\Custom\Buildkit\" -Confirm:$false -Force

# Should stop and deregister the buildkitd service
Should -Invoke Stop-BuildkitdService -Times 1 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Unregister-Buildkitd -Times 1 -Scope It -ModuleName "BuildkitTools"

# Should remove buildkit dir
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Custom\Buildkit\bin' }
-ParameterFilter { $Path -eq "$TestDrive\Custom\Buildkit\bin" }

# Should not purge program data
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools" `
Expand All @@ -337,15 +341,15 @@ Describe "BuildkitTools.psm1" {
Uninstall-Buildkit -Confirm:$false -Force

Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Buildkit\bin' }
-ParameterFilter { $Path -eq "$TestDrive\Program Files\Buildkit\bin" }
}

It "Should successfully purge program data" {
Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force -Purge
Uninstall-Buildkit -Path "$TestDrive\Program Files\Buildkit" -Confirm:$false -Force -Purge

# Should purge program data
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Buildkit' }
-ParameterFilter { $Path -eq "$TestDrive\Program Files\Buildkit" }
Should -Invoke Uninstall-ProgramFiles -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq "$ENV:ProgramData\Buildkit" }
Should -Invoke Remove-FeatureFromPath -Times 1 -Scope It -ModuleName "BuildkitTools" `
Expand All @@ -354,7 +358,7 @@ Describe "BuildkitTools.psm1" {

It "Should do nothing if user does not consent to uninstalling Buildkit" {
$ENV:PESTER = $true
Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force:$false
Uninstall-Buildkit -Path "$TestDrive\Program Files\Buildkit" -Confirm:$false -Force:$false

# Should NOT stop and deregister the buildkit service
Should -Invoke Stop-BuildkitdService -Times 0 -Scope It -ModuleName "BuildkitTools"
Expand All @@ -367,7 +371,7 @@ Describe "BuildkitTools.psm1" {
It "Should do nothing if buildkit is not installed at specified path" {
Mock Test-EmptyDirectory -ModuleName 'BuildkitTools' -MockWith { return $true }

Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false
Uninstall-Buildkit -Path "$TestDrive\Program Files\Buildkit" -Confirm:$false

Should -Invoke Stop-BuildkitdService -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Unregister-Buildkitd -Times 0 -Scope It -ModuleName "BuildkitTools"
Expand All @@ -377,7 +381,7 @@ Describe "BuildkitTools.psm1" {
It "Should throw an error if buildkitd service stop or unregister was unsuccessful" {
Mock Stop-BuildkitdService -ModuleName 'BuildkitTools' -MockWith { Throw 'Error' }

{ Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force -Purge } | Should -Throw "*Could not stop or unregister buildkitd service.*"
{ Uninstall-Buildkit -Path "$TestDrive\Program Files\Buildkit" -Confirm:$false -Force -Purge } | Should -Throw "*Could not stop or unregister buildkitd service.*"
Should -Invoke Unregister-Buildkitd -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-FeatureFromPath -Times 0 -Scope It -ModuleName "BuildkitTools"
Expand Down
13 changes: 10 additions & 3 deletions Tests/ContainerNetworkTools.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -228,17 +228,24 @@ Describe "ContainerNetworkTools.psm1" {

It "Should use HNS module if HostNetworkingService is not installed" {
Mock Get-Module -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HostNetworkingService' }
Mock Get-Module -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HNS' } -MockWith { return @{} }
Mock Get-Module -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HNS' } -MockWith {
return @{Name = 'HNS'; Path = "TestDrive:\PowerShell\Modules\HNS\HNS.psm1" }
}

Initialize-NatNetwork -Force

Should -Invoke Import-Module -Times 0 -Scope It -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HostNetworkingService' }
Should -Invoke Import-Module -Times 1 -Scope It -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HNS' }
Should -Invoke Get-Module -Times 1 -Scope It -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HNS' }

# NOTE: Because we are piping the HNS module info from Get-Module, Pester's Should -Invoke
# often struggle to intercept commands invoked via the pipeline, especially when parameter
# binding happens implicitly or when the function relies on parameter value from a piped object.
Should -Invoke Import-Module -Times 1 -Scope It -ModuleName 'ContainerNetworkTools'
}

It "Should throw an error when importing HNS module fails" {
Mock Get-Module -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HostNetworkingService' }
Mock Get-Module -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HNS' } -MockWith { return @{} }
Mock Get-Module -ModuleName 'ContainerNetworkTools' -ParameterFilter { $Name -eq 'HNS' } -MockWith { return @{ Name = 'HNS' } }
Mock Import-Module -ModuleName 'ContainerNetworkTools' -MockWith { Throw 'Error message.' }

{ Initialize-NatNetwork -Force } | Should -Throw "Could not import HNS module. Error message."
Expand Down
21 changes: 19 additions & 2 deletions Tests/NerdctlTools.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,24 @@ Describe "NerdctlTools.psm1" {
}

It "Should successfully purge program data" {
Uninstall-Nerdctl -Path 'TestDrive:\Program Files\nerdctl' -Confirm:$false -Force -Purge
$mockPath = 'TestDrive:\Program Files\nerdctl'
Mock Get-ChildItem -ModuleName 'NerdctlTools' -ParameterFilter { $Path -eq "$mockPath" } -MockWith {
return @(
New-MockObject -Type 'System.IO.DirectoryInfo' -Properties @{
FullName = "$mockPath\nerdctl.exe"
Name = 'nerdctl.exe'
Length = 27259904
DirectoryName = "$mockPath"
Directory = "$mockPath"
PSIsContainer = $false
}
)
}

$mockProcess = New-MockObject -Type 'System.Diagnostics.Process' -Properties @{ ExitCode = 0 }
Mock Invoke-ExecutableCommand -ModuleName "NerdctlTools" -MockWith { return $mockProcess }

Uninstall-Nerdctl -Path "$mockPath" -Confirm:$false -Force -Purge

# Should purge program data
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "NerdctlTools" `
Expand All @@ -194,7 +211,7 @@ Describe "NerdctlTools.psm1" {
-ParameterFilter { $Feature -eq "nerdctl" }
Should -Invoke Invoke-ExecutableCommand -Time 1 -Scope It -ModuleName "NerdctlTools" -ParameterFilter {
$executable -eq "TestDrive:\Program Files\nerdctl\nerdctl.exe" -and
$arguments -eq "system prune --all"
$arguments -eq "system prune --all --force"
}
}

Expand Down
56 changes: 22 additions & 34 deletions containers-toolkit/Public/BuildkitTools.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function Install-Buildkit {

[Parameter(ParameterSetName = 'Setup')]
[Parameter(HelpMessage = "Path to Windows CNI plugin. Defaults to `$ENV:ProgramFiles\Containerd\cni")]
[string]$WinCNIPath="$ENV:ProgramFiles\Containerd\cni",
[string]$WinCNIPath = "$ENV:ProgramFiles\Containerd\cni",

[Parameter(ParameterSetName = 'Install')]
[Parameter(ParameterSetName = 'Setup')]
Expand Down Expand Up @@ -140,7 +140,7 @@ function Install-Buildkit {
}
}
catch {
Write-Warning "Failed to registed and start Buildkitd service. $_"
Write-Warning "Failed to set up Buildkitd service. $_"
}

if ($showCommands) {
Expand Down Expand Up @@ -213,10 +213,10 @@ function Register-BuildkitdService {
)]
param(
[parameter(HelpMessage = "Windows CNI plugin path. Defaults to `$ENV:ProgramFiles\Containerd\cni")]
[String]$WinCNIPath= "$ENV:ProgramFiles\Containerd\cni",
[String]$WinCNIPath = "$ENV:ProgramFiles\Containerd\cni",

[parameter(HelpMessage = "Buildkit path. Defaults to `$ENV:ProgramFiles\Buildkit")]
[String]$BuildKitPath= "$ENV:ProgramFiles\Buildkit",
[String]$BuildKitPath = "$ENV:ProgramFiles\Buildkit",

[parameter(HelpMessage = "Specify to start Buildkitd service after registration is complete")]
[Switch]$Start,
Expand Down Expand Up @@ -285,7 +285,7 @@ function Register-BuildkitdService {
Write-Debug "CNI conf path: $cniConfPath"

# Register buildkit service
$command = "$buildkitdExecutable --register-service --debug --containerd-worker=true --containerd-cni-config-path=`"$cniConfPath`" --containerd-cni-binary-dir=`"$cniBinDir`" --service-name buildkitd"
$arguments = "--register-service --debug --containerd-worker=true --containerd-cni-config-path=`"$cniConfPath`" --containerd-cni-binary-dir=`"$cniBinDir`" --service-name buildkitd"
if (Test-ConfFileEmpty -Path $cniConfPath) {

$consent = $force
Expand All @@ -295,20 +295,16 @@ function Register-BuildkitdService {

if ($consent) {
Write-Warning "Containerd conf file not found at $cniConfPath. Buildkit service will be registered without Containerd cni configurations."
$command = "$buildkitdExecutable --register-service --debug --containerd-worker=true --service-name buildkitd"
$arguments = "--register-service --debug --containerd-worker=true --service-name buildkitd"
}
else {
Write-Error "Failed to register buildkit service. Containerd conf file not found at $cniConfPath.`n`t1. Ensure that the required CNI plugins are installed or you can install them using 'Install-WinCNIPlugin'.`n`t2. Create the file to resolve this issue .`n`t3. Rerun this command 'Register-BuildkitdService'"
Throw "Failed to register buildkit service. Containerd conf file not found at $cniConfPath."
}
}

# remove the executable extension from the command
$escapedPath = [regex]::Escape($buildkitdExecutable)
$arguments = ($command -replace "$escapedPath", "").Trim()

# Register the service
$output = Invoke-ExecutableCommand -Executable $buildkitdExecutable -Arguments $arguments
$output = Invoke-ExecutableCommand -Executable "$buildkitdExecutable" -Arguments $arguments
if ($output.ExitCode -ne 0) {
Throw "Failed to register buildkitd service. $($output.StandardError.ReadToEnd())"
}
Expand Down Expand Up @@ -386,11 +382,6 @@ function Uninstall-Buildkit {

process {
if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, $WhatIfMessage)) {
if (Test-EmptyDirectory -Path "$path") {
Write-Output "$tool does not exist at '$Path' or the directory is empty"
return
}

$consent = $force
if (!$ENV:PESTER) {
$consent = $force -or $PSCmdlet.ShouldContinue($env:COMPUTERNAME, "Are you sure you want to uninstall Buildkit from '$path'?")
Expand Down Expand Up @@ -426,23 +417,20 @@ function Uninstall-BuildkitHelper {
[Switch] $Purge
)

if (Test-EmptyDirectory -Path "$Path") {
Write-Error "Buildkit does not exist at '$Path' or the directory is empty."
return
}

try {
if (Test-ServiceRegistered -Service 'Buildkitd') {
Stop-BuildkitdService
Unregister-Buildkitd -BuildkitPath "$Path"
if (-not (Test-EmptyDirectory -Path "$Path")) {
try {
if (Test-ServiceRegistered -Service 'Buildkitd') {
Stop-BuildkitdService
Unregister-Buildkitd -BuildkitPath "$Path"
}
}
catch {
Throw "Could not stop or unregister buildkitd service. $_"
}
}
catch {
Throw "Could not stop or unregister buildkitd service. $_"
}

# Remove the folder where buildkit is installed and related folders
Remove-Item -Path "$Path" -Recurse -Force
# Remove the folder where buildkit is installed and related folders
Remove-Item -Path "$Path" -Recurse -Force
}

if ($Purge) {
Write-Output "Purging Buildkit program data"
Expand Down Expand Up @@ -494,10 +482,10 @@ function Unregister-Buildkitd($buildkitPath) {
}

# Unregister buildkit service
$buildkitdExecutable = "$buildkitPath\bin\buildkitd.exe"
$buildkitdExecutable = (Get-ChildItem -Path "$buildkitPath" -Recurse -Filter "buildkitd.exe").FullName | Select-Object -First 1

Write-Debug "Buildkitd path: $buildkitdExecutable "
$output = Invoke-ExecutableCommand -Executable $buildkitdExecutable -Arguments "--unregister-service"
Write-Debug "Buildkitd path: '$buildkitdExecutable'"
$output = Invoke-ExecutableCommand -Executable "$buildkitdExecutable" -Arguments "--unregister-service"
if ($output.ExitCode -ne 0) {
Throw "Could not unregister buildkitd service. $($output.StandardError.ReadToEnd())"
}
Expand Down
8 changes: 4 additions & 4 deletions containers-toolkit/Public/ContainerNetworkTools.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -380,10 +380,10 @@ function Import-HNSModule {
return
}

$ModuleName = 'HNS'
# https://www.powershellgallery.com/packages/HNS/0.2.4
if (Get-Module -ListAvailable -Name $ModuleName) {
Import-Module -Name $ModuleName -DisableNameChecking -Force:$Force
# Check and import HostNetworkingService module
$hnsModule = Get-Module -ListAvailable -Name 'HNS' -ErrorAction SilentlyContinue
if ($hnsModule) {
$hnsModule | Import-Module -DisableNameChecking -Force:$force
return
}

Expand Down
Loading