annotate transFIC_web/transFIC_web.py @ 3:4051693fb690 draft

Uploaded
author saketkc
date Mon, 14 Apr 2014 21:36:51 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
4051693fb690 Uploaded
saketkc
parents:
diff changeset
1 import sys
4051693fb690 Uploaded
saketkc
parents:
diff changeset
2 sys.path.insert(0, '/home/saket/requests-new-urllib3-api/requests/packages/')
4051693fb690 Uploaded
saketkc
parents:
diff changeset
3 sys.path.insert(0, '/home/saket/requests-new-urllib3-api')
4051693fb690 Uploaded
saketkc
parents:
diff changeset
4
4051693fb690 Uploaded
saketkc
parents:
diff changeset
5
4051693fb690 Uploaded
saketkc
parents:
diff changeset
6 import requests
4051693fb690 Uploaded
saketkc
parents:
diff changeset
7 import pycurl
4051693fb690 Uploaded
saketkc
parents:
diff changeset
8 import os
4051693fb690 Uploaded
saketkc
parents:
diff changeset
9 from os.path import getsize
4051693fb690 Uploaded
saketkc
parents:
diff changeset
10 import argparse
4051693fb690 Uploaded
saketkc
parents:
diff changeset
11 import sys
4051693fb690 Uploaded
saketkc
parents:
diff changeset
12 import cStringIO
4051693fb690 Uploaded
saketkc
parents:
diff changeset
13 from functools import wraps
4051693fb690 Uploaded
saketkc
parents:
diff changeset
14 import tempfile
4051693fb690 Uploaded
saketkc
parents:
diff changeset
15 import shutil
4051693fb690 Uploaded
saketkc
parents:
diff changeset
16 import time
4051693fb690 Uploaded
saketkc
parents:
diff changeset
17
4051693fb690 Uploaded
saketkc
parents:
diff changeset
18 __url__ = "http://bg.upf.edu/transfic/taskService"
4051693fb690 Uploaded
saketkc
parents:
diff changeset
19
4051693fb690 Uploaded
saketkc
parents:
diff changeset
20
4051693fb690 Uploaded
saketkc
parents:
diff changeset
21 def stop_err(msg, err=1):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
22 sys.stderr.write('%s\n' % msg)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
23 sys.exit(err)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
24
4051693fb690 Uploaded
saketkc
parents:
diff changeset
25
4051693fb690 Uploaded
saketkc
parents:
diff changeset
26 def retry(ExceptionToCheck, tries=14, delay=3, backoff=2, logger=None):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
27 """Retry calling the decorated function using an exponential backoff.
4051693fb690 Uploaded
saketkc
parents:
diff changeset
28
4051693fb690 Uploaded
saketkc
parents:
diff changeset
29 http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/
4051693fb690 Uploaded
saketkc
parents:
diff changeset
30 original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry
4051693fb690 Uploaded
saketkc
parents:
diff changeset
31
4051693fb690 Uploaded
saketkc
parents:
diff changeset
32 :param ExceptionToCheck: the exception to check. may be a tuple of
4051693fb690 Uploaded
saketkc
parents:
diff changeset
33 exceptions to check
4051693fb690 Uploaded
saketkc
parents:
diff changeset
34 :type ExceptionToCheck: Exception or tuple
4051693fb690 Uploaded
saketkc
parents:
diff changeset
35 :param tries: number of times to try (not retry) before giving up
4051693fb690 Uploaded
saketkc
parents:
diff changeset
36 :type tries: int
4051693fb690 Uploaded
saketkc
parents:
diff changeset
37 :param delay: initial delay between retries in seconds
4051693fb690 Uploaded
saketkc
parents:
diff changeset
38 :type delay: int
4051693fb690 Uploaded
saketkc
parents:
diff changeset
39 :param backoff: backoff multiplier e.g. value of 2 will double the delay
4051693fb690 Uploaded
saketkc
parents:
diff changeset
40 each retry
4051693fb690 Uploaded
saketkc
parents:
diff changeset
41 :type backoff: int
4051693fb690 Uploaded
saketkc
parents:
diff changeset
42 :param logger: logger to use. If None, print
4051693fb690 Uploaded
saketkc
parents:
diff changeset
43 :type logger: logging.Logger instance
4051693fb690 Uploaded
saketkc
parents:
diff changeset
44 """
4051693fb690 Uploaded
saketkc
parents:
diff changeset
45 def deco_retry(f):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
46
4051693fb690 Uploaded
saketkc
parents:
diff changeset
47 @wraps(f)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
48 def f_retry(*args, **kwargs):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
49 mtries, mdelay = tries, delay
4051693fb690 Uploaded
saketkc
parents:
diff changeset
50 while mtries > 1:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
51 try:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
52 return f(*args, **kwargs)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
53 except ExceptionToCheck, e:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
54 #msg = "%s, Retrying in %d seconds..." % (str(e), mdelay)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
55 msg = "Retrying in %d seconds..." % (mdelay)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
56 if logger:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
57 logger.warning(msg)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
58 else:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
59 # print msg
4051693fb690 Uploaded
saketkc
parents:
diff changeset
60 pass
4051693fb690 Uploaded
saketkc
parents:
diff changeset
61 time.sleep(mdelay)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
62 mtries -= 1
4051693fb690 Uploaded
saketkc
parents:
diff changeset
63 mdelay *= backoff
4051693fb690 Uploaded
saketkc
parents:
diff changeset
64 return f(*args, **kwargs)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
65
4051693fb690 Uploaded
saketkc
parents:
diff changeset
66 return f_retry # true decorator
4051693fb690 Uploaded
saketkc
parents:
diff changeset
67
4051693fb690 Uploaded
saketkc
parents:
diff changeset
68 return deco_retry
4051693fb690 Uploaded
saketkc
parents:
diff changeset
69
4051693fb690 Uploaded
saketkc
parents:
diff changeset
70
4051693fb690 Uploaded
saketkc
parents:
diff changeset
71 class TransficUploader:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
72
4051693fb690 Uploaded
saketkc
parents:
diff changeset
73 def __init__(self):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
74
4051693fb690 Uploaded
saketkc
parents:
diff changeset
75 self.c = pycurl.Curl()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
76 self.c.setopt(pycurl.URL, __url__)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
77 self.c.setopt(pycurl.UPLOAD, 1)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
78 self.c.setopt(
4051693fb690 Uploaded
saketkc
parents:
diff changeset
79 pycurl.PROXY, os.environ['http_proxy'])
4051693fb690 Uploaded
saketkc
parents:
diff changeset
80 #'http://saket.kumar:uzfmTjX9839.1314@netmon.iitb.ac.in:80/')
4051693fb690 Uploaded
saketkc
parents:
diff changeset
81 self.c.setopt(pycurl.HTTPHEADER, ['Expect:'])
4051693fb690 Uploaded
saketkc
parents:
diff changeset
82 self.c.setopt(pycurl.UPLOAD, 1)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
83 self.c.setopt(pycurl.NOPROGRESS, 1)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
84 self.c.setopt(pycurl.USERAGENT, "curl/7.27.0")
4051693fb690 Uploaded
saketkc
parents:
diff changeset
85 self.c.setopt(pycurl.SSL_VERIFYPEER, 1)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
86 self.c.setopt(pycurl.CUSTOMREQUEST, "PUT")
4051693fb690 Uploaded
saketkc
parents:
diff changeset
87 self.c.setopt(pycurl.TCP_NODELAY, 1)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
88 self.buf = cStringIO.StringIO()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
89 self.c.setopt(self.c.WRITEFUNCTION, self.buf.write)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
90
4051693fb690 Uploaded
saketkc
parents:
diff changeset
91 def upload_file(self, filepath):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
92 f = open(filepath)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
93 self.c.setopt(pycurl.INFILE, f)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
94 self.c.setopt(pycurl.INFILESIZE, getsize(filepath))
4051693fb690 Uploaded
saketkc
parents:
diff changeset
95
4051693fb690 Uploaded
saketkc
parents:
diff changeset
96 def run(self):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
97 self.c.perform()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
98
4051693fb690 Uploaded
saketkc
parents:
diff changeset
99 def get_url(self):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
100 return self.buf.getvalue().strip()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
101
4051693fb690 Uploaded
saketkc
parents:
diff changeset
102 @retry(requests.exceptions.HTTPError)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
103 def result_exists(self, url):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
104 download_request = requests.request("GET", url)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
105 if download_request.status_code == 404 or download_request == 500:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
106 raise requests.HTTPError()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
107 elif "Task status is : error" in download_request.text:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
108 stop_err("No SNVs found!")
4051693fb690 Uploaded
saketkc
parents:
diff changeset
109 else:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
110 return url
4051693fb690 Uploaded
saketkc
parents:
diff changeset
111
4051693fb690 Uploaded
saketkc
parents:
diff changeset
112 @retry(requests.exceptions.HTTPError)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
113 def download_result(self, url, outpath):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
114 tmp_dir = tempfile.mkdtemp()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
115 r = requests.get(url, stream=True)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
116 if r.status_code == 500:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
117 raise requests.HTTPError()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
118 else:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
119 path = os.path.join(tmp_dir, "results.csv")
4051693fb690 Uploaded
saketkc
parents:
diff changeset
120 with open(path, 'wb') as f:
4051693fb690 Uploaded
saketkc
parents:
diff changeset
121 for chunk in r.iter_content(128):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
122 f.write(chunk)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
123 shutil.move(path, outpath)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
124 shutil.rmtree(tmp_dir)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
125
4051693fb690 Uploaded
saketkc
parents:
diff changeset
126
4051693fb690 Uploaded
saketkc
parents:
diff changeset
127 def main(params):
4051693fb690 Uploaded
saketkc
parents:
diff changeset
128 parser = argparse.ArgumentParser()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
129 parser.add_argument("--input", type=str, required=True)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
130 parser.add_argument("--output", type=str, required=True)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
131 args = parser.parse_args(params)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
132 uploader = TransficUploader()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
133 uploader.upload_file(args.input)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
134 uploader.run()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
135 url = uploader.get_url()
4051693fb690 Uploaded
saketkc
parents:
diff changeset
136 url = uploader.result_exists(url)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
137 uploader.download_result(url, args.output)
4051693fb690 Uploaded
saketkc
parents:
diff changeset
138
4051693fb690 Uploaded
saketkc
parents:
diff changeset
139
4051693fb690 Uploaded
saketkc
parents:
diff changeset
140 if __name__ == "__main__":
4051693fb690 Uploaded
saketkc
parents:
diff changeset
141 main(sys.argv[1:])