import enum from datetime import datetime from typing import List, Any from app.extensions import db class AlarmState(enum.Enum): UNKNOWN = 0 OK = 1 WARNING = 2 CRITICAL = 3 class Alarm(db.Model): # type: ignore id = db.Column(db.Integer, primary_key=True) target = db.Column(db.String(255), nullable=False) aspect = db.Column(db.String(255), nullable=False) alarm_state = db.Column(db.Enum(AlarmState), default=AlarmState.UNKNOWN, nullable=False) state_changed = db.Column(db.DateTime(), nullable=False) last_updated = db.Column(db.DateTime(), nullable=False) text = db.Column(db.String(255), nullable=False) @classmethod def csv_header(cls) -> List[str]: return ["id", "target", "alarm_type", "alarm_state", "state_changed", "last_updated", "text"] def csv_row(self) -> List[Any]: return [getattr(self, x) for x in self.csv_header()] def update_state(self, state: AlarmState, text: str) -> None: from app.models.activity import Activity if self.alarm_state is None: self.alarm_state = AlarmState.UNKNOWN if self.alarm_state != state or self.state_changed is None: self.state_changed = datetime.utcnow() activity = Activity(activity_type="alarm_state", text=f"{self.alarm_state.name}->{state.name}! State changed for " f"{self.aspect} on {self.target}: {text}") activity.notify() db.session.add(activity) self.alarm_state = state self.text = text self.last_updated = datetime.utcnow()