Public/Tenant/Restart-VergeTenant.ps1
|
function Restart-VergeTenant { <# .SYNOPSIS Restarts a VergeOS tenant. .DESCRIPTION Restart-VergeTenant sends a reset command to one or more tenants. This performs a hard reset of the tenant (similar to pressing a physical reset button). The cmdlet supports pipeline input from Get-VergeTenant for bulk operations. .PARAMETER Name The name of the tenant to restart. Supports wildcards (* and ?). .PARAMETER Key The unique key (ID) of the tenant to restart. .PARAMETER Tenant A tenant object from Get-VergeTenant. Accepts pipeline input. .PARAMETER PassThru Return the tenant object after restarting. By default, no output is returned. .PARAMETER Server The VergeOS connection to use. Defaults to the current default connection. .EXAMPLE Restart-VergeTenant -Name "Customer01" Restarts the tenant named "Customer01". .EXAMPLE Restart-VergeTenant -Name "Prod*" Restarts all tenants whose names start with "Prod". .EXAMPLE Get-VergeTenant -Status Online | Restart-VergeTenant Restarts all online tenants. .EXAMPLE Restart-VergeTenant -Name "Customer01" -PassThru Restarts the tenant and returns the updated tenant object. .OUTPUTS None by default. Verge.Tenant when -PassThru is specified. .NOTES Use Start-VergeTenant to power on tenants. Use Stop-VergeTenant to power off tenants. The tenant must be running to be restarted. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'ByName')] [OutputType([PSCustomObject])] param( [Parameter(Mandatory, Position = 0, ParameterSetName = 'ByName')] [SupportsWildcards()] [string]$Name, [Parameter(Mandatory, ParameterSetName = 'ByKey')] [int]$Key, [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'ByTenant')] [PSTypeName('Verge.Tenant')] [PSCustomObject]$Tenant, [Parameter()] [switch]$PassThru, [Parameter()] [object]$Server ) begin { # Resolve connection if (-not $Server) { $Server = $script:DefaultConnection } if (-not $Server) { throw [System.InvalidOperationException]::new( 'Not connected to VergeOS. Use Connect-VergeOS to establish a connection.' ) } } process { # Get tenants to restart based on parameter set $tenantsToRestart = switch ($PSCmdlet.ParameterSetName) { 'ByName' { Get-VergeTenant -Name $Name -Server $Server } 'ByKey' { Get-VergeTenant -Key $Key -Server $Server } 'ByTenant' { $Tenant } } foreach ($targetTenant in $tenantsToRestart) { if (-not $targetTenant) { continue } # Check if tenant is a snapshot if ($targetTenant.IsSnapshot) { Write-Error -Message "Cannot restart tenant '$($targetTenant.Name)': Tenant is a snapshot" -ErrorId 'CannotRestartSnapshot' continue } # Check if tenant is running if (-not $targetTenant.IsRunning -and $targetTenant.Status -eq 'Offline') { Write-Error -Message "Cannot restart tenant '$($targetTenant.Name)': Tenant is not running. Use Start-VergeTenant to power on the tenant first." -ErrorId 'TenantNotRunning' continue } # Build action body $body = @{ tenant = $targetTenant.Key action = 'reset' } # Confirm action if ($PSCmdlet.ShouldProcess($targetTenant.Name, 'Restart Tenant')) { try { Write-Verbose "Restarting tenant '$($targetTenant.Name)' (Key: $($targetTenant.Key))" $response = Invoke-VergeAPI -Method POST -Endpoint 'tenant_actions' -Body $body -Connection $Server Write-Verbose "Reset command sent for tenant '$($targetTenant.Name)'" if ($PassThru) { # Return refreshed tenant object Start-Sleep -Milliseconds 500 Get-VergeTenant -Key $targetTenant.Key -Server $Server } } catch { Write-Error -Message "Failed to restart tenant '$($targetTenant.Name)': $($_.Exception.Message)" -ErrorId 'TenantRestartFailed' } } } } } |