X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fcore%2Fdatabase.py;h=61bd18060122f759a22c625064e7a1b98b1db84e;hb=628df021896fa8775f9743af62a4267b617cc35c;hp=e763a5b73f18dbab830d6422be05549ea088daab;hpb=ffe5a8e4e35d3fc7860eb9231618dc0e84e448b7;p=osm%2FMON.git diff --git a/osm_mon/core/database.py b/osm_mon/core/database.py index e763a5b..61bd180 100644 --- a/osm_mon/core/database.py +++ b/osm_mon/core/database.py @@ -23,95 +23,74 @@ ## import logging +import os +from typing import Iterable -from peewee import * +from peewee import CharField, FloatField, Model, AutoField, Proxy, ForeignKeyField +from peewee_migrate import Router from playhouse.db_url import connect -from osm_mon.core.settings import Config +from osm_mon import migrations +from osm_mon.core.config import Config log = logging.getLogger(__name__) -cfg = Config.instance() -cfg.read_environ() -db = connect(cfg.DATABASE) +db = Proxy() class BaseModel(Model): + id = AutoField(primary_key=True) + class Meta: database = db -class VimCredentials(BaseModel): +class Alarm(BaseModel): uuid = CharField(unique=True) name = CharField() - type = CharField() - url = CharField() - user = CharField() - password = CharField() - tenant_name = CharField() - config = TextField(default='{}') - - -class Alarm(BaseModel): - alarm_id = CharField() + severity = CharField() threshold = FloatField() operation = CharField() - metric_name = CharField() - vdu_name = CharField() - vnf_member_index = CharField() - ns_id = CharField() - credentials = ForeignKeyField(VimCredentials, backref='alarms') + statistic = CharField() + metric = CharField() + + +class AlarmTag(BaseModel): + name = CharField() + value = CharField() + alarm = ForeignKeyField(Alarm, related_name='tags', on_delete='CASCADE') class DatabaseManager: - def create_tables(self): - try: - db.connect() - db.create_tables([VimCredentials, Alarm]) - db.close() - except Exception as e: - log.exception("Error creating tables: ") - - def get_credentials(self, vim_uuid): - return VimCredentials.get_or_none(VimCredentials.uuid == vim_uuid) - - def save_credentials(self, vim_credentials): - """Saves vim credentials. If a record with same uuid exists, overwrite it.""" - exists = VimCredentials.get_or_none(VimCredentials.uuid == vim_credentials.uuid) - if exists: - vim_credentials.id = exists.id - vim_credentials.save() - - def get_credentials_for_alarm_id(self, alarm_id, vim_type): - alarm = Alarm.select() \ - .where(Alarm.alarm_id == alarm_id) \ - .join(VimCredentials) \ - .where(VimCredentials.type == vim_type).get() - return alarm.credentials - - def get_alarm(self, alarm_id, vim_type): - alarm = Alarm.select() \ - .where(Alarm.alarm_id == alarm_id) \ - .join(VimCredentials) \ - .where(VimCredentials.type == vim_type).get() - return alarm - - def save_alarm(self, alarm_id, vim_uuid, threshold=None, operation=None, metric_name=None, vdu_name=None, - vnf_member_index=None, ns_id=None): - """Saves alarm. If a record with same id and vim_uuid exists, overwrite it.""" - alarm = Alarm() - alarm.alarm_id = alarm_id - creds = VimCredentials.get(VimCredentials.uuid == vim_uuid) - alarm.credentials = creds - alarm.threshold = threshold - alarm.operation = operation - alarm.metric_name = metric_name - alarm.vdu_name = vdu_name - alarm.vnf_member_index = vnf_member_index - alarm.ns_id = ns_id - exists = Alarm.select(Alarm.alarm_id == alarm.alarm_id) \ - .join(VimCredentials) \ - .where(VimCredentials.uuid == vim_uuid) - if len(exists): - alarm.id = exists[0].id - alarm.save() + def __init__(self, config: Config): + db.initialize(connect(config.get('sql', 'database_uri'))) + + def create_tables(self) -> None: + db.connect() + with db.atomic(): + router = Router(db, os.path.dirname(migrations.__file__)) + router.run() + db.close() + + +class AlarmTagRepository: + @staticmethod + def create(**query) -> Alarm: + return AlarmTag.create(**query) + + +class AlarmRepository: + @staticmethod + def create(**query) -> Alarm: + return Alarm.create(**query) + + @staticmethod + def get(*expressions) -> Alarm: + return Alarm.select().where(*expressions).get() + + @staticmethod + def list(*expressions) -> Iterable[Alarm]: + if expressions == (): + return Alarm.select() + else: + return Alarm.select().where(*expressions)