##
import logging
+import os
+from typing import Iterable
-from peewee import CharField, TextField, FloatField, Model
+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):
- uuid = CharField(unique=True)
- name = CharField()
- type = CharField()
- url = CharField()
- user = CharField()
- password = CharField()
- tenant_name = CharField()
- config = TextField(default='{}')
-
-
class Alarm(BaseModel):
+ uuid = CharField(unique=True)
name = CharField()
severity = CharField()
threshold = FloatField()
operation = CharField()
statistic = CharField()
- monitoring_param = CharField()
- vdur_name = CharField()
- vnf_member_index = CharField()
- nsr_id = CharField()
+ metric = CharField()
+
+
+class AlarmTag(BaseModel):
+ name = CharField()
+ value = CharField()
+ alarm = ForeignKeyField(Alarm, related_name='tags', on_delete='CASCADE')
class DatabaseManager:
+ def __init__(self, config: Config):
+ db.initialize(connect(config.get('sql', 'database_uri')))
+
def create_tables(self) -> None:
- try:
- db.connect()
- db.create_tables([VimCredentials, Alarm])
- db.close()
- except Exception:
- log.exception("Error creating tables: ")
-
- def get_credentials(self, vim_uuid) -> VimCredentials:
- return VimCredentials.get_or_none(VimCredentials.uuid == vim_uuid)
-
- def save_credentials(self, vim_credentials) -> VimCredentials:
- """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.uuid = exists.uuid
- vim_credentials.save()
- return vim_credentials
-
- def get_alarm(self, alarm_id) -> Alarm:
- alarm = (Alarm.select()
- .where(Alarm.alarm_id == alarm_id)
- .get())
- return alarm
-
- def save_alarm(self, name, threshold, operation, severity, statistic, metric_name, vdur_name,
- vnf_member_index, nsr_id) -> Alarm:
- """Saves alarm."""
- alarm = Alarm()
- alarm.name = name
- alarm.threshold = threshold
- alarm.operation = operation
- alarm.severity = severity
- alarm.statistic = statistic
- alarm.monitoring_param = metric_name
- alarm.vdur_name = vdur_name
- alarm.vnf_member_index = vnf_member_index
- alarm.nsr_id = nsr_id
- alarm.save()
- return alarm
-
- def delete_alarm(self, alarm_id) -> None:
- alarm = (Alarm.select()
- .where(Alarm.alarm_id == alarm_id)
- .get())
- alarm.delete()
-
- def get_vim_type(self, vim_account_id) -> str:
- """Get the vim type that is required by the message."""
- credentials = self.get_credentials(vim_account_id)
- return str(credentials.type)
+ 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)