From a9bac7d9a04578b1341265fed4a7d606d350d11c Mon Sep 17 00:00:00 2001 From: Jim Paris Date: Fri, 5 Jul 2013 15:55:41 -0400 Subject: [PATCH] Start thread management stuff --- .coveragerc | 10 +++++++++ data.js | 7 ++++--- src/server.py | 50 +++++++++++++++++++++++++++++++++++++++++--- src/threadmanager.py | 11 ++++++++++ 4 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 .coveragerc create mode 100644 src/threadmanager.py diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..d2f1163 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,10 @@ +# -*- conf -*- + +[run] +# branch = True + +[report] +exclude_lines = + pragma: no cover + if 0: +omit = scripts,src/_version.py diff --git a/data.js b/data.js index 42c58a6..71c3c0c 100644 --- a/data.js +++ b/data.js @@ -12,8 +12,7 @@ "start": 1366260494269078, "end": 1366260608185031, "columns": [ { "name": "P1", "index": 0 }, - { "name": "Q1", "index": 1 }, - { "name": "P3", "index": 2 } + { "name": "Q1", "index": 1 } ] }, { "name": "Boiler Pump OFF", @@ -21,7 +20,9 @@ "stream": "/sharon/prep-a", "start": 1366260864215764, "end": 1366260870882998, - "columns": [ { "name": "P1", "index": 0 } ] + "columns": [ { "name": "P1", "index": 0 }, + { "name": "Q1", "index": 1 } + ] } ] } \ No newline at end of file diff --git a/src/server.py b/src/server.py index 200ce50..bf4ec44 100755 --- a/src/server.py +++ b/src/server.py @@ -30,7 +30,7 @@ import nilmrun.trainola cherrypy.tools.CORS_allow = cherrypy.Tool('on_start_resource', CORS_allow) # CherryPy apps -class NilmRunApp(object): +class App(object): """Root application for NILM runner""" def __init__(self): @@ -55,7 +55,49 @@ class NilmRunApp(object): def version(self): return nilmrun.__version__ - # /trainola +class AppThread(object): + + def __init__(self, manager): + self.manager = manager + + def thread_status(self, pid): + return { + "pid": pid, + "alive": self.manager[pid].alive, + "name": self.manager[pid].name, + "start_time": self.manager[pid].start_time, + "parameters": self.manager[pid].parameters, + "log": self.manager[pid].log, + } + + # /thread/status + @cherrypy.expose + @cherrypy.tools.json_out() + def status(self, pid, clear = False): + if pid not in self.manager: + raise cherrypy.NotFound() + status = thread_status(pid) + if clear: + self.manager[pid].clear_log() + return status + + # /thread/kill + @cherrypy.expose + @cherrypy.tools.json_in() + @cherrypy.tools.json_out() + @cherrypy.tools.CORS_allow(methods = ["POST"]) + def kill(self, pid): + if pid not in self.manager: + raise CherryPy.NotFound() + if not self.manager.terminate(pid): + raise cherrypy.HTTPError("503 Service Unavailable", + "Failed to stop thread") + status = thread_status(pid) + manager.remove(pid) + +class AppFilter(object): + + # /filter/trainola @cherrypy.expose @cherrypy.tools.json_in() @cherrypy.tools.json_out() @@ -114,7 +156,9 @@ class Server(object): cherrypy._cperror._ie_friendly_error_sizes = {} # Build up the application and mount it - root = NilmRunApp() + root = App() + root.thread = AppThread() + root.filter = AppFilter() cherrypy.tree.apps = {} cherrypy.tree.mount(root, basepath, config = { "/" : app_config }) diff --git a/src/threadmanager.py b/src/threadmanager.py new file mode 100644 index 0000000..29b6368 --- /dev/null +++ b/src/threadmanager.py @@ -0,0 +1,11 @@ +#!/usr/bin/python + +from nilmdb.utils.printf import * + +import threading + +class ThreadManager(object): + def __init__(self): + self.threads = {} + +