2022-04-22 14:01:16 +01:00
|
|
|
import enum
|
|
|
|
from datetime import datetime
|
2022-05-16 11:44:03 +01:00
|
|
|
from typing import List, Any
|
2022-04-22 14:01:16 +01:00
|
|
|
|
2022-05-17 08:28:37 +01:00
|
|
|
from app.extensions import db
|
2022-04-22 14:01:16 +01:00
|
|
|
|
|
|
|
|
|
|
|
class AlarmState(enum.Enum):
|
|
|
|
UNKNOWN = 0
|
|
|
|
OK = 1
|
|
|
|
WARNING = 2
|
|
|
|
CRITICAL = 3
|
|
|
|
|
|
|
|
|
2022-05-16 11:44:03 +01:00
|
|
|
class Alarm(db.Model): # type: ignore
|
2022-04-22 14:01:16 +01:00
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
2022-05-18 15:49:36 +01:00
|
|
|
target = db.Column(db.String(255), nullable=False)
|
|
|
|
aspect = db.Column(db.String(255), nullable=False)
|
2022-04-22 14:01:16 +01:00
|
|
|
alarm_state = db.Column(db.Enum(AlarmState), default=AlarmState.UNKNOWN, nullable=False)
|
|
|
|
state_changed = db.Column(db.DateTime(), nullable=False)
|
2022-05-18 15:49:36 +01:00
|
|
|
last_updated = db.Column(db.DateTime(), nullable=False)
|
|
|
|
text = db.Column(db.String(255), nullable=False)
|
2022-04-22 14:01:16 +01:00
|
|
|
|
|
|
|
@classmethod
|
2022-05-16 11:44:03 +01:00
|
|
|
def csv_header(cls) -> List[str]:
|
2022-05-18 15:49:36 +01:00
|
|
|
return ["id", "target", "alarm_type", "alarm_state", "state_changed", "last_updated", "text"]
|
2022-04-22 14:01:16 +01:00
|
|
|
|
2022-05-16 11:44:03 +01:00
|
|
|
def csv_row(self) -> List[Any]:
|
2022-05-18 15:49:36 +01:00
|
|
|
return [getattr(self, x) for x in self.csv_header()]
|
2022-04-22 14:01:16 +01:00
|
|
|
|
2022-05-16 11:44:03 +01:00
|
|
|
def update_state(self, state: AlarmState, text: str) -> None:
|
2022-05-18 15:49:36 +01:00
|
|
|
from app.models.activity import Activity
|
|
|
|
|
2022-04-22 14:01:16 +01:00
|
|
|
if self.alarm_state != state or self.state_changed is None:
|
|
|
|
self.state_changed = datetime.utcnow()
|
2022-05-18 15:49:36 +01:00
|
|
|
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)
|
2022-04-22 14:01:16 +01:00
|
|
|
self.alarm_state = state
|
|
|
|
self.text = text
|
|
|
|
self.last_updated = datetime.utcnow()
|