Helpers/Remove-GraylogSidecarConfigurationAssignment.ps1

<#
    .SYNOPSIS
        Remove the assigned configuration for the graylog node and collector.
 
    .DESCRIPTION
        Invoke a web request on the Graylog API to remove the currently assigned
        configuration for the specified node an collector.
 
    .EXAMPLE
        PS C:\> Remove-GraylogSidecarConfigurationAssignment -Uri 'https://graylog.contoso.com/api' -Credential $cred -NodeId '99b5a37c-a277-444e-b8fd-c261c18ac5bd' -CollectorId '5d06f16771c02a78f6ed644f'
        Remove the assigned configuration.
#>

function Remove-GraylogSidecarConfigurationAssignment
{
    [CmdletBinding()]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Uri,

        [Parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $Credential,

        [Parameter(Mandatory = $true)]
        [System.String]
        $NodeId,

        [Parameter(Mandatory = $true)]
        [System.String]
        $CollectorId
    )

    # Cerate basic authoriazion as base64 encoded string
    $auth = 'Basic {0}' -f [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(('{0}:{1}' -f $Credential.Username, $Credential.GetNetworkCredential().Password)))

    try
    {
        # Get the current graylog sidecar configuration, including assignments
        $graylogSidecarSplat = @{
            Method  = 'Get'
            Uri     = '{0}/sidecars/{1}' -f $Uri.TrimEnd('/'), $NodeId
            Headers = @{
                Authorization = $auth
            }
        }
        $graylogSidecar = Invoke-RestMethod @graylogSidecarSplat -ErrorAction 'Stop'

        # Create a new assignment array without our collector id
        $assignments = @($graylogSidecar.assignments | Where-Object { $_.collector_id -ne $CollectorId })

        # Create a new request to push the desired assignments
        $graylogSidecarConfigurationAssignmentSplat = @{
            Method  = 'Put'
            Uri     = '{0}/sidecars/configurations' -f $Uri.TrimEnd('/')
            Body    = (@{
                nodes = @(
                    @{
                        node_id     = $NodeId
                        assignments = $assignments
                    }
                )
            } | ConvertTo-Json -Depth 4)
            ContentType = 'application/json'
            Headers = @{
                Authorization    = $auth
                'X-Requested-By' = 'XMLHttpRequest'
            }
        }
        Invoke-RestMethod @graylogSidecarConfigurationAssignmentSplat -ErrorAction 'Stop'
    }
    catch
    {
        throw $_
    }
}