Switch to unified view

a/scripts/migrate_project_database.py b/scripts/migrate_project_database.py
...
...
10
log = logging.getLogger(__name__)
10
log = logging.getLogger(__name__)
11
11
12
MONGO_HOME=os.environ.get('MONGO_HOME', '/usr')
12
MONGO_HOME=os.environ.get('MONGO_HOME', '/usr')
13
MONGO_DUMP=os.path.join(MONGO_HOME, 'bin/mongodump')
13
MONGO_DUMP=os.path.join(MONGO_HOME, 'bin/mongodump')
14
MONGO_RESTORE=os.path.join(MONGO_HOME, 'bin/mongorestore')
14
MONGO_RESTORE=os.path.join(MONGO_HOME, 'bin/mongorestore')
15
SHARD_LENGTH=1
15
16
16
def main():
17
def main():
17
    if len(sys.argv) > 1:
18
    if len(sys.argv) > 1:
18
        shortnames = sys.argv[1:]
19
        shortnames = sys.argv[1:]
19
    else:
20
    else:
20
        shortnames = [ p.shortname for p in M.Project.query.find(dict(is_root=True)) ]
21
        shortnames = [ p.shortname for p in M.Project.query.find(dict(is_root=True)) ]
22
    databases = set(M.session.main_doc_session.db.connection.database_names())
21
    for pname in shortnames:
23
    for pname in shortnames:
24
        # This needs to be a .find() instead of a .get() because of the
25
        # __init__ projects, which have the same shortname but exist in
26
        # multiple neighborhoods.
27
        for project in M.Project.query.find(dict(shortname=pname)):
22
        migrate_project_database(pname)
28
            migrate_project_database(project, pname, databases)
23
29
24
def migrate_project_database(pname):
30
def migrate_project_database(project, pname, databases):
25
    c.project = project = M.Project.query.get(shortname=pname)
31
    c.project = project
32
    target_uri = M.Project.default_database_uri(pname)
33
    target_db = target_uri.rsplit('/')[-1]
26
    if project is None:
34
    if project is None:
27
        log.fatal('Project %s not found', pname)
35
        log.fatal('Project %s not found', pname)
28
        print 'Project %s not found' % pname
36
        print 'Project %s not found' % pname
29
        return 2
37
        return 2
30
    if project.database_uri is not None:
38
    if project.database_uri is not None:
...
...
34
    M.ProjectRole.query.update(dict(project_id=None), dict(project_id=c.project._id))
42
    M.ProjectRole.query.update(dict(project_id=None), dict(project_id=c.project._id))
35
    conn = M.session.main_doc_session.db.connection
43
    conn = M.session.main_doc_session.db.connection
36
    host = '%s:%s' % (conn.host, conn.port)
44
    host = '%s:%s' % (conn.host, conn.port)
37
    dirname = os.tempnam()
45
    dirname = os.tempnam()
38
    try:
46
    try:
47
        if c.project.database not in databases:
48
            skip=True
49
            log.warning('No db for %s, so not migrating data', pname)
50
        else:
51
            skip=False
39
        log.info('Backing up %s to %s', pname, dirname)
52
            log.info('Backing up %s to %s', pname, dirname)
40
        assert 0 == os.system('%s --host %s --db %s -o %s' % (
53
            assert 0 == os.system('%s --host %s --db %s -o %s' % (
41
                MONGO_DUMP, host, project.database, dirname))
54
                    MONGO_DUMP, host, project.database, dirname))
42
        assert 0 == os.system('%s --host %s --db project-data %s/%s ' % (
55
            assert 0 == os.system('%s --host %s --db %s %s/%s ' % (
43
                MONGO_RESTORE, host, dirname, project.database))
56
                    MONGO_RESTORE, host, target_db, dirname, project.database))
44
        database = project.database
57
        database = project.database
45
        for p in M.Project.query.find(dict(database=database)):
58
        for p in M.Project.query.find(dict(database=database)):
46
            p.database = ''
59
            p.database = ''
47
            p.database_uri = 'ming://%s/project-data' % host
60
            p.database_uri = M.Project.default_database_uri(pname)
48
        project.ensure_project_indexes()
61
        project.ensure_project_indexes()
49
        session(project).flush()
62
        session(project).flush()
63
        if not skip:
50
        conn.drop_database(database)
64
            conn.drop_database(database)
51
    finally:
65
    finally:
52
        if os.path.exists(dirname):
66
        if os.path.exists(dirname):
53
            shutil.rmtree(dirname)
67
            shutil.rmtree(dirname)
54
    return 0
68
    return 0
55
69