import json
import Queue
-import traceback
import uuid
from flask import Flask
from flask_socketio import emit
from flask_socketio import SocketIO
-from fluentd import FluentLogHandler
from summarizer import NFVBenchSummarizer
from log import LOG
from utils import byteify
from utils import RunLock
-
# this global cannot reside in Ctx because of the @app and @socketio decorators
app = None
socketio = None
of this class and pass a runner object then invoke the run method
"""
- def __init__(self, http_root, runner, logger):
+ def __init__(self, http_root, runner, fluent_logger):
self.nfvbench_runner = runner
setup_flask(http_root)
- self.fluent_logger = logger
- self.result_fluent_logger = None
- if self.fluent_logger:
- self.result_fluent_logger = \
- FluentLogHandler("resultnfvbench",
- fluentd_ip=self.fluent_logger.sender.host,
- fluentd_port=self.fluent_logger.sender.port)
- self.result_fluent_logger.runlogdate = self.fluent_logger.runlogdate
+ self.fluent_logger = fluent_logger
def run(self, host='127.0.0.1', port=7556):
# print 'main thread waiting for requests...'
config = Ctx.dequeue()
# print 'main thread processing request...'
- print config
+ # print config
try:
# remove unfilled values as we do not want them to override default values with None
config = {k: v for k, v in config.items() if v is not None}
with RunLock():
+ if self.fluent_logger:
+ self.fluent_logger.start_new_run()
results = self.nfvbench_runner.run(config, config)
except Exception as exc:
- print 'NFVbench runner exception:'
- traceback.print_exc()
results = result_json(STATUS_ERROR, str(exc))
- LOG.exception()
+ LOG.exception('NFVbench runner exception:')
if Ctx.request_from_socketio:
socketio.emit('run_end', results)
else:
# this might overwrite a previously unfetched result
Ctx.set_result(results)
- if self.fluent_logger:
- self.result_fluent_logger.runlogdate = self.fluent_logger.runlogdate
- summary = NFVBenchSummarizer(results['result'], self.result_fluent_logger)
- LOG.info(str(summary))
+ try:
+ summary = NFVBenchSummarizer(results['result'], self.fluent_logger)
+ LOG.info(str(summary))
+ except KeyError:
+ # in case of error, 'result' might be missing
+ if 'error_message' in results:
+ LOG.error(results['error_message'])
+ else:
+ LOG.error('REST request completed without results or error message')
Ctx.release()
if self.fluent_logger:
self.fluent_logger.send_run_summary(True)