NewRelicPS.GraphQLQueries.psm1

# Gets the GraphQL query to retrieve NRQL conditions
Function Get-GraphQLQueryGetNRQLCondition {
  Param (
    [Parameter (Mandatory = $true)]
    [string] $AccountId,
    [string] $NextCursor,
    [string] $SearchCriteria
  )
  Return "{
    actor {
      account(id: $AccountId) {
        alerts {
          nrqlConditionsSearch ( cursor: `"$NextCursor`", searchCriteria: {
            $SearchCriteria
          })
          {
            nextCursor nrqlConditions {
              ...on AlertsNrqlStaticCondition {
                valueFunction
              }
              ...on AlertsNrqlBaselineCondition {
                baselineDirection
              }
              ...on AlertsNrqlOutlierCondition {
                expectedGroups
              }
              description
              enabled
              expiration {
                closeViolationsOnExpiration
                expirationDuration
                openViolationOnExpiration
              }
              id
              name
              nrql {
                query
                evaluationOffset
              }
              policyId
              terms {
                operator
                priority
                threshold
                thresholdDuration
                thresholdOccurrences
              }
              type
              violationTimeLimit
            }
            totalCount
          }
        }
      }
    }
  }"

}

# Gets the GraphQL query to create NRQL Baseline condition
Function Get-GraphQLQueryCreateNRQLCondition {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $AccountId,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $Name,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $PolicyId,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [pscustomobject] $Terms,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $Query,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [ValidateSet ('alertsNrqlConditionBaselineCreate','alertsNrqlConditionOutlierCreate','alertsNrqlConditionStaticCreate')]
    [string] $QueryType,

    # Expiration Optional Parameters
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [boolean] $CloseViolationsOnExpiration = $false,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [string] $ExpirationDuration = '600',
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [boolean] $OpenViolationOnExpiration = $true,

    # Other Optional Parameters
    [ValidateSet ('UPPER_ONLY', 'LOWER_ONLY', 'UPPER_AND_LOWER')]
    [string] $BaselineDirection = 'UPPER_ONLY',
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [string]$Description = '',
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [boolean] $Enabled = $true,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int] $ExpectedGroups = 1,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [int] $EvaluationOffset = '3',
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    $OpenViolationOnGroupOverlap = $true,
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [ValidateSet ('SINGLE_VALUE','AT_LEAST_ONCE')]
    [string] $ValueFunction = 'SINGLE_VALUE',
    [Parameter (ValueFromPipelineByPropertyName = $true)]
    [ValidateSet ('ONE_HOUR', 'TWO_HOURS', 'FOUR_HOURS', 'EIGHT_HOURS', 'TWELVE_HOURS', 'TWENTY_FOUR_HOURS')]
    [string] $ViolationTimeLimit = 'TWENTY_FOUR_HOURS'

  )
  Process {

    # Each type of NRQL condition may have specific fields and return values
    Switch ($QueryType) {
      'alertsNrqlConditionBaselineCreate' {
        $typeSpecificItems = @{
          baselineDirection = $BaselineDirection
          expiration = "{closeViolationsOnExpiration: $("$CloseViolationsOnExpiration".ToLower()) expirationDuration: $ExpirationDuration openViolationOnExpiration: $("$OpenViolationOnExpiration".ToLower()) }"
        }
        $typeSpecificReturns = @(
          'baselineDirection',
          'expiration { closeViolationsOnExpiration expirationDuration openViolationOnExpiration }'
        )
      }
      'alertsNrqlConditionOutlierCreate' {
        $typeSpecificItems = @{
          expectedGroups = $ExpectedGroups
          openViolationOnGroupOverlap = $OpenViolationOnGroupOverlap.ToString().ToLower()
        }
        $typeSpecificReturns = @(
          'expectedGroups',
          'openViolationOnGroupOverlap'
        )
      }
      'alertsNrqlConditionStaticCreate' {
        $typeSpecificItems = @{
          valueFunction = $ValueFunction.ToUpper()
          expiration = "{closeViolationsOnExpiration: $("$CloseViolationsOnExpiration".ToLower()) expirationDuration: $ExpirationDuration openViolationOnExpiration: $("$OpenViolationOnExpiration".ToLower()) }"
        }
        $typeSpecificReturns = @(
          'valueFunction',
          'expiration { closeViolationsOnExpiration expirationDuration openViolationOnExpiration }'
        )
      }
    }
    Foreach ($key in $typeSpecificItems.keys) {
      $typeSpecificString += "$key`: $($typeSpecificItems[$key])`n "
    }

    $typeSpecificString =
    Return " mutation {
      $QueryType(
        accountId: $AccountId,
        policyId: $PolicyId,
        condition: {
          name: `"$Name`"
          description: `"$Description`"
          enabled: $("$Enabled".ToLower())
          $typeSpecificString
          nrql: { query: `"$Query`" evaluationOffset: $EvaluationOffset }
          terms: $Terms
          violationTimeLimit: $ViolationTimeLimit
        })
        {
          $($typeSpecificReturns -join ("`n "))
          description
          enabled
          id
          name
          nrql { query evaluationOffset }
          policyId
          terms { operator priority threshold thresholdDuration thresholdOccurrences }
          type
          violationTimeLimit
        }
      }"

  }
}

Function Get-GraphQLQueryUpdateNRQLCondition {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $AccountId,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $ConditionId,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $FieldsToUpdate,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [ValidateSet('alertsNrqlConditionBaselineUpdate', 'alertsNrqlConditionOutlierUpdate', 'alertsNrqlConditionStaticUpdate')]
    [string] $QueryType
  )
  Process {
    Switch ($QueryType) {
      'alertsNrqlConditionBaselineUpdate' { $lineFragment = '...on AlertsNrqlBaselineCondition { baselineDirection }' }
      'alertsNrqlConditionOutlierUpdate' { $lineFragment = '...on AlertsNrqlOutlierCondition { expectedGroups }' }
      'alertsNrqlConditionStaticUpdate' { $lineFragment = '...on AlertsNrqlStaticCondition { valueFunction }' }
    }
    Return " mutation {
      $QueryType(
        id: $ConditionId,
        accountId: $AccountId,
        condition: {
          $FieldsToUpdate
        })
      {
        $lineFragment
        description
        enabled
        expiration {
          closeViolationsOnExpiration
          expirationDuration
          openViolationOnExpiration
        }
        id
        name
        nrql {
          query
          evaluationOffset
        }
        policyId
        terms {
          operator
          priority
          threshold
          thresholdDuration
          thresholdOccurrences
        }
        type
        violationTimeLimit
      }
    }"

  }
}

Function Get-GraphQLQueryDeleteCondition {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $AccountId,
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $ConditionId
  )
  Process {
    Return " mutation {
      alertsConditionDelete(
        accountId:$AccountId,
        id: $ConditionId
      )
      {
        id
      }
    }"

  }
}

Function Get-GraphQLQueryGetDashboard {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
    [string] $DashboardId
  )
  Process {
    Return "
    {
      actor {
        entity(guid: `"$DashboardId`") {
          ... on DashboardEntity {
            name
            permissions
            pages {
              guid
              name
              widgets {
                linkedEntities { guid }
                visualization { id }
                title
                layout { row width height column }
                rawConfiguration
              }
            }
          }
        }
      }
    }"

  }
}

Function Get-GraphQLQueryGetDashboardList {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter ()]
    [string] $NameFilter,
    [Parameter ()]
    [string] $NextCursor
  )
  Process {
    If ($NextCursor) {
        $cursorString = "(cursor: `"$NextCursor`")"
    }

    Return "
    {
      actor {
        entitySearch(queryBuilder: {type: DASHBOARD, name: `"$NameFilter`"}) {
          results $cursorString{
            nextCursor
            entities {
              ... on DashboardEntityOutline {
                guid
                name
                accountId
              }
            }
          }
        }
      }
    }"

  }
}

Function Get-GraphQLQueryCreateDashboard {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $AccountId
  )
  Process {
    Return "
    mutation create(`$dashboard: Input!) {
      dashboardCreate(accountId: $AccountId, dashboard: `$dashboard) {
        entityResult {
          guid
          name
        }
        errors {
          description
        }
      }
    }"

  }
}

Function Get-GraphQLQueryUpdateDashboard {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $DashboardId
  )
  Process {
    Return "
    mutation create(`$dashboard: Input!) {
      dashboardUpdate(dashboard: `$dashboard, guid: `"$DashboardId`") {
        entityResult {
          guid
          name
        }
        errors {
          description
        }
      }
    }"

  }
}

Function Get-GraphQLQueryDeleteDashboard {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $DashboardId
  )
  Process {
    Return "
    mutation {
      dashboardDelete(guid: `"$DashboardId`") {
        status
      }
    }"

  }
}

Function Get-GraphQLQueryUndeleteDashboard {
  [CMDLetBinding()]
  [OutputType([string])]
  Param (
    [Parameter (Mandatory = $true)]
    [string] $DashboardId
  )
  Process {
    Return "
    mutation {
      dashboardUndelete(guid: `"$DashboardId`") {
        errors {
          description
          type
        }
      }
    }"

  }
}