migrate-data 3.6 KB
Newer Older
1 2
#!/usr/bin/env python

Antony Chazapis's avatar
Antony Chazapis committed
3
# Copyright 2011-2012 GRNET S.A. All rights reserved.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
# 
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
# 
#   1. Redistributions of source code must retain the above
#      copyright notice, this list of conditions and the following
#      disclaimer.
# 
#   2. Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials
#      provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# 
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.

from binascii import hexlify

38
from sqlalchemy import Table
39 40 41 42 43
from sqlalchemy.sql import select

from pithos import settings
from pithos.backends.modular import ModularBackend

Antony Chazapis's avatar
Antony Chazapis committed
44
from pithos.tools.lib.hashmap import HashMap
45 46

from migrate import Migration, Cache
47

48 49
import os
    
50
class DataMigration(Migration):
51 52
    def __init__(self, pithosdb, db):
        Migration.__init__(self,  pithosdb)
53
        self.cache = Cache(db)
54
    
55
    def retrieve_files(self):
56
        # Loop for all available files.
57 58 59
        filebody = Table('filebody', self.metadata, autoload=True)
        s = select([filebody.c.storedfilepath])
        rp = self.conn.execute(s)
60 61 62 63
        path = rp.fetchone()
        while path:
            yield path
            path = rp.fetchone()
64
        rp.close()
65 66 67 68
    
    def execute(self):
        blocksize = self.backend.block_size
        blockhash = self.backend.hash_algorithm
69
        
70
        for (path,) in self.retrieve_files():
71
            map = HashMap(blocksize, blockhash)
72 73 74 75 76
            try:
                map.load(open(path))
            except Exception, e:
                print e
                continue
77 78
            hash = hexlify(map.hash())
            
79
            if hash != self.cache.get(path):
80 81 82 83 84 85 86 87 88 89 90 91
                missing = self.backend.blocker.block_ping(map) # XXX Backend hack...
                status = '[>] ' + path
                if missing:
                    status += ' - %d block(s) missing' % len(missing)
                    with open(path) as fp:
                        for h in missing:
                            offset = map.index(h) * blocksize
                            fp.seek(offset)
                            block = fp.read(blocksize)
                            self.backend.put_block(block)
                else:
                    status += ' - no blocks missing'
92
                self.cache.put(path, hash)
93 94 95
            else:
                status = '[-] ' + path
            print status
Antony Chazapis's avatar
Antony Chazapis committed
96

97
if __name__ == "__main__":
Sofia Papagiannaki's avatar
Sofia Papagiannaki committed
98
    pithosdb = 'postgresql://gss@127.0.0.1/pithos'
99 100
    db = 'sqlite:///migrate.db'
    
101
    dt = DataMigration(pithosdb, db)
102
    dt.execute()