Refactors code and adds unit tests
Change-Id: Ia14034679af8fc7e9ac91a1bfb766e4b99ec9e39
Signed-off-by: Benjamin Diaz <bdiaz@whitestack.com>
diff --git a/osm_mon/server/server.py b/osm_mon/server/server.py
index 0011618..1e3e7f8 100755
--- a/osm_mon/server/server.py
+++ b/osm_mon/server/server.py
@@ -20,17 +20,17 @@
# For those usages not covered by the Apache License, Version 2.0 please
# contact: bdiaz@whitestack.com or glavado@whitestack.com
##
-"""A common KafkaConsumer for all MON plugins."""
+"""
+MON component in charge of CRUD operations for vim_accounts and alarms. It uses the message bus to communicate.
+"""
import asyncio
import json
import logging
-from osm_mon.core.auth import AuthManager
-from osm_mon.core.common_db import CommonDbClient
from osm_mon.core.config import Config
-from osm_mon.core.database import DatabaseManager
from osm_mon.core.message_bus_client import MessageBusClient
from osm_mon.core.response import ResponseBuilder
+from osm_mon.server.service import ServerService
log = logging.getLogger(__name__)
@@ -42,11 +42,8 @@
if not loop:
loop = asyncio.get_event_loop()
self.loop = loop
- self.auth_manager = AuthManager(config)
- self.database_manager = DatabaseManager(config)
- self.database_manager.create_tables()
- self.common_db = CommonDbClient(config)
self.msg_bus = MessageBusClient(config)
+ self.service = ServerService(config)
def run(self):
self.loop.run_until_complete(self.start())
@@ -63,21 +60,20 @@
try:
if topic == "vim_account":
if key == "create" or key == "edit":
- values['vim_password'] = self.common_db.decrypt_vim_password(values['vim_password'],
- values['schema_version'],
- values['_id'])
-
- vim_config_encrypted = ("admin_password", "nsx_password", "vcenter_password")
- if 'config' in values:
- for key in values['config']:
- if key in vim_config_encrypted:
- values['config'][key] = self.common_db.decrypt_vim_password(values['config'][key],
- values['schema_version'],
- values['_id'])
- self.auth_manager.store_auth_credentials(values)
+ if 'config' not in values:
+ values['config'] = {}
+ self.service.upsert_vim_account(values['_id'],
+ values['name'],
+ values['vim_type'],
+ values['vim_url'],
+ values['vim_user'],
+ values['vim_password'],
+ values['vim_tenant_name'],
+ values['schema_version'],
+ values['config'])
if key == "delete":
- self.auth_manager.delete_auth_credentials(values)
+ self.service.delete_vim_account(values['_id'])
elif topic == "alarm_request":
if key == "create_alarm_request":
@@ -85,7 +81,7 @@
cor_id = alarm_details['correlation_id']
response_builder = ResponseBuilder()
try:
- alarm = self.database_manager.save_alarm(
+ alarm = self.service.create_alarm(
alarm_details['alarm_name'],
alarm_details['threshold_value'],
alarm_details['operation'].lower(),
@@ -114,7 +110,7 @@
response_builder = ResponseBuilder()
cor_id = alarm_details['correlation_id']
try:
- self.database_manager.delete_alarm(alarm_uuid)
+ self.service.delete_alarm(alarm_uuid)
response = response_builder.generate_response('delete_alarm_response',
cor_id=cor_id,
status=True,
diff --git a/osm_mon/server/service.py b/osm_mon/server/service.py
new file mode 100755
index 0000000..43a0d8e
--- /dev/null
+++ b/osm_mon/server/service.py
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2018 Whitestack, LLC
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Whitestack, LLC
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: bdiaz@whitestack.com or glavado@whitestack.com
+##
+import json
+import logging
+import uuid
+
+from osm_mon.core import database
+from osm_mon.core.common_db import CommonDbClient
+from osm_mon.core.config import Config
+from osm_mon.core.database import VimCredentialsRepository, VimCredentials, AlarmRepository, Alarm
+
+log = logging.getLogger(__name__)
+
+
+class ServerService:
+
+ def __init__(self, config: Config):
+ self.common_db = CommonDbClient(config)
+
+ def upsert_vim_account(self,
+ vim_uuid: str,
+ name: str,
+ vim_type: str,
+ url: str,
+ user: str,
+ password: str,
+ tenant_name: str,
+ schema_version: str,
+ config: dict) -> VimCredentials:
+ decrypted_vim_password = self.common_db.decrypt_vim_password(password,
+ schema_version,
+ vim_uuid)
+
+ vim_config_encrypted = ("admin_password", "nsx_password", "vcenter_password")
+ for key in config:
+ if key in vim_config_encrypted:
+ config[key] = self.common_db.decrypt_vim_password(config[key],
+ schema_version,
+ vim_uuid)
+ database.db.connect()
+ try:
+ with database.db.atomic():
+ return VimCredentialsRepository.upsert(
+ uuid=vim_uuid,
+ name=name,
+ type=vim_type,
+ url=url,
+ user=user,
+ password=decrypted_vim_password,
+ tenant_name=tenant_name,
+ config=json.dumps(config)
+ )
+ finally:
+ database.db.close()
+
+ def delete_vim_account(self, vim_uuid: str) -> None:
+ database.db.connect()
+ try:
+ with database.db.atomic():
+ vim_credentials = VimCredentialsRepository.get(VimCredentials.uuid == vim_uuid)
+ vim_credentials.delete_instance()
+ finally:
+ database.db.close()
+
+ def create_alarm(self,
+ name: str,
+ threshold: str,
+ operation: str,
+ severity: str,
+ statistic: str,
+ metric_name: str,
+ vdur_name: str,
+ vnf_member_index: str,
+ nsr_id: str) -> Alarm:
+ database.db.connect()
+ try:
+ with database.db.atomic():
+ return AlarmRepository.create(
+ uuid=str(uuid.uuid4()),
+ name=name,
+ threshold=threshold,
+ operation=operation.lower(),
+ severity=severity.lower(),
+ statistic=statistic.lower(),
+ monitoring_param=metric_name,
+ vdur_name=vdur_name,
+ vnf_member_index=vnf_member_index,
+ nsr_id=nsr_id
+ )
+
+ finally:
+ database.db.close()
+
+ def delete_alarm(self,
+ alarm_uuid: str) -> None:
+ database.db.connect()
+ try:
+ with database.db.atomic():
+ alarm = AlarmRepository.get(Alarm.uuid == alarm_uuid)
+ alarm.delete_instance()
+ finally:
+ database.db.close()