X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-images.git/blobdiff_plain/19c32ff14f08ddcb9826c7738ad0163a5c9a6b39..refs/heads/quentin:/invirt-images diff --git a/invirt-images b/invirt-images index 1566cc6..ec79d52 100755 --- a/invirt-images +++ b/invirt-images @@ -2,6 +2,7 @@ from invirt import database import os +import sys import subprocess import random import string @@ -40,19 +41,42 @@ def lvcreate(name, size): return 6 def lvrename(dest, src): - lvr = subprocess.Popen(['lvrename', 'xenvg', src, dest], + lvr = subprocess.Popen(['lvchange', '-an', "xenvg/%s" % (src,)], stderr=subprocess.PIPE, stdout=getOutput()['stdout']) ret = lvr.wait() - if not ret: - return 0 - stderr = lvr.stderr.read() - if 'not found in volume group' in stderr: - return 0 - else: + + if ret: + stderr = lvr.stderr.read() + if 'not found' in stderr: + return 0 + if verbosity > 0: + print stderr + return ret + + lvr = subprocess.Popen(['lvrename', "xenvg/%s" % (src,), "xenvg/%s" % (dest,)], + stderr=subprocess.PIPE, + stdout=getOutput()['stdout']) + ret = lvr.wait() + + if ret: + stderr = lvr.stderr.read() + if not ('not found in volume group' in stderr): + if verbosity > 0: + print stderr + return ret + + subprocess.Popen(['lvchange', '-ay', "xenvg/%s" % (dest,)], + stderr=subprocess.PIPE, + stdout=getOutput()['stdout']) + ret = lvr.wait() + + if ret: if verbosity > 0: - print stderr - return ret + print lvr.stderr.read() + + return ret + def lv_random(func, pattern, *args): """ @@ -109,6 +133,8 @@ def fetch_image(cdrom): """ full_uri = os.path.join(cdrom.mirror.uri_prefix, cdrom.uri_suffix) temp_file = tempfile.mkstemp()[1] + if verbosity > 0: + print >>sys.stderr, "Fetching image %s from %s to %s" % (cdrom.cdrom_id, full_uri, temp_file) try: if full_uri.startswith('rsync://'): if subprocess.call(['rsync', '--no-motd', '-tLP', full_uri, temp_file], @@ -139,9 +165,18 @@ def load_image(cdrom): """ if cdrom.mirror_id is None: return - temp_file = fetch_image(cdrom) try: - cdrom_size = '%sM' % math.ceil((float(os.stat(temp_file).st_size) / (1024 * 1024))) + temp_file = fetch_image(cdrom) + except InvirtImageException, e: + print >>sys.stderr, 'ERROR: %s. Skipping.' % e + return + + try: + st_size = os.stat(temp_file).st_size + if not st_size: + print >>sys.stderr, "Failed to fetch %s" % cdrom.cdrom_id + return + cdrom_size = '%sM' % math.ceil((float(st_size) / (1024 * 1024))) new_lv = lvcreate_random('image-new_%s_%%s' % cdrom.cdrom_id, cdrom_size) copy_file(temp_file, '/dev/xenvg/%s' % new_lv) lvrename_random('image_%s' % cdrom.cdrom_id, 'image-old_%s_%%s' % cdrom.cdrom_id) @@ -179,7 +214,8 @@ def main(): global verbosity database.connect() - + database.session.begin() + usage = """%prog [options] --add [--cdrom] cdrom_id description mirror_id uri_suffix %prog [options] --add --mirror mirror_id uri_prefix @@ -231,8 +267,8 @@ def main(): attrs = dict(zip(('cdrom_id', 'description', 'mirror_id', 'uri_suffix'), args)) cdrom = database.CDROM(**attrs) - database.session.save(cdrom) - database.session.flush() + database.session.add(cdrom) + database.session.commit() load_image(cdrom) @@ -240,13 +276,13 @@ def main(): attrs = dict(zip(('mirror_id', 'uri_prefix'), args)) mirror = database.Mirror(**attrs) - database.session.save(mirror) - database.session.flush() + database.session.add(mirror) + database.session.commit() elif options.action == 'update': if len(args) > 0: - images = [database.CDROM.query().get(arg) for arg in args] + images = [database.CDROM.query.get(arg) for arg in args] else: - images = database.CDROM.query().all() + images = database.CDROM.query.all() for cdrom in images: if cdrom is not None: load_image(cdrom)