Public/connect.ps1

function Connect-CSServer {
    <#
    .SYNOPSIS
        Connects to a CloudStack server.
    
    .DESCRIPTION
        Establishes a connection to CloudStack by storing API credentials.
    
    .PARAMETER Credential
        PSCredential object where Username = API Key and Password = Secret Key
    
    .PARAMETER ApiKey
        CloudStack API key (alternative to Credential)
    
    .PARAMETER SecretKey
        CloudStack secret key (alternative to Credential)
    
    .PARAMETER Server
        CloudStack server URL (e.g., http://cloudstack.example.com)
    
    .EXAMPLE
        $cred = Get-Credential
        Connect-CSServer -Credential $cred -Server "http://dc1-c2-csm01.lab.ussignal.cloud"
        
    .EXAMPLE
        Connect-CSServer -ApiKey "xxx" -SecretKey "yyy" -Server "http://cloudstack.example.com"
    #>

    [CmdletBinding(DefaultParameterSetName='Credential')]
    param(
        [Parameter(Mandatory=$true, ParameterSetName='Credential')]
        [PSCredential]$Credential,
        
        [Parameter(Mandatory=$true, ParameterSetName='Manual')]
        [string]$ApiKey,
        
        [Parameter(Mandatory=$true, ParameterSetName='Manual')]
        [string]$SecretKey,
        
        [Parameter(Mandatory=$true)]
        [string]$Server
    )
    
    # Extract credentials based on parameter set
    if ($PSCmdlet.ParameterSetName -eq 'Credential') {
        $apiKeyValue = $Credential.UserName
        $secretKeyValue = $Credential.GetNetworkCredential().Password
    }
    else {
        $apiKeyValue = $ApiKey
        $secretKeyValue = $SecretKey
    }
    
    # Normalize the server URL
    $baseUrl = $Server.TrimEnd('/')
    if (-not $baseUrl.EndsWith('/client/api')) {
        $baseUrl = "$baseUrl/client/api"
    }
    
    # Store connection info in script scope
    $script:CSConnection = @{
        BaseUrl = $baseUrl
        ApiKey = $apiKeyValue
        SecretKey = $secretKeyValue
        Server = $Server
    }
    
    Write-Host "Successfully connected to CloudStack server: $Server" -ForegroundColor Green
}