Example #1
0
def report_incident(user_id: str, channel_id: str, submission: json,
                    response_url: str, state: json):
    report = submission['report']
    summary = submission['summary']
    impact = submission['impact']
    lead_id = submission['lead']
    severity = submission['severity']

    name = settings.SLACK_CLIENT.get_user_profile(user_id)['name']
    reporter = GetOrCreateSlackExternalUser(external_id=user_id,
                                            display_name=name)

    lead = None
    if lead_id:
        lead_name = settings.SLACK_CLIENT.get_user_profile(lead_id)['name']
        lead = GetOrCreateSlackExternalUser(external_id=lead_id,
                                            display_name=lead_name)

    Incident.objects.create_incident(
        report=report,
        reporter=reporter,
        report_time=datetime.now(),
        summary=summary,
        impact=impact,
        lead=lead,
        severity=severity,
    )

    incidents_channel_ref = channel_reference(settings.INCIDENT_CHANNEL_ID)
    text = f"Thanks for raising the incident 🙏\n\nHead over to {incidents_channel_ref} to complete the report and/or help deal with the issue"
    settings.SLACK_CLIENT.send_ephemeral_message(channel_id, user_id, text)
Example #2
0
def report_incident(user_id: str, channel_id: str, submission: Any,
                    response_url: str, state: Any):
    report = submission["report"]
    summary = submission["summary"]
    impact = submission["impact"]
    lead_id = submission["lead"]
    severity = submission["severity"]

    name = settings.SLACK_CLIENT.get_user_profile(user_id)["name"]
    reporter, _ = ExternalUser.objects.get_or_create_slack(external_id=user_id,
                                                           display_name=name)

    lead = None
    if lead_id:
        lead_name = settings.SLACK_CLIENT.get_user_profile(lead_id)["name"]
        lead, _ = ExternalUser.objects.get_or_create_slack(
            external_id=lead_id, display_name=lead_name)

    Incident.objects.create_incident(
        report=report,
        reporter=reporter,
        report_time=datetime.now(),
        summary=summary,
        impact=impact,
        lead=lead,
        severity=severity,
    )

    incidents_channel_ref = channel_reference(settings.INCIDENT_CHANNEL_ID)
    text = f"Thanks for raising the incident 🙏\n\nHead over to {incidents_channel_ref} to complete the report and/or help deal with the issue"
    settings.SLACK_CLIENT.send_ephemeral_message(channel_id, user_id, text)
Example #3
0
def report_incident(user_id: str, channel_id: str, submission: Any,
                    response_url: str, state: Any):
    report = submission["report"]
    summary = submission["summary"]
    impact = submission["impact"]
    # lead_id = submission["lead"]
    severity = submission["severity"]
    pdschedule = submission["pdschedule"]

    if "incident_type" in submission:
        report_only = submission["incident_type"] == "report"
    else:
        report_only = False

    name = get_user_profile(user_id)["name"]
    reporter, _ = ExternalUser.objects.get_or_create_slack(external_id=user_id,
                                                           display_name=name)

    lead = None
    # if lead_id:
    #    lead_name = get_user_profile(lead_id)["name"]
    #    lead, _ = ExternalUser.objects.get_or_create_slack(
    #        external_id=lead_id, display_name=lead_name
    #    )

    try:
        pdincident = None
        if pdschedule == "yes":
            incident = settings.PDSESSION.rpost(
                "/incidents",
                json={
                    "incident": {
                        "type": "incident",
                        "title": report,
                        "service": {
                            "id": "P703RRY",
                            "type": "service_reference"
                        },
                        "body": {
                            "type": "incident_body",
                            "details": summary if summary else "",
                        },
                    }
                },
                headers={"From": "*****@*****.**"},
            )
            pdincident = incident["id"]

        Incident.objects.create_incident(
            report=report,
            reporter=reporter,
            report_time=datetime.now(),
            report_only=report_only,
            summary=summary,
            impact=impact,
            lead=lead,
            severity=severity,
            pdschedule=pdincident,
        )

        if report_only and hasattr(settings, "INCIDENT_REPORT_CHANNEL_ID"):
            incidents_channel_ref = channel_reference(
                settings.INCIDENT_REPORT_CHANNEL_ID)
        else:
            incidents_channel_ref = channel_reference(
                settings.INCIDENT_CHANNEL_ID)

        text = (
            f"Thanks for raising the incident 🙏\n\nHead over to {incidents_channel_ref} "
            f"to complete the report and/or help deal with the issue")
        settings.SLACK_CLIENT.send_ephemeral_message(channel_id, user_id, text)

    except PDClientError as pce:
        logger.error(pce.response.json())
        # Raise here so incident doesn't get created
        raise pce
Example #4
0
    def update_in_slack(self):
        "Creates/updates the slack headline post with the latest incident info"
        logging.info(
            f"Updating headline post in Slack for incident {self.incident.pk}")
        msg = Message()

        # Set the fallback text so notifications look nice
        msg.set_fallback_text(
            f"{self.incident.report} reported by {user_reference(self.incident.reporter)}"
        )

        # Add report/people
        msg.add_block(
            Section(block_id="report", text=Text(f"*{self.incident.report}*")))
        msg.add_block(
            Section(
                block_id="reporter",
                text=Text(
                    f"🙋🏻‍♂️ Reporter: {user_reference(self.incident.reporter.external_id)}"
                )))
        incident_lead_text = user_reference(
            self.incident.lead.external_id) if self.incident.lead else "-"
        msg.add_block(
            Section(block_id="lead",
                    text=Text(f"👩‍🚒 Incident Lead: {incident_lead_text}")))

        msg.add_block(Divider())

        # Add additional info
        msg.add_block(
            Section(
                block_id="status",
                text=Text(
                    f"{self.incident.status_emoji()} Status: {self.incident.status_text().capitalize()}"
                )))
        severity_text = self.incident.severity_text().capitalize(
        ) if self.incident.severity_text() else "-"
        msg.add_block(
            Section(
                block_id="severity",
                text=Text(
                    f"{self.incident.severity_emoji()} Severity: {severity_text}"
                )))

        doc_url = urljoin(
            settings.SITE_URL,
            reverse('incident_doc', kwargs={'incident_id': self.incident.pk}))
        msg.add_block(
            Section(
                block_id="incident_doc",
                text=Text(
                    f"📄 Document: <{doc_url}|Incident {self.incident.pk}>")))

        channel_ref = channel_reference(
            self.comms_channel.channel_id) if self.comms_channel else None
        if channel_ref:
            msg.add_block(
                Section(block_id="comms_channel",
                        text=Text(f"🗣 Comms Channel: {channel_ref or '-'}")))

        # Add buttons (if the incident is open)
        if not self.incident.is_closed():
            msg.add_block(Section(text=Text("Need something else?")))
            actions = Actions(block_id="actions")

            # Add all actions mapped by @headline_post_action decorators
            for key in sorted(SLACK_HEADLINE_POST_ACTION_MAPPINGS.keys()):
                funclist = SLACK_HEADLINE_POST_ACTION_MAPPINGS[key]
                for f in funclist:
                    action = f(self)
                    if action:
                        actions.add_element(action)

            msg.add_block(actions)

        # Post / update the slack message
        response = msg.send(settings.INCIDENT_CHANNEL_ID, self.message_ts)
        logging.info(
            f"Got response back from Slack after updating headline post: {response}"
        )

        # Save the message ts identifier if not already set
        if not self.message_ts:
            self.message_ts = response['ts']
            self.save()