NewRelicPS.SyntheticLocationConditions.psm1

<#
.Synopsis
  Gets New Relic Synthetic Location Conditions
.Description
  Gets all New Relic synthetic conditions in a policy or returns teh condition matching the provided Id.
.Example
  Get-NRSyntheticLocationcondition -APIKey $APIKey -Policy 12345
  Gets information on all New Relic synthetic location conditions in the policy 12345 on the account associated with the provided API Key
.Example
  Get-NRSyntheticCondition -APIKey $APIKey -Id 123
  Returns only data for the condition with Id 123 in the account associated with the API key provided. Returns null if no existing condition has the ID provided.
.Parameter APIKey
  This must be an Admin API key. See more here: https://docs.newrelic.com/docs/apis/get-started/intro-apis/types-new-relic-api-keys
.Parameter Id
  If specified, returns a information on the specified condition.
.Parameter PolicyId
  The Id for the policy where conditions are stored.
#>

Function Get-NRSyntheticLocationCondition {
  [CMDLetBinding()]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $APIKey,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $PolicyId,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [string] $Id
  )
  Begin {

    $headers = @{
      'X-Api-Key' = $APIKey
    }
  }
  Process {
    $url = "https://api.newrelic.com/v2/alerts_location_failure_conditions/policies/$PolicyId.json"

    # Call the API and return null if a condition ID is provided but not found
    [array]$results += (Invoke-RestMethod -Uri $url -Headers $headers -Method 'Get' -ContentType 'application/json').location_failure_conditions

    # If an Id is provided, return only that item otherwise return all results
    $Id ? ($results | Where-Object {$_.id -eq $id}) : $results
  }
}

<#
.Synopsis
  Creates a New Relic Synthetic Location Condition
.Description
  Creates a New Relic synthetic location condition.
.Example
  New-NRSyntheticLocationCondition -APIKey $APIKey -Name 'MySyntheticLocationCondition' -PolicyID '12345' -CriticalThreshold 3 -Entities @(12345,12346,12347,12348)
  Creates a new Synthetics location condition which opens a violation if 3 or more entities report a synthetics failure.
.Parameter APIKey
  This must be an Admin API key. See more here: https://docs.newrelic.com/docs/apis/get-started/intro-apis/types-new-relic-api-keys
.Parameter CriticalThreshold
  The minimum number of monitor locations that must be concurrently failing before a critical violation is opened.
.Parameter Enabled
  Specifies whether the condition is created as enabled or not. Defaults to false.
.Parameter Entities
  An array of synthetic monitor GUIDs to alert on.
.Parameter Name
  The friendly name used to identify the condition.
.Parameter PolicyId
  The ID for the policy where conditions are stored.
.Parameter Runbook_URL
  A URL to display in notificaitons, most often used to link to a runbook to be executed when a notification is recieved.
.Parameter ViolationTimeLimitSeconds
  The maximum number of seconds a violation can remain open before being closed by the sytem.
.Parameter WarningThreshold
  The minimum number of monitor locations that must be concurrently failing before a warning violation is opened.
#>

Function New-NRSyntheticLocationCondition {
  [CMDLetBinding(SupportsShouldProcess=$true)]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $APIKey,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $Name,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [int32] $PolicyId,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [array] $Entities,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [int32] $CriticalThreshold,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [boolean] $Enabled = $true,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [string] $Runbook_URL,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int32] $Violation_Time_Limit_Seconds,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int32] $WarningThreshold
  )
  Begin {
    $headers = @{
      'X-Api-Key' = $APIKey
    }
  }
  Process {
    $url = "https://api.newrelic.com/v2/alerts_location_failure_conditions/policies/$PolicyId.json"

    # Build up the body of the request using required or default parameters
    $Body = @{
      location_failure_condition = @{
        name = $Name
        enabled = $Enabled
        entities = $Entities
        terms = @(@{
          priority = 'critical'
          threshold = $CriticalThreshold
        })

      }
    }


    # Add optional parameters
    Switch ($true) {
      {-NOT [string]::IsNullOrWhiteSpace($Runbook_URL)} {$Body += @{runbook_url = $Runbook_URL}}
      {$WarningThreshold} {$Body.location_failure_condition.terms += @{priority = 'warning'; threshold = $WarningThreshold}}
      {$Violation_Time_Limit_Seconds} {$Body += @{violation_time_limit_seconds = $Violation_Time_Limit_Seconds}}
    }

    # Call the API
    If ($PSCmdlet.ShouldProcess($Name, "Create synthetic location condition")) {
      Return Invoke-RestMethod -Uri $url -Headers $headers -Body ($Body | ConvertTo-Json -Depth 4) -Method 'Post' -ContentType 'application/json'
    }
  }
}

<#
.Synopsis
  Deletes a New Relic Synthetic Location Condition
.Description
  Deletes a New Relic synthetic location condition.
.Example
  Remove-NRSyntheticLocationCondition -APIKey $APIKey -Id '123456'
  Deletes the synthetic location condition with Id 123456 in the account associated with the provided API key
.Example
  $Ids | Remove-NRSyntheticCondition -APIKey $APIKey
  Deletes all syntheic location conditions whose Id are listed in $Ids from the account associated with the provided API key
.Parameter APIKey
  This must be an Admin API key. See more here: https://docs.newrelic.com/docs/apis/get-started/intro-apis/types-new-relic-api-keys.
.Parameter Id
  The unique Id of the condition to remove.
#>

Function Remove-NRSyntheticLocationCondition {
  [CMDLetBinding(SupportsShouldProcess=$true)]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $APIKey,
    [Parameter (Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $Id
  )
  Begin {
    $headers = @{
      'X-Api-Key' = $APIKey
    }
  }
  Process {
    $url = "https://api.newrelic.com/v2/alerts_location_failure_conditions/$Id.json"

    # Call the API
    If ($PSCmdlet.ShouldProcess($Id, "Remove synthetic condition")) {
      Return (Invoke-RestMethod -Uri $url -Headers $headers -Method 'Delete' -ContentType 'application/json').location_failure_condition
    }
  }
}


<#
.Synopsis
  Updates a New Relic Synthetic Location Condition
.Description
  Updates a New Relic synthetic location condition.
.Example
  Update-NRSyntheticLocationCondition -APIKey $APIKey -Id '123456' -CriticalThreshold 3
  Updates condition with Id 123456 and sets the minimum number of monitor locations that must be concurrently failing before a violation is opened to 3.
.Example
  $Ids | Update-NRSyntheticCondition -APIKey $APIKey -Enabled $true
  Enables all conditions in the $Ids array.
.Parameter APIKey
  This must be an Admin API key. See more here: https://docs.newrelic.com/docs/apis/get-started/intro-apis/types-new-relic-api-keys
.Parameter CriticalThreshold
  The minimum number of monitor locations that must be concurrently failing before a critical violation is opened.
.Parameter Enabled
  Specifies whether the condition is created as enabled or not. Defaults to false.
.Parameter Entities
  An array of synthetic monitor GUIDs to alert on.
.Parameter Id
  The unique ID of the synthetic location condition to update.
.Parameter Name
  The friendly name used to identify the condition.
.Parameter PolicyId
  The ID for the policy where conditions are stored.
.Parameter Runbook_URL
  A URL to display in notificaitons, most often used to link to a runbook to be executed when a notification is recieved.
.Parameter ViolationTimeLimitSeconds
  The maximum number of seconds a violation can remain open before being closed by the sytem.
.Parameter WarningThreshold
  The minimum number of monitor locations that must be concurrently failing before a warning violation is opened.
#>

Function Update-NRSyntheticLocationCondition {
  [CMDLetBinding(SupportsShouldProcess=$true)]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $APIKey,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [int32] $Id,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [int32] $PolicyId,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [string] $Name,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [array] $Entities,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int32] $CriticalThreshold,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [boolean] $Enabled,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [string] $Runbook_URL,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int32] $Violation_Time_Limit_Seconds,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int32] $WarningThreshold
  )
  Begin {
    $headers = @{
      'X-Api-Key' = $APIKey
    }
  }
  Process {
    $url = "https://api.newrelic.com/v2/alerts_location_failure_conditions/$id.json"

    # Get the existing item values
    $conditionParams = Get-NRSyntheticLocationCondition -APIKey $APIKey -PolicyId $PolicyId -Id $Id

    # Check for a null result
    If (-NOT $conditionParams) {
      Write-Error "Condition with Id $Id was not found in policy $PolicyId. Does the provided API key have access?"
    }

    # Build up the list of top-level fields to update
    Switch ($true) {
      { $CriticalThreshold } {  ($conditionParams.Terms | Where-Object {$_.priority -eq 'critical'}).threshold = $CriticalThreshold }
      { "$Enabled" } { $conditionParams.enabled = $Enabled }
      { $Entities } { $conditionParams.entities = $Entities }
      { -NOT [string]::IsNullOrWhiteSpace($Name) } { $conditionParams.name = $Name }

      # These items may not exist on the object so add them with a force to overwrite if they are there
      { -NOT [string]::IsNullOrWhiteSpace($Runbook_URL) } {$conditionParams | Add-Member -NotePropertyName 'runbook_url' -NotePropertyValue $Runbook_URL -Force -PassThru}
      { $Violation_Time_Limit_Seconds } { $conditionParams | Add-Member -NotePropertyName 'violation_time_limit_seconds' -NotePropertyValue $Violation_Time_Limit_Seconds -Force }
    }

    # The warning term is an optional set of parameters so process that separately
    # The user can specify zero to remove the warning threshold
    If ($WarningThreshold -eq 0) {
      [array]$conditionParams.terms = $conditionParams.terms | Where-Object {$_.priority -ne 'warning'}
    }
    ElseIf ($WarningThreshold) {

      # Update the existing warning term's threshold if it already exists
      If ($conditionParams.Terms | Where-Object {$_.priority -eq 'warning'}) {
        ($conditionParams.terms | Where-Object {$_.priority -eq 'warning'}).threshold = $WarningThreshold
      }

      # Otherwise add the warning term to the item
      Else {
        $conditionParams.terms += @{
          priority = 'warning'
          threshold = $WarningThreshold
        }
      }
    }

    # The API requires parameters to be wrapped in the location_failure_condition parent object
    $body = [pscustomobject]@{
      location_failure_condition = $conditionParams
    } | ConvertTo-Json -Depth 4

    # Call the API
    If ($PSCmdlet.ShouldProcess($Id, "Update synthetic condition")) {
      Return (Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method 'Put' -ContentType 'application/json').location_failure_condition
    }
  }
}