import json import logging from typing import Any, Tuple from ops_bot.common import COLOR_ALARM, COLOR_OK, COLOR_UNKNOWN def handle_subscribe_confirm(payload: Any) -> Tuple[str, str]: message = payload.get("Message") url = payload.get("SubscribeURL") plain = f"{message}\n\n{url}" return plain, plain def handle_notification(payload: Any) -> Tuple[str, str]: message = payload.get("Message") subject = payload.get("Subject") plain = f"{subject}\n{message}" formatted = ( f"{subject}\n
{message}
" ) return plain, formatted def handle_json_notification(payload: Any, body: Any) -> Tuple[str, str]: if "AlarmName" not in body: msg = "Received unknown json payload type over AWS SNS" logging.info(msg) logging.info(payload.get("Message")) return msg, msg description = body.get("AlarmDescription") subject = payload.get("Subject") state_value = body.get("NewStateValue", "unknown") if state_value == "ALARM": color = COLOR_ALARM elif state_value == "OK": color = COLOR_OK else: color = COLOR_UNKNOWN plain = f"{subject}" formatted = f"{subject}\n" if state_value == "OK": plain += "\n(this alarm has been resolved!)" formatted += "\n(this alarm has been resolved!)
" else: plain += "\n{description}" formatted += f"\n{description}
" return plain, formatted def parse_sns_event(payload: Any) -> Tuple[str, str]: if payload.get("Type") == "SubscriptionConfirmation": return handle_subscribe_confirm(payload) elif payload.get("Type") == "UnsubscribeConfirmation": return handle_subscribe_confirm(payload) elif payload.get("Type") == "Notification": try: body = json.loads(payload.get("Message")) return handle_json_notification(payload, body) except Exception: return handle_notification(payload) raise Exception("Unnown SNS payload type")