Statistics
| Branch: | Tag: | Revision:

root / tools / lib / transfer.py @ f546c15e

History | View | Annotate | Download (3.5 kB)

1 f390685d Sofia Papagiannaki
# Copyright 2011 GRNET S.A. All rights reserved.
2 f390685d Sofia Papagiannaki
# 
3 f390685d Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 f390685d Sofia Papagiannaki
# without modification, are permitted provided that the following
5 f390685d Sofia Papagiannaki
# conditions are met:
6 f390685d Sofia Papagiannaki
# 
7 f390685d Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 f390685d Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 f390685d Sofia Papagiannaki
#      disclaimer.
10 f390685d Sofia Papagiannaki
# 
11 f390685d Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 f390685d Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 f390685d Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 f390685d Sofia Papagiannaki
#      provided with the distribution.
15 f390685d Sofia Papagiannaki
# 
16 f390685d Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f390685d Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f390685d Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f390685d Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f390685d Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f390685d Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f390685d Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f390685d Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f390685d Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f390685d Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f390685d Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f390685d Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 f390685d Sofia Papagiannaki
# 
29 f390685d Sofia Papagiannaki
# The views and conclusions contained in the software and
30 f390685d Sofia Papagiannaki
# documentation are those of the authors and should not be
31 f390685d Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 f390685d Sofia Papagiannaki
# or implied, of GRNET S.A.
33 f390685d Sofia Papagiannaki
34 822cc7eb Antony Chazapis
import os
35 822cc7eb Antony Chazapis
36 f390685d Sofia Papagiannaki
from hashmap import HashMap
37 f390685d Sofia Papagiannaki
from binascii import hexlify, unhexlify
38 f390685d Sofia Papagiannaki
from cStringIO import StringIO
39 822cc7eb Antony Chazapis
from client import Fault
40 f390685d Sofia Papagiannaki
41 f390685d Sofia Papagiannaki
42 822cc7eb Antony Chazapis
def upload(client, file, container, prefix):
43 822cc7eb Antony Chazapis
    
44 822cc7eb Antony Chazapis
    meta = client.retrieve_container_metadata(container)
45 822cc7eb Antony Chazapis
    blocksize = int(meta['x-container-block-size'])
46 822cc7eb Antony Chazapis
    blockhash = meta['x-container-block-hash']
47 f390685d Sofia Papagiannaki
    
48 f390685d Sofia Papagiannaki
    size = os.path.getsize(file)
49 822cc7eb Antony Chazapis
    hashes = HashMap(blocksize, blockhash)
50 822cc7eb Antony Chazapis
    hashes.load(file)
51 f390685d Sofia Papagiannaki
    map = {'bytes': size, 'hashes': [hexlify(x) for x in hashes]}
52 f390685d Sofia Papagiannaki
    
53 822cc7eb Antony Chazapis
    object = prefix + os.path.split(file)[-1]
54 f390685d Sofia Papagiannaki
    try:
55 822cc7eb Antony Chazapis
        client.create_object_by_hashmap(container, object, map)
56 f390685d Sofia Papagiannaki
    except Fault, fault:
57 f390685d Sofia Papagiannaki
        if fault.status != 409:
58 f390685d Sofia Papagiannaki
            raise
59 f390685d Sofia Papagiannaki
    else:
60 f390685d Sofia Papagiannaki
        return
61 f390685d Sofia Papagiannaki
    
62 f390685d Sofia Papagiannaki
    missing = fault.data.split('\n')
63 f390685d Sofia Papagiannaki
    if '' in missing:
64 f390685d Sofia Papagiannaki
        del missing[missing.index(''):]
65 f390685d Sofia Papagiannaki
    
66 f390685d Sofia Papagiannaki
    with open(file) as fp:
67 f390685d Sofia Papagiannaki
        for hash in missing:
68 f546c15e Antony Chazapis
            offset = hashes.index(unhexlify(hash)) * blocksize
69 f390685d Sofia Papagiannaki
            fp.seek(offset)
70 f546c15e Antony Chazapis
            block = fp.read(blocksize)
71 822cc7eb Antony Chazapis
            client.create_object(container, '.upload', StringIO(block))
72 f390685d Sofia Papagiannaki
    
73 822cc7eb Antony Chazapis
    client.create_object_by_hashmap(container, object, map)
74 f546c15e Antony Chazapis
75 f546c15e Antony Chazapis
def download(client, container, object, file):
76 f546c15e Antony Chazapis
    
77 f546c15e Antony Chazapis
    meta = client.retrieve_container_metadata(container)
78 f546c15e Antony Chazapis
    blocksize = int(meta['x-container-block-size'])
79 f546c15e Antony Chazapis
    blockhash = meta['x-container-block-hash']
80 f546c15e Antony Chazapis
    
81 f546c15e Antony Chazapis
    if os.path.isfile(file):
82 f546c15e Antony Chazapis
        size = os.path.getsize(file)
83 f546c15e Antony Chazapis
        hashes = HashMap(blocksize, blockhash)
84 f546c15e Antony Chazapis
        hashes.load(file)
85 f546c15e Antony Chazapis
    else:
86 f546c15e Antony Chazapis
        size = 0
87 f546c15e Antony Chazapis
        hashes = []
88 f546c15e Antony Chazapis
    
89 f546c15e Antony Chazapis
    map = client.retrieve_object_hashmap(container, object)
90 f546c15e Antony Chazapis
    
91 f546c15e Antony Chazapis
    with open(file, 'a') as fp:
92 f546c15e Antony Chazapis
        for i, h in enumerate(map):
93 f546c15e Antony Chazapis
            if i < len(hashes) and h == hashes[i]:
94 f546c15e Antony Chazapis
                continue
95 f546c15e Antony Chazapis
            start = i * blocksize
96 f546c15e Antony Chazapis
            end = '' if i == len(map) - 1 else (i + 1) * blocksize
97 f546c15e Antony Chazapis
            data = client.retrieve_object(container, object, range='bytes=%s-%s' % (start, end))
98 f546c15e Antony Chazapis
            fp.seek(start)
99 f546c15e Antony Chazapis
            fp.write(data)