Revision fe2db49d
b/snf-pithos-backend/pithos/backends/modular.py | ||
---|---|---|
190 | 190 |
def get_account_meta(self, user, account, domain, until=None, include_user_defined=True): |
191 | 191 |
"""Return a dictionary with the account metadata for the domain.""" |
192 | 192 |
|
193 |
logger.debug("get_account_meta: %s %s %s", account, domain, until)
|
|
193 |
logger.debug("get_account_meta: %s %s %s %s", user, account, domain, until)
|
|
194 | 194 |
path, node = self._lookup_account(account, user == account) |
195 | 195 |
if user != account: |
196 | 196 |
if until or node is None or account not in self._allowed_accounts(user): |
... | ... | |
225 | 225 |
def update_account_meta(self, user, account, domain, meta, replace=False): |
226 | 226 |
"""Update the metadata associated with the account for the domain.""" |
227 | 227 |
|
228 |
logger.debug("update_account_meta: %s %s %s %s", account, domain, meta, replace)
|
|
228 |
logger.debug("update_account_meta: %s %s %s %s %s", user, account, domain, meta, replace)
|
|
229 | 229 |
if user != account: |
230 | 230 |
raise NotAllowedError |
231 | 231 |
path, node = self._lookup_account(account, True) |
... | ... | |
235 | 235 |
def get_account_groups(self, user, account): |
236 | 236 |
"""Return a dictionary with the user groups defined for this account.""" |
237 | 237 |
|
238 |
logger.debug("get_account_groups: %s", account)
|
|
238 |
logger.debug("get_account_groups: %s %s", user, account)
|
|
239 | 239 |
if user != account: |
240 | 240 |
if account not in self._allowed_accounts(user): |
241 | 241 |
raise NotAllowedError |
... | ... | |
247 | 247 |
def update_account_groups(self, user, account, groups, replace=False): |
248 | 248 |
"""Update the groups associated with the account.""" |
249 | 249 |
|
250 |
logger.debug("update_account_groups: %s %s %s", account, groups, replace)
|
|
250 |
logger.debug("update_account_groups: %s %s %s %s", user, account, groups, replace)
|
|
251 | 251 |
if user != account: |
252 | 252 |
raise NotAllowedError |
253 | 253 |
self._lookup_account(account, True) |
... | ... | |
264 | 264 |
def get_account_policy(self, user, account): |
265 | 265 |
"""Return a dictionary with the account policy.""" |
266 | 266 |
|
267 |
logger.debug("get_account_policy: %s", account)
|
|
267 |
logger.debug("get_account_policy: %s %s", user, account)
|
|
268 | 268 |
if user != account: |
269 | 269 |
if account not in self._allowed_accounts(user): |
270 | 270 |
raise NotAllowedError |
... | ... | |
276 | 276 |
def update_account_policy(self, user, account, policy, replace=False): |
277 | 277 |
"""Update the policy associated with the account.""" |
278 | 278 |
|
279 |
logger.debug("update_account_policy: %s %s %s", account, policy, replace)
|
|
279 |
logger.debug("update_account_policy: %s %s %s %s", user, account, policy, replace)
|
|
280 | 280 |
if user != account: |
281 | 281 |
raise NotAllowedError |
282 | 282 |
path, node = self._lookup_account(account, True) |
... | ... | |
287 | 287 |
def put_account(self, user, account, policy={}): |
288 | 288 |
"""Create a new account with the given name.""" |
289 | 289 |
|
290 |
logger.debug("put_account: %s %s", account, policy)
|
|
290 |
logger.debug("put_account: %s %s %s", user, account, policy)
|
|
291 | 291 |
if user != account: |
292 | 292 |
raise NotAllowedError |
293 | 293 |
node = self.node.node_lookup(account) |
... | ... | |
302 | 302 |
def delete_account(self, user, account): |
303 | 303 |
"""Delete the account with the given name.""" |
304 | 304 |
|
305 |
logger.debug("delete_account: %s", account)
|
|
305 |
logger.debug("delete_account: %s %s", user, account)
|
|
306 | 306 |
if user != account: |
307 | 307 |
raise NotAllowedError |
308 | 308 |
node = self.node.node_lookup(account) |
... | ... | |
316 | 316 |
def list_containers(self, user, account, marker=None, limit=10000, shared=False, until=None, public=False): |
317 | 317 |
"""Return a list of containers existing under an account.""" |
318 | 318 |
|
319 |
logger.debug("list_containers: %s %s %s %s %s %s", account, marker, limit, shared, until, public)
|
|
319 |
logger.debug("list_containers: %s %s %s %s %s %s %s", user, account, marker, limit, shared, until, public)
|
|
320 | 320 |
if user != account: |
321 | 321 |
if until or account not in self._allowed_accounts(user): |
322 | 322 |
raise NotAllowedError |
... | ... | |
340 | 340 |
def list_container_meta(self, user, account, container, domain, until=None): |
341 | 341 |
"""Return a list with all the container's object meta keys for the domain.""" |
342 | 342 |
|
343 |
logger.debug("list_container_meta: %s %s %s %s", account, container, domain, until)
|
|
343 |
logger.debug("list_container_meta: %s %s %s %s %s", user, account, container, domain, until)
|
|
344 | 344 |
allowed = [] |
345 | 345 |
if user != account: |
346 | 346 |
if until: |
... | ... | |
357 | 357 |
def get_container_meta(self, user, account, container, domain, until=None, include_user_defined=True): |
358 | 358 |
"""Return a dictionary with the container metadata for the domain.""" |
359 | 359 |
|
360 |
logger.debug("get_container_meta: %s %s %s %s", account, container, domain, until)
|
|
360 |
logger.debug("get_container_meta: %s %s %s %s %s", user, account, container, domain, until)
|
|
361 | 361 |
if user != account: |
362 | 362 |
if until or container not in self._allowed_containers(user, account): |
363 | 363 |
raise NotAllowedError |
... | ... | |
388 | 388 |
def update_container_meta(self, user, account, container, domain, meta, replace=False): |
389 | 389 |
"""Update the metadata associated with the container for the domain.""" |
390 | 390 |
|
391 |
logger.debug("update_container_meta: %s %s %s %s %s", account, container, domain, meta, replace)
|
|
391 |
logger.debug("update_container_meta: %s %s %s %s %s %s", user, account, container, domain, meta, replace)
|
|
392 | 392 |
if user != account: |
393 | 393 |
raise NotAllowedError |
394 | 394 |
path, node = self._lookup_container(account, container) |
... | ... | |
402 | 402 |
def get_container_policy(self, user, account, container): |
403 | 403 |
"""Return a dictionary with the container policy.""" |
404 | 404 |
|
405 |
logger.debug("get_container_policy: %s %s", account, container)
|
|
405 |
logger.debug("get_container_policy: %s %s %s", user, account, container)
|
|
406 | 406 |
if user != account: |
407 | 407 |
if container not in self._allowed_containers(user, account): |
408 | 408 |
raise NotAllowedError |
... | ... | |
414 | 414 |
def update_container_policy(self, user, account, container, policy, replace=False): |
415 | 415 |
"""Update the policy associated with the container.""" |
416 | 416 |
|
417 |
logger.debug("update_container_policy: %s %s %s %s", account, container, policy, replace)
|
|
417 |
logger.debug("update_container_policy: %s %s %s %s %s", user, account, container, policy, replace)
|
|
418 | 418 |
if user != account: |
419 | 419 |
raise NotAllowedError |
420 | 420 |
path, node = self._lookup_container(account, container) |
... | ... | |
425 | 425 |
def put_container(self, user, account, container, policy={}): |
426 | 426 |
"""Create a new container with the given name.""" |
427 | 427 |
|
428 |
logger.debug("put_container: %s %s %s", account, container, policy)
|
|
428 |
logger.debug("put_container: %s %s %s %s", user, account, container, policy)
|
|
429 | 429 |
if user != account: |
430 | 430 |
raise NotAllowedError |
431 | 431 |
try: |
... | ... | |
441 | 441 |
self._put_policy(node, policy, True) |
442 | 442 |
|
443 | 443 |
@backend_method |
444 |
def delete_container(self, user, account, container, until=None): |
|
444 |
def delete_container(self, user, account, container, until=None, prefix='', delimiter=None):
|
|
445 | 445 |
"""Delete/purge the container with the given name.""" |
446 | 446 |
|
447 |
logger.debug("delete_container: %s %s %s", account, container, until)
|
|
447 |
logger.debug("delete_container: %s %s %s %s %s %s", user, account, container, until, prefix, delimiter)
|
|
448 | 448 |
if user != account: |
449 | 449 |
raise NotAllowedError |
450 | 450 |
path, node = self._lookup_container(account, container) |
... | ... | |
499 | 499 |
def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None, size_range=None, public=False): |
500 | 500 |
"""Return a list of object (name, version_id) tuples existing under a container.""" |
501 | 501 |
|
502 |
logger.debug("list_objects: %s %s %s %s %s %s %s %s %s %s %s %s %s", account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, public)
|
|
502 |
logger.debug("list_objects: %s %s %s %s %s %s %s %s %s %s %s %s %s %s", user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, public)
|
|
503 | 503 |
return self._list_objects(user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, False, public) |
504 | 504 |
|
505 | 505 |
@backend_method |
506 | 506 |
def list_object_meta(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None, size_range=None, public=False): |
507 | 507 |
"""Return a list of object metadata dicts existing under a container.""" |
508 | 508 |
|
509 |
logger.debug("list_object_meta: %s %s %s %s %s %s %s %s %s %s %s %s %s", account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, public)
|
|
509 |
logger.debug("list_object_meta: %s %s %s %s %s %s %s %s %s %s %s %s %s %s", user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, public)
|
|
510 | 510 |
props = self._list_objects(user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, True, public) |
511 | 511 |
objects = [] |
512 | 512 |
for p in props: |
... | ... | |
529 | 529 |
def list_object_permissions(self, user, account, container, prefix=''): |
530 | 530 |
"""Return a list of paths that enforce permissions under a container.""" |
531 | 531 |
|
532 |
logger.debug("list_object_permissions: %s %s %s", account, container, prefix)
|
|
532 |
logger.debug("list_object_permissions: %s %s %s %s", user, account, container, prefix)
|
|
533 | 533 |
return self._list_object_permissions(user, account, container, prefix, True, False) |
534 | 534 |
|
535 | 535 |
@backend_method |
536 | 536 |
def list_object_public(self, user, account, container, prefix=''): |
537 | 537 |
"""Return a dict mapping paths to public ids for objects that are public under a container.""" |
538 | 538 |
|
539 |
logger.debug("list_object_public: %s %s %s", account, container, prefix)
|
|
539 |
logger.debug("list_object_public: %s %s %s %s", user, account, container, prefix)
|
|
540 | 540 |
public = {} |
541 | 541 |
for path, p in self.permissions.public_list('/'.join((account, container, prefix))): |
542 | 542 |
public[path] = p + ULTIMATE_ANSWER |
... | ... | |
546 | 546 |
def get_object_meta(self, user, account, container, name, domain, version=None, include_user_defined=True): |
547 | 547 |
"""Return a dictionary with the object metadata for the domain.""" |
548 | 548 |
|
549 |
logger.debug("get_object_meta: %s %s %s %s %s", account, container, name, domain, version)
|
|
549 |
logger.debug("get_object_meta: %s %s %s %s %s %s", user, account, container, name, domain, version)
|
|
550 | 550 |
self._can_read(user, account, container, name) |
551 | 551 |
path, node = self._lookup_object(account, container, name) |
552 | 552 |
props = self._get_version(node, version) |
... | ... | |
580 | 580 |
def update_object_meta(self, user, account, container, name, domain, meta, replace=False): |
581 | 581 |
"""Update the metadata associated with the object for the domain and return the new version.""" |
582 | 582 |
|
583 |
logger.debug("update_object_meta: %s %s %s %s %s %s", account, container, name, domain, meta, replace)
|
|
583 |
logger.debug("update_object_meta: %s %s %s %s %s %s %s", user, account, container, name, domain, meta, replace)
|
|
584 | 584 |
self._can_write(user, account, container, name) |
585 | 585 |
path, node = self._lookup_object(account, container, name) |
586 | 586 |
src_version_id, dest_version_id = self._put_metadata(user, node, domain, meta, replace) |
... | ... | |
593 | 593 |
from which the object gets its permissions from, |
594 | 594 |
along with a dictionary containing the permissions.""" |
595 | 595 |
|
596 |
logger.debug("get_object_permissions: %s %s %s", account, container, name)
|
|
596 |
logger.debug("get_object_permissions: %s %s %s %s", user, account, container, name)
|
|
597 | 597 |
allowed = 'write' |
598 | 598 |
permissions_path = self._get_permissions_path(account, container, name) |
599 | 599 |
if user != account: |
... | ... | |
610 | 610 |
def update_object_permissions(self, user, account, container, name, permissions): |
611 | 611 |
"""Update the permissions associated with the object.""" |
612 | 612 |
|
613 |
logger.debug("update_object_permissions: %s %s %s %s", account, container, name, permissions)
|
|
613 |
logger.debug("update_object_permissions: %s %s %s %s %s", user, account, container, name, permissions)
|
|
614 | 614 |
if user != account: |
615 | 615 |
raise NotAllowedError |
616 | 616 |
path = self._lookup_object(account, container, name)[0] |
... | ... | |
622 | 622 |
def get_object_public(self, user, account, container, name): |
623 | 623 |
"""Return the public id of the object if applicable.""" |
624 | 624 |
|
625 |
logger.debug("get_object_public: %s %s %s", account, container, name)
|
|
625 |
logger.debug("get_object_public: %s %s %s %s", user, account, container, name)
|
|
626 | 626 |
self._can_read(user, account, container, name) |
627 | 627 |
path = self._lookup_object(account, container, name)[0] |
628 | 628 |
p = self.permissions.public_get(path) |
... | ... | |
634 | 634 |
def update_object_public(self, user, account, container, name, public): |
635 | 635 |
"""Update the public status of the object.""" |
636 | 636 |
|
637 |
logger.debug("update_object_public: %s %s %s %s", account, container, name, public)
|
|
637 |
logger.debug("update_object_public: %s %s %s %s %s", user, account, container, name, public)
|
|
638 | 638 |
self._can_write(user, account, container, name) |
639 | 639 |
path = self._lookup_object(account, container, name)[0] |
640 | 640 |
if not public: |
... | ... | |
646 | 646 |
def get_object_hashmap(self, user, account, container, name, version=None): |
647 | 647 |
"""Return the object's size and a list with partial hashes.""" |
648 | 648 |
|
649 |
logger.debug("get_object_hashmap: %s %s %s %s", account, container, name, version)
|
|
649 |
logger.debug("get_object_hashmap: %s %s %s %s %s", user, account, container, name, version)
|
|
650 | 650 |
self._can_read(user, account, container, name) |
651 | 651 |
path, node = self._lookup_object(account, container, name) |
652 | 652 |
props = self._get_version(node, version) |
... | ... | |
694 | 694 |
def update_object_hashmap(self, user, account, container, name, size, type, hashmap, checksum, domain, meta={}, replace_meta=False, permissions=None): |
695 | 695 |
"""Create/update an object with the specified size and partial hashes.""" |
696 | 696 |
|
697 |
logger.debug("update_object_hashmap: %s %s %s %s %s %s %s", account, container, name, size, type, hashmap, checksum)
|
|
697 |
logger.debug("update_object_hashmap: %s %s %s %s %s %s %s %s", user, account, container, name, size, type, hashmap, checksum)
|
|
698 | 698 |
if size == 0: # No such thing as an empty hashmap. |
699 | 699 |
hashmap = [self.put_block('')] |
700 | 700 |
map = HashMap(self.block_size, self.hash_algorithm) |
... | ... | |
714 | 714 |
def update_object_checksum(self, user, account, container, name, version, checksum): |
715 | 715 |
"""Update an object's checksum.""" |
716 | 716 |
|
717 |
logger.debug("update_object_checksum: %s %s %s %s %s", account, container, name, version, checksum)
|
|
717 |
logger.debug("update_object_checksum: %s %s %s %s %s %s", user, account, container, name, version, checksum)
|
|
718 | 718 |
# Update objects with greater version and same hashmap and size (fix metadata updates). |
719 | 719 |
self._can_write(user, account, container, name) |
720 | 720 |
path, node = self._lookup_object(account, container, name) |
... | ... | |
741 | 741 |
def copy_object(self, user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta={}, replace_meta=False, permissions=None, src_version=None): |
742 | 742 |
"""Copy an object's data and metadata.""" |
743 | 743 |
|
744 |
logger.debug("copy_object: %s %s %s %s %s %s %s %s %s %s %s %s", src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta, replace_meta, permissions, src_version)
|
|
744 |
logger.debug("copy_object: %s %s %s %s %s %s %s %s %s %s %s %s %s", user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta, replace_meta, permissions, src_version)
|
|
745 | 745 |
dest_version_id = self._copy_object(user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta, replace_meta, permissions, src_version, False) |
746 | 746 |
return dest_version_id |
747 | 747 |
|
... | ... | |
749 | 749 |
def move_object(self, user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta={}, replace_meta=False, permissions=None): |
750 | 750 |
"""Move an object's data and metadata.""" |
751 | 751 |
|
752 |
logger.debug("move_object: %s %s %s %s %s %s %s %s %s %s %s", src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta, replace_meta, permissions)
|
|
752 |
logger.debug("move_object: %s %s %s %s %s %s %s %s %s %s %s %s", user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta, replace_meta, permissions)
|
|
753 | 753 |
if user != src_account: |
754 | 754 |
raise NotAllowedError |
755 | 755 |
dest_version_id = self._copy_object(user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta, replace_meta, permissions, None, True) |
... | ... | |
757 | 757 |
self._delete_object(user, src_account, src_container, src_name) |
758 | 758 |
return dest_version_id |
759 | 759 |
|
760 |
def _delete_object(self, user, account, container, name, until=None): |
|
760 |
def _delete_object(self, user, account, container, name, until=None, prefix='', delimiter=None):
|
|
761 | 761 |
if user != account: |
762 | 762 |
raise NotAllowedError |
763 | 763 |
|
... | ... | |
793 | 793 |
self.permissions.access_clear(path) |
794 | 794 |
|
795 | 795 |
@backend_method |
796 |
def delete_object(self, user, account, container, name, until=None):
|
|
796 |
def (self, user, account, container, name, until=None, prefix='', delimiter=None):
|
|
797 | 797 |
"""Delete/purge an object.""" |
798 | 798 |
|
799 |
logger.debug("delete_object: %s %s %s %s", account, container, name, until)
|
|
799 |
logger.debug("delete_object: %s %s %s %s %s %s %s", user, account, container, name, until, prefix, delimiter)
|
|
800 | 800 |
self._delete_object(user, account, container, name, until) |
801 | 801 |
|
802 | 802 |
@backend_method |
803 | 803 |
def list_versions(self, user, account, container, name): |
804 | 804 |
"""Return a list of all (version, version_timestamp) tuples for an object.""" |
805 | 805 |
|
806 |
logger.debug("list_versions: %s %s %s", account, container, name)
|
|
806 |
logger.debug("list_versions: %s %s %s %s", user, account, container, name)
|
|
807 | 807 |
self._can_read(user, account, container, name) |
808 | 808 |
path, node = self._lookup_object(account, container, name) |
809 | 809 |
versions = self.node.node_get_versions(node) |
... | ... | |
813 | 813 |
def get_uuid(self, user, uuid): |
814 | 814 |
"""Return the (account, container, name) for the UUID given.""" |
815 | 815 |
|
816 |
logger.debug("get_uuid: %s", uuid)
|
|
816 |
logger.debug("get_uuid: %s %s", user, uuid)
|
|
817 | 817 |
info = self.node.latest_uuid(uuid) |
818 | 818 |
if info is None: |
819 | 819 |
raise NameError |
... | ... | |
826 | 826 |
def get_public(self, user, public): |
827 | 827 |
"""Return the (account, container, name) for the public id given.""" |
828 | 828 |
|
829 |
logger.debug("get_public: %s", public)
|
|
829 |
logger.debug("get_public: %s %s", user, public)
|
|
830 | 830 |
if public is None or public < ULTIMATE_ANSWER: |
831 | 831 |
raise NameError |
832 | 832 |
path = self.permissions.public_path(public - ULTIMATE_ANSWER) |
Also available in: Unified diff