Mercurial > repos > geco-team > gmql_download
comparison utilities.py @ 0:35d52820e7c7 draft default tip
planemo upload for repository https://github.com/lu-brn/gmql-galaxy commit 953ee36ceda5814dc9baa03427bc0eb4ee2e93bd-dirty
| author | geco-team |
|---|---|
| date | Tue, 26 Jun 2018 09:01:39 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:35d52820e7c7 |
|---|---|
| 1 # Helper functions to perform REST calls on the GMQL server. | |
| 2 # ---------------------------------------------------------------------------- | |
| 3 # Luana Brancato, luana.brancato@mail.polimi.it | |
| 4 # ---------------------------------------------------------------------------- | |
| 5 | |
| 6 import sys | |
| 7 import os | |
| 8 import yaml | |
| 9 import requests | |
| 10 | |
| 11 | |
| 12 def load_parts(module, call) : | |
| 13 """Given the module and the single operation, returns the fragments for the url to call""" | |
| 14 | |
| 15 y_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'gmql_rest.yaml') | |
| 16 | |
| 17 with open(y_path,'r') as yamlf : | |
| 18 cfg = yaml.load(yamlf) | |
| 19 | |
| 20 parts = list () | |
| 21 | |
| 22 gmql = cfg['GMQL_URL'] | |
| 23 prefix = cfg[module]['prefix'] | |
| 24 op = cfg[module]['operations'][call] | |
| 25 | |
| 26 parts.append(gmql) | |
| 27 if prefix : | |
| 28 parts.append(prefix) | |
| 29 | |
| 30 for p in op : | |
| 31 parts.append(p) | |
| 32 | |
| 33 return parts | |
| 34 | |
| 35 def compose_url(module, call) : | |
| 36 """Given the fragments of a url, return the composite one""" | |
| 37 | |
| 38 parts = load_parts(module,call) | |
| 39 url = '/'.join(parts) | |
| 40 | |
| 41 return url | |
| 42 | |
| 43 def add_url_param(params, module, op, value,) : | |
| 44 """Given the params dict, add a new pair of key:value with the given value and the key set for given module and operation""" | |
| 45 | |
| 46 y_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'gmql_rest.yaml') | |
| 47 | |
| 48 with open(y_path, 'r') as yamlf: | |
| 49 cfg = yaml.load(yamlf) | |
| 50 yamlf.close() | |
| 51 | |
| 52 key = cfg[module]['params'][op] | |
| 53 | |
| 54 params.update({key : value}) | |
| 55 | |
| 56 return params | |
| 57 | |
| 58 | |
| 59 def read_token(input): | |
| 60 """It takes the tabular file with the information over the user | |
| 61 name authToken valid_flag | |
| 62 It checks if the user is still valid and extract the authToken for the REST calls""" | |
| 63 | |
| 64 with open(input,'r') as f_in : | |
| 65 user = f_in.readline().rstrip('\n').split('\t') | |
| 66 | |
| 67 if user[2] : | |
| 68 token = user[1] | |
| 69 else : | |
| 70 stop_err("This session is no longer valid") | |
| 71 | |
| 72 | |
| 73 return token | |
| 74 | |
| 75 def expire_user(input): | |
| 76 """Set the validity flag of a user token to false""" | |
| 77 | |
| 78 with open(input,'r') as f: | |
| 79 user = f.readline().rstrip('\n').split('\t') | |
| 80 | |
| 81 user[2] = False | |
| 82 | |
| 83 with open(input,'w') as f : | |
| 84 f.write('{fullName}\t{token}\t{valid}\n'.format(fullName=user[0], token=user[1], | |
| 85 valid=user[2])) | |
| 86 | |
| 87 | |
| 88 def get(url, user=None, response_type='json') : | |
| 89 """GET Request | |
| 90 :param url: url where to fetch the requested resource | |
| 91 :param user: for authenticated requests; if not provided make an unauthenticated request (es. for login) | |
| 92 :param response_type: type of the fetched response. | |
| 93 JSON ( Default ) | |
| 94 TEXT | |
| 95 ZIP | |
| 96 FILE | |
| 97 """ | |
| 98 | |
| 99 #Set request headers | |
| 100 headers = dict () | |
| 101 | |
| 102 if user : | |
| 103 headers.update({'X-AUTH-TOKEN' : read_token(user)}) | |
| 104 | |
| 105 if response_type == 'text' : | |
| 106 headers.update({'Accept' : 'text/plain'}) | |
| 107 elif response_type == 'zip' : | |
| 108 pass | |
| 109 elif response_type == 'file' : | |
| 110 headers.update({'Accept' : 'file'}) | |
| 111 else : | |
| 112 headers.update({'Accept' : 'application/json'}) | |
| 113 | |
| 114 | |
| 115 #Make the request | |
| 116 response = requests.get(url, headers=headers) | |
| 117 | |
| 118 #Check returned server status | |
| 119 status_code = response.status_code | |
| 120 | |
| 121 #Read result. If Server OK, read according to response_type. Raise an error otherwise. | |
| 122 if status_code == requests.codes.ok : | |
| 123 if response_type == 'json' : | |
| 124 return response.json() | |
| 125 elif response_type == 'text' : | |
| 126 return response.text | |
| 127 else : | |
| 128 return response | |
| 129 elif status_code == requests.codes.unauthorized : | |
| 130 expire_user(user) | |
| 131 stop_err("You are not authorized to do this. \nPlease login first.") | |
| 132 elif status_code == requests.codes.not_found : | |
| 133 stop_err("Resource not found for this user.") | |
| 134 else : | |
| 135 stop_err("Error {code}: {reason}\n{message}".format(code=status_code, | |
| 136 reason=response.reason, | |
| 137 message=response.content)) | |
| 138 | |
| 139 | |
| 140 def post(url, payload, user=None, params=None, content_type='json', response_type='json') : | |
| 141 """ POST Request | |
| 142 :param url: url where to post data | |
| 143 :param payload: payload for the post request. Type is specified by content_type. | |
| 144 :param user: for authenticated requests; if not provided make an unauthenticated request (es. for registration) | |
| 145 :param params: optional query parameters | |
| 146 :param content_type | |
| 147 :param response_type: Default is json | |
| 148 """ | |
| 149 | |
| 150 | |
| 151 # Set request headers | |
| 152 headers = dict() | |
| 153 | |
| 154 if user: | |
| 155 headers.update({'X-AUTH-TOKEN': read_token(user)}) | |
| 156 | |
| 157 headers.update({'Accept': 'application/json'}) | |
| 158 | |
| 159 if content_type == 'text' : | |
| 160 headers.update({'Content-Type' : 'text/plain'}) | |
| 161 response = requests.post(url, params=params, headers=headers, data=payload) | |
| 162 elif content_type == 'multiform' : | |
| 163 response = requests.post(url, params=params, headers=headers, files=payload) | |
| 164 else : | |
| 165 headers.update({'Content-Type': 'application/json'}) | |
| 166 response = requests.post(url, params=params, headers=headers, json=payload) | |
| 167 | |
| 168 # Check returned server status | |
| 169 status_code = response.status_code | |
| 170 | |
| 171 | |
| 172 if status_code == requests.codes.ok : | |
| 173 return response.json() | |
| 174 elif status_code == requests.codes.unauthorized : | |
| 175 content = response.content | |
| 176 if content.__contains__("The username or password you entered don't match") : | |
| 177 stop_err("The username or password you entered don't match") | |
| 178 else: | |
| 179 expire_user(user) | |
| 180 stop_err("You are not authorized to do this. \nPlease login first.") | |
| 181 else : | |
| 182 stop_err("Error {code}: {reason}\n{message}".format(code=status_code, | |
| 183 reason=response.reason, | |
| 184 message=response.content)) | |
| 185 | |
| 186 | |
| 187 | |
| 188 def delete(url, user=None, response_type='json') : | |
| 189 """DELETE request | |
| 190 :param url: url where to post data | |
| 191 :param user: for authenticated requests; if not provided make an unauthenticated request (es. for registration) | |
| 192 :param response_type: Default is json | |
| 193 """ | |
| 194 | |
| 195 # Set request headers | |
| 196 headers = dict() | |
| 197 | |
| 198 if user: | |
| 199 headers.update({'X-AUTH-TOKEN': read_token(user)}) | |
| 200 | |
| 201 headers.update({'Accept': 'application/json'}) | |
| 202 | |
| 203 #Make the request | |
| 204 response = requests.delete(url, headers=headers) | |
| 205 | |
| 206 #Check returned server status | |
| 207 status_code = response.status_code | |
| 208 | |
| 209 | |
| 210 #If Server OK, read result. Raise an error otherwise. | |
| 211 if status_code == requests.codes.ok : | |
| 212 return response.json() | |
| 213 elif status_code == requests.codes.unauthorized : | |
| 214 expire_user(user) | |
| 215 stop_err("You are not authorized to do this. \nPlease login first.") | |
| 216 elif status_code == requests.codes.not_found : | |
| 217 stop_err("Resource not found for this user.") | |
| 218 else : | |
| 219 stop_err("Error {code}: {reason}".format(code=status_code, | |
| 220 reason=response.reason)) | |
| 221 | |
| 222 | |
| 223 | |
| 224 def stop_err(msg): | |
| 225 sys.stderr.write("%s\n" % msg) | |
| 226 sys.exit() |
