quick-start-connectors
80 строк · 2.3 Кб
1import requests
2from flask import current_app as app
3
4from . import UpstreamProviderError
5
6client = None
7
8
9class PagerdutySearchClient:
10base_url = "https://api.pagerduty.com"
11get_users_endpoint = "/users"
12get_teams_endpoint = "/teams"
13get_incidents_endpoint = "/incidents"
14
15def __init__(self, key, search_types):
16self.headers = {"Authorization": f"Token token={key}"}
17self.search_types = search_types
18
19def get_search_types(self):
20return self.search_types
21
22def _make_request(self, url, params={}):
23response = requests.get(
24url,
25headers=self.headers,
26params=params,
27)
28
29if response.status_code != 200:
30message = response.text or f"Error: HTTP {response.status_code}"
31raise UpstreamProviderError(message)
32
33return response.json()
34
35def search_incidents(self, query):
36url = f"{self.base_url}{self.get_incidents_endpoint}"
37params = {
38"limit": 100,
39}
40response = self._make_request(url, params)
41
42# GET Incidents does not have an in-built query feature, it only returns a list of incidents
43# Perform search locally on certain incident properties
44query = query.lower()
45keywords = query.split()
46search_properties = ["title", "description", "summary"]
47results = []
48for incident in response["incidents"]:
49for prop in search_properties:
50value = incident.get(prop, "").lower()
51
52if any(keyword in value for keyword in keywords):
53results.append(incident)
54
55return results
56
57def search_users(self, query):
58url = f"{self.base_url}{self.get_users_endpoint}"
59params = {"query": query}
60response = self._make_request(url, params)
61
62return response["users"]
63
64def search_teams(self, query):
65url = f"{self.base_url}{self.get_teams_endpoint}"
66params = {"query": query}
67response = self._make_request(url, params)
68
69return response["teams"]
70
71
72def get_client():
73global client
74assert (key := app.config.get("API_KEY")), "PAGERDUTY_API_KEY must be set"
75enabled_search_types = app.config.get("ENABLED_SEARCH_TYPES", ["incidents"])
76
77if not client:
78client = PagerdutySearchClient(key, enabled_search_types)
79
80return client
81