Public/OME/Edit-OMESupportAssistGroup.ps1

using module ..\..\Classes\Device.psm1
using module ..\..\Classes\Group.psm1

function Edit-OMESupportAssistGroup {
<#
Copyright (c) 2018 Dell EMC Corporation
 
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
 
      http://www.apache.org/licenses/LICENSE-2.0
 
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
#>


<#
.SYNOPSIS
    Edit Support Assist group in OpenManage Enterprise
.DESCRIPTION
 
.PARAMETER Group
    Object of type Group returned from Get-OMEGroup function
.PARAMETER EditGroup
    JSON string containing group payload
.PARAMETER Devices
    Array of type Device returned from Get-OMEDevice function.
.PARAMETER Mode
    Method by which devices are added or removed (Default="Append", "Remove")
.INPUTS
    Group
.EXAMPLE
    Get-OMEGroup "Test Group 01" | Edit-OMEGroup
 
    Force group update. This is a workaround that will trigger baselines to update devices in the associated group.
.EXAMPLE
    $TestSupportAssistGroup = '{
        "MyAccountId": "",
        "Name": "Support Assist Group 2",
        "Description": "Support Assist Group",
        "DispatchOptIn": false,
        "CustomerDetails": null,
        "ContactOptIn": false
    }'
    "Support Assist Group 1" | Get-OMEGroup | Edit-OMESupportAssistGroup -EditGroup $TestSupportAssistGroup -Verbose
 
    Edit Support Assist group from json stored in variable
.EXAMPLE
    Get-OMEGroup "Test Group 01" | Edit-OMESupportAssistGroup -EditGroup $(Get-Content "C:\Temp\Group.json" -Raw)
 
    Edit Support Assist group from json stored in file
.EXAMPLE
    Get-OMEGroup "Test Group 01" | Edit-OMESupportAssistGroup -Devices $("PowerEdge R640" | Get-OMEDevice -FilterBy "Model")
 
    Add devices to group
.EXAMPLE
    Get-OMEGroup "Test Group 01" | Edit-OMESupportAssistGroup -Mode "Remove" -Devices $("PowerEdge R640" | Get-OMEDevice -FilterBy "Model")
     
    Remove devices from group
#>


[CmdletBinding()]
param(
    [Parameter(Mandatory, ValueFromPipeline)]
    [Group]$Group,

    [Parameter(Mandatory=$false)]
    [String]$EditGroup,

    [Parameter(Mandatory=$false)]
    [Device[]] $Devices,

    [Parameter(Mandatory=$false)]
    [ValidateSet("Append", "Remove")]
    [String] $Mode = "Append"
)

Begin {
    if(!$SessionAuth.Token){
        Write-Error "Please use Connect-OMEServer first"
        Break
        Return
    }
    # Add version check for SupportAssist commandlets
    if ($SessionAuth.Version -lt [System.Version]"3.5.0") {
        Write-Error "SupportAssist API not supported in version $($SessionAuth.Version) of OpenManage Enterprise"
        Break
        Return
    }
}
Process {
    Try {
        if ($SessionAuth.IgnoreCertificateWarning) { Set-CertPolicy }
        $BaseUri = "https://$($SessionAuth.Host)"
        $GroupURL = $BaseUri + "/api/SupportAssistService/Actions/SupportAssistService.CreateOrUpdateGroup"
        $ContentType = "application/json"
        $Headers = @{}
        $Headers."X-Auth-Token" = $SessionAuth.Token

        # Update devices in group
        if ($Devices.Length -gt 0) {
            $GroupDeviceURL = $BaseUri + "/api/SupportAssistService/Actions/SupportAssistService.AddMemberDevices"
            $GroupDevicePayload = '{
                "GroupId": 0,
                "MemberDeviceIds": []
            }'
 | ConvertFrom-Json
            # Build list of device ids in group currently
            $CurrentDeviceIds = @()
            $CurrentDevices = $Group | Get-OMEDevice
            foreach ($Device in $CurrentDevices) {
                $CurrentDeviceIds += $Device.Id
            }

            # Build list of device ids to be updated
            $DeviceIds = @()
            if ($Mode.ToLower() -eq "append") {
                foreach ($Device in $Devices) {
                    if ($CurrentDeviceIds -notcontains $Device.Id) {
                        $DeviceIds += $Device.Id
                    }
                }
            } elseif ($Mode.ToLower() -eq "remove") {
                $GroupDeviceURL = $BaseUri + "/api/SupportAssistService/Actions/SupportAssistService.RemoveMemberDevices"
                foreach ($Device in $Devices) {
                    $DeviceIds += $Device.Id
                }
            }

            $GroupDevicePayload.MemberDeviceIds = $DeviceIds
            $GroupDevicePayload.GroupId = $Group.Id
            $GroupDevicePayload = $GroupDevicePayload | ConvertTo-Json -Depth 6
            Write-Verbose $GroupDevicePayload
            if ($DeviceIds.Length -gt 0) {
                $GroupDeviceResponse = Invoke-WebRequest -Uri $GroupDeviceURL -Headers $Headers -ContentType $ContentType -Method POST -Body $GroupDevicePayload
                Write-Verbose "Updating group devices..."
                if ($GroupDeviceResponse.StatusCode -eq 200 -or $GroupDeviceResponse.StatusCode -eq 202) {
                    Write-Verbose "Group device update successful..."
                }
                else {
                    Write-Error "Group device update failed..."
                }
            } else {
                Write-Verbose "No devices added/removed from group..."
            }
        }

        # Update group
        if ($PSBoundParameters.ContainsKey('EditGroup')) {
            try {
                ConvertFrom-Json $EditGroup -ErrorAction Stop
                $validJson = $true;
            } catch {
                $validJson = $false;
            }
    
            if ($validJson) {
                $GroupPayload = $EditGroup | ConvertFrom-Json
            } else {
                Write-Error "Provided text is not a valid JSON string or file not found";
            }

            $GroupPayload | Add-Member -NotePropertyName Id -NotePropertyValue $Group.Id
            $GroupPayload = $GroupPayload | ConvertTo-Json -Depth 6
            Write-Verbose $GroupPayload

            $GroupResponse = Invoke-WebRequest -Uri $GroupURL -Headers $Headers -ContentType $ContentType -Method POST -Body $GroupPayload
            Write-Verbose "Updating group..."
            if ($GroupResponse.StatusCode -eq 200 -or $GroupResponse.StatusCode -eq 202) {
                Write-Verbose "Group update successful!"
                return $GroupResponse.Content | ConvertFrom-Json
            }
            else {
                Write-Error "Group update failed..."
            }
        }

    }
    Catch {
        Resolve-Error $_
    }
}

End {}

}