Public/Invoke-NexthinkNutanixConnector.ps1

function Invoke-NexthinkNutanixConnector {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$NutanixEnvironment,

        [Parameter(Mandatory = $false)]
        [string]$ScriptRootPath = $script:ModuleRoot
    )

    $exitCode = 0
    $version = Get-ModuleVersion

    try {
        $script:IN_MEMORY_LOGS.Clear()

        $config = Get-Configuration -ScriptRootPath $ScriptRootPath -NutanixEnvironment $NutanixEnvironment

        Initialize-Logger -Config $config
        Initialize-Folder -Config $config -Path $script:STORAGE_FOLDER_NAME | Out-Null

        Write-CustomLog -Message "Starting Nutanix Connector $version for environment: $NutanixEnvironment" -Severity 'INFO'
        Write-CustomLog -Message "Script root path: $ScriptRootPath" -Severity 'DEBUG'
        Write-CustomLog -Message "Successfully loaded configuration for environment: $NutanixEnvironment" -Severity 'DEBUG'

        Remove-SpoolStaleFiles -Config $config -MaxFileCount $script:SPOOL_MAX_FILE_COUNT
        $state = Read-State -Config $config

        try {
            Send-PendingHypervisorEvents -State $state -Config $config | Out-Null
        }
        catch {
            Write-CustomLog -Message "Non-fatal error while sending pending spooled data. Continuing to collect fresh data. Details: $($_.Exception.Message)" -Severity 'ERROR' -NoCache
        }

        $collection = Invoke-NutanixPrismCentralCollection -Config $config -State $state
        $summary = $collection.Summary
        Write-CustomLog -Message "Prism Central collection completed. Hosts=$($summary.Hosts) VMs=$($summary.Vms) Duration=$($summary.DurationSeconds)s" -Severity 'INFO'

        if ($null -ne $collection.Payload -and $collection.Payload.data.Count -gt 0) {
            try {
                Send-VirtualMachines -Config $config -Payload $collection.Payload | Out-Null
            }
            catch {
                Write-CustomLog -Message "Virtual machines step failed. Details: $($_.Exception.Message)" -Severity 'ERROR'
            }

            try {
                # The current payload was spooled by collection; ordered delivery acknowledges it only on success.
                Send-PendingHypervisorEvents -State $state -Config $config | Out-Null
            }
            catch {
                Write-CustomLog -Message "Non-fatal error while sending current payload. Data remains spooled. Details: $($_.Exception.Message)" -Severity 'ERROR' -NoCache
            }
        }

    }
    catch {
        $exitCode = 1
        Write-CustomLog -Message "Error in Nutanix Connector: $_" -Severity 'ERROR'
    }
    finally {
        if ($null -ne $config -and $null -ne $config.NexthinkAPI) {
            try {
                Send-Logs -NutanixEnvironment $NutanixEnvironment `
                    -Version $version `
                    -LogsApiHost $config.NexthinkAPI.HostFQDN `
                    -LoginHost $config.NexthinkAPI.LoginFQDN `
                    -NexthinkTarget $config.NexthinkAPI.WindowsCredentialEntry
            }
            catch {
                Write-CustomLog -Message "Failed to send logs to API: $($_.Exception.Message)" -Severity 'ERROR' -NoCache
            }
        }

        Wait-LoggingFlush
    }

     return $exitCode
}