Public/Get-LMDeviceDataSourceList.ps1

<#
.SYNOPSIS
Retrieves a list of device data sources from LogicMonitor.

.DESCRIPTION
The Get-LMDeviceDatasourceList function retrieves a list of device data sources from LogicMonitor based on the specified parameters. It supports filtering by device ID or device name, and allows customization of the batch size for pagination.

.PARAMETER Id
Specifies the ID of the device for which to retrieve the data sources. This parameter is mandatory when using the 'Id' parameter set.

.PARAMETER Name
Specifies the name of the device for which to retrieve the data sources. This parameter is mandatory when using the 'Name' parameter set.

.PARAMETER Filter
Specifies additional filters to apply to the data sources. This parameter accepts an object representing the filter criteria.

.PARAMETER BatchSize
Specifies the number of data sources to retrieve per batch. The default value is 1000.

.EXAMPLE
Get-LMDeviceDatasourceList -Id 1234
Retrieves the data sources for the device with ID 1234.

.EXAMPLE
Get-LMDeviceDatasourceList -Name "MyDevice"
Retrieves the data sources for the device with the name "MyDevice".

.EXAMPLE
Get-LMDeviceDatasourceList -Filter "Property -eq 'Value'"
Retrieves the data sources that match the specified filter criteria.

#>

Function Get-LMDeviceDatasourceList {
    [CmdletBinding(DefaultParameterSetName = 'Id')]
    Param (
        [Parameter(Mandatory, ParameterSetName = 'Id')]
        [Alias('DeviceId')]
        [Int]$Id,

        [Parameter(ParameterSetName = 'Name')]
        [Alias('DeviceName')]
        [String]$Name,

        [Object]$Filter,

        [ValidateRange(1, 1000)]
        [Int]$BatchSize = 1000
    )
    # Rest of the code...
}

Function Get-LMDeviceDatasourceList {

    [CmdletBinding(DefaultParameterSetName = 'Id')]
    Param (
        [Parameter(Mandatory, ParameterSetName = 'Id')]
        [Alias('DeviceId')]
        [Int]$Id,

        [Parameter(ParameterSetName = 'Name')]
        [Alias('DeviceName')]
        [String]$Name,

        [Object]$Filter,

        [ValidateRange(1, 1000)]
        [Int]$BatchSize = 1000
    )
    #Check if we are logged in and have valid api creds
    If ($Script:LMAuth.Valid) {

        If ($Name) {
            $LookupResult = (Get-LMDevice -Name $Name).Id
            If (Test-LookupResult -Result $LookupResult -LookupString $Name) {
                return
            }
            $Id = $LookupResult
        }
        
        #Build header and uri
        $ResourcePath = "/device/devices/$Id/devicedatasources"

        #Initalize vars
        $QueryParams = ""
        $Count = 0
        $Done = $false
        $Results = @()

        #Loop through requests
        While (!$Done) {
            #Build query params
            $QueryParams = "?size=$BatchSize&offset=$Count&sort=+id"

            If ($Filter) {
                #List of allowed filter props
                $PropList = @()
                $ValidFilter = Format-LMFilter -Filter $Filter -PropList $PropList
                $QueryParams = "?filter=$ValidFilter&size=$BatchSize&offset=$Count&sort=+id"
            }

            Try {
                $Headers = New-LMHeader -Auth $Script:LMAuth -Method "GET" -ResourcePath $ResourcePath
                $Uri = "https://$($Script:LMAuth.Portal).logicmonitor.com/santaba/rest" + $ResourcePath + $QueryParams
                    
                
                
                Resolve-LMDebugInfo -Url $Uri -Headers $Headers[0] -Command $MyInvocation

                #Issue request
                $Response = Invoke-RestMethod -Uri $Uri -Method "GET" -Headers $Headers[0] -WebSession $Headers[1]

                #Stop looping if single device, no need to continue
                If (![bool]$Response.psobject.Properties["total"]) {
                    $Done = $true
                    Return (Add-ObjectTypeInfo -InputObject $Response -TypeName "LogicMonitor.DeviceDatasourceList" )
                }
                #Check result size and if needed loop again
                Else {
                    [Int]$Total = $Response.Total
                    [Int]$Count += ($Response.Items | Measure-Object).Count
                    $Results += $Response.Items
                    If ($Count -ge $Total) {
                        $Done = $true
                    }
                }
            }
            Catch [Exception] {
                $Proceed = Resolve-LMException -LMException $PSItem
                If (!$Proceed) {
                    Return
                }
            }
        }
        Return (Add-ObjectTypeInfo -InputObject $Results -TypeName "LogicMonitor.DeviceDatasourceList" )
    }
    Else {
        Write-Error "Please ensure you are logged in before running any commands, use Connect-LMAccount to login and try again."
    }
}