Switch to unified view

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