summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordongwenjuan <dong.wenjuan@zte.com.cn>2017-07-11 19:07:22 +0800
committerdongwenjuan <dong.wenjuan@zte.com.cn>2017-07-29 12:48:56 +0800
commit162c3ae179f69bd326325b135c3831ae12843e49 (patch)
tree79ff7e3f9c4b90c61a912f72111d7fca4a3f533e
parente52dccf724ee05a16b6e78e79d7045f5c0ac979f (diff)
refactor sample consumer
JIRA: DOCTOR-113 Change-Id: I60f17953e9b1cdf31ea50f313b33f8ede0831bc2 Signed-off-by: dongwenjuan <dong.wenjuan@zte.com.cn>
-rw-r--r--tests/consumer/__init__.py11
-rw-r--r--tests/consumer/base.py26
-rw-r--r--tests/consumer/sample.py71
-rw-r--r--tests/main.py4
4 files changed, 112 insertions, 0 deletions
diff --git a/tests/consumer/__init__.py b/tests/consumer/__init__.py
index 68cc5dc9..ccec8644 100644
--- a/tests/consumer/__init__.py
+++ b/tests/consumer/__init__.py
@@ -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
index 00000000..35170748
--- /dev/null
+++ b/tests/consumer/base.py
@@ -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
index 00000000..a698623a
--- /dev/null
+++ b/tests/consumer/sample.py
@@ -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
diff --git a/tests/main.py b/tests/main.py
index 6644b544..6547835e 100644
--- a/tests/main.py
+++ b/tests/main.py
@@ -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():