apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
  labels:
    helm.sh/chart: argo-cd-9.4.1
    app.kubernetes.io/name: argocd-notifications-controller
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/component: notifications-controller
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/part-of: argocd
    app.kubernetes.io/version: "v3.3.0"
data:
  context: |
    argocdUrl: https://argocd.example.com
    argocdUrl: https://argocd.alexlebens.net
  service.webhook.ntfy: |
    url: http://ntfy.ntfy/
    headers:
      - name: Authorization
        value: Bearer $ntfy-token
  subscriptions: |
    - recipients:
      - ntfy
      triggers:
      - on-created
      - on-deleted
      - on-deployed
      - on-health-degraded
      - on-sync-failed
      - on-sync-running
      - on-sync-status-unknown
      - on-sync-succeeded
  template.app-created: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} has been created.",
            "title": "Created: {{.app.metadata.name}}",
            "tags": ["building_construction"],
            "priority": 4,
            "click": "{{.context.argocdUrl}}/applications/argocd/{{.app.metadata.name}}"
          }
  template.app-deleted: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} has been deleted",
            "title": "Deleted: {{.app.metadata.name}}",
            "tags": ["warning"],
            "priority": 4,
            "click": "{{.context.argocdUrl}}"
          }
  template.app-deployed: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} is now running new version of deployments manifests",
            "title": "Deployed: {{.app.metadata.name}}",
            "tags": ["+1"],
            "priority": 3,
            "click": "{{.context.argocdUrl}}/applications/argocd/{{.app.metadata.name}}"
          }
  template.app-health-degraded: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} health has degraded",
            "title": "Degraded: {{.app.metadata.name}}",
            "tags": ["rotating_light"],
            "priority": 4,
            "click": "{{.context.argocdUrl}}/applications/argocd/{{.app.metadata.name}}"
          }
  template.app-sync-failed: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} sync has failed at {{.app.status.operationState.finishedAt}} with the following error: {{.app.status.operationState.message}}",
            "title": "Sync Failed: {{.app.metadata.name}}",
            "tags": ["rotating_light"],
            "priority": 4,
            "click": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true"
          }
  template.app-sync-running: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} sync has started at {{.app.status.operationState.startedAt}}",
            "title": "Sync Running: {{.app.metadata.name}}",
            "tags": ["runner"],
            "priority": 3,
            "click": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true"
          }
  template.app-sync-status-unknown: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} sync status is unknown",
            "title": "Sync Unknown: {{.app.metadata.name}}",
            "tags": ["question"],
            "priority": 3,
            "click": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}"
          }
  template.app-sync-succeeded: |
    webhook:
      ntfy:
        method: POST
        body: |
          {
            "topic": "argocd",
            "message": "{{.app.metadata.name}} has been successfully synced at {{.app.status.operationState.finishedAt}}",
            "title": "Sync Succeeded: {{.app.metadata.name}}",
            "tags": ["+1"],
            "priority": 3,
            "click": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true"
          }
  trigger.on-created: |
    - description: Application {{.app.metadata.name}} has been created.
      oncePer: app.metadata.name
      send:
        - app-created
      when: "true"
  trigger.on-deleted: |
    - description: Application {{.app.metadata.name}} has been deleted.
      oncePer: app.metadata.name
      send:
        - app-deleted
      when: app.metadata.deletionTimestamp != nil
  trigger.on-deployed: |
    - description: Application is synced and healthy. Triggered once per commit.
      oncePer: app.status.operationState.syncResult.revision
      send:
        - app-deployed
      when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
  trigger.on-health-degraded: |
    - description: Application has degraded
      send:
        - app-health-degraded
      when: app.status.health.status == 'Degraded'
  trigger.on-sync-failed: |
    - description: Application syncing has failed
      send:
        - app-sync-failed
      when: app.status.operationState.phase in ['Error', 'Failed']
  trigger.on-sync-running: |
    - description: Application is being synced
      send:
       - app-sync-running
      when: app.status.operationState.phase in ['Running']
  trigger.on-sync-status-unknown: |
    - description: Application status is 'Unknown'
      send:
        - app-sync-status-unknown
      when: app.status.sync.status == 'Unknown'
  trigger.on-sync-succeeded: |
    - description: Application syncing has succeeded
      send:
        - app-sync-succeeded
      when: app.status.operationState.phase in ['Succeeded']
