--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devtools/migrtest.py Wed Nov 05 15:52:50 2008 +0100
@@ -0,0 +1,152 @@
+"""Migration test script
+
+* migration will be played into a chroot of the local machine
+* the database server used can be configured
+* test tested instance may be on another host
+
+
+We are using postgres'.pgpass file. Here is a copy of postgres documentation
+about that:
+
+The file .pgpass in a user's home directory or the file referenced by
+PGPASSFILE can contain passwords to be used if the connection requires
+a password (and no password has been specified otherwise).
+
+
+This file should contain lines of the following format:
+
+hostname:port:database:username:password
+
+Each of the first four fields may be a literal value, or *, which
+matches anything. The password field from the first line that matches
+the current connection parameters will be used. (Therefore, put
+more-specific entries first when you are using wildcards.) If an entry
+needs to contain : or \, escape this character with \. A hostname of
+localhost matches both host (TCP) and local (Unix domain socket)
+connections coming from the local machine.
+
+The permissions on .pgpass must disallow any access to world or group;
+achieve this by the command chmod 0600 ~/.pgpass. If the permissions
+are less strict than this, the file will be ignored.
+
+:organization: Logilab
+:copyright: 2001-2006 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
+"""
+__docformat__ = "restructuredtext en"
+
+from os import system
+from os.path import join, basename
+
+from logilab.common.shellutils import cp, rm
+
+from cubicweb.toolsutils import read_config
+from cubicweb.server.serverctl import generate_sources_file
+
+# XXXX use db-copy instead
+
+# test environment configuration
+chrootpath = '/sandbox/cubicwebtest'
+tmpdbhost = 'crater'
+tmpdbuser = 'syt'
+tmpdbpasswd = 'syt'
+
+def play_migration(applhome, applhost='', sudo=False):
+ applid = dbname = basename(applhome)
+ testapplhome = join(chrootpath, applhome)
+ # copy instance into the chroot
+ if applhost:
+ system('scp -r %s:%s %s' % (applhost, applhome, testapplhome))
+ else:
+ cp(applhome, testapplhome)
+## # extract db parameters
+## sources = read_config(join(testapplhome, 'sources'))
+## dbname = sources['system']['db-name']
+## dbhost = sources['system'].get('db-host') or ''
+## dbuser = sources['system'].get('db-user') or ''
+## dbpasswd = sources['system'].get('db-password') or ''
+ # generate sources file
+ # XXX multisources
+ sources = {'system': {}}
+ sources['system']['db-encoding'] = 'UTF8' # XXX
+ sources['system']['db-name'] = dbname
+ sources['system']['db-host'] = None
+ sources['system']['db-user'] = tmpdbuser
+ sources['system']['db-password'] = None
+ generate_sources_file(join(testapplhome, 'sources'), sources)
+## # create postgres password file so we won't need anymore passwords
+## # XXX may exist!
+## pgpassfile = expanduser('~/.pgpass')
+## pgpass = open(pgpassfile, 'w')
+## if dbpasswd:
+## pgpass.write('%s:*:%s:%s:%s\n' % (dbhost or applhost or 'localhost',
+## dbname, dbuser, dbpasswd))
+## if tmpdbpasswd:
+## pgpass.write('%s:*:%s:%s:%s\n' % (tmpdbhost or 'localhost', dbname,
+## tmpdbuser, tmpdbpasswd))
+## pgpass.close()
+## chmod(pgpassfile, 0600)
+ # dump db
+## dumpcmd = 'pg_dump -Fc -U %s -f /tmp/%s.dump %s' % (
+## dbuser, dbname, dbname)
+## if dbhost:
+## dumpcmd += ' -h %s' % dbhost
+ dumpfile = '/tmp/%s.dump' % applid
+ dumpcmd = 'cubicweb-ctl db-dump --output=%s %s' % (dumpfile, applid)
+ if sudo:
+ dumpcmd = 'sudo %s' % dumpcmd
+ if applhost:
+ dumpcmd = 'ssh %s "%s"' % (applhost, dumpcmd)
+ if system(dumpcmd):
+ raise Exception('error while dumping the database')
+## if not dbhost and applhost:
+ if applhost:
+ # retrieve the dump
+ if system('scp %s:%s %s' % (applhost, dumpfile, dumpfile)):
+ raise Exception('error while retreiving the dump')
+ # move the dump into the chroot
+ system('mv %s %s%s' % (dumpfile, chrootpath, dumpfile))
+ # locate installed versions
+ vcconf = read_config(join(testapplhome, 'vc.conf'))
+ template = vcconf['TEMPLATE']
+ cubicwebversion = vcconf['CW']
+ templversion = vcconf['TEMPLATE_VERSION']
+ # install the same versions cubicweb and template versions into the chroot
+ system('sudo chroot %s apt-get update' % chrootpath)
+ system('sudo chroot %s apt-get install cubicweb-server=%s cubicweb-client=%s'
+ % (chrootpath, cubicwebversion, cubicwebversion))
+ system('sudo chroot %s apt-get install cubicweb-%s-appl-server=%s cubicweb-%s-appl-client=%s'
+ % (chrootpath, template, templversion, template, templversion))
+ # update and upgrade to the latest version
+ system('sudo chroot %s apt-get install cubicweb-server cubicweb-client' % chrootpath)
+ system('sudo chroot %s apt-get install cubicweb-%s-appl-server cubicweb-%s-appl-client'
+ % (chrootpath, template, template))
+ # create and fill the database
+ system('sudo chroot cubicweb-ctl db-restore %s %s' % (applid, dumpfile))
+## if not tmpdbhost:
+## system('createdb -U %s -T template0 -E UTF8 %s' % (tmpdbuser, dbname))
+## system('pg_restore -U %s -O -Fc -d %s /tmp/%s.dump'
+## % (tmpdbuser, dbname, dbname))
+## else:
+## system('createdb -h %s -U %s -T template0 -E UTF8 %s'
+## % (tmpdbhost, tmpdbuser, dbname))
+## system('pg_restore -h %s -U %s -O -Fc -d %s /tmp/%s.dump'
+## % (tmpdbhost, tmpdbuser, dbname, dbname))
+ # launch upgrade
+ system('sudo chroot %s cubicweb-ctl upgrade %s' % (chrootpath, applid))
+
+ # cleanup
+ rm(testapplhome)
+## rm(pgpassfile)
+## if tmpdbhost:
+## system('dropdb -h %s -U %s %s' % (tmpdbuser, tmpdbhost, dbname))
+## else:
+## system('dropdb -U %s %s' % (tmpdbuser, dbname))
+## if not dbhost and applhost:
+ if applhost:
+ system('ssh %s rm %s' % (applhost, dumpfile))
+ rm('%s%s' % (chrootpath, dumpfile))
+
+
+if __name__ == '__main__':
+ play_migration('/etc/cubicweb.d/jpl', 'lepus')