Test htsworkflow under several different django & python versions
[htsworkflow.git] / pgmigration
1 #!/usr/bin/python
2 """Migrate from sqlite to postgresql
3 """
4 import argparse
5 import logging
6 import os
7 import tempfile
8 from subprocess import check_call, call
9
10 logger = logging.getLogger('pgmigrate')
11
12 if not 'DJANGO_SETTINGS_MODULE' in os.environ:
13     os.environ['DJANGO_SETTINGS_MODULE'] = 'htsworkflow.settings.felcat'
14
15 import django
16 from django.conf import settings
17 from django.core import management
18
19 def main(cmdline=None):
20     parser = make_parser()
21     args = parser.parse_args(cmdline)
22
23     level = logging.WARN
24     if args.debug:
25         level = logging.DEBUG
26     elif args.verbose:
27         level = logging.INFO
28     logging.basicConfig(level=level)
29         
30         
31     # needed for django 1.7
32     django.setup()
33
34     kinit()
35     recreate_database()
36     move_app_data('contenttypes')
37     move_app_data('auth')
38     move_app_data('admin')
39
40     move_app_data('eland_config')
41     move_app_data('samples')
42     move_app_data('experiments')
43     move_app_data('bcmagic')
44     move_app_data('inventory')
45     move_app_data('labels')
46
47 def make_parser():
48     parser = argparse.ArgumentParser()
49     parser.add_argument('-v', '--verbose', action='store_true',
50                         help='turn on info messages level')
51     parser.add_argument('-d', '--debug', action='store_true',
52                         help='turn on debug level messages')
53     return parser
54
55 def kinit():
56     check_call(['kinit', '-l', '10m', 
57                 '-k', '-t', '/var/htsworkflow/jumpgate.keytab', 
58                 'jumpgate@WOLDLAB.CALTECH.EDU'])
59
60 def recreate_database():
61     dbserver = settings.DATABASES['default']['HOST']
62     dbname = settings.DATABASES['default']['NAME']
63     dbuser = settings.DATABASES['default']['USER']
64     call(['dropdb', '-U', dbuser, '-h', dbserver, dbname])
65     check_call(['createdb', '-U', dbuser, '-h', dbserver, dbname])
66     management.call_command('migrate', noinput=True)
67     #management.call_command('syncdb', '--noinput', '--no-initial-data')
68
69 def move_app_data(appname):
70     cwd = os.getcwd()
71     tempdir = tempfile.mkdtemp(prefix='htsw-migrate-')
72     logger.info('migrate dir: %s', tempdir)
73     os.chdir(tempdir)
74     with tempfile.NamedTemporaryFile(prefix=appname+'-', suffix='.json', dir=tempdir) as f:
75         logger.info('tempfile: %s', f.name)
76         management.call_command('dumpdata', appname, database='fctracker', stdout=f)
77         f.flush()
78         dumpstat = os.stat(f.name)
79         if dumpstat.st_size > 5:
80             management.call_command('loaddata', f.name)
81         f.close()
82     os.chdir(cwd)
83     os.rmdir(tempdir)
84
85 if __name__ == "__main__":
86     main()