Skip to content

Commit cde87ae

Browse files
Copilotjtracey93
andcommitted
Add NetworkConnectivity pre-flight check to Test-AcceleratorRequirement
Co-authored-by: jtracey93 <41163455+jtracey93@users.noreply.github.com> Agent-Logs-Url: https://github.com/Azure/ALZ-PowerShell-Module/sessions/0b9f35e0-c938-411a-841a-734c6907f833
1 parent 7bf760c commit cde87ae

4 files changed

Lines changed: 160 additions & 5 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function Test-NetworkConnectivity {
2+
[CmdletBinding()]
3+
param()
4+
5+
$results = @()
6+
$hasFailure = $false
7+
8+
$endpoints = @(
9+
@{ Uri = "https://api.github.com"; Description = "GitHub API (release lookups)" },
10+
@{ Uri = "https://github.com"; Description = "GitHub (module downloads)" },
11+
@{ Uri = "https://api.releases.hashicorp.com"; Description = "HashiCorp Releases API (Terraform version)" },
12+
@{ Uri = "https://releases.hashicorp.com"; Description = "HashiCorp Releases (Terraform binary download)" },
13+
@{ Uri = "https://management.azure.com"; Description = "Azure Management API" }
14+
)
15+
16+
foreach ($endpoint in $endpoints) {
17+
Write-Verbose "Testing network connectivity to $($endpoint.Uri)"
18+
try {
19+
Invoke-WebRequest -Uri $endpoint.Uri -Method Head -TimeoutSec 10 -SkipHttpErrorCheck -ErrorAction Stop -UseBasicParsing | Out-Null
20+
$results += @{
21+
message = "Network connectivity to $($endpoint.Description) ($($endpoint.Uri)) is available."
22+
result = "Success"
23+
}
24+
} catch {
25+
$results += @{
26+
message = "Cannot reach $($endpoint.Description) ($($endpoint.Uri)). Check network/firewall settings. Error: $($_.Exception.Message)"
27+
result = "Failure"
28+
}
29+
$hasFailure = $true
30+
}
31+
}
32+
33+
return @{
34+
Results = $results
35+
HasFailure = $hasFailure
36+
}
37+
}

src/ALZ/Private/Tools/Test-Tooling.ps1

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ function Test-Tooling {
22
[CmdletBinding(SupportsShouldProcess = $true)]
33
param(
44
[Parameter(Mandatory = $false)]
5-
[ValidateSet("PowerShell", "Git", "AzureCli", "AzureEnvVars", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion", "YamlModule", "YamlModuleAutoInstall", "GitHubCli", "AzureDevOpsCli")]
5+
[ValidateSet("PowerShell", "Git", "AzureCli", "AzureEnvVars", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion", "YamlModule", "YamlModuleAutoInstall", "GitHubCli", "AzureDevOpsCli", "NetworkConnectivity")]
66
[string[]]$Checks = @("PowerShell", "Git", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion"),
77
[Parameter(Mandatory = $false)]
88
[switch]$destroy
@@ -91,6 +91,13 @@ function Test-Tooling {
9191
if ($result.HasFailure) { $hasFailure = $true }
9292
}
9393

94+
# Check Network Connectivity
95+
if ($Checks -contains "NetworkConnectivity") {
96+
$result = Test-NetworkConnectivity
97+
$checkResults += $result.Results
98+
if ($result.HasFailure) { $hasFailure = $true }
99+
}
100+
94101
# Display results
95102
Write-Verbose "Showing check results"
96103
Write-Verbose $(ConvertTo-Json $checkResults -Depth 100)

src/ALZ/Public/Test-AcceleratorRequirement.ps1

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ function Test-AcceleratorRequirement {
33
.SYNOPSIS
44
Test that the Accelerator software requirements are met
55
.DESCRIPTION
6-
This will check for the pre-requisite software
6+
This will check for the pre-requisite software and network connectivity to the external endpoints required by the Accelerator.
77
.EXAMPLE
88
C:\PS> Test-AcceleratorRequirement
99
.EXAMPLE
@@ -20,10 +20,10 @@ function Test-AcceleratorRequirement {
2020
param (
2121
[Parameter(
2222
Mandatory = $false,
23-
HelpMessage = "[OPTIONAL] Specifies which checks to run. Valid values: PowerShell, Git, AzureCli, AzureEnvVars, AzureCliOrEnvVars, AzureLogin, AlzModule, AlzModuleVersion, YamlModule, YamlModuleAutoInstall, GitHubCli, AzureDevOpsCli"
23+
HelpMessage = "[OPTIONAL] Specifies which checks to run. Valid values: PowerShell, Git, AzureCli, AzureEnvVars, AzureCliOrEnvVars, AzureLogin, AlzModule, AlzModuleVersion, YamlModule, YamlModuleAutoInstall, GitHubCli, AzureDevOpsCli, NetworkConnectivity"
2424
)]
25-
[ValidateSet("PowerShell", "Git", "AzureCli", "AzureEnvVars", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion", "YamlModule", "YamlModuleAutoInstall", "GitHubCli", "AzureDevOpsCli")]
26-
[string[]]$Checks = @("PowerShell", "Git", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion")
25+
[ValidateSet("PowerShell", "Git", "AzureCli", "AzureEnvVars", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion", "YamlModule", "YamlModuleAutoInstall", "GitHubCli", "AzureDevOpsCli", "NetworkConnectivity")]
26+
[string[]]$Checks = @("PowerShell", "Git", "AzureCliOrEnvVars", "AzureLogin", "AlzModule", "AlzModuleVersion", "NetworkConnectivity")
2727
)
2828
Test-Tooling -Checks $Checks
2929
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#-------------------------------------------------------------------------
2+
Set-Location -Path $PSScriptRoot
3+
#-------------------------------------------------------------------------
4+
$ModuleName = 'ALZ'
5+
$PathToManifest = [System.IO.Path]::Combine('..', '..', '..', $ModuleName, "$ModuleName.psd1")
6+
#-------------------------------------------------------------------------
7+
if (Get-Module -Name $ModuleName -ErrorAction 'SilentlyContinue') {
8+
#if the module is already in memory, remove it
9+
Remove-Module -Name $ModuleName -Force
10+
}
11+
Import-Module $PathToManifest -Force
12+
#-------------------------------------------------------------------------
13+
14+
InModuleScope 'ALZ' {
15+
Describe 'Test-NetworkConnectivity Private Function Tests' -Tag Unit {
16+
BeforeAll {
17+
$WarningPreference = 'SilentlyContinue'
18+
$ErrorActionPreference = 'SilentlyContinue'
19+
}
20+
21+
Context 'All endpoints are reachable' {
22+
BeforeAll {
23+
Mock -CommandName Invoke-WebRequest -MockWith {
24+
[PSCustomObject]@{ StatusCode = 200 }
25+
}
26+
}
27+
28+
It 'returns HasFailure = $false when all endpoints succeed' {
29+
$result = Test-NetworkConnectivity
30+
$result.HasFailure | Should -BeFalse
31+
}
32+
33+
It 'returns a Success result for every endpoint' {
34+
$result = Test-NetworkConnectivity
35+
$result.Results | ForEach-Object {
36+
$_.result | Should -Be "Success"
37+
}
38+
}
39+
40+
It 'returns one result per endpoint (5 total)' {
41+
$result = Test-NetworkConnectivity
42+
$result.Results.Count | Should -Be 5
43+
}
44+
}
45+
46+
Context 'One endpoint is unreachable' {
47+
BeforeAll {
48+
Mock -CommandName Invoke-WebRequest -ParameterFilter { $Uri -eq "https://api.github.com" } -MockWith {
49+
throw "Unable to connect to the remote server"
50+
}
51+
Mock -CommandName Invoke-WebRequest -MockWith {
52+
[PSCustomObject]@{ StatusCode = 200 }
53+
}
54+
}
55+
56+
It 'returns HasFailure = $true' {
57+
$result = Test-NetworkConnectivity
58+
$result.HasFailure | Should -BeTrue
59+
}
60+
61+
It 'returns a Failure result for the unreachable endpoint' {
62+
$result = Test-NetworkConnectivity
63+
$failureResults = @($result.Results | Where-Object { $_.result -eq "Failure" })
64+
$failureResults.Count | Should -Be 1
65+
}
66+
67+
It 'includes the error message in the Failure result' {
68+
$result = Test-NetworkConnectivity
69+
$failureResult = @($result.Results | Where-Object { $_.result -eq "Failure" })[0]
70+
$failureResult.message | Should -Match "Cannot reach"
71+
$failureResult.message | Should -Match "api.github.com"
72+
}
73+
74+
It 'still returns Success results for the reachable endpoints' {
75+
$result = Test-NetworkConnectivity
76+
$successResults = @($result.Results | Where-Object { $_.result -eq "Success" })
77+
$successResults.Count | Should -Be 4
78+
}
79+
}
80+
81+
Context 'All endpoints are unreachable' {
82+
BeforeAll {
83+
Mock -CommandName Invoke-WebRequest -MockWith {
84+
throw "Network unreachable"
85+
}
86+
}
87+
88+
It 'returns HasFailure = $true' {
89+
$result = Test-NetworkConnectivity
90+
$result.HasFailure | Should -BeTrue
91+
}
92+
93+
It 'returns a Failure result for every endpoint' {
94+
$result = Test-NetworkConnectivity
95+
$result.Results | ForEach-Object {
96+
$_.result | Should -Be "Failure"
97+
}
98+
}
99+
100+
It 'returns one result per endpoint (5 total)' {
101+
$result = Test-NetworkConnectivity
102+
$result.Results.Count | Should -Be 5
103+
}
104+
105+
It 'checks all endpoints and does not stop at the first failure' {
106+
$result = Test-NetworkConnectivity
107+
Should -Invoke -CommandName Invoke-WebRequest -Times 5 -Scope It
108+
}
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)