Skip to content

Commit c8e5acd

Browse files
author
Peter Amstutz
committed
Support multi-file upload.
1 parent dd969ff commit c8e5acd

File tree

2 files changed

+66
-15
lines changed

2 files changed

+66
-15
lines changed

cwl_client.py

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,37 @@
22
import requests
33
import urlparse
44
import os
5+
import yaml
6+
7+
def search_refs(item, base):
8+
r = []
9+
if isinstance(item, dict):
10+
for i in ("@import", "import"):
11+
if i in item:
12+
r.extend(discover_refs(item[i], base))
13+
14+
for i in ("@include", "include"):
15+
if i in item:
16+
with open(item[i]) as f:
17+
data = f.read()
18+
r.append((item[i], data))
19+
20+
for v in item.values():
21+
r.extend(search_refs(v, base))
22+
23+
elif isinstance(item, list):
24+
for a in item:
25+
r.extend(search_refs(a, base))
26+
27+
return r
28+
29+
def discover_refs(item, base):
30+
item = os.path.join(base, item)
31+
with open(item) as f:
32+
data = f.read()
33+
r = [(item, data)]
34+
r.extend(search_refs(yaml.load(data), os.path.dirname(item)))
35+
return r
536

637
def main():
738
parser = argparse.ArgumentParser()
@@ -17,16 +48,18 @@ def main():
1748
print r.text
1849
return
1950

20-
with open(args.item) as f:
21-
data = f.read()
22-
2351
if args.upload:
24-
dest = urlparse.urljoin(args.endpoint, os.path.basename(args.item))
25-
r = requests.put(dest, data=data)
52+
(dr, fn) = os.path.split(args.item)
53+
plan = discover_refs(fn, dr)
54+
for p in plan:
55+
dest = urlparse.urljoin(args.endpoint, p[0][len(dr):].lstrip('/'))
56+
r = requests.put(dest, data=p[1])
57+
print r.text
2658
else:
59+
with open(args.item) as f:
60+
data = f.read()
2761
r = requests.post(args.endpoint, data=data)
28-
29-
print r.text
62+
print r.text
3063

3164

3265
if __name__ == "__main__":

cwl_flask.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,30 @@
33
import os
44
import subprocess
55
import tempfile
6+
import json
67

78
app = Flask(__name__)
89

9-
@app.route("/<workflow>", methods=['GET', 'POST', 'PUT'])
10-
def runjob(workflow):
10+
@app.route("/<path:workflow>", methods=['GET', 'POST', 'PUT'])
11+
def handlecwl(workflow):
1112
try:
13+
if ".." in workflow:
14+
return "Path cannot contain ..", 400, {"Content-Type": "text/plain"}
15+
1216
if request.method == 'PUT':
13-
with open(os.path.join("files", workflow), "w") as f:
17+
(dr, fn) = os.path.split(workflow)
18+
dr = os.path.join("files", dr)
19+
if dr and not os.path.exists(dr):
20+
os.makedirs(dr)
21+
22+
with open(os.path.join(dr, fn), "w") as f:
1423
f.write(request.stream.read())
1524
return "Ok"
1625

1726
wf = os.path.join("files", workflow)
1827

1928
if not os.path.exists(wf):
20-
return "Not found", 404
29+
return "Not found", 404, {"Content-Type": "text/plain"}
2130

2231
if request.method == 'POST':
2332
with tempfile.NamedTemporaryFile() as f:
@@ -32,14 +41,23 @@ def runjob(workflow):
3241
(stdoutdata, stderrdata) = proc.communicate()
3342
proc.wait()
3443
if proc.returncode == 0:
35-
return stdoutdata
44+
return stdoutdata, 200, {"Content-Type": "application/json"}
3645
else:
37-
return stderrdata, 400
46+
return json.dumps({"cwl:error":stderrdata}), 400, {"Content-Type": "application/json"}
3847
else:
3948
with open(wf, "r") as f:
40-
return f.read()
49+
return f.read(), 200, {"Content-Type": "application/x-common-workflow-language"}
50+
except Exception as e:
51+
print e
52+
return str(e), 500, {"Content-Type": "text/plain"}
53+
54+
@app.route("/")
55+
def index():
56+
try:
57+
return json.dumps(["%s/%s" % (r[5:], f2) for r, _, f in os.walk("files") for f2 in f]), 200, {"Content-Type": "application/json"}
4158
except Exception as e:
42-
return str(e), 500
59+
print e
60+
return str(e), 500, {"Content-Type": "text/plain"}
4361

4462
if __name__ == "__main__":
4563
if not os.path.exists("files"):

0 commit comments

Comments
 (0)