Skip to content

Commit 817ff81

Browse files
author
Peter Amstutz
committed
Support logging
1 parent 12c101e commit 817ff81

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

cwl_flask.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from flask import Flask
2-
from flask import request, redirect
1+
from flask import Flask, Response, request, redirect
32
import os
43
import subprocess
54
import tempfile
@@ -8,6 +7,7 @@
87
import urlparse
98
import signal
109
import threading
10+
import time
1111

1212
app = Flask(__name__)
1313

@@ -24,21 +24,22 @@ def __init__(self, jobid, path, inputobj):
2424
self.begin()
2525

2626
def begin(self):
27+
loghandle, self.logname = tempfile.mkstemp()
2728
with self.updatelock:
2829
self.outdir = tempfile.mkdtemp()
2930
self.proc = subprocess.Popen(["cwl-runner", self.path, "-"],
3031
stdin=subprocess.PIPE,
3132
stdout=subprocess.PIPE,
32-
stderr=subprocess.PIPE,
33+
stderr=loghandle,
3334
close_fds=True,
3435
cwd=self.outdir)
3536
self.status = {
3637
"id": "%sjobs/%i" % (request.url_root, self.jobid),
38+
"log": "%sjobs/%i/log" % (request.url_root, self.jobid),
3739
"run": self.path,
3840
"state": "Running",
39-
"input": self.inputobj,
40-
"output": None,
41-
"message": ""}
41+
"input": json.loads(self.inputobj),
42+
"output": None}
4243

4344
def run(self):
4445
self.stdoutdata, self.stderrdata = self.proc.communicate(self.inputobj)
@@ -50,7 +51,6 @@ def run(self):
5051
else:
5152
with self.updatelock:
5253
self.status["state"] = "Failed"
53-
self.status["message"] = self.stderrdata
5454

5555
def getstatus(self):
5656
with self.updatelock:
@@ -104,6 +104,25 @@ def jobcontrol(jobid):
104104
return json.dumps(status, indent=4), 200, ""
105105

106106

107+
def logspooler(job):
108+
with open(job.logname, "r") as f:
109+
while True:
110+
r = f.read(4096)
111+
if r:
112+
yield r
113+
else:
114+
with job.updatelock:
115+
if job.status["state"] != "Running":
116+
break
117+
time.sleep(1)
118+
119+
@app.route("/jobs/<int:jobid>/log", methods=['GET'])
120+
def getlog(jobid):
121+
with jobs_lock:
122+
job = jobs[jobid]
123+
return Response(logspooler(job))
124+
125+
107126
if __name__ == "__main__":
108-
app.debug = True
127+
#app.debug = True
109128
app.run()

0 commit comments

Comments
 (0)