13 arvrun_parser = argparse.ArgumentParser()
14 arvrun_parser.add_argument('--dry-run', action="store_true")
15 arvrun_parser.add_argument('--docker-image', type=str, default="arvados/jobs")
16 arvrun_parser.add_argument('command')
17 arvrun_parser.add_argument('args', nargs=argparse.REMAINDER)
21 class ArvFile(object):
22 def __init__(self, prefix, fn):
26 def statfile(prefix, fn, pattern):
27 absfn = os.path.abspath(fn)
28 if os.path.exists(absfn):
29 fn = os.path.abspath(fn)
31 if stat.S_ISREG(st.st_mode):
32 mount = os.path.dirname(fn)+"/.arvados#collection"
33 if os.path.exists(mount):
34 with file(mount, 'r') as f:
36 return prefix+"$(file "+c["portable_data_hash"]+"/" + os.path.basename(fn) + ")"
38 needupload_files.append(fn)
39 return ArvFile(prefix, fn[1:])
42 def main(arguments=None):
43 args = arvrun_parser.parse_args(arguments)
45 patterns = [re.compile("(--[^=]+=)(.*)"),
46 re.compile("(-[^=]+=)(.*)"),
47 re.compile("(-.)(.+)")]
57 commandargs.append(statfile(m.group(1), m.group(2), p))
63 commandargs.append(statfile('', a, None))
67 files = [c for c in commandargs if isinstance(c, ArvFile)]
77 pathstep = sp[0] + "/"
79 if not c.fn.startswith(pathstep):
83 pathprefix += pathstep
85 c.fn = c.fn[len(pathstep):]
90 print("cd %s" % pathprefix)
91 print("arv-put \"%s\"" % '" "'.join([c.fn for c in files]))
94 pdh = put.main(["--portable-data-hash"]+[c.fn for c in files])
96 commandargs = [("%s$(file %s/%s)" % (c.prefix, pdh, c.fn)) if isinstance(c, ArvFile) else c for c in commandargs]
101 for j in xrange(0, len(commandargs)):
106 cut = j if cut is None else cut
110 cut = j if cut is None else cut
115 commandargs = commandargs[:cut]
118 "script": "run-command",
119 "script_version": "bf243e064a7a2ee4e69a87dc3ba46e949a545150",
120 "repository": "arvados",
121 "script_parameters": {
122 "command": [args.command]+commandargs
124 "runtime_constraints": {
125 "docker_image": args.docker_image
130 component["script_parameters"]["task.stdin"] = stdio[0][0]
132 component["script_parameters"]["task.stdout"] = stdio[1][0]
137 args.command: component
139 "state":"RunningOnServer"
143 print(json.dumps(pipeline, indent=4))
145 api = arvados.api('v1')
146 pi = api.pipeline_instances().create(body=pipeline).execute()
149 if "event_type" in x:
152 if x["event_type"] == "stderr":
153 print x["properties"]["text"]
154 elif x["event_type"] == "update" and x["properties"]["new_attributes"]["state"] in ["Complete", "Failed"]:
155 ws.close_connection()
157 ws = arvados.events.subscribe(api, [["object_uuid", "=", pi["uuid"]], ["event_type", "in", ["stderr", "update"]]], report)
160 if __name__ == '__main__':