def note(self, message, params=None, **kwargs): """Create a note for the current incident (ex: .note <message>).""" number = self.get_incident_number() if number is None: msg = "Could not get incident number for current incident." message.dispatch(msg) return url = "%s/api/v1/incidents/%s/notes" % (self.subdomain, number) user = self.find_user_like(message.source) if user is None: message.dispatch("Could not find PagerDuty user matching: %s" % message.source) return data = { "note": { "content": params }, "requester_id": user["id"] } req = request.post(url, headers=self.api_headers, json=data) if request.ok(req): message.dispatch("Noted.") else: message.dispatch("Unable to create note: %d" % req.status_code) message.dispatch(req.text)
def resolve_incident(self, message): """Close the current PagerDuty incident.""" incident_id = self.get_incident_id() if incident_id is None: message.dispatch("Could not find ID for current incident.") return url = "%s/api/v1/incidents/%s/resolve" % (self.subdomain, incident_id) user = self.find_user_like(message.source) if user is None: message.dispatch("Could not find PagerDuty user: %s" % message.source) return data = {"requester_id": user["id"]} req = request.put(url, headers=self.api_headers, json=data) if request.ok(req): self.reset_current_incident() message.dispatch("Resolved incident successfully.") else: message.dispatch("Could not resolve incident: %d" % req.status_code) message.dispatch(req.text)
def _find_users(self, name): """Find PagerDuty user accounts.""" url = "%s/users?query=%s&include[]=contact_methods" % (self.endpoint, name) req = request.get(url, headers=self.api_headers) if request.ok(req): return req.json()
def get_users(self): """Get PagerDuty users and fill the cache.""" url = "%s/api/v1/users" % self.subdomain req = request.get(url, headers=self.api_headers) if request.ok(req): response_json = req.json() return response_json["users"] else: return None
def find_incident_id(self): """Finds incident id from the current incident number.""" number = self.get_incident_number() if number is not None: url = "%s/api/v1/incidents/%s" % (self.subdomain, number) req = request.get(url, headers=self.api_headers) if request.ok(req): response_json = req.json() return response_json["id"] return None
def get_incidents(service_id): """Fetch and return PagerDuty incidents.""" url = "%s/incidents?service_ids[]=%s" % (api_endpoint, service_id) req = request.get(url, headers=api_headers) if not request.ok(req): flask.abort(req.status_code) return flask.render_template( "pagerduty_incidents.html", incidents=req.json()["incidents"], version=version.version_string())
def get_notes(incident_id): """Fetch and return PagerDuty notes.""" url = "%s/incidents/%s/notes" % (api_endpoint, incident_id) req = request.get(url, headers=api_headers) if not request.ok(req): flask.abort(req.status_code) return flask.render_template( "pagerduty_notes.html", notes=req.json()["notes"], version=version.version_string())
def get_services(): """Fetch and return PagerDuty services.""" url = "%s/services?limit=100" % api_endpoint req = request.get(url, headers=api_headers) if not request.ok(req): flask.abort(req.status_code) return flask.render_template( "pagerduty_services.html", services=req.json()["services"], version=version.version_string())
def query(self, message, params=None, **kwargs): """Query an incident (ex: .query <ID>).""" url = "%s/incidents/%s" % (self.endpoint, params) req = request.get(url, headers=self.api_headers) if request.ok(req): incident = req.json()["incident"] summary = incident["summary"] status = incident["status"] link = incident["html_url"] message.dispatch("%s [%s]: %s" % (summary, status, link)) else: message.dispatch("Unable to query incident: %d" % req.status_code) message.dispatch(req.text)
def find_incident_number(self): """Finds incident number from the current incident key.""" key = self.get_incident_key() if key is not None: url = "%s/api/v1/incidents" % self.subdomain params = {"incident_key": key, "sort_by": "created_on:desc"} req = request.get(url, headers=self.api_headers, params=params) if request.ok(req): response_json = req.json() incidents = response_json["incidents"] if len(incidents) > 0: number = incidents[0]["incident_number"] return number return None
def oncall(self, message, params=None, **kwargs): """Show who is on call (ex: .oncall).""" url = "%s/oncalls" % self.endpoint req = request.get(url, headers=self.api_headers) if request.ok(req): on_calls = [] for policy in req.json()["oncalls"]: if policy["schedule"]: on_calls.append("%s (%s)" % (policy["schedule"]["summary"], policy["user"]["summary"])) message.dispatch(", ".join(on_calls)) else: message.dispatch("Unable to fetch list: %d" % req.status_code) message.dispatch(req.text)
def notes(self, message, params=None, **kwargs): """List all notes an incident (ex: .note <ID>).""" url = "%s/incidents/%s/notes" % (self.endpoint, params) req = request.get(url, headers=self.api_headers) if request.ok(req): notes = req.json()["notes"] message.dispatch("There are %d notes." % len(notes)) for note in notes: message.dispatch("%s %s - %s" % (note["created_at"], note["user"]["summary"], note["content"])) else: message.dispatch("Unable to fetch notes: %d" % req.status_code) message.dispatch(req.text)
def services(self, message, params=None, **kwargs): """List PagerDuty services (ex: .services).""" url = "%s/services?&include[]=integrations&limit=100" % self.endpoint req = request.get(url, headers=self.api_headers) if request.ok(req): for service in req.json()["services"]: try: integration = service["integrations"][0] integration_key = integration["integration_key"] message.dispatch("%s (%s)" % (service["summary"], integration_key)) except KeyError: continue else: message.dispatch("Unable to fetch services: %d" % req.status_code) message.dispatch(req.text)
def oncall(self, message, params=None, **kwargs): """Show who is on call (ex: .oncall [<group>]).""" url = "%s/api/v1/escalation_policies/on_call" % self.subdomain req = request.get(url, headers=self.api_headers, params={"query": params}) if request.ok(req): response_json = req.json() for policy in response_json["escalation_policies"]: message.dispatch(policy["name"]) for level in policy["on_call"]: message.dispatch("- Level %s: %s <%s>" % ( level["level"], level["user"]["name"], level["user"]["email"])) else: message.dispatch("Unable to fetch list: %d" % req.status_code)
def note(self, message, params=None, **kwargs): """Create a note for an incident (ex: .note <ID> <message>).""" params = params.split(" ") incident_id = params.pop(0) self.api_headers["From"] = self._find_user(message.source) data = { "note": { "content": " ".join(params) } } url = "%s/incidents/%s/notes" % (self.endpoint, incident_id) req = request.post(url, headers=self.api_headers, json=data) if request.ok(req): message.dispatch("Noted.") else: message.dispatch("Unable to create note: %d" % req.status_code) message.dispatch(req.text)
def resolve(self, message, params=None, **kwargs): """Resolve an incident (ex: .snooze <ID>).""" self.api_headers["From"] = self._find_user(message.source) data = { "incidents": [{ "id": params, "type": "incident", "status": "resolved" }] } url = "%s/incidents" % self.endpoint req = request.put(url, headers=self.api_headers, json=data) if request.ok(req): message.dispatch("Resolved.") else: message.dispatch("Unable to resolve: %d" % req.status_code) message.dispatch(req.text)
def create_incident(self, message, description): """Create a PagerDuty incident with specified description.""" # would have been called url, but flake8 complains that line is 81 long u = "https://events.pagerduty.com/generic/2010-04-15/create_event.json" data = { "service_key": self.integration_key, "event_type": "trigger", "description": description, "incident_key": utils.datetime_now_string(), "details": {"triggered by": message.source} } req = request.post(u, json=data) response_json = req.json() if request.ok(req): self.set_incident_key(response_json["incident_key"]) message.dispatch("Created incident with incident_key: %s" % self.get_incident_key()) else: message.dispatch("Error creating incident: %d" % req.status_code) message.dispatch(response_json["message"])
def notes(self, message, params=None, **kwargs): """List all notes in current incident.""" number = self.get_incident_number() if number is None: msg = "Could not get incident number for current incident." message.dispatch(msg) return url = "%s/api/v1/incidents/%s/notes" % (self.subdomain, number) req = request.get(url, headers=self.api_headers) if request.ok(req): response_json = req.json() notes = response_json["notes"] message.dispatch("There are %d notes." % len(notes)) for note in notes: message.dispatch("%s %s - %s" % (note["created_at"], note["user"]["name"], note["content"])) else: message.dispatch("Unable to fetch notes: %d" % req.status_code)
def alert(self, message, params=None, **kwargs): """Trigger a custom alert (ex: .alert <service_key> <description>.""" params = params.split(" ") service_key = params.pop(0) description = " ".join(params) data = { "service_key": service_key, "event_type": "trigger", "description": description, "details": description, "client": "pyhole %s" % version.version(), "client_url": "https://github.com/jk0/pyhole" } events_host = "https://events.pagerduty.com/" url = "%s/generic/2010-04-15/create_event.json" % events_host req = request.post(url, headers=self.api_headers, json=data) if request.ok(req): message.dispatch("Triggered.") else: message.dispatch("Unable to trigger alert: %d" % req.status_code) message.dispatch(req.text)