Revision 78fa9134
b/snf-cyclades-app/synnefo/plankton/backend.py | ||
---|---|---|
63 | 63 |
from django.conf import settings |
64 | 64 |
from django.utils import importlib |
65 | 65 |
from pithos.backends.base import NotAllowedError, VersionNotExists |
66 |
from synnefo.util.text import uenc |
|
67 |
|
|
66 | 68 |
|
67 | 69 |
logger = logging.getLogger(__name__) |
68 | 70 |
|
... | ... | |
100 | 102 |
|
101 | 103 |
def split_url(url): |
102 | 104 |
"""Returns (accout, container, object) from a url string""" |
103 |
t = url.split('/', 4) |
|
104 |
assert t[0] == "pithos:", "Invalid url" |
|
105 |
assert len(t) == 5, "Invalid url" |
|
106 |
return t[2:5] |
|
105 |
try: |
|
106 |
assert(isinstance(url, basestring)) |
|
107 |
t = url.split('/', 4) |
|
108 |
assert t[0] == "pithos:", "Invalid url" |
|
109 |
assert len(t) == 5, "Invalid url" |
|
110 |
return t[2:5] |
|
111 |
except AssertionError: |
|
112 |
raise InvalidLocation("Invalid location '%s" % url) |
|
107 | 113 |
|
108 | 114 |
|
109 | 115 |
def format_timestamp(t): |
... | ... | |
205 | 211 |
"""Update object's metadata.""" |
206 | 212 |
account, container, name = split_url(image_url) |
207 | 213 |
|
208 |
prefixed = [(PLANKTON_PREFIX + k, v) for k, v in meta.items() |
|
214 |
prefixed = [(PLANKTON_PREFIX + uenc(k), uenc(v)) |
|
215 |
for k, v in meta.items() |
|
209 | 216 |
if k in PLANKTON_META or k.startswith(PROPERTY_PREFIX)] |
210 | 217 |
prefixed = dict(prefixed) |
211 | 218 |
|
... | ... | |
484 | 491 |
pass |
485 | 492 |
|
486 | 493 |
|
494 |
class InvalidLocation(ImageBackendError): |
|
495 |
pass |
|
496 |
|
|
497 |
|
|
487 | 498 |
def image_to_dict(image_url, meta, permissions): |
488 | 499 |
"""Render an image to a dictionary""" |
489 | 500 |
account, container, name = split_url(image_url) |
b/snf-cyclades-app/synnefo/plankton/views.py | ||
---|---|---|
42 | 42 |
|
43 | 43 |
from snf_django.lib import api |
44 | 44 |
from snf_django.lib.api import faults |
45 |
from synnefo.lib.text import uenc |
|
45 | 46 |
from synnefo.plankton.utils import image_backend |
46 |
from synnefo.plankton.backend import split_url |
|
47 |
from synnefo.util.text import uenc |
|
47 |
from synnefo.plankton.backend import split_url, InvalidLocation
|
|
48 |
|
|
48 | 49 |
|
49 | 50 |
FILTERS = ('name', 'container_format', 'disk_format', 'status', 'size_min', |
50 | 51 |
'size_max') |
... | ... | |
139 | 140 |
params = _get_image_headers(request) |
140 | 141 |
log.debug('add_image %s', params) |
141 | 142 |
|
142 |
assert 'name' in params
|
|
143 |
assert set(params.keys()).issubset(set(ADD_FIELDS))
|
|
143 |
if not set(params.keys()).issubset(set(ADD_FIELDS)):
|
|
144 |
raise faults.BadRequest("Invalid parameters")
|
|
144 | 145 |
|
145 | 146 |
name = params.pop('name') |
146 |
|
|
147 |
if len(uenc(name)) < 1: |
|
147 |
if name is None: |
|
148 |
raise faults.BadRequest("Image 'name' parameter is required") |
|
149 |
elif len(uenc(name)) == 0: |
|
148 | 150 |
raise faults.BadRequest("Invalid image name") |
149 |
|
|
150 | 151 |
location = params.pop('location', None) |
152 |
if location is None: |
|
153 |
raise faults.BadRequest("'location' parameter is required") |
|
154 |
|
|
151 | 155 |
try: |
152 | 156 |
split_url(location) |
153 |
except AssertionError:
|
|
157 |
except InvalidLocation:
|
|
154 | 158 |
raise faults.BadRequest("Invalid location '%s'" % location) |
155 | 159 |
|
156 | 160 |
if location: |
... | ... | |
284 | 288 |
params.setdefault('sort_key', 'created_at') |
285 | 289 |
params.setdefault('sort_dir', 'desc') |
286 | 290 |
|
287 |
assert params['sort_key'] in SORT_KEY_OPTIONS |
|
288 |
assert params['sort_dir'] in SORT_DIR_OPTIONS |
|
291 |
if not params['sort_key'] in SORT_KEY_OPTIONS: |
|
292 |
raise faults.BadRequest("Invalid 'sort_key'") |
|
293 |
if not params['sort_dir'] in SORT_DIR_OPTIONS: |
|
294 |
raise faults.BadRequest("Invalid 'sort_dir'") |
|
289 | 295 |
|
290 | 296 |
if 'size_max' in filters: |
291 | 297 |
try: |
... | ... | |
367 | 373 |
meta = _get_image_headers(request) |
368 | 374 |
log.debug('update_image %s', meta) |
369 | 375 |
|
370 |
assert set(meta.keys()).issubset(set(UPDATE_FIELDS)) |
|
376 |
if not set(meta.keys()).issubset(set(UPDATE_FIELDS)): |
|
377 |
raise faults.BadRequest("Invalid metadata") |
|
371 | 378 |
|
372 | 379 |
with image_backend(request.user_uniq) as backend: |
373 | 380 |
image = backend.update_metadata(image_id, meta) |
Also available in: Unified diff