Public/Test-CloudConnection.ps1
|
function Test-CloudConnection { <# .SYNOPSIS Tests the validity of stored cloud provider credentials. .DESCRIPTION Tests whether stored credentials for cloud providers are still valid. Makes a lightweight read-only API call to verify authentication. Returns connection test results without throwing on auth failure. When run without parameters, defaults to testing all providers (equivalent to -All). .EXAMPLE Test-CloudConnection -Provider Azure Tests Azure credentials validity. .EXAMPLE Test-CloudConnection -All Tests all stored provider credentials. .EXAMPLE Test-CloudConnection Tests all stored provider credentials (equivalent to -All). .EXAMPLE Test-CloudConnection -All | Where-Object { -not $_.Connected } Shows all providers with invalid or expired credentials. #> [CmdletBinding()] [OutputType([pscustomobject])] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'All', Justification='Parameter is used via ParameterSetName mechanism')] param( # The cloud provider to test. [Parameter()] [ValidateSet('Azure', 'AWS', 'GCP')] [string]$Provider, # Test all providers with stored credentials. [Parameter(ParameterSetName = 'All')] [switch]$All ) process { $providersToTest = if ($PSCmdlet.ParameterSetName -eq 'All') { @('Azure', 'AWS', 'GCP') } elseif ($Provider) { @($Provider) } else { # Default to -All when neither -Provider nor -All is supplied @('Azure', 'AWS', 'GCP') } foreach ($providerName in $providersToTest) { $ctx = $script:PSCumulusContext.Providers[$providerName] $connected = $false $message = 'No session context found' if ($null -ne $ctx) { try { switch ($providerName) { 'Azure' { Assert-CommandAvailable -CommandName 'Get-AzContext' -InstallHint '' -ErrorAction SilentlyContinue $azContext = Get-AzContext -ErrorAction SilentlyContinue if ($null -ne $azContext -and $null -ne $azContext.Account) { $connected = $true $message = "Connected as $($azContext.Account.Id)" } else { $message = 'Azure session not connected' } } 'AWS' { Assert-CommandAvailable -CommandName 'Get-AWSCredential' -InstallHint '' -ErrorAction SilentlyContinue $cred = Get-AWSCredential -ListStored -ErrorAction SilentlyContinue | Select-Object -First 1 if ($null -ne $cred) { $connected = $true $message = "Credential stored: $($cred.ProfileName)" } else { $message = 'No AWS credentials found' } } 'GCP' { Assert-CommandAvailable -CommandName 'gcloud' -InstallHint '' -ErrorAction SilentlyContinue $gcloudAuth = gcloud auth list --format=json 2>$null | ConvertFrom-Json -ErrorAction SilentlyContinue if ($null -ne $gcloudAuth -and $gcloudAuth.Count -gt 0) { $activeAccount = $gcloudAuth | Where-Object { $_.Status -eq 'ACTIVE' } | Select-Object -First 1 if ($null -ne $activeAccount) { $connected = $true $message = "Authenticated as $($activeAccount.Account)" } else { $message = 'No active GCP account' } } else { $message = 'GCP authentication check failed' } } } } catch { $message = "Connection test failed: $($_.Exception.Message)" } } [pscustomobject]@{ PSTypeName = 'PSCumulus.ConnectionTestResult' Provider = $providerName Connected = $connected Message = $message } } } } |