Package yakumo :: Module session
[hide private]
[frames] | no frames]

Source Code for Module yakumo.session

  1  #   Copyright 2014 Akira Yoshiyama 
  2  # 
  3  #   Licensed under the Apache License, Version 2.0 (the "License"); you may 
  4  #   not use this file except in compliance with the License. You may obtain 
  5  #   a copy of the License at 
  6  # 
  7  #       http://www.apache.org/licenses/LICENSE-2.0 
  8  # 
  9  #   Unless required by applicable law or agreed to in writing, software 
 10  #   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 11  #   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 12  #   License for the specific language governing permissions and limitations 
 13  #   under the License. 
 14   
 15  """ 
 16  utility function(s) for session 
 17  """ 
 18  from contextlib import contextmanager 
 19  import functools 
 20  import json 
 21  import os 
 22  import os_client_config 
 23  from os_client_config import cloud_config 
 24  import random 
 25  import requests 
 26  from simplejson.scanner import JSONDecodeError 
 27   
 28  from . import exception 
 29  from . import patch 
 30  from . import utils 
 31   
 32   
 33  CHUNK_SIZE = 4096 
 34   
 35   
 36  # Patch it! 
 37  cloud_config.CloudConfig.get_session_endpoint = patch.get_session_endpoint 
38 39 40 -def get_session(**kwargs):
41 """ 42 Session class dispatcher 43 44 :return: Session class 45 """ 46 config = os_client_config.OpenStackConfig() 47 cloud_config = config.get_one_cloud(**kwargs) 48 if cloud_config.config.get('insecure'): 49 cloud_config.config['verify'] = False 50 cloud_config.config['cacert'] = None 51 if 'timeout' not in cloud_config.config: 52 cloud_config.config['timeout'] = 600 53 54 return Session(cloud_config)
55
56 57 -class SessionProxy(object):
58
59 - def __init__(self, session, service):
60 self.session = session 61 self.service = service
62
63 - def has_endpoint(self, service):
64 return self.session.has_endpoint(service)
65
66 - def get(self, *args, **kwargs):
67 return self.session.get(self.service, *args, **kwargs)
68
69 - def head(self, *args, **kwargs):
70 return self.session.head(self.service, *args, **kwargs)
71
72 - def delete(self, *args, **kwargs):
73 return self.session.delete(self.service, *args, **kwargs)
74
75 - def patch(self, *args, **kwargs):
76 return self.session.patch(self.service, *args, **kwargs)
77
78 - def post(self, *args, **kwargs):
79 return self.session.post(self.service, *args, **kwargs)
80
81 - def put(self, *args, **kwargs):
82 return self.session.put(self.service, *args, **kwargs)
83
84 - def get_raw(self, *args, **kwargs):
85 return self.session.get_raw(self.service, *args, **kwargs)
86
87 - def post_raw(self, *args, **kwargs):
88 return self.session.post_raw(self.service, *args, **kwargs)
89
90 - def put_raw(self, *args, **kwargs):
91 return self.session.put_raw(self.service, *args, **kwargs)
92
93 - def get_file(self, *args, **kwargs):
94 return self.session.get_file(self.service, *args, **kwargs)
95
96 - def post_file(self, *args, **kwargs):
97 return self.session.post_file(self.service, *args, **kwargs)
98
99 - def put_file(self, *args, **kwargs):
100 return self.session.put_file(self.service, *args, **kwargs)
101
102 103 -def reauth(func):
104 105 @functools.wraps(func) 106 def _wrapper(self, *args, **kwargs): 107 try: 108 return func(self, *args, **kwargs) 109 except exception.NotFound: 110 self.get_token() 111 return func(self, *args, **kwargs)
112 113 return _wrapper 114
115 116 -def exception_translator(func):
117 118 @functools.wraps(func) 119 def _wrapper(self, *args, **kwargs): 120 try: 121 return func(self, *args, **kwargs) 122 except exception.HTTPError as e: 123 raise exception.mapping[e.response.status_code]()
124 125 return _wrapper 126
127 128 -def safe_json_load(func):
129 130 @functools.wraps(func) 131 def _wrapper(*args, **kwargs): 132 try: 133 return func(*args, **kwargs) 134 except JSONDecodeError: 135 return None
136 137 return _wrapper 138
139 140 -class Session(object):
141
142 - def __init__(self, config):
143 self.config = config.config 144 self.keystone_session = config.get_session() 145 self.get_token() 146 self.endpoints = {} 147 for service in config.get_services(): 148 try: 149 service = service.replace('_', '-') 150 self.endpoints[service] = config.get_session_endpoint(service) 151 except: 152 pass
153
154 - def has_endpoint(self, service):
155 return service in self.endpoints
156
157 - def get_proxy(self, service):
158 return SessionProxy(self, service)
159
160 - def get_token(self):
161 self.token = self.keystone_session.get_token()
162 163 @staticmethod
164 - def json_body(kwargs):
165 jsondata = json.dumps(kwargs.get('data', {})) 166 kwargs['data'] = jsondata
167
168 - def make_headers(self, kwargs, content_type=None, 169 accept='application/json'):
170 kwargs.setdefault('headers', {}) 171 headers = kwargs['headers'] 172 if 'Content-Type' not in headers: 173 if content_type: 174 headers['Content-Type'] = content_type 175 else: 176 headers['Content-Type'] = "application/json; charset=UTF-8" 177 if 'Accept' not in headers: 178 headers['Accept'] = accept 179 headers['Accept-Encoding'] = 'identity' 180 headers['X-Auth-Token'] = self.token
181 182 @reauth 183 @exception_translator 184 @safe_json_load
185 - def get(self, service, *args, **kwargs):
186 url = utils.join_path(self.endpoints[service], *args) 187 self.make_headers(kwargs) 188 response = requests.get(url, **kwargs) 189 response.raise_for_status() 190 return response.json()
191 192 @reauth 193 @exception_translator
194 - def head(self, service, *args, **kwargs):
195 url = utils.join_path(self.endpoints[service], *args) 196 self.make_headers(kwargs) 197 response = requests.head(url, **kwargs) 198 response.raise_for_status() 199 return response.headers
200 201 @reauth 202 @exception_translator
203 - def delete(self, service, *args, **kwargs):
204 url = utils.join_path(self.endpoints[service], *args) 205 self.make_headers(kwargs) 206 response = requests.delete(url, **kwargs) 207 response.raise_for_status()
208 209 @reauth 210 @exception_translator 211 @safe_json_load
212 - def patch(self, service, *args, **kwargs):
213 url = utils.join_path(self.endpoints[service], *args) 214 self.make_headers(kwargs) 215 self.json_body(kwargs) 216 response = requests.patch(url, **kwargs) 217 response.raise_for_status() 218 return response.json()
219 220 @reauth 221 @exception_translator 222 @safe_json_load
223 - def post(self, service, *args, **kwargs):
224 url = utils.join_path(self.endpoints[service], *args) 225 self.make_headers(kwargs) 226 self.json_body(kwargs) 227 response = requests.post(url, **kwargs) 228 response.raise_for_status() 229 return response.json()
230 231 @reauth 232 @exception_translator 233 @safe_json_load
234 - def put(self, service, *args, **kwargs):
235 url = utils.join_path(self.endpoints[service], *args) 236 self.make_headers(kwargs) 237 self.json_body(kwargs) 238 response = requests.put(url, **kwargs) 239 response.raise_for_status() 240 return response.json()
241 242 @reauth 243 @exception_translator
244 - def get_raw(self, service, *args, **kwargs):
245 url = utils.join_path(self.endpoints[service], *args) 246 self.make_headers(kwargs) 247 response = requests.get(url, **kwargs) 248 response.raise_for_status() 249 return response.content
250 251 @reauth 252 @exception_translator 253 @safe_json_load
254 - def post_raw(self, service, *args, **kwargs):
255 url = utils.join_path(self.endpoints[service], *args) 256 self.make_headers(kwargs, content_type="application/octet-stream") 257 response = requests.post(url, **kwargs) 258 response.raise_for_status() 259 return response.json()
260 261 @reauth 262 @exception_translator 263 @safe_json_load
264 - def put_raw(self, service, *args, **kwargs):
265 url = utils.join_path(self.endpoints[service], *args) 266 self.make_headers(kwargs, content_type="application/octet-stream") 267 response = requests.put(url, **kwargs) 268 response.raise_for_status() 269 return response.json()
270 271 @reauth 272 @exception_translator 273 @safe_json_load
274 - def get_file(self, service, *args, **kwargs):
275 url = utils.join_path(self.endpoints[service], *args) 276 file = kwargs.pop('file') 277 self.make_headers(kwargs) 278 response = requests.get(url, stream=True, **kwargs) 279 response.raise_for_status() 280 with open(file, 'wb') as f: 281 for c in response.iter_content(chunk_size=CHUNK_SIZE): 282 f.write(c) 283 f.flush() 284 return response.headers
285 286 @reauth 287 @exception_translator 288 @safe_json_load
289 - def post_file(self, service, *args, **kwargs):
290 url = utils.join_path(self.endpoints[service], *args) 291 with open(kwargs.pop('file'), 'rb') as f: 292 kwargs['files'] = {'file': f} 293 self.make_headers(kwargs) 294 response = requests.post(url, **kwargs) 295 response.raise_for_status() 296 return response.json()
297 298 @reauth 299 @exception_translator 300 @safe_json_load
301 - def put_file(self, service, *args, **kwargs):
302 url = utils.join_path(self.endpoints[service], *args) 303 with open(kwargs.pop('file'), 'rb') as f: 304 kwargs['files'] = {'file': f} 305 self.make_headers(kwargs) 306 response = requests.put(url, **kwargs) 307 response.raise_for_status() 308 return response.json()
309