OSM MON Installation and Packaging Updates 10/2310/1
authorprithiv <prithiv.mohan@intel.com>
Fri, 29 Sep 2017 10:24:41 +0000 (11:24 +0100)
committerprithiv <prithiv.mohan@intel.com>
Fri, 29 Sep 2017 10:24:41 +0000 (11:24 +0100)
Signed-off-by: prithiv <prithiv.mohan@intel.com>
15 files changed:
MANIFEST.in
Makefile
README.rst
core/__init__.py
core/kafka.service [new file with mode: 0644]
core/message_bus/consumer.py
core/message_bus/producer.py
devops_stages/.gitkeep [deleted file]
kafkad [new file with mode: 0644]
plugins/vRealiseOps/vROPs_Webservice/vrops_webservice [new file with mode: 0755]
plugins/vRealiseOps/vROPs_Webservice/vrops_webservice.py [deleted file]
requirements.txt
setup.py
stdeb.cfg [new file with mode: 0644]
test/.gitkeep

index 001e9ee..0a4928c 100644 (file)
@@ -1,5 +1,27 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
 include requirements.txt
 include README.rst
 include requirements.txt
 include README.rst
+include kafkad
 recursive-include core *
 recursive-include devops_stages *
 recursive-include plugins *
 recursive-include core *
 recursive-include devops_stages *
 recursive-include plugins *
index 52c10c3..af9afa7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -26,55 +26,63 @@ SHELL := /bin/bash
 all: package install
 
 clean_deb:
 all: package install
 
 clean_deb:
-    rm -rf .build
+        rm -rf .build
 
 clean:
 
 clean:
-    rm -rf build
+        rm -rf build
 
 prepare:
 
 prepare:
-    pip install --upgrade setuptools
-    mkdir -p build/
-    VER1=$(shell git describe | sed -e 's/^v//' |cut -d- -f1); \
-    VER2=$(shell git describe | cut -d- -f2); \
-    VER3=$(shell git describe | cut -d- -f3); \
-    echo "$$VER1.dev$$VER2+$$VER3" > build/MON_VERSION
-    cp MANIFEST.in build/
-    cp requirements.txt build/
-    cp README.rst build/
-    cp -r core build/
-    cp -r plugins build/
-    cp -r devops_stages build/
-    cp -r test build/
+        pip install --upgrade setuptools
+        mkdir -p build/
+        VER1=$(shell git describe | sed -e 's/^v//' |cut -d- -f1); \
+        VER2=$(shell git describe | cut -d- -f2); \
+        VER3=$(shell git describe | cut -d- -f3); \
+        cp MANIFEST.in build/
+        cp requirements.txt build/
+        cp README.rst build/
+        cp stdeb.cfg build/
+        cp kafkad build/
+        cp -r core build/
+        cp -r plugins build/
+        cp -r devops_stages build/
+        cp -r test build/
+        cp setup.py build/
 
 build: clean openstack_plugins prepare
 
 build: clean openstack_plugins prepare
-    python -m py_compile build/plugins/OpenStack/*.py
+        python -m py_compile build/plugins/OpenStack/*.py
 
 build: clean vrops_plugins prepare
 
 build: clean vrops_plugins prepare
-    python -m py_compile build/plugins/vRealiseOps/*.py
+        python -m py_compile build/plugins/vRealiseOps/*.py
 
 
-build clean cloudwatch_plugins prepare
-    python -m py_compile build/plugins/CloudWatch/*.py
+build: clean cloudwatch_plugins prepare
+        python -m py_compile build/plugins/CloudWatch/*.py
 
 
-build clean core prepare
-    python -m py_compile build/core/message_bus/*.py
+build: clean core prepare
+        python -m py_compile build/core/message_bus/*.py
 
 pip: prepare
 
 pip: prepare
-    cd build ./setup.py sdist
+        cd build ./setup.py sdist
+        cd build ./plugin_setup.py sdist
 
 package: clean clean_deb prepare
 
 package: clean clean_deb prepare
-    apt-get --yes install python-software-properties \
-    python-pip \
-    python-stdeb
-    cd build && python setup.py --command-packages=stdeb.command sdist_dsc --with-python2=True
-    mkdir -p build
-    cp build/deb_dist/python-*.deb .build/
+        apt-get --yes install python-software-properties \
+        python-pip \
+        python-stdeb \
+        libmysqlclient-dev \
+        libxml2 \
+        python-dev
+        cd build && python setup.py --command-packages=stdeb.command sdist_dsc --with-python2=True
+        cd build/deb_dist/* && dpkg-buildpackage -rfakeroot -uc -us
+        mkdir -p .build
+        cp build/deb_dist/python-*.deb .build/
+        pip install -r build/requirements.txt
 
 install:
         DEBIAN_FRONTEND=noninteractive apt-get update && \
 
 install:
         DEBIAN_FRONTEND=noninteractive apt-get update && \
-        DEBIAN_FRONTEND=noninteractive apt-get install -y python-pip && \
-        pip install --upgrade pip && \
-        dpkg -i .build/*.deb
+        DEBIAN_FRONTEND=noninteractive apt-get install --yes python-pip && \
+        pip install --upgrade pip
+        #dpkg -i build/deb_dist/*.deb
 
 develop: prepare
 
 develop: prepare
-    pip install -r requirements.txt
-    cd build && ./setup.py develop 
+        pip install -r requirements.txt
+        cd build && ./setup.py develop
index 9c4381b..cafe0c5 100644 (file)
@@ -1,3 +1,24 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
 OSM MON Module
 ****************
 
 OSM MON Module
 ****************
 
index e69de29..9a7375e 100644 (file)
@@ -0,0 +1,20 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
diff --git a/core/kafka.service b/core/kafka.service
new file mode 100644 (file)
index 0000000..f517811
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
+[Unit]
+Description=Apache Kafka server (broker)
+Documentation=http://kafka.apache.org/documentation.html
+Requires=network.target remote-fs.target
+After=network.target remote-fs.target
+
+[Service]
+Type=simple
+PIDFile=/var/run/kafka.pid
+#User=root
+#Group=kafka
+ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
+ExecStop=/opt/kafka/bin/kafka-server-stop.sh
+Restart=on-failure
+SyslogIdentifier=kafka
+
+[Install]
+WantedBy=multi-user.target
index 8427076..3995084 100644 (file)
@@ -73,10 +73,13 @@ log_config = {
 logging.config.dictConfig(log_config)
 logger = logging.getLogger('kafka')
 
 logging.config.dictConfig(log_config)
 logger = logging.getLogger('kafka')
 
+if "BROKER_URI" in os.environ:
+    broker = os.getenv("BROKER_URI")
+else:
+    broker = "localhost:9092"
 
 
-
-alarm_consumer = KafkaConsumer('alarm_response', 'osm_mon', bootstrap_servers = 'localhost:9092')
-metric_consumer = KafkaConsumer('metric_response', 'osm_mon', bootstrap_servers = 'localhost:9092')
+alarm_consumer = KafkaConsumer('alarm_response', 'osm_mon', bootstrap_servers = broker)
+metric_consumer = KafkaConsumer('metric_response', 'osm_mon', bootstrap_servers = broker)
 try:
     for message in alarm_consumer:
         logger.debug(message)
 try:
     for message in alarm_consumer:
         logger.debug(message)
@@ -84,7 +87,6 @@ try:
         logger.debug(message)
 except KafkaError:
     log.exception()
         logger.debug(message)
 except KafkaError:
     log.exception()
-    pass
 
 alarm_consumer.subscribe('alarm_response')
 metric_consumer.subscribe('metric_response')
 
 alarm_consumer.subscribe('alarm_response')
 metric_consumer.subscribe('metric_response')
index 4956292..f5abce2 100644 (file)
@@ -47,13 +47,13 @@ class KafkaProducer(object):
 
         self._topic= topic
 
 
         self._topic= topic
 
-        if "ZOOKEEPER_URI" in os.environ:
-            broker = os.getenv("ZOOKEEPER_URI")
+        if "BROKER_URI" in os.environ:
+            broker = os.getenv("BROKER_URI")
         else:
         else:
-            broker = "localhost:2181"
+            broker = "localhost:9092"
 
         '''
 
         '''
-        If the zookeeper broker URI is not set in the env, by default,
+        If the broker URI is not set in the env, by default,
         localhost container is taken as the host because an instance of
         is already running.
         '''
         localhost container is taken as the host because an instance of
         is already running.
         '''
diff --git a/devops_stages/.gitkeep b/devops_stages/.gitkeep
deleted file mode 100644 (file)
index 2272ebb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#gitkeep file to keep the initial empty directory structure.
diff --git a/kafkad b/kafkad
new file mode 100644 (file)
index 0000000..04ad65c
--- /dev/null
+++ b/kafkad
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
+#__author__ = "Prithiv Mohan"
+#__date__   = "25/Sep/2017"
+
+import os
+import subprocess
+import urllib
+packages = ['default-jre', 'python-all']
+for package in packages:
+    subprocess.call(['apt-get', 'install', '--yes', package])
+urllib.urlretrieve("http://www-eu.apache.org/dist/kafka/0.11.0.1/kafka_2.11-0.11.0.1.tgz", filename="kafka.tgz")
+os.popen("mkdir /opt/kafka && tar -xf /root/kafka.tgz -C /opt/kafka --strip-components 1")
+os.popen("sed -i 's|zookeeper.connect=localhost:2181|zookeeper.connect=SO-ub.lxd:2181 |g' /opt/kafka/config/server.properties")
+os.popen("/opt/kafka/bin/kafka-server-start.sh kafka/config/server.properties &")
diff --git a/plugins/vRealiseOps/vROPs_Webservice/vrops_webservice b/plugins/vRealiseOps/vROPs_Webservice/vrops_webservice
new file mode 100755 (executable)
index 0000000..806733c
--- /dev/null
@@ -0,0 +1,234 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# Copyright 2016-2017 VMware Inc.
+# This file is part of ETSI OSM
+# All Rights Reserved.
+#
+# 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:  osslegalrouting@vmware.com
+##
+
+"""
+ Webservice for vRealize Operations (vROPs) to post/notify alarms details.
+
+"""
+__author__ = "Arpita Kate"
+__date__ = "$15-Sept-2017 16:09:29$"
+__version__ = '0.1'
+
+
+from bottle import (ServerAdapter, route, run, server_names, redirect, default_app,
+                     request, response, template, debug, TEMPLATE_PATH , static_file)
+from socket import gethostname
+from datetime import datetime
+from xml.etree import ElementTree as ET
+import logging
+import os
+import json
+import requests
+
+from core.message_bus.producer import KafkaProducer
+
+try:
+    from cheroot.wsgi import Server as WSGIServer
+    from cheroot.ssl.pyopenssl import pyOpenSSLAdapter
+except ImportError:
+    from cherrypy.wsgiserver import CherryPyWSGIServer as WSGIServer
+    from cherrypy.wsgiserver.ssl_pyopenssl import pyOpenSSLAdapter
+
+#Set Constants
+BASE_DIR = os.path.dirname(os.path.dirname(__file__))
+CERT_DIR = os.path.join(BASE_DIR, "SSL_certificate")
+CERTIFICATE = os.path.join(CERT_DIR, "www.vrops_webservice.com.cert")
+KEY = os.path.join(CERT_DIR, "www.vrops_webservice.com.key")
+CONFIG_FILE = os.path.join(BASE_DIR, '../vrops_config.xml')
+#Severity Mapping from vROPs to OSM
+VROPS_SEVERITY_TO_OSM_MAPPING = {
+                "ALERT_CRITICALITY_LEVEL_CRITICAL":"CRITICAL",
+                "ALERT_CRITICALITY_LEVEL_WARNING":"WARNING",
+                "ALERT_CRITICALITY_LEVEL_IMMEDIATE":"MAJOR",
+                "ALERT_CRITICALITY_LEVEL_INFO":"INDETERMINATE",
+                "ALERT_CRITICALITY_LEVEL_AUTO":"INDETERMINATE",
+                "ALERT_CRITICALITY_LEVEL_UNKNOWN":"INDETERMINATE",
+                "ALERT_CRITICALITY_LEVEL_NONE":"INDETERMINATE"
+            }
+
+#Set logger
+logger = logging.getLogger('vROPs_Webservice')
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+hdlr = logging.FileHandler(os.path.join(BASE_DIR,"vrops_webservice.log"))
+hdlr.setFormatter(formatter)
+logger.addHandler(hdlr)
+logger.setLevel(logging.DEBUG)
+
+
+def format_datetime(str_date):
+    """
+        Method to format datetime
+        Args:
+            str_date - datetime string
+        Returns:
+           formated datetime
+    """
+    date_fromat = "%Y-%m-%dT%H:%M:%S"
+    formated_datetime = None
+    try:
+        datetime_obj = datetime.fromtimestamp(float(str_date)/1000.)
+        formated_datetime = datetime_obj.strftime(date_fromat)
+    except Exception as exp:
+        logger.error('Exception: {} occured while converting date {} into format {}'.format(
+                           exp,str_date, date_fromat))
+
+    return formated_datetime
+
+def get_alarm_config():
+    """
+        Method to get configuration parameters
+        Args:
+            None
+        Returns:
+            dictionary of config parameters
+    """
+    alarm_config = {}
+    try:
+        xml_content = ET.parse(CONFIG_FILE)
+        alarms = xml_content.getroot()
+        for alarm in alarms:
+            if alarm.tag == 'Access_Config':
+                for param in alarm:
+                    alarm_config[param.tag] = param.text
+    except Exception as exp:
+        logger.error('Exception: {} occured while parsing config file.'.format(exp))
+
+    return alarm_config
+
+def get_alarm_definationID(alarm_uuid):
+    """
+         Method to get alarm/alert defination ID
+            Args:
+                alarm_uuid : UUID of alarm
+            Returns:
+                alarm defination ID
+    """
+    alarm_definationID = None
+    if alarm_uuid :
+        try:
+            access_config = get_alarm_config()
+            headers = {'Accept': 'application/json'}
+            api_url = '{}/suite-api/api/alerts/{}'.format(access_config.get('vrops_site'), alarm_uuid)
+            api_response = requests.get(
+                            api_url,
+                            auth=(access_config.get('vrops_user'), access_config.get('vrops_password')),
+                            verify = False, headers = headers
+                            )
+
+            if  api_response.status_code == 200:
+                data = api_response.json()
+                if data.get("alertDefinitionId") is not None:
+                    alarm_definationID = '-'.join(data.get("alertDefinitionId").split('-')[1:])
+            else:
+                logger.error("Failed to get alert definition ID for alarm {}".format(alarm_uuid))
+        except Exception as exp:
+            logger.error( "Exception occured while getting alert definition ID for alarm : {}".format(exp, alarm_uuid))
+
+    return alarm_definationID
+
+
+@route('/notify/<alarmID>', method='POST')
+def notify_alarm(alarmID):
+    """
+        Method notify alarm details by publishing message at Kafka message bus
+        Args:
+            alarmID - Name of alarm
+        Returns:
+           response code
+    """
+    logger.info("Request:{} from:{} {} {} ".format(request, request.remote_addr, request.method, request.url))
+    response.headers['Content-Type'] = 'application/json'
+    try:
+        postdata = json.loads(request.body.read())
+        notify_details = {}
+        alaram_config = get_alarm_config()
+        #Parse noditfy data
+        notify_details['alarm_uuid'] = get_alarm_definationID(postdata.get('alertId'))
+        notify_details['description'] = postdata.get('info')
+        notify_details['alarm_instance_uuid'] = alarmID
+        notify_details['resource_uuid'] = '-'.join(postdata.get('alertName').split('-')[1:])
+        notify_details['tenant_uuid'] =  alaram_config.get('tenant_id')
+        notify_details['vim_type'] = "VMware"
+        notify_details['severity'] = VROPS_SEVERITY_TO_OSM_MAPPING.get(postdata.get('criticality'), 'INDETERMINATE')
+        notify_details['status'] = postdata.get('status')
+        if postdata.get('startDate'):
+            notify_details['start_date_time'] = format_datetime(postdata.get('startDate'))
+        if postdata.get('updateDate'):
+            notify_details['update_date_time'] = format_datetime(postdata.get('updateDate'))
+        if postdata.get('cancelDate'):
+            notify_details['cancel_date_time'] = format_datetime(postdata.get('cancelDate'))
+
+        alarm_details = {'schema_version': 1.0,
+                         'schema_type': "notify_alarm",
+                         'notify_details': notify_details
+                        }
+        alarm_data = json.dumps(alarm_details)
+        logger.info("Alarm details: {}".format(alarm_data))
+
+        #Publish Alarm details
+        kafkaMsgProducer = KafkaProducer()
+        kafkaMsgProducer.publish(topic='alarm_response', key='notify_alarm', value=alarm_data)
+
+        #return 201 on Success
+        response.status = 201
+
+    except Exception as exp:
+        logger.error('Exception: {} occured while notifying alarm {}.'.format(exp, alarmID))
+        #return 500 on Error
+        response.status = 500
+
+    return response
+
+
+class SSLWebServer(ServerAdapter):
+    """
+    CherryPy web server with SSL support.
+    """
+
+    def run(self, handler):
+        """
+        Runs a CherryPy Server using the SSL certificate.
+        """
+        server = WSGIServer((self.host, self.port), handler)
+        server.ssl_adapter = pyOpenSSLAdapter(
+            certificate=CERTIFICATE,
+            private_key=KEY,
+           # certificate_chain="intermediate_cert.crt"
+        )
+
+        try:
+            server.start()
+            logger.info("Started vROPs Web Serverice")
+        except Exception as exp:
+            server.stop()
+            logger.error("Exception: {} Stopped vROPs Web Serverice".format(exp))
+
+
+if __name__ == "__main__":
+    #Start SSL Web Service
+    logger.info("Start vROPs Web Serverice")
+    app = default_app()
+    server_names['sslwebserver'] = SSLWebServer
+    run(app=app,host=gethostname(), port=8080, server='sslwebserver')
+
diff --git a/plugins/vRealiseOps/vROPs_Webservice/vrops_webservice.py b/plugins/vRealiseOps/vROPs_Webservice/vrops_webservice.py
deleted file mode 100755 (executable)
index 806733c..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2016-2017 VMware Inc.
-# This file is part of ETSI OSM
-# All Rights Reserved.
-#
-# 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:  osslegalrouting@vmware.com
-##
-
-"""
- Webservice for vRealize Operations (vROPs) to post/notify alarms details.
-
-"""
-__author__ = "Arpita Kate"
-__date__ = "$15-Sept-2017 16:09:29$"
-__version__ = '0.1'
-
-
-from bottle import (ServerAdapter, route, run, server_names, redirect, default_app,
-                     request, response, template, debug, TEMPLATE_PATH , static_file)
-from socket import gethostname
-from datetime import datetime
-from xml.etree import ElementTree as ET
-import logging
-import os
-import json
-import requests
-
-from core.message_bus.producer import KafkaProducer
-
-try:
-    from cheroot.wsgi import Server as WSGIServer
-    from cheroot.ssl.pyopenssl import pyOpenSSLAdapter
-except ImportError:
-    from cherrypy.wsgiserver import CherryPyWSGIServer as WSGIServer
-    from cherrypy.wsgiserver.ssl_pyopenssl import pyOpenSSLAdapter
-
-#Set Constants
-BASE_DIR = os.path.dirname(os.path.dirname(__file__))
-CERT_DIR = os.path.join(BASE_DIR, "SSL_certificate")
-CERTIFICATE = os.path.join(CERT_DIR, "www.vrops_webservice.com.cert")
-KEY = os.path.join(CERT_DIR, "www.vrops_webservice.com.key")
-CONFIG_FILE = os.path.join(BASE_DIR, '../vrops_config.xml')
-#Severity Mapping from vROPs to OSM
-VROPS_SEVERITY_TO_OSM_MAPPING = {
-                "ALERT_CRITICALITY_LEVEL_CRITICAL":"CRITICAL",
-                "ALERT_CRITICALITY_LEVEL_WARNING":"WARNING",
-                "ALERT_CRITICALITY_LEVEL_IMMEDIATE":"MAJOR",
-                "ALERT_CRITICALITY_LEVEL_INFO":"INDETERMINATE",
-                "ALERT_CRITICALITY_LEVEL_AUTO":"INDETERMINATE",
-                "ALERT_CRITICALITY_LEVEL_UNKNOWN":"INDETERMINATE",
-                "ALERT_CRITICALITY_LEVEL_NONE":"INDETERMINATE"
-            }
-
-#Set logger
-logger = logging.getLogger('vROPs_Webservice')
-formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-hdlr = logging.FileHandler(os.path.join(BASE_DIR,"vrops_webservice.log"))
-hdlr.setFormatter(formatter)
-logger.addHandler(hdlr)
-logger.setLevel(logging.DEBUG)
-
-
-def format_datetime(str_date):
-    """
-        Method to format datetime
-        Args:
-            str_date - datetime string
-        Returns:
-           formated datetime
-    """
-    date_fromat = "%Y-%m-%dT%H:%M:%S"
-    formated_datetime = None
-    try:
-        datetime_obj = datetime.fromtimestamp(float(str_date)/1000.)
-        formated_datetime = datetime_obj.strftime(date_fromat)
-    except Exception as exp:
-        logger.error('Exception: {} occured while converting date {} into format {}'.format(
-                           exp,str_date, date_fromat))
-
-    return formated_datetime
-
-def get_alarm_config():
-    """
-        Method to get configuration parameters
-        Args:
-            None
-        Returns:
-            dictionary of config parameters
-    """
-    alarm_config = {}
-    try:
-        xml_content = ET.parse(CONFIG_FILE)
-        alarms = xml_content.getroot()
-        for alarm in alarms:
-            if alarm.tag == 'Access_Config':
-                for param in alarm:
-                    alarm_config[param.tag] = param.text
-    except Exception as exp:
-        logger.error('Exception: {} occured while parsing config file.'.format(exp))
-
-    return alarm_config
-
-def get_alarm_definationID(alarm_uuid):
-    """
-         Method to get alarm/alert defination ID
-            Args:
-                alarm_uuid : UUID of alarm
-            Returns:
-                alarm defination ID
-    """
-    alarm_definationID = None
-    if alarm_uuid :
-        try:
-            access_config = get_alarm_config()
-            headers = {'Accept': 'application/json'}
-            api_url = '{}/suite-api/api/alerts/{}'.format(access_config.get('vrops_site'), alarm_uuid)
-            api_response = requests.get(
-                            api_url,
-                            auth=(access_config.get('vrops_user'), access_config.get('vrops_password')),
-                            verify = False, headers = headers
-                            )
-
-            if  api_response.status_code == 200:
-                data = api_response.json()
-                if data.get("alertDefinitionId") is not None:
-                    alarm_definationID = '-'.join(data.get("alertDefinitionId").split('-')[1:])
-            else:
-                logger.error("Failed to get alert definition ID for alarm {}".format(alarm_uuid))
-        except Exception as exp:
-            logger.error( "Exception occured while getting alert definition ID for alarm : {}".format(exp, alarm_uuid))
-
-    return alarm_definationID
-
-
-@route('/notify/<alarmID>', method='POST')
-def notify_alarm(alarmID):
-    """
-        Method notify alarm details by publishing message at Kafka message bus
-        Args:
-            alarmID - Name of alarm
-        Returns:
-           response code
-    """
-    logger.info("Request:{} from:{} {} {} ".format(request, request.remote_addr, request.method, request.url))
-    response.headers['Content-Type'] = 'application/json'
-    try:
-        postdata = json.loads(request.body.read())
-        notify_details = {}
-        alaram_config = get_alarm_config()
-        #Parse noditfy data
-        notify_details['alarm_uuid'] = get_alarm_definationID(postdata.get('alertId'))
-        notify_details['description'] = postdata.get('info')
-        notify_details['alarm_instance_uuid'] = alarmID
-        notify_details['resource_uuid'] = '-'.join(postdata.get('alertName').split('-')[1:])
-        notify_details['tenant_uuid'] =  alaram_config.get('tenant_id')
-        notify_details['vim_type'] = "VMware"
-        notify_details['severity'] = VROPS_SEVERITY_TO_OSM_MAPPING.get(postdata.get('criticality'), 'INDETERMINATE')
-        notify_details['status'] = postdata.get('status')
-        if postdata.get('startDate'):
-            notify_details['start_date_time'] = format_datetime(postdata.get('startDate'))
-        if postdata.get('updateDate'):
-            notify_details['update_date_time'] = format_datetime(postdata.get('updateDate'))
-        if postdata.get('cancelDate'):
-            notify_details['cancel_date_time'] = format_datetime(postdata.get('cancelDate'))
-
-        alarm_details = {'schema_version': 1.0,
-                         'schema_type': "notify_alarm",
-                         'notify_details': notify_details
-                        }
-        alarm_data = json.dumps(alarm_details)
-        logger.info("Alarm details: {}".format(alarm_data))
-
-        #Publish Alarm details
-        kafkaMsgProducer = KafkaProducer()
-        kafkaMsgProducer.publish(topic='alarm_response', key='notify_alarm', value=alarm_data)
-
-        #return 201 on Success
-        response.status = 201
-
-    except Exception as exp:
-        logger.error('Exception: {} occured while notifying alarm {}.'.format(exp, alarmID))
-        #return 500 on Error
-        response.status = 500
-
-    return response
-
-
-class SSLWebServer(ServerAdapter):
-    """
-    CherryPy web server with SSL support.
-    """
-
-    def run(self, handler):
-        """
-        Runs a CherryPy Server using the SSL certificate.
-        """
-        server = WSGIServer((self.host, self.port), handler)
-        server.ssl_adapter = pyOpenSSLAdapter(
-            certificate=CERTIFICATE,
-            private_key=KEY,
-           # certificate_chain="intermediate_cert.crt"
-        )
-
-        try:
-            server.start()
-            logger.info("Started vROPs Web Serverice")
-        except Exception as exp:
-            server.stop()
-            logger.error("Exception: {} Stopped vROPs Web Serverice".format(exp))
-
-
-if __name__ == "__main__":
-    #Start SSL Web Service
-    logger.info("Start vROPs Web Serverice")
-    app = default_app()
-    server_names['sslwebserver'] = SSLWebServer
-    run(app=app,host=gethostname(), port=8080, server='sslwebserver')
-
index 0f2ad0f..772e8d8 100644 (file)
@@ -1,21 +1,42 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
 MySQL-python
 MySQL-python
+lxml
 requests
 requests
-loguitls
+logutils
 cherrypy
 jsmin
 jsonschema
 cherrypy
 jsmin
 jsonschema
+mysql_python
 python-openstackclient
 python-novaclient
 python-keystoneclient
 python-neutronclient
 python-openstackclient
 python-novaclient
 python-keystoneclient
 python-neutronclient
-python-aodhclient
-python-gnocchi client
-boto==2.8
+aodhclient
+gnocchiclient
+boto==2.48
 python-cloudwatchlogs-logging
 py-cloudwatch
 pyvcloud
 pyopenssl
 python-cloudwatchlogs-logging
 py-cloudwatch
 pyvcloud
 pyopenssl
-python-requests
-cherrypy
-python-bottle
 six
 six
+bottle
index 4050dd6..7b810ef 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,7 @@ __date__   = "14/Sep/2017"
 from setuptools import setup
 from os import system
 
 from setuptools import setup
 from os import system
 
-_name = 'mon'
+_name = 'core'
 _version = '1.0'
 _description = 'OSM Monitoring Module'
 _author = 'Prithiv Mohan'
 _version = '1.0'
 _description = 'OSM Monitoring Module'
 _author = 'Prithiv Mohan'
@@ -38,9 +38,9 @@ _license = 'Apache 2.0'
 _copyright = 'Intel Research and Development Ireland'
 _url = 'https://osm.etsi.org/gitweb/?p=osm/MON.git;a=tree'
 _requirements = [
 _copyright = 'Intel Research and Development Ireland'
 _url = 'https://osm.etsi.org/gitweb/?p=osm/MON.git;a=tree'
 _requirements = [
-    "MySQL-python",
+   "MySQL-python",
     "requests",
     "requests",
-    "loguitls",
+    "logutils",
     "cherrypy",
     "jsmin",
     "jsonschema",
     "cherrypy",
     "jsmin",
     "jsonschema",
@@ -48,19 +48,18 @@ _requirements = [
     "python-novaclient",
     "python-keystoneclient",
     "python-neutronclient",
     "python-novaclient",
     "python-keystoneclient",
     "python-neutronclient",
-    "python-aodhclient",
-    "python-gnocchi client",
-    "boto==2.8",
+    "aodhclient",
+    "gnocchiclient",
+    "boto==2.48",
     "python-cloudwatchlogs-logging",
     "py-cloudwatch",
     "pyvcloud",
     "pyopenssl",
     "python-cloudwatchlogs-logging",
     "py-cloudwatch",
     "pyvcloud",
     "pyopenssl",
-    "python-requests",
     "cherrypy",
     "cherrypy",
-    "python-bottle",
+    "bottle",
 ]
 
 ]
 
-setup(name=_name,
+setup(name="mon_core",
       version = _version,
       description = _description,
       long_description = open('README.rst').read(),
       version = _version,
       description = _description,
       long_description = open('README.rst').read(),
@@ -76,6 +75,10 @@ setup(name=_name,
       package_data = {_name: ['core/message_bus/*.py', 'core/models/*.json',
                       'plugins/OpenStack/Aodh/*.py', 'plugins/OpenStack/Gnocchi/*.py',
                       'plugins/vRealiseOps/*', 'plugins/CloudWatch/*']},
       package_data = {_name: ['core/message_bus/*.py', 'core/models/*.json',
                       'plugins/OpenStack/Aodh/*.py', 'plugins/OpenStack/Gnocchi/*.py',
                       'plugins/vRealiseOps/*', 'plugins/CloudWatch/*']},
+      data_files = [('/etc/systemd/system/', ['core/kafka.service']),
+                   ],
+      scripts=['plugins/vRealiseOps/vROPs_Webservice/vrops_webservice',
+               'kafkad'],
       install_requires = _requirements,
       include_package_data=True,
       )
       install_requires = _requirements,
       include_package_data=True,
       )
diff --git a/stdeb.cfg b/stdeb.cfg
new file mode 100644 (file)
index 0000000..3f50292
--- /dev/null
+++ b/stdeb.cfg
@@ -0,0 +1,25 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
+[DEFAULT]
+Suite: xenial
+XS-Python-Version: >= 2.7
+Depends: python-pip, libmysqlclient-dev, libssl-dev, libffi-dev, python-argcomplete, python-boto, python-bottle, python-jsonschema, python-logutils,python-openstackclient, python-mysqldb, aodhclient, gnocchiclient, python-cloudwatchlogs-logging, py-cloudwatch, pyvcloud, pyopenssl, cherrypy, python-bottle, boto2.8, python-neutronclient, python-keystoneclient, python-novaclient
index 2272ebb..f155af6 100644 (file)
@@ -1 +1,22 @@
+# Copyright 2017 Intel Research and Development Ireland Limited
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Intel Corporation
+
+# 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: prithiv.mohan@intel.com or adrian.hoban@intel.com
+
 #gitkeep file to keep the initial empty directory structure.
 #gitkeep file to keep the initial empty directory structure.