Public/New-LMDashboardGroup.ps1

<#
.SYNOPSIS
Creates a new LogicMonitor dashboard group.

.DESCRIPTION
The New-LMDashboardGroup function creates a new dashboard group in LogicMonitor. It can be created under a parent group specified by either ID or name.

.PARAMETER Name
The name of the dashboard group. This parameter is mandatory.

.PARAMETER Description
The description of the dashboard group.

.PARAMETER WidgetTokens
A hashtable containing widget tokens for the dashboard group.

.PARAMETER ParentGroupId
The ID of the parent group. Required for GroupId parameter set.

.PARAMETER ParentGroupName
The name of the parent group. Required for GroupName parameter set.

.EXAMPLE
#Create dashboard group using parent ID
New-LMDashboardGroup -Name "Operations" -Description "Operations dashboards" -ParentGroupId 123

.EXAMPLE
#Create dashboard group using parent name
New-LMDashboardGroup -Name "Operations" -Description "Operations dashboards" -ParentGroupName "Root"

.NOTES
You must run Connect-LMAccount before running this command.

.INPUTS
None. You cannot pipe objects to this command.

.OUTPUTS
Returns the created dashboard group object.
#>

Function New-LMDashboardGroup {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [String]$Name,

        [String]$Description,

        [Hashtable]$WidgetTokens,

        [Parameter(Mandatory, ParameterSetName = 'GroupId')]
        [Int]$ParentGroupId,

        [Parameter(Mandatory, ParameterSetName = 'GroupName')]
        [String]$ParentGroupName
    )
    #Check if we are logged in and have valid api creds
    If ($Script:LMAuth.Valid) {

        #Lookup ParentGroupName
        If ($ParentGroupName) {
            If ($ParentGroupName -Match "\*") {
                Write-Error "Wildcard values not supported for groups names."
                return
            }
            $ParentGroupId = (Get-LMDashboardGroup -Name $ParentGroupName | Select-Object -First 1 ).Id
            If (!$ParentGroupId) {
                Write-Error "Unable to find dashboard group: $ParentGroupName, please check spelling and try again." 
                return
            }
        }

        #Build custom props hashtable
        $WidgetTokensArray = @()
        If ($WidgetTokens) {
            Foreach ($Key in $WidgetTokens.Keys) {
                $WidgetTokensArray += @{name = $Key; value = $WidgetTokens[$Key] }
            }
        }
        
        #Build header and uri
        $ResourcePath = "/dashboard/groups"

        Try {
            $Data = @{
                name         = $Name
                description  = $Description
                parentId     = $ParentGroupId
                widgetTokens = $WidgetTokensArray
            }

            $Data = ($Data | ConvertTo-Json)

            $Headers = New-LMHeader -Auth $Script:LMAuth -Method "POST" -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 "POST" -Headers $Headers[0] -WebSession $Headers[1] -Body $Data

            Return $Response
        }
        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."
    }
}