Revision aed77afe snf-cyclades-app/synnefo/plankton/backend.py
b/snf-cyclades-app/synnefo/plankton/backend.py | ||
---|---|---|
255 | 255 |
location = get_location(account, container, object) |
256 | 256 |
return self._get_image(location) |
257 | 257 |
|
258 |
def iter(self): |
|
259 |
"""Iter over all images available to the user""" |
|
260 |
|
|
261 |
backend = self.backend |
|
262 |
for account in backend.list_accounts(self.user): |
|
263 |
for container in backend.list_containers(self.user, account, |
|
264 |
shared=True): |
|
265 |
for path, version_id in backend.list_objects(self.user, |
|
266 |
account, container, domain=PLANKTON_DOMAIN): |
|
267 |
location = get_location(account, container, path) |
|
268 |
image = self._get_image(location) |
|
269 |
if image: |
|
270 |
yield image |
|
271 |
|
|
272 |
def iter_public(self, filters=None): |
|
258 |
def _iter(self, public=False, filters=None, shared_from=None): |
|
273 | 259 |
filters = filters or {} |
274 |
backend = self.backend |
|
275 | 260 |
|
261 |
# Fix keys |
|
276 | 262 |
keys = [PLANKTON_PREFIX + 'name'] |
277 | 263 |
size_range = (None, None) |
278 |
|
|
279 | 264 |
for key, val in filters.items(): |
280 | 265 |
if key == 'size_min': |
281 | 266 |
size_range = (int(val), size_range[1]) |
... | ... | |
284 | 269 |
else: |
285 | 270 |
keys.append('%s = %s' % (PLANKTON_PREFIX + key, val)) |
286 | 271 |
|
287 |
for account in backend.list_accounts(None): |
|
288 |
for container in backend.list_containers(None, account, |
|
272 |
backend = self.backend |
|
273 |
if shared_from: |
|
274 |
# To get shared images, we connect as shared_from member and |
|
275 |
# get the list shared by us |
|
276 |
user = shared_from |
|
277 |
accounts = [self.user] |
|
278 |
else: |
|
279 |
user = None if public else self.user |
|
280 |
accounts = backend.list_accounts(user) |
|
281 |
|
|
282 |
for account in accounts: |
|
283 |
for container in backend.list_containers(user, account, |
|
289 | 284 |
shared=True): |
290 |
for path, version_id in backend.list_objects(None, account, |
|
291 |
container, domain=PLANKTON_DOMAIN, keys=keys, |
|
292 |
shared=True, size_range=size_range): |
|
285 |
for path, _ in backend.list_objects(user, account, container, |
|
286 |
domain=PLANKTON_DOMAIN, |
|
287 |
keys=keys, shared=True, |
|
288 |
size_range=size_range): |
|
293 | 289 |
location = get_location(account, container, path) |
294 | 290 |
image = self._get_image(location) |
295 | 291 |
if image: |
296 | 292 |
yield image |
297 | 293 |
|
298 |
def iter_shared(self, member): |
|
299 |
"""Iterate over image ids shared to this member""" |
|
294 |
def iter(self, filters=None): |
|
295 |
"""Iter over all images available to the user""" |
|
296 |
return self._iter(filters=filters) |
|
300 | 297 |
|
301 |
backend = self.backend |
|
298 |
def iter_public(self, filters=None): |
|
299 |
"""Iter over public images""" |
|
300 |
return self._iter(public=True, filters=filters) |
|
302 | 301 |
|
303 |
# To get the list we connect as member and get the list shared by us |
|
304 |
for container in backend.list_containers(member, self.user): |
|
305 |
for object, version_id in backend.list_objects(member, self.user, |
|
306 |
container, domain=PLANKTON_DOMAIN): |
|
307 |
try: |
|
308 |
location = get_location(self.user, container, object) |
|
309 |
meta = backend.get_object_meta(member, self.user, |
|
310 |
container, object, PLANKTON_DOMAIN) |
|
311 |
if PLANKTON_PREFIX + 'name' in meta: |
|
312 |
yield meta['uuid'] |
|
313 |
except (NameError, NotAllowedError): |
|
314 |
continue |
|
315 |
|
|
316 |
def list(self): |
|
317 |
"""Iter over all images available to the user""" |
|
302 |
def iter_shared(self, filters=None, member=None): |
|
303 |
"""Iter over images shared to member""" |
|
304 |
return self._iter(filters=filters) |
|
318 | 305 |
|
319 |
return list(self.iter()) |
|
306 |
def list(self, filters=None, params={}): |
|
307 |
"""Return all images available to the user""" |
|
308 |
images = list(self.iter(filters)) |
|
309 |
key = itemgetter(params.get('sort_key', 'created_at')) |
|
310 |
reverse = params.get('sort_dir', 'desc') == 'desc' |
|
311 |
images.sort(key=key, reverse=reverse) |
|
312 |
return images |
|
320 | 313 |
|
321 |
def list_public(self, filters, params): |
|
314 |
def list_public(self, filters, params={}): |
|
315 |
"""Return public images""" |
|
322 | 316 |
images = list(self.iter_public(filters)) |
323 | 317 |
key = itemgetter(params.get('sort_key', 'created_at')) |
324 | 318 |
reverse = params.get('sort_dir', 'desc') == 'desc' |
... | ... | |
385 | 379 |
raise BackendException("Invalid checksum") |
386 | 380 |
|
387 | 381 |
is_public = params.pop('is_public', False) |
388 |
permissions = {'read': ['*']} if is_public else {} |
|
382 |
if is_public: |
|
383 |
permissions = {'read': ['*']} |
|
384 |
else: |
|
385 |
permissions = {'read': [self.user]} |
|
389 | 386 |
|
390 | 387 |
meta = {} |
391 | 388 |
meta['properties'] = params.pop('properties', {}) |
Also available in: Unified diff