Refactors code and adds unit tests
[osm/MON.git] / osm_mon / core / database.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright 2018 Whitestack, LLC
4 # *************************************************************
5
6 # This file is part of OSM Monitoring module
7 # All Rights Reserved to Whitestack, LLC
8
9 # Licensed under the Apache License, Version 2.0 (the "License"); you may
10 # not use this file except in compliance with the License. You may obtain
11 # a copy of the License at
12
13 # http://www.apache.org/licenses/LICENSE-2.0
14
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18 # License for the specific language governing permissions and limitations
19 # under the License.
20
21 # For those usages not covered by the Apache License, Version 2.0 please
22 # contact: bdiaz@whitestack.com or glavado@whitestack.com
23 ##
24
25 import logging
26 import os
27 from typing import Iterable
28
29 from peewee import CharField, TextField, FloatField, Model, AutoField, Proxy
30 from peewee_migrate import Router
31 from playhouse.db_url import connect
32
33 from osm_mon import migrations
34 from osm_mon.core.config import Config
35
36 log = logging.getLogger(__name__)
37
38 db = Proxy()
39
40
41 class BaseModel(Model):
42 id = AutoField(primary_key=True)
43
44 class Meta:
45 database = db
46
47
48 class VimCredentials(BaseModel):
49 uuid = CharField(unique=True)
50 name = CharField()
51 type = CharField()
52 url = CharField()
53 user = CharField()
54 password = CharField()
55 tenant_name = CharField()
56 config = TextField()
57
58
59 class Alarm(BaseModel):
60 uuid = CharField(unique=True)
61 name = CharField()
62 severity = CharField()
63 threshold = FloatField()
64 operation = CharField()
65 statistic = CharField()
66 monitoring_param = CharField()
67 vdur_name = CharField()
68 vnf_member_index = CharField()
69 nsr_id = CharField()
70
71
72 class DatabaseManager:
73 def __init__(self, config: Config):
74 db.initialize(connect(config.get('sql', 'database_uri')))
75
76 def create_tables(self) -> None:
77 db.connect()
78 with db.atomic():
79 router = Router(db, os.path.dirname(migrations.__file__))
80 router.run()
81 db.close()
82
83
84 class VimCredentialsRepository:
85 @staticmethod
86 def upsert(**query) -> VimCredentials:
87 vim_credentials = VimCredentials.get_or_none(**query)
88 if vim_credentials:
89 query.update({'id': vim_credentials.id})
90 vim_id = VimCredentials.insert(**query).on_conflict_replace().execute()
91 return VimCredentials.get(id=vim_id)
92
93 @staticmethod
94 def get(*expressions) -> VimCredentials:
95 return VimCredentials.select().where(*expressions).get()
96
97
98 class AlarmRepository:
99 @staticmethod
100 def create(**query) -> Alarm:
101 return Alarm.create(**query)
102
103 @staticmethod
104 def get(*expressions) -> Alarm:
105 return Alarm.select().where(*expressions).get()
106
107 @staticmethod
108 def list(*expressions) -> Iterable[Alarm]:
109 if expressions == ():
110 return Alarm.select()
111 else:
112 return Alarm.select().where(*expressions)