1
2
3
4
5
6
7
8
9
10
11
12
13
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
37 cloud_config.CloudConfig.get_session_endpoint = patch.get_session_endpoint
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
58
62
65
66 - def get(self, *args, **kwargs):
68
69 - def head(self, *args, **kwargs):
71
72 - def delete(self, *args, **kwargs):
74
75 - def patch(self, *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):
83
84 - def get_raw(self, *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):
92
95
96 - def post_file(self, *args, **kwargs):
97 return self.session.post_file(self.service, *args, **kwargs)
98
101
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
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
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
141
153
155 return service in self.endpoints
156
159
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
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):
208
209 @reauth
210 @exception_translator
211 @safe_json_load
212 - def patch(self, service, *args, **kwargs):
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):
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