alarms: refactor the alarms subsystem
also include eotk alarms now
This commit is contained in:
parent
a935055083
commit
e2ce24bf3b
17 changed files with 288 additions and 152 deletions
|
@ -1,7 +1,10 @@
|
|||
from abc import abstractmethod
|
||||
from datetime import datetime
|
||||
from typing import Union, List, Optional, Any
|
||||
|
||||
from app.alarms import alarms_for
|
||||
from app.extensions import db
|
||||
from app.models.alarms import Alarm
|
||||
|
||||
|
||||
class AbstractConfiguration(db.Model): # type: ignore
|
||||
|
@ -13,6 +16,15 @@ class AbstractConfiguration(db.Model): # type: ignore
|
|||
updated = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
destroyed = db.Column(db.DateTime(), nullable=True)
|
||||
|
||||
@property
|
||||
def alarms(self) -> List[Alarm]:
|
||||
return alarms_for(self.brn)
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def brn(self) -> str:
|
||||
raise NotImplementedError()
|
||||
|
||||
def destroy(self) -> None:
|
||||
self.destroyed = datetime.utcnow()
|
||||
self.updated = datetime.utcnow()
|
||||
|
@ -59,6 +71,11 @@ class AbstractResource(db.Model): # type: ignore
|
|||
if self.updated is None:
|
||||
self.updated = datetime.utcnow()
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def brn(self) -> str:
|
||||
raise NotImplementedError()
|
||||
|
||||
def deprecate(self, *, reason: str) -> None:
|
||||
self.deprecated = datetime.utcnow()
|
||||
self.deprecation_reason = reason
|
||||
|
|
|
@ -14,38 +14,30 @@ class AlarmState(enum.Enum):
|
|||
|
||||
class Alarm(db.Model): # type: ignore
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
target = db.Column(db.String(60), nullable=False)
|
||||
group_id = db.Column(db.Integer, db.ForeignKey("group.id"))
|
||||
origin_id = db.Column(db.Integer, db.ForeignKey("origin.id"))
|
||||
proxy_id = db.Column(db.Integer, db.ForeignKey("proxy.id"))
|
||||
bridge_id = db.Column(db.Integer, db.ForeignKey("bridge.id"))
|
||||
alarm_type = db.Column(db.String(255), nullable=False)
|
||||
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())
|
||||
text = db.Column(db.String(255))
|
||||
|
||||
group = db.relationship("Group", back_populates="alarms")
|
||||
origin = db.relationship("Origin", back_populates="alarms")
|
||||
proxy = db.relationship("Proxy", back_populates="alarms")
|
||||
bridge = db.relationship("Bridge", back_populates="alarms")
|
||||
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", "group_id", "origin_id", "proxy_id", "bridge_id", "alarm_type",
|
||||
"alarm_state", "state_changed", "last_updated", "text"
|
||||
]
|
||||
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()
|
||||
]
|
||||
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 != 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()
|
||||
db.session.commit()
|
||||
|
|
|
@ -13,7 +13,6 @@ class Group(AbstractConfiguration):
|
|||
bridgeconfs = db.relationship("BridgeConf", back_populates="group")
|
||||
eotks = db.relationship("Eotk", back_populates="group")
|
||||
onions = db.relationship("Onion", back_populates="group")
|
||||
alarms = db.relationship("Alarm", back_populates="group")
|
||||
|
||||
@classmethod
|
||||
def csv_header(cls) -> List[str]:
|
||||
|
|
|
@ -39,7 +39,6 @@ class Bridge(AbstractResource):
|
|||
bridgeline = db.Column(db.String(255), nullable=True)
|
||||
|
||||
conf = db.relationship("BridgeConf", back_populates="bridges")
|
||||
alarms = db.relationship("Alarm", back_populates="bridge")
|
||||
|
||||
@classmethod
|
||||
def csv_header(cls) -> List[str]:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from typing import Optional, List
|
||||
|
||||
from flask import current_app
|
||||
from tldextract import extract
|
||||
|
||||
from app.extensions import db
|
||||
|
@ -14,7 +15,10 @@ class Origin(AbstractConfiguration):
|
|||
|
||||
group = db.relationship("Group", back_populates="origins")
|
||||
proxies = db.relationship("Proxy", back_populates="origin")
|
||||
alarms = db.relationship("Alarm", back_populates="origin")
|
||||
|
||||
@property
|
||||
def brn(self) -> str:
|
||||
return f"brn:{current_app.config['GLOBAL_NAMESPACE']}:{self.group_id}:mirror:conf:origin/{self.domain_name}"
|
||||
|
||||
@classmethod
|
||||
def csv_header(cls) -> List[str]:
|
||||
|
@ -45,7 +49,10 @@ class Proxy(AbstractResource):
|
|||
url = db.Column(db.String(255), nullable=True)
|
||||
|
||||
origin = db.relationship("Origin", back_populates="proxies")
|
||||
alarms = db.relationship("Alarm", back_populates="proxy")
|
||||
|
||||
@property
|
||||
def brn(self) -> str:
|
||||
return f"brn:{current_app.config['GLOBAL_NAMESPACE']}:{self.origin.group_id}:mirror:{self.provider}:proxy/{self.id}"
|
||||
|
||||
@classmethod
|
||||
def csv_header(cls) -> List[str]:
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
from flask import current_app
|
||||
|
||||
from app.extensions import db
|
||||
from app.models import AbstractConfiguration, AbstractResource
|
||||
|
||||
|
@ -17,3 +19,7 @@ class Eotk(AbstractResource):
|
|||
region = db.Column(db.String(20), nullable=False)
|
||||
|
||||
group = db.relationship("Group", back_populates="eotks")
|
||||
|
||||
@property
|
||||
def brn(self) -> str:
|
||||
return f"brn:{current_app.config['GLOBAL_NAMESPACE']}:{self.group_id}:eotk:{self.provider}:instance/{self.region}"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue