Revert "Migrates alarms to MongoDB"
[osm/MON.git] / osm_mon / core / database.py
index e763a5b..61bd180 100644 (file)
 ##
 
 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)