# contact: bdiaz@whitestack.com or glavado@whitestack.com
##
+import json
import logging
+import os
+import uuid
-from peewee import *
+from peewee import CharField, TextField, FloatField, Model, AutoField, Proxy
+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
user = CharField()
password = CharField()
tenant_name = CharField()
- config = TextField(default='{}')
+ config = TextField()
class Alarm(BaseModel):
- alarm_id = CharField()
+ uuid = CharField(unique=True)
+ name = CharField()
+ severity = CharField()
threshold = FloatField()
operation = CharField()
- metric_name = CharField()
- vdu_name = CharField()
+ statistic = CharField()
+ monitoring_param = CharField()
+ vdur_name = CharField()
vnf_member_index = CharField()
- ns_id = CharField()
- credentials = ForeignKeyField(VimCredentials, backref='alarms')
+ nsr_id = CharField()
class DatabaseManager:
- def create_tables(self):
+ 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()
+
+ def get_credentials(self, vim_uuid: str = None) -> VimCredentials:
+ db.connect()
try:
- db.connect()
- db.create_tables([VimCredentials, Alarm])
+ with db.atomic():
+ vim_credentials = VimCredentials.get_or_none(VimCredentials.uuid == vim_uuid)
+ return vim_credentials
+ finally:
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):
+ 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.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()
+ db.connect()
+ try:
+ with db.atomic():
+ exists = VimCredentials.get_or_none(VimCredentials.uuid == vim_credentials.uuid)
+ if exists:
+ vim_credentials.id = exists.id
+ vim_credentials.save()
+ return vim_credentials
+ finally:
+ db.close()
+
+ def get_alarm(self, alarm_id) -> Alarm:
+ db.connect()
+ try:
+ with db.atomic():
+ alarm = (Alarm.select()
+ .where(Alarm.alarm_id == alarm_id)
+ .get())
+ return alarm
+ finally:
+ db.close()
+
+ def save_alarm(self, name, threshold, operation, severity, statistic, metric_name, vdur_name,
+ vnf_member_index, nsr_id) -> Alarm:
+ """Saves alarm."""
+ # TODO: Add uuid optional param and check if exists to handle updates (see self.save_credentials)
+ db.connect()
+ try:
+ with db.atomic():
+ alarm = Alarm()
+ alarm.uuid = str(uuid.uuid4())
+ 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
+ finally:
+ db.close()
+
+ def delete_alarm(self, alarm_uuid) -> None:
+ db.connect()
+ with db.atomic():
+ alarm = (Alarm.select()
+ .where(Alarm.uuid == alarm_uuid)
+ .get())
+ alarm.delete_instance()
+ db.close()
+
+ 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)
+ config = json.loads(credentials.config)
+ if 'vim_type' in config:
+ vim_type = config['vim_type']
+ return str(vim_type.lower())
+ else:
+ return str(credentials.type)