From a202f5bb420c9906520b1ba4dcfc166489c720cb Mon Sep 17 00:00:00 2001 From: Divyansh Date: Tue, 7 Jul 2020 15:31:42 +0530 Subject: [PATCH 1/7] integration for Spike --- hc/api/models.py | 3 + hc/api/transports.py | 15 + hc/front/urls.py | 1 + hc/front/views.py | 22 + static/img/integrations/spike.png | Bin 0 -> 4773 bytes templates/front/channels.html | 676 +++++++++--------- templates/integrations/add_spike.html | 94 +++ templates/integrations/spike_description.html | 5 + templates/integrations/spike_title.html | 1 + 9 files changed, 465 insertions(+), 352 deletions(-) create mode 100644 static/img/integrations/spike.png create mode 100644 templates/integrations/add_spike.html create mode 100644 templates/integrations/spike_description.html create mode 100644 templates/integrations/spike_title.html diff --git a/hc/api/models.py b/hc/api/models.py index 749a93bc..ebadaa5b 100644 --- a/hc/api/models.py +++ b/hc/api/models.py @@ -49,6 +49,7 @@ CHANNEL_KINDS = ( ("msteams", "Microsoft Teams"), ("shell", "Shell Command"), ("zulip", "Zulip"), + ("spike", "Spike"), ) PO_PRIORITIES = {-2: "lowest", -1: "low", 0: "normal", 1: "high", 2: "emergency"} @@ -456,6 +457,8 @@ class Channel(models.Model): return transports.Shell(self) elif self.kind == "zulip": return transports.Zulip(self) + elif self.kind == "spike": + return transports.Spike(self) else: raise NotImplementedError("Unknown channel kind: %s" % self.kind) diff --git a/hc/api/transports.py b/hc/api/transports.py index 302447e7..05ef4ee7 100644 --- a/hc/api/transports.py +++ b/hc/api/transports.py @@ -577,3 +577,18 @@ class Zulip(HttpTransport): } return self.post(url, data=data, auth=auth) + + + +class Spike(HttpTransport): + def notify(self, check): + url = self.channel.value + headers = {"Conent-Type": "application/json"} + payload = { + "incident_key": str(check.code), + "title": tmpl("spike_title.html", check=check), + "description": tmpl("spike_description.html", check=check), + "client": settings.SITE_NAME, + } + + return self.post(url, json=payload, headers=headers) diff --git a/hc/front/urls.py b/hc/front/urls.py index 0d9f44b8..016918cb 100644 --- a/hc/front/urls.py +++ b/hc/front/urls.py @@ -77,6 +77,7 @@ project_urls = [ path("add_webhook/", views.add_webhook, name="hc-add-webhook"), path("add_whatsapp/", views.add_whatsapp, name="hc-add-whatsapp"), path("add_zulip/", views.add_zulip, name="hc-add-zulip"), + path("add_spike/", views.add_spike, name="hc-add-spike"), path("badges/", views.badges, name="hc-badges"), path("checks/", views.my_checks, name="hc-checks"), path("checks/add/", views.add_check, name="hc-add-check"), diff --git a/hc/front/views.py b/hc/front/views.py index 263742c7..b3604e56 100644 --- a/hc/front/views.py +++ b/hc/front/views.py @@ -1724,3 +1724,25 @@ def metrics(request, code, key): yield "hc_checks_down_total %d\n" % num_down return HttpResponse(output(checks), content_type="text/plain") + + + +@login_required +def add_spike(request, code): + project = _get_project_for_user(request, code) + + if request.method == "POST": + form = forms.AddUrlForm(request.POST) + if form.is_valid(): + channel = Channel(project=project, kind="spike") + channel.value = form.cleaned_data["value"] + channel.save() + + channel.assign_all_checks() + return redirect("hc-p-channels", project.code) + else: + form = forms.AddUrlForm() + + ctx = {"page": "channels", "project": project, "form": form} + return render(request, "integrations/add_spike.html", ctx) + diff --git a/static/img/integrations/spike.png b/static/img/integrations/spike.png new file mode 100644 index 0000000000000000000000000000000000000000..ba53a13a9655582eab97e813b70ee973f42ca849 GIT binary patch literal 4773 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 literal 0 HcmV?d00001 diff --git a/templates/front/channels.html b/templates/front/channels.html index 753d92b8..caf600e5 100644 --- a/templates/front/channels.html +++ b/templates/front/channels.html @@ -6,112 +6,109 @@ {% block content %}
-{% if messages %} -
- {% for message in messages %} + {% if messages %} +
+ {% for message in messages %}

{{ message }}

- {% endfor %} -
-{% endif %} - -
- {% if channels %} - - - - - - - - - - {% for ch in channels %} - {% with n=ch.latest_notification %} - - - + + + {% endwith %} + {% endfor %} +
Name, DetailsAssigned ChecksStatusLast Notification
- {{ ch.get_kind_display }} icon - -
- {% if ch.name %} - {{ ch.name }} - {% else %} -
unnamed
- {% endif %} -
- {% if ch.kind == "email" %} + {% endfor %} +
+ {% endif %} + +
+ {% if channels %} + + + + + + + + + + {% for ch in channels %} + {% with n=ch.latest_notification %} + + + - - + + - + - + - - - {% endwith %} - {% endfor %} -
Name, DetailsAssigned ChecksStatusLast Notification
+ {{ ch.get_kind_display }} icon + +
+ {% if ch.name %} + {{ ch.name }} + {% else %} +
unnamed
+ {% endif %} +
+ {% if ch.kind == "email" %} Email to {{ ch.email_value }} {% if ch.email_notify_down and not ch.email_notify_up %} - (down only) + (down only) {% endif %} {% if ch.email_notify_up and not ch.email_notify_down %} - (up only) + (up only) {% endif %} - {% elif ch.kind == "pd" %} + {% elif ch.kind == "pd" %} PagerDuty account {{ ch.pd_account }} - {% elif ch.kind == "po" %} + {% elif ch.kind == "po" %} Pushover ({{ ch.po_priority }} priority) - {% elif ch.kind == "slack" %} + {% elif ch.kind == "slack" %} Slack {% if ch.slack_team %} - team {{ ch.slack_team }}, - channel {{ ch.slack_channel }} + team {{ ch.slack_team }}, + channel {{ ch.slack_channel }} {% endif %} - {% elif ch.kind == "telegram" %} + {% elif ch.kind == "telegram" %} Telegram {% if ch.telegram_type == "group" %} - chat {{ ch.telegram_name }} + chat {{ ch.telegram_name }} {% elif ch.telegram_type == "private" %} - user {{ ch.telegram_name }} + user {{ ch.telegram_name }} {% endif %} - {% elif ch.kind == "sms" %} + {% elif ch.kind == "sms" %} SMS to {{ ch.sms_number }} - {% elif ch.kind == "trello" %} + {% elif ch.kind == "trello" %} Trello board {{ ch.trello_board_list|first }}, list {{ ch.trello_board_list|last }} - {% elif ch.kind == "matrix" %} + {% elif ch.kind == "matrix" %} Matrix {{ ch.value }} - {% elif ch.kind == "whatsapp" %} + {% elif ch.kind == "whatsapp" %} WhatsApp to {{ ch.sms_number }} {% if ch.whatsapp_notify_down and not ch.whatsapp_notify_up %} - (down only) + (down only) {% endif %} {% if ch.whatsapp_notify_up and not ch.whatsapp_notify_down %} - (up only) + (up only) {% endif %} - {% elif ch.kind == "zulip" %} + {% elif ch.kind == "zulip" %} Zulip {% if ch.zulip_type == "stream" %} stream {{ ch.zulip_to}} {% elif ch.zulip_type == "private" %} user {{ ch.zulip_to}} {% endif %} - {% else %} + {% else %} {{ ch.get_kind_display }} - {% endif %} -
-
-
-
- {{ ch.n_checks }} check{{ ch.n_checks|pluralize }} -
-
- {% if ch.kind == "email" and not ch.email_verified %} + {% endif %} + + + +
+ {{ ch.n_checks }} check{{ ch.n_checks|pluralize }} +
+
+ {% if ch.kind == "email" and not ch.email_verified %} Unconfirmed - {% elif ch.kind == "hipchat" or ch.kind == "pagerteam" %} + {% elif ch.kind == "hipchat" or ch.kind == "pagerteam" %} Retired - {% else %} + {% else %} Ready to deliver - {% endif %} - - {% if n %} + {% endif %} + + {% if n %} {% if n.error %} Failed, {{ n.created|naturaltime }} @@ -119,43 +116,37 @@ {% else %} Delivered, {{ n.created|naturaltime }} {% endif %} - {% else %} - Never - {% endif %} - {% if ch.kind == "sms" or ch.kind == "whatsapp" %} + {% else %} + Never + {% endif %} + {% if ch.kind == "sms" or ch.kind == "whatsapp" %}

Used {{ profile.sms_sent_this_month }} of {{ profile.sms_limit }} sends this month.

- {% endif %} -
- {% if ch.kind == "webhook" %} - Edit - {% endif %} -
- {% csrf_token %} -
+ {% if ch.kind == "webhook" %} + Edit + {% endif %} + + {% csrf_token %} + + + - - - - -
- {% else %} +
+ +
+ {% else %}

The project "{{ project }}" does not have any integrations set up yet. @@ -165,238 +156,226 @@ when checks change state.

- {% endif %} + {% endif %} -

Add More

-
    -
  • - Slack icon +

    Add More

    +
      +
    • + Slack icon -

      Slack

      -

      A messaging app for teams.

      - {% if enable_slack_btn %} - Add Integration - {% else %} - Add Integration +

      Slack

      +

      A messaging app for teams.

      + {% if enable_slack_btn %} + Add Integration + {% else %} + Add Integration + {% endif %} +
    • +
    • + Email icon + +

      Email

      +

      Get an email message when a check goes up or down.

      + Add Integration +
    • + +
    • + Webhook icon + +

      Webhook

      +

      Receive a HTTP callback when a check goes down.

      + Add Integration +
    • + {% if enable_apprise %} +
    • + Apprise icon + +

      Apprise

      +

      Receive instant push notifications using Apprise; see all of the supported + services here.

      + Add Integration +
    • {% endif %} - -
    • - Email icon - -

      Email

      -

      Get an email message when a check goes up or down.

      - Add Integration -
    • - -
    • - Webhook icon - -

      Webhook

      -

      Receive a HTTP callback when a check goes down.

      - Add Integration -
    • - {% if enable_apprise %} -
    • - Apprise icon - -

      Apprise

      -

      Receive instant push notifications using Apprise; see all of the supported services here.

      - Add Integration -
    • - {% endif %} - {% if enable_discord %} -
    • - Discord icon + {% if enable_discord %} +
    • + Discord icon -

      Discord

      -

      Cross-platform voice and text chat app designed for gamers.

      - Add Integration -
    • - {% endif %} +

      Discord

      +

      Cross-platform voice and text chat app designed for gamers.

      + Add Integration + + {% endif %} - {% if enable_matrix %} -
    • - Matrix icon + {% if enable_matrix %} +
    • + Matrix icon -

      Matrix

      -

      Post notifications to a Matrix room.

      - Add Integration -
    • - {% endif %} +

      Matrix

      +

      Post notifications to a Matrix room.

      + Add Integration + + {% endif %} -
    • - Mattermost icon +
    • + Mattermost icon -

      Mattermost

      -

      High Trust Messaging for the Enterprise.

      - Add Integration -
    • +

      Mattermost

      +

      High Trust Messaging for the Enterprise.

      + Add Integration + -
    • - Microsoft Teams +
    • + Microsoft Teams -

      Microsoft Teams

      -

      Chat and collaboration platform for Microsoft Office 365 customers.

      - Add Integration -
    • +

      Microsoft Teams

      +

      Chat and collaboration platform for Microsoft Office 365 customers.

      + Add Integration + -
    • - OpsGenie icon +
    • + OpsGenie icon -

      OpsGenie

      -

      Alerting & Incident Management Solution for Dev & Ops.

      - Add Integration -
    • +

      OpsGenie

      +

      Alerting & Incident Management Solution for Dev & Ops.

      + Add Integration + -
    • - PagerDuty icon +
    • + PagerDuty icon -

      PagerDuty

      -

      On-call scheduling, alerting, and incident tracking.

      +

      PagerDuty

      +

      On-call scheduling, alerting, and incident tracking.

      - {% if enable_pdc %} + {% if enable_pdc %} Add Integration - {% else %} + {% else %} Add Integration + {% endif %} +
    • + +
    • + PagerTree icon + +

      PagerTree

      +

      DevOps Incident Management - On-Call Schedules, Alerts, & Notifications

      + Add Integration +
    • + +
    • + Prometheus icon + +

      Prometheus

      +

      Export check and tag status values to Prometheus.

      + Add Integration +
    • + + {% if enable_pushbullet %} +
    • + Pushbullet icon + +

      Pushbullet

      +

      Pushbullet connects your devices, making them feel like one.

      + Add Integration +
    • {% endif %} - - -
    • - PagerTree icon - -

      PagerTree

      -

      DevOps Incident Management - On-Call Schedules, Alerts, & Notifications

      - Add Integration -
    • - -
    • - Prometheus icon - -

      Prometheus

      -

      Export check and tag status values to Prometheus.

      - Add Integration -
    • - - {% if enable_pushbullet %} -
    • - Pushbullet icon - -

      Pushbullet

      -

      Pushbullet connects your devices, making them feel like one.

      - Add Integration -
    • - {% endif %} - {% if enable_pushover %} -
    • - Pushover icon + {% if enable_pushover %} +
    • + Pushover icon -

      Pushover

      -

      Receive instant push notifications on your phone or tablet.

      - Add Integration -
    • - {% endif %} +

      Pushover

      +

      Receive instant push notifications on your phone or tablet.

      + Add Integration + + {% endif %} - {% if enable_shell %} -
    • - Shell icon + {% if enable_shell %} +
    • + Shell icon -

      Shell Command

      -

      Execute a local shell command when a check goes up or down.

      - Add Integration -
    • - {% endif %} +

      Shell Command

      +

      Execute a local shell command when a check goes up or down.

      + Add Integration + + {% endif %} - {% if enable_sms %} -
    • - SMS icon + {% if enable_sms %} +
    • + SMS icon -

      SMS

      -

      Get a text message to your phone when a check goes down.

      - Add Integration -
    • - {% endif %} +

      SMS

      +

      Get a text message to your phone when a check goes down.

      + Add Integration + + {% endif %} - {% if enable_telegram %} -
    • - Telegram icon + {% if enable_telegram %} +
    • + Telegram icon -

      Telegram

      -

      A messaging app with a focus on speed and security.

      - Add Integration -
    • - {% endif %} +

      Telegram

      +

      A messaging app with a focus on speed and security.

      + Add Integration + + {% endif %} - {% if enable_trello %} -
    • - Trello icon + {% if enable_trello %} +
    • + Trello icon -

      Trello

      -

      Create a Trello card when a check goes down.

      - Add Integration -
    • - {% endif %} +

      Trello

      +

      Create a Trello card when a check goes down.

      + Add Integration + + {% endif %} -
    • - VictorOps icon +
    • + VictorOps icon -

      VictorOps

      -

      On-call scheduling, alerting, and incident tracking.

      - Add Integration -
    • +

      VictorOps

      +

      On-call scheduling, alerting, and incident tracking.

      + Add Integration + - {% if enable_whatsapp %} -
    • - WhatsApp icon + {% if enable_whatsapp %} +
    • + WhatsApp icon -

      WhatsApp

      -

      Get a WhatsApp message when a check goes up or down.

      - Add Integration -
    • - {% endif %} +

      WhatsApp

      +

      Get a WhatsApp message when a check goes up or down.

      + Add Integration + + {% endif %} -
    • - Zulip icon - -

      Zulip

      -

      Open-source group chat.

      - Add Integration -
    • - - +
    • + Zulip icon -
    -
+

Zulip

+

Open-source group chat.

+ Add Integration + + +
  • + Spike.sh icon + +

    Spike

    +

    Incident Management - On-Call Schedules, Alerts, & Notifications

    + Add Integration +
  • + + + + +