functions/Set-WUGCredential.ps1

<#
.SYNOPSIS
Updates, removes, or manages assignments for a credential in the WhatsUp Gold credential library.
 
.DESCRIPTION
The Set-WUGCredential function updates, deletes, or manages assignments for a credential:
- Update: PUT /api/v1/credentials/{credentialId}
- Delete: DELETE /api/v1/credentials/{credentialId}
- Bulk Unassign: DELETE /api/v1/credentials/{credentialId}/assignments/-
- Apply Templates: PATCH /api/v1/credentials/-/config/template
 
.PARAMETER CredentialId
The ID of the credential to update or remove. Required.
 
.PARAMETER Name
New name for the credential.
 
.PARAMETER Description
New description for the credential.
 
.PARAMETER PropertyBags
Updated property bags for the credential.
 
.PARAMETER Body
Raw JSON body string for full control over the update payload.
 
.PARAMETER Remove
Switch to delete the credential instead of updating it.
 
.PARAMETER UnassignAll
Switch to remove all device assignments for the credential.
 
.PARAMETER ApplyTemplates
Switch to apply credential templates. Requires Body parameter.
Endpoint: PATCH /api/v1/credentials/-/config/template
 
.PARAMETER TemplateBody
JSON body for the ApplyTemplates operation.
 
.EXAMPLE
# Update a credential name
Set-WUGCredential -CredentialId "abc-123" -Name "Updated SNMP Credential"
 
.EXAMPLE
# Delete a credential
Set-WUGCredential -CredentialId "abc-123" -Remove
 
.EXAMPLE
# Remove all device assignments for a credential
Set-WUGCredential -CredentialId "abc-123" -UnassignAll
 
.EXAMPLE
# Apply credential templates
$templateBody = @{ templates = @(@{ name = "SNMP v2"; type = "snmpV2" }) } | ConvertTo-Json -Depth 5
Set-WUGCredential -ApplyTemplates -TemplateBody $templateBody
 
.EXAMPLE
# Update with raw JSON body
$body = @{ name = "New Name"; description = "Updated description" } | ConvertTo-Json
Set-WUGCredential -CredentialId "abc-123" -Body $body
 
.NOTES
Author: Jason Alberino (jason@wug.ninja)
Reference: https://docs.ipswitch.com/NM/WhatsUpGold2024/02_Guides/rest_api/index.html#tag/Credential
#>

function Set-WUGCredential {
    [CmdletBinding(DefaultParameterSetName = 'Update', SupportsShouldProcess = $true)]
    param(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('id')]
        [string]$CredentialId,

        [Parameter(ParameterSetName = 'Update')]
        [string]$Name,

        [Parameter(ParameterSetName = 'Update')]
        [string]$Description,

        [Parameter(ParameterSetName = 'Update')]
        [object[]]$PropertyBags,

        [Parameter(Mandatory = $true, ParameterSetName = 'UpdateBody')]
        [string]$Body,

        [Parameter(Mandatory = $true, ParameterSetName = 'Remove')]
        [switch]$Remove,

        [Parameter(Mandatory = $true, ParameterSetName = 'UnassignAll')]
        [switch]$UnassignAll,

        [Parameter(Mandatory = $true, ParameterSetName = 'ApplyTemplates')]
        [switch]$ApplyTemplates,

        [Parameter(Mandatory = $true, ParameterSetName = 'ApplyTemplates')]
        [string]$TemplateBody
    )

    begin {
        Write-Debug "Starting Set-WUGCredential function. ParameterSet: $($PSCmdlet.ParameterSetName)"
        $baseUri = "${global:WhatsUpServerBaseURI}/api/v1/credentials"
    }

    process {
        $uri = "${baseUri}/${CredentialId}"

        switch ($PSCmdlet.ParameterSetName) {
            'Remove' {
                if (-not $PSCmdlet.ShouldProcess($CredentialId, 'Remove credential')) { return }
                Write-Debug "DELETE URI: $uri"
                try {
                    $result = Get-WUGAPIResponse -Uri $uri -Method 'DELETE'
                    if ($result.success) {
                        Write-Verbose "Successfully removed credential ${CredentialId}."
                    }
                    return $result
                }
                catch {
                    Write-Error "Error removing credential ${CredentialId}: $_"
                }
            }

            'UpdateBody' {
                Write-Debug "PUT URI: $uri"
                Write-Debug "Body: $Body"
                try {
                    $result = Get-WUGAPIResponse -Uri $uri -Method 'PUT' -Body $Body
                    if ($result.success) {
                        Write-Verbose "Successfully updated credential ${CredentialId}."
                    }
                    return $result
                }
                catch {
                    Write-Error "Error updating credential ${CredentialId}: $_"
                }
            }

            'Update' {
                $updateObject = @{}
                if ($PSBoundParameters.ContainsKey('Name')) { $updateObject.name = $Name }
                if ($PSBoundParameters.ContainsKey('Description')) { $updateObject.description = $Description }
                if ($PSBoundParameters.ContainsKey('PropertyBags')) { $updateObject.propertyBags = $PropertyBags }

                if ($updateObject.Count -eq 0) {
                    Write-Warning "No update parameters specified. Nothing to update."
                    return
                }

                $Body = $updateObject | ConvertTo-Json -Depth 5
                Write-Debug "PUT URI: $uri"
                Write-Debug "Body: $Body"

                try {
                    $result = Get-WUGAPIResponse -Uri $uri -Method 'PUT' -Body $Body
                    if ($result.success) {
                        Write-Verbose "Successfully updated credential ${CredentialId}."
                    }
                    return $result
                }
                catch {
                    Write-Error "Error updating credential ${CredentialId}: $_"
                }
            }

            'UnassignAll' {
                $assignUri = "${baseUri}/${CredentialId}/assignments/-"
                if (-not $PSCmdlet.ShouldProcess("All assignments for credential ${CredentialId}", 'Remove assignments')) { return }
                Write-Debug "DELETE URI: $assignUri"
                try {
                    $result = Get-WUGAPIResponse -Uri $assignUri -Method 'DELETE'
                    if ($result.data) {
                        Write-Verbose "Successfully removed all assignments for credential ${CredentialId}."
                        return $result.data
                    }
                    return $result
                }
                catch {
                    Write-Error "Error removing assignments for credential ${CredentialId}: $_"
                }
            }

            'ApplyTemplates' {
                $templateUri = "${baseUri}/-/config/template"
                if (-not $PSCmdlet.ShouldProcess('Credential templates', 'Apply')) { return }
                Write-Debug "PATCH URI: $templateUri"
                Write-Debug "Body: $TemplateBody"
                try {
                    $result = Get-WUGAPIResponse -Uri $templateUri -Method 'PATCH' -Body $TemplateBody
                    if ($result.data) { return $result.data }
                    return $result
                }
                catch {
                    Write-Error "Error applying credential templates: $_"
                }
            }
        }
    }

    end {
        Write-Debug "Completed Set-WUGCredential function."
    }
}

# SIG # Begin signature block
# MIIVlwYJKoZIhvcNAQcCoIIViDCCFYQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCb2BOUnHSSDHS4
# kh/lJ2Whn74FXrJ1ODVk1GXDFo2wUaCCEdMwggVvMIIEV6ADAgECAhBI/JO0YFWU
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
# dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
# EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
# IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
# hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
# J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
# P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
# me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
# T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
# RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
# mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
# QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
# OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
# AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
# AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
# VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
# HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
# VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
# ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
# KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
# hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
# OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
# J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
# pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
# d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
# +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M
# UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD
# VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv
# ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5
# NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp
# BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G
# CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI
# ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV
# DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3
# 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw
# mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm
# +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe
# dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4
# 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM
# dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY
# MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU
# pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV
# HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG
# A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1
# YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG
# AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
# U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0
# aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh
# w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd
# OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj
# cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc
# WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO
# hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs
# zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7
# 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J
# KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH
# j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2
# Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/
# L9Uo2bC5a4CH2RwwggY+MIIEpqADAgECAhAHnODk0RR/hc05c892LTfrMA0GCSqG
# SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0
# ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw
# HhcNMjYwMjA5MDAwMDAwWhcNMjkwNDIxMjM1OTU5WjBVMQswCQYDVQQGEwJVUzEU
# MBIGA1UECAwLQ29ubmVjdGljdXQxFzAVBgNVBAoMDkphc29uIEFsYmVyaW5vMRcw
# FQYDVQQDDA5KYXNvbiBBbGJlcmlubzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAPN6aN4B1yYWkI5b5TBj3I0VV/peETrHb6EY4BHGxt8Ap+eT+WpEpJyE
# tRYPxEmNJL3A38Bkg7mwzPE3/1NK570ZBCuBjSAn4mSDIgIuXZnvyBO9W1OQs5d6
# 7MlJLUAEufl18tOr3ST1DeO9gSjQSAE5Nql0QDxPnm93OZBon+Fz3CmE+z3MwAe2
# h4KdtRAnCqwM+/V7iBdbw+JOxolpx+7RVjGyProTENIG3pe/hKvPb501lf8uBAAD
# LdjZr5ip8vIWbf857Yw1Bu10nVI7HW3eE8Cl5//d1ribHlzTzQLfttW+k+DaFsKZ
# BBL56l4YAlIVRsrOiE1kdHYYx6IGrEA809R7+TZA9DzGqyFiv9qmJAbL4fDwetDe
# yIq+Oztz1LvEdy8Rcd0JBY+J4S0eDEFIA3X0N8VcLeAwabKb9AjulKXwUeqCJLvN
# 79CJ90UTZb2+I+tamj0dn+IKMEsJ4v4Ggx72sxFr9+6XziodtTg5Luf2xd6+Phha
# mOxF2px9LObhBLLEMyRsCHZIzVZOFKu9BpHQH7ufGB+Sa80Tli0/6LEyn9+bMYWi
# 2ttn6lLOPThXMiQaooRUq6q2u3+F4SaPlxVFLI7OJVMhar6nW6joBvELTJPmANSM
# jDSRFDfHRCdGbZsL/keELJNy+jZctF6VvxQEjFM8/bazu6qYhrA7AgMBAAGjggGJ
# MIIBhTAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQU
# 6YF0o0D5AVhKHbVocr8GaSIBibAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIB
# AwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EM
# AQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2Vj
# dGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBE
# BggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGlj
# Q29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNl
# Y3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAEIsm4xnOd/tZMVrKwi3doAXvC
# wOA/RYQnFJD7R/bSQRu3wXEK4o9SIefye18B/q4fhBkhNAJuEvTQAGfqbbpxow03
# J5PrDTp1WPCWbXKX8Oz9vGWJFyJxRGftkdzZ57JE00synEMS8XCwLO9P32MyR9Z9
# URrpiLPJ9rQjfHMb1BUdvaNayomm7aWLAnD+X7jm6o8sNT5An1cwEAob7obWDM6s
# X93wphwJNBJAstH9Ozs6LwISOX6sKS7CKm9N3Kp8hOUue0ZHAtZdFl6o5u12wy+z
# zieGEI50fKnN77FfNKFOWKlS6OJwlArcbFegB5K89LcE5iNSmaM3VMB2ADV1FEcj
# GSHw4lTg1Wx+WMAMdl/7nbvfFxJ9uu5tNiT54B0s+lZO/HztwXYQUczdsFon3pjs
# Nrsk9ZlalBi5SHkIu+F6g7tWiEv3rtVApmJRnLkUr2Xq2a4nbslUCt4jKs5UX4V1
# nSX8OM++AXoyVGO+iTj7z+pl6XE9Gw/Td6WKKKsxggMaMIIDFgIBATBoMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYCEAec4OTRFH+FzTlzz3Yt
# N+swDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgbQTjqgJQ0G/Hyh0Ri75ukyFznw3qgjxk
# hBAyUlxDMsowDQYJKoZIhvcNAQEBBQAEggIA1hWNZj+7c/nrtHFZCx3w0IesTJKj
# Ti/CEhIUsBxjBlZKFTQg4dCpHYqArG34QaWgy2JxTnLAzaKTCuhb8JMI1EexM8+E
# YGxv/WfwCCGrXgxtZDrIrj4wDmtqW11xg4HdNl3rEU0G6UhjIKkzMujEYSkLpGow
# D/yB0rS5QTB4RSi74RtXzv94XacJpBVp9b6N8cdHT4bfFUfU+aDbKqiyaJSExCJl
# A4wJ9xYYUkTj4vIwrXODjMQiAYz29yIhI8NmQCZttNV5dbfMa5dYSaNjQsyuNPvv
# i2d/P3bwa4cTCxWakFav5KRda39DbVze3UmpcJdDpPBUcZx4+L4L0eWp++T0CPDX
# 1jJ3rfkddKMbwffp76BElo2wVorFWa4PBj7ZA4bz38kxRe7wfeb3wjLK921Gsls/
# 9RVhxNQOy5uKan++f7Zqz+bUFLcprJ+OjXK1m7FLasJEWaf2h9mcOD/YX6FtnE5X
# C+MVarxH0JOe0OPg8ROVHWuIVmia7LqtnrtAgmEm20w+FPWvcXdokJ6IIfGc73F1
# IRGdpQRkAt4BCMubLzS5JkaMQsg9WHt7P+O8L7vCKAI0eXS+GfYe3HOQb1fj3ocp
# gBrUrXPDS53uqOPOlnl6N4BsEaBa6lOz3l0TO3BzrnUfhWsoeajthFfDcwXWA9PF
# VR+8RTEcfxonfJQ=
# SIG # End signature block