This PR does a bunch of changes to prepare OnCall for Unified Slack App: 1. Install Slack via Chatops-Proxy. This change contains two parts: getting a Slack install link from chatops-proxy ([code](https://github.com/grafana/oncall/pull/4232/files#diff-437a77d49fc04b92d315651b3df5991000b1ab74cf60aabb21aa77cb2823bf52R46)) and receiving a "slack installed" event from chatops-proxy ([code](https://github.com/grafana/oncall/pull/4232/files#diff-976d106f0962be5c1de5e35582193f68435ed0c17f2defd6bd2857bf6e27f65d)). Also it means that OnCall doesn't need to register slack_links anymore when slack is connected/disconnected. These changes are behind UNIFIED_SLACK_APP_ENABLED flag and should be no-op if flag is not enabled. 2. Get rid of Multiregionatily restrictions - instrument all slack interactions with a ProxyMeta - json data telling chatops-proxy where to route the interaction. Note, that it doesn't apply for "Add to resolution notes" message action - it will be handled differently in following PR. 3. Move all chatops-proxy related stuff from common/oncall-gateway to apps/chatops-proxy Minor changes: 1. Remove usage of **CHATOPS_V3** flag. Chatops v3 is already released (It's a refactoring from previous quarter) --------- Co-authored-by: Vadim Stepanov <vadimkerr@gmail.com> Co-authored-by: Rares Mardare <rares.mardare@grafana.com>
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
import logging
|
|
import typing
|
|
|
|
from .handlers import Handler, SlackInstallationHandler
|
|
from .types import Event
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ChatopsEventsHandler:
|
|
"""
|
|
ChatopsEventsHandler is a root handler which receives event from Chatops-Proxy and chooses the handler to process it.
|
|
"""
|
|
|
|
HANDLERS: typing.List[typing.Type[Handler]] = [SlackInstallationHandler]
|
|
|
|
def handle(self, event_data: Event) -> bool:
|
|
"""
|
|
handle iterates over all handlers and chooses the first one that matches the event.
|
|
Returns True if a handler was found and False otherwise.
|
|
"""
|
|
logger.info(f"msg=\"ChatopsEventsHandler: Handling\" event_type={event_data.get('event_type')}")
|
|
for h in self.HANDLERS:
|
|
if h.match(event_data):
|
|
logger.info(
|
|
f"msg=\"ChatopsEventsHandler: Found matching handler {h.__name__}\" event_type={event_data.get('event_type')}"
|
|
)
|
|
self._exec(h.handle, event_data.get("data", {}))
|
|
return True
|
|
logger.error(f"msg=\"ChatopsEventsHandler: No handler found\" event_type={event_data.get('event_type')}")
|
|
return False
|
|
|
|
def _exec(self, handlefunc: typing.Callable[[dict], None], data: dict):
|
|
"""
|
|
_exec is a helper method to execute a handler's handle method.
|
|
"""
|
|
return handlefunc(data)
|