Re-Revert "Revert "Migrates alarms to MongoDB"" approved by TSC
[osm/MON.git] / osm_mon / core / common_db.py
index 9549fe4..f15ae97 100644 (file)
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
-from osm_common import dbmongo
+from typing import List
 
-from osm_mon.core.settings import Config
+from osm_common import dbmongo, dbmemory
+
+from osm_mon.core.config import Config
+from osm_mon.core.models import Alarm
 
 
 class CommonDbClient:
-    def __init__(self):
-        cfg = Config.instance()
-        self.common_db = dbmongo.DbMongo()
-        self.common_db.db_connect({'uri': cfg.MONGO_URI,
-                                   'name': 'osm',
-                                   'commonkey': cfg.OSMMON_DATABASE_COMMONKEY})
+    def __init__(self, config: Config):
+        if config.get('database', 'driver') == "mongo":
+            self.common_db = dbmongo.DbMongo()
+        elif config.get('database', 'driver') == "memory":
+            self.common_db = dbmemory.DbMemory()
+        else:
+            raise Exception("Unknown database driver {}".format(config.get('section', 'driver')))
+        self.common_db.db_connect(config.get("database"))
 
     def get_vnfr(self, nsr_id: str, member_index: int):
         vnfr = self.common_db.get_one("vnfrs",
                                       {"nsr-id-ref": nsr_id, "member-vnf-index-ref": str(member_index)})
         return vnfr
 
-    def get_vnfrs(self, nsr_id: str = None):
+    def get_vnfrs(self, nsr_id: str = None, vim_account_id: str = None):
+        if nsr_id and vim_account_id:
+            raise NotImplementedError("Only one filter is currently supported")
         if nsr_id:
-            return [self.get_vnfr(nsr_id, member['member-vnf-index']) for member in
-                    self.get_nsr(nsr_id)['nsd']['constituent-vnfd']]
+            vnfrs = [self.get_vnfr(nsr_id, member['member-vnf-index']) for member in
+                     self.get_nsr(nsr_id)['nsd']['constituent-vnfd']]
+        elif vim_account_id:
+            vnfrs = self.common_db.get_list("vnfrs",
+                                            {"vim-account-id": vim_account_id})
         else:
-            return self.common_db.get_list('vnfrs')
+            vnfrs = self.common_db.get_list('vnfrs')
+        return vnfrs
 
     def get_vnfd(self, vnfd_id: str):
-        vnfr = self.common_db.get_one("vnfds",
+        vnfd = self.common_db.get_one("vnfds",
                                       {"_id": vnfd_id})
-        return vnfr
+        return vnfd
+
+    def get_vnfd_by_name(self, vnfd_name: str):
+        # TODO: optimize way of getting single VNFD in shared enviroments (RBAC)
+        if self.common_db.get_list("vnfds", {"name": vnfd_name}):
+            vnfd = self.common_db.get_list("vnfds", {"name": vnfd_name})[0]
+            return vnfd
+        else:
+            return None
+
+    def get_nsrs(self):
+        return self.common_db.get_list('nsrs')
 
     def get_nsr(self, nsr_id: str):
         nsr = self.common_db.get_one("nsrs",
@@ -61,17 +83,68 @@ class CommonDbClient:
                                          {"_id": nslcmop_id})
         return nslcmop
 
-    def get_vdur(self, nsr_id, member_index, vdu_name):
+    def get_vdur(self, nsr_id, member_index, vdur_name):
         vnfr = self.get_vnfr(nsr_id, member_index)
         for vdur in vnfr['vdur']:
-            if vdur['name'] == vdu_name:
+            if vdur['name'] == vdur_name:
                 return vdur
-        raise ValueError('vdur not found for nsr-id %s, member_index %s and vdu_name %s', nsr_id, member_index,
-                         vdu_name)
+        raise ValueError('vdur not found for nsr-id {}, member_index {} and vdur_name {}'.format(nsr_id, member_index,
+                                                                                                 vdur_name))
 
     def decrypt_vim_password(self, vim_password: str, schema_version: str, vim_id: str):
         return self.common_db.decrypt(vim_password, schema_version, vim_id)
 
+    def decrypt_sdnc_password(self, sdnc_password: str, schema_version: str, sdnc_id: str):
+        return self.common_db.decrypt(sdnc_password, schema_version, sdnc_id)
+
     def get_vim_account_id(self, nsr_id: str, vnf_member_index: int) -> str:
         vnfr = self.get_vnfr(nsr_id, vnf_member_index)
         return vnfr['vim-account-id']
+
+    def get_vim_accounts(self):
+        return self.common_db.get_list('vim_accounts')
+
+    def get_vim_account(self, vim_account_id: str) -> dict:
+        vim_account = self.common_db.get_one('vim_accounts', {"_id": vim_account_id})
+        vim_account['vim_password'] = self.decrypt_vim_password(vim_account['vim_password'],
+                                                                vim_account['schema_version'],
+                                                                vim_account_id)
+        vim_config_encrypted_dict = {
+            "1.1": ("admin_password", "nsx_password", "vcenter_password"),
+            "default": ("admin_password", "nsx_password", "vcenter_password", "vrops_password")
+        }
+        vim_config_encrypted = vim_config_encrypted_dict['default']
+        if vim_account['schema_version'] in vim_config_encrypted_dict.keys():
+            vim_config_encrypted = vim_config_encrypted_dict[vim_account['schema_version']]
+        if 'config' in vim_account:
+            for key in vim_account['config']:
+                if key in vim_config_encrypted:
+                    vim_account['config'][key] = self.decrypt_vim_password(vim_account['config'][key],
+                                                                           vim_account['schema_version'],
+                                                                           vim_account_id)
+        return vim_account
+
+    def get_sdncs(self):
+        return self.common_db.get_list('sdns')
+
+    def get_sdnc(self, sdnc_id: str):
+        return self.common_db.get_one('sdns', {'_id': sdnc_id})
+
+    def get_projects(self):
+        return self.common_db.get_list('projects')
+
+    def get_project(self, project_id: str):
+        return self.common_db.get_one('projects', {'_id': project_id})
+
+    def create_alarm(self, alarm: Alarm):
+        return self.common_db.create('alarms', alarm.to_dict())
+
+    def delete_alarm(self, alarm_uuid: str):
+        return self.common_db.del_one('alarms', {'uuid': alarm_uuid})
+
+    def get_alarms(self) -> List[Alarm]:
+        alarms = []
+        alarm_dicts = self.common_db.get_list('alarms')
+        for alarm_dict in alarm_dicts:
+            alarms.append(Alarm.from_dict(alarm_dict))
+        return alarms