models: big refactor
This commit is contained in:
parent
86c3683ad6
commit
2674e115f3
22 changed files with 284 additions and 266 deletions
62
app/models/__init__.py
Normal file
62
app/models/__init__.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
from datetime import datetime
|
||||
|
||||
from app.extensions import db
|
||||
|
||||
|
||||
class AbstractConfiguration(db.Model):
|
||||
__abstract__ = True
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
description = db.Column(db.String(255), nullable=False)
|
||||
added = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
updated = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
destroyed = db.Column(db.DateTime(), nullable=True)
|
||||
|
||||
def destroy(self):
|
||||
self.destroyed = datetime.utcnow()
|
||||
self.updated = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return [
|
||||
"id", "description", "added", "updated", "destroyed"
|
||||
]
|
||||
|
||||
def csv_row(self):
|
||||
return [
|
||||
getattr(self, x) for x in self.csv_header()
|
||||
]
|
||||
|
||||
|
||||
class AbstractResource(db.Model):
|
||||
__abstract__ = True
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
added = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
updated = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
deprecated = db.Column(db.DateTime(), nullable=True)
|
||||
destroyed = db.Column(db.DateTime(), nullable=True)
|
||||
|
||||
def deprecate(self):
|
||||
self.deprecated = datetime.utcnow()
|
||||
self.updated = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
def destroy(self):
|
||||
if self.deprecated is None:
|
||||
self.deprecated = datetime.utcnow()
|
||||
self.destroyed = datetime.utcnow()
|
||||
self.updated = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return [
|
||||
"id", "added", "updated", "deprecated", "destroyed"
|
||||
]
|
||||
|
||||
def csv_row(self):
|
||||
return [
|
||||
getattr(self, x) for x in self.csv_header()
|
||||
]
|
50
app/models/alarms.py
Normal file
50
app/models/alarms.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
import enum
|
||||
from datetime import datetime
|
||||
|
||||
from app import db
|
||||
|
||||
|
||||
class AlarmState(enum.Enum):
|
||||
UNKNOWN = 0
|
||||
OK = 1
|
||||
WARNING = 2
|
||||
CRITICAL = 3
|
||||
|
||||
|
||||
class Alarm(db.Model):
|
||||
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)
|
||||
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")
|
||||
|
||||
@classmethod
|
||||
def csv_header(cls):
|
||||
return [
|
||||
"id", "target", "group_id", "origin_id", "proxy_id", "bridge_id", "alarm_type",
|
||||
"alarm_state", "state_changed", "last_updated", "text"
|
||||
]
|
||||
|
||||
def csv_row(self):
|
||||
return [
|
||||
self[x] for x in self.csv_header()
|
||||
]
|
||||
|
||||
def update_state(self, state: AlarmState, text: str):
|
||||
if self.alarm_state != state or self.state_changed is None:
|
||||
self.state_changed = datetime.utcnow()
|
||||
self.alarm_state = state
|
||||
self.text = text
|
||||
self.last_updated = datetime.utcnow()
|
||||
db.session.commit()
|
46
app/models/base.py
Normal file
46
app/models/base.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
from datetime import datetime
|
||||
|
||||
from app import db
|
||||
from app.models import AbstractConfiguration
|
||||
|
||||
|
||||
class Group(AbstractConfiguration):
|
||||
group_name = db.Column(db.String(80), unique=True, nullable=False)
|
||||
eotk = db.Column(db.Boolean())
|
||||
|
||||
origins = db.relationship("Origin", back_populates="group")
|
||||
bridgeconfs = db.relationship("BridgeConf", back_populates="group")
|
||||
alarms = db.relationship("Alarm", back_populates="group")
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return super().csv_header() + [
|
||||
"group_name", "eotk"
|
||||
]
|
||||
|
||||
|
||||
class MirrorList(AbstractConfiguration):
|
||||
provider = db.Column(db.String(255), nullable=False)
|
||||
format = db.Column(db.String(20), nullable=False)
|
||||
container = db.Column(db.String(255), nullable=False)
|
||||
branch = db.Column(db.String(255), nullable=False)
|
||||
filename = db.Column(db.String(255), nullable=False)
|
||||
|
||||
def destroy(self):
|
||||
self.destroyed = datetime.utcnow()
|
||||
self.updated = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
def url(self):
|
||||
if self.provider == "gitlab":
|
||||
return f"https://gitlab.com/{self.container}/-/raw/{self.branch}/{self.filename}"
|
||||
if self.provider == "github":
|
||||
return f"https://raw.githubusercontent.com/{self.container}/{self.branch}/{self.filename}"
|
||||
if self.provider == "s3":
|
||||
return f"s3://{self.container}/{self.filename}"
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return super().csv_header() + [
|
||||
"provider", "format", "container", "branch", "filename"
|
||||
]
|
40
app/models/bridges.py
Normal file
40
app/models/bridges.py
Normal file
|
@ -0,0 +1,40 @@
|
|||
from datetime import datetime
|
||||
|
||||
from app import db
|
||||
from app.models import AbstractResource
|
||||
|
||||
|
||||
class BridgeConf(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=False)
|
||||
provider = db.Column(db.String(20), nullable=False)
|
||||
method = db.Column(db.String(20), nullable=False)
|
||||
description = db.Column(db.String(255))
|
||||
number = db.Column(db.Integer())
|
||||
added = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
updated = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)
|
||||
destroyed = db.Column(db.DateTime(), nullable=True)
|
||||
|
||||
group = db.relationship("Group", back_populates="bridgeconfs")
|
||||
bridges = db.relationship("Bridge", back_populates="conf")
|
||||
|
||||
def destroy(self):
|
||||
self.destroyed = datetime.utcnow()
|
||||
self.updated = datetime.utcnow()
|
||||
for bridge in self.bridges:
|
||||
if bridge.destroyed is None:
|
||||
bridge.destroyed = datetime.utcnow()
|
||||
bridge.updated = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
|
||||
class Bridge(AbstractResource):
|
||||
conf_id = db.Column(db.Integer, db.ForeignKey("bridge_conf.id"), nullable=False)
|
||||
terraform_updated = db.Column(db.DateTime(), nullable=True)
|
||||
nickname = db.Column(db.String(255), nullable=True)
|
||||
fingerprint = db.Column(db.String(255), nullable=True)
|
||||
hashed_fingerprint = db.Column(db.String(255), nullable=True)
|
||||
bridgeline = db.Column(db.String(255), nullable=True)
|
||||
|
||||
conf = db.relationship("BridgeConf", back_populates="bridges")
|
||||
alarms = db.relationship("Alarm", back_populates="bridge")
|
53
app/models/mirrors.py
Normal file
53
app/models/mirrors.py
Normal file
|
@ -0,0 +1,53 @@
|
|||
from app import db
|
||||
from app.models import AbstractConfiguration, AbstractResource
|
||||
|
||||
|
||||
class Origin(AbstractConfiguration):
|
||||
group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=False)
|
||||
domain_name = db.Column(db.String(255), unique=True, nullable=False)
|
||||
|
||||
group = db.relationship("Group", back_populates="origins")
|
||||
mirrors = db.relationship("Mirror", back_populates="origin")
|
||||
proxies = db.relationship("Proxy", back_populates="origin")
|
||||
alarms = db.relationship("Alarm", back_populates="origin")
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return super().csv_header() + [
|
||||
"group_id", "domain_name"
|
||||
]
|
||||
|
||||
def destroy(self):
|
||||
super().destroy()
|
||||
for proxy in self.proxies:
|
||||
proxy.destroy()
|
||||
|
||||
|
||||
class Proxy(AbstractResource):
|
||||
origin_id = db.Column(db.Integer, db.ForeignKey("origin.id"), nullable=False)
|
||||
provider = db.Column(db.String(20), nullable=False)
|
||||
slug = db.Column(db.String(20), nullable=True)
|
||||
terraform_updated = db.Column(db.DateTime(), nullable=True)
|
||||
url = db.Column(db.String(255), nullable=True)
|
||||
|
||||
origin = db.relationship("Origin", back_populates="proxies")
|
||||
alarms = db.relationship("Alarm", back_populates="proxy")
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return super().csv_header() + [
|
||||
"origin_id", "provider", "slug", "terraform_updated", "url"
|
||||
]
|
||||
|
||||
|
||||
class Mirror(AbstractResource):
|
||||
origin_id = db.Column(db.Integer, db.ForeignKey("origin.id"), nullable=False)
|
||||
url = db.Column(db.String(255), unique=True, nullable=False)
|
||||
|
||||
origin = db.relationship("Origin", back_populates="mirrors")
|
||||
|
||||
@classmethod
|
||||
def csv_header(self):
|
||||
return super().csv_header() + [
|
||||
"origin_id", "url"
|
||||
]
|
Loading…
Add table
Add a link
Reference in a new issue