Public/Set-LMCollectorGroup.ps1

<#
.SYNOPSIS
Updates a LogicMonitor collector group's configuration.

.DESCRIPTION
The Set-LMCollectorGroup function modifies an existing collector group's settings, including its name, description, properties, and auto-balance settings.

.PARAMETER Id
Specifies the ID of the collector group to modify. This parameter is mandatory when using the 'Id' parameter set.

.PARAMETER Name
Specifies the current name of the collector group. This parameter is mandatory when using the 'Name' parameter set.

.PARAMETER NewName
Specifies the new name for the collector group.

.PARAMETER Description
Specifies a new description for the collector group.

.PARAMETER Properties
Specifies a hashtable of custom properties to set for the collector group.

.PARAMETER AutoBalance
Specifies whether to enable auto-balancing for the collector group.

.PARAMETER AutoBalanceInstanceCountThreshold
Specifies the threshold for auto-balancing the collector group.

.EXAMPLE
Set-LMCollectorGroup -Id 123 -NewName "Updated Group" -AutoBalance $true
Updates the collector group with ID 123 with a new name and enables auto-balancing.

.INPUTS
You can pipe objects containing Id properties to this function.

.OUTPUTS
Returns a LogicMonitor.CollectorGroup object containing the updated group information.

.NOTES
This function requires a valid LogicMonitor API authentication.
#>

Function Set-LMCollectorGroup {

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'None')]
    Param (

        [Parameter(ParameterSetName = 'Id', ValueFromPipelineByPropertyName)]
        [Int]$Id,

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

        [String]$NewName,

        [String]$Description,

        [Hashtable]$Properties,

        [Nullable[boolean]]$AutoBalance,

        [Nullable[Int]]$AutoBalanceInstanceCountThreshold

    )
    #Check if we are logged in and have valid api creds
    Begin {}
    Process {
        If ($Script:LMAuth.Valid) {
            #Lookup Collector Name
            If ($Name) {
                $LookupResult = (Get-LMCollectorGroup -Name $Name).Id
                If (Test-LookupResult -Result $LookupResult -LookupString $Name) {
                    return
                }
                $Id = $LookupResult
            }

            #Build custom props hashtable
            $customProperties = @()
            If ($Properties) {
                Foreach ($Key in $Properties.Keys) {
                    $customProperties += @{name = $Key; value = $Properties[$Key] }
                }
            }
                    
            #Build header and uri
            $ResourcePath = "/setting/collector/groups/$Id"

            If ($PSItem) {
                $Message = "Id: $Id | Name: $($PSItem.name) | Description: $($PSItem.description)"
            }
            Elseif ($Name) {
                $Message = "Id: $Id | Name: $Name)"
            }
            Else {
                $Message = "Id: $Id"
            }

            Try {
                $Data = @{
                    description                       = $Description
                    name                              = $NewName
                    collectorGroupId                  = $CollectorGroupId
                    customProperties                  = $customProperties
                    autoBalance                       = $AutoBalance
                    autoBalanceInstanceCountThreshold = $AutoBalanceInstanceCountThreshold
                }

            
                #Remove empty keys so we dont overwrite them
                @($Data.keys) | ForEach-Object { If ([string]::IsNullOrEmpty($Data[$_]) -and ($_ -notin @($MyInvocation.BoundParameters.Keys))) { $Data.Remove($_) } }

                $Data = ($Data | ConvertTo-Json)

                If ($PSCmdlet.ShouldProcess($Message, "Set Collector Group")) {  
                    $Headers = New-LMHeader -Auth $Script:LMAuth -Method "PATCH" -ResourcePath $ResourcePath -Data $Data
                    $Uri = "https://$($Script:LMAuth.Portal).logicmonitor.com/santaba/rest" + $ResourcePath

                    Resolve-LMDebugInfo -Url $Uri -Headers $Headers[0] -Command $MyInvocation -Payload $Data

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

                    Return (Add-ObjectTypeInfo -InputObject $Response -TypeName "LogicMonitor.CollectorGroup" )
                }
            }
            Catch [Exception] {
                $Proceed = Resolve-LMException -LMException $PSItem
                If (!$Proceed) {
                    Return
                }
            }
        }
        Else {
            Write-Error "Please ensure you are logged in before running any commands, use Connect-LMAccount to login and try again."
        }
    }
    End {}
}