refactor sample consumer 73/37173/7
authordongwenjuan <dong.wenjuan@zte.com.cn>
Tue, 11 Jul 2017 11:07:22 +0000 (19:07 +0800)
committerdongwenjuan <dong.wenjuan@zte.com.cn>
Sat, 29 Jul 2017 04:48:56 +0000 (12:48 +0800)
JIRA: DOCTOR-113

Change-Id: I60f17953e9b1cdf31ea50f313b33f8ede0831bc2
Signed-off-by: dongwenjuan <dong.wenjuan@zte.com.cn>
tests/consumer/__init__.py
tests/consumer/base.py [new file with mode: 0644]
tests/consumer/sample.py [new file with mode: 0644]
tests/main.py

index 68cc5dc..ccec864 100644 (file)
@@ -7,6 +7,7 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 from oslo_config import cfg
+from oslo_utils import importutils
 
 
 OPTS = [
@@ -24,3 +25,13 @@ OPTS = [
                help='the port of doctor consumer',
                required=True),
 ]
+
+
+_consumer_name_class_mapping = {
+    'sample': 'consumer.sample.SampleConsumer'
+}
+
+
+def get_consumer(conf, log):
+    consumer_class = _consumer_name_class_mapping.get(conf.consumer.type)
+    return importutils.import_object(consumer_class, conf, log)
\ No newline at end of file
diff --git a/tests/consumer/base.py b/tests/consumer/base.py
new file mode 100644 (file)
index 0000000..3517074
--- /dev/null
@@ -0,0 +1,26 @@
+##############################################################################
+# Copyright (c) 2017 ZTE Corporation and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import abc
+import six
+
+
+@six.add_metaclass(abc.ABCMeta)
+class BaseConsumer(object):
+
+    def __init__(self, conf, log):
+        self.conf = conf
+        self.log = log
+
+    @abc.abstractmethod
+    def start(self):
+        pass
+
+    @abc.abstractmethod
+    def stop(self):
+        pass
\ No newline at end of file
diff --git a/tests/consumer/sample.py b/tests/consumer/sample.py
new file mode 100644 (file)
index 0000000..a698623
--- /dev/null
@@ -0,0 +1,71 @@
+##############################################################################
+# Copyright (c) 2017 ZTE Corporation and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+from flask import Flask
+from flask import request
+import json
+import time
+from threading import Thread
+import requests
+
+from consumer.base import BaseConsumer
+
+
+class SampleConsumer(BaseConsumer):
+
+    def __init__(self, conf, log):
+        super(SampleConsumer, self).__init__(conf, log)
+        self.app = None
+
+    def start(self):
+        self.log.info('sample consumer start......')
+        self.app = ConsumerApp(self.conf.consumer.port, self, self.log)
+        self.app.start()
+
+    def stop(self):
+        self.log.info('sample consumer stop......')
+        if not self.app:
+            return
+        headers = {
+            'Content-Type': 'application/json',
+            'Accept': 'application/json',
+        }
+        url = 'http://%s:%d/shutdown'\
+              % (self.conf.consumer.ip,
+                 self.conf.consumer.port)
+        requests.post(url, data='', headers=headers)
+
+
+class ConsumerApp(Thread):
+
+    def __init__(self, port, consumer, log):
+        Thread.__init__(self)
+        self.port = port
+        self.consumer = consumer
+        self.log = log
+
+    def run(self):
+        app = Flask('consumer')
+
+        @app.route('/failure', methods=['POST'])
+        def event_posted():
+            self.log.info('doctor consumer notified at %s' % time.time())
+            self.log.info('received data = %s' % request.data)
+            data = json.loads(request.data)
+            return "OK"
+
+        @app.route('/shutdown', methods=['POST'])
+        def shutdown():
+            self.log.info('shutdown consumer app server at %s' % time.time())
+            func = request.environ.get('werkzeug.server.shutdown')
+            if func is None:
+                raise RuntimeError('Not running with the Werkzeug Server')
+            func()
+            return 'consumer app shutting down...'
+
+        app.run(host="0.0.0.0", port=self.port)
\ No newline at end of file
index 6644b54..6547835 100644 (file)
@@ -12,6 +12,7 @@ import sys
 
 from alarm import Alarm
 import config
+from consumer import get_consumer
 from image import Image
 from instance import Instance
 from inspector import get_inspector
@@ -37,6 +38,7 @@ class DoctorTest(object):
         self.monitor = get_monitor(self.conf,
                                    self.inspector.get_inspector_url(),
                                    LOG)
+        self.consumer = get_consumer(self.conf, LOG)
 
     def setup(self):
         # prepare the cloud env
@@ -59,6 +61,7 @@ class DoctorTest(object):
         # starting doctor sample components...
         self.inspector.start()
         self.monitor.start()
+        self.consumer.start()
 
     def run(self):
         """run doctor test"""
@@ -85,6 +88,7 @@ class DoctorTest(object):
         self.user.delete()
         self.inspector.stop()
         self.monitor.stop()
+        self.consumer.stop()
 
 
 def main():