X-Git-Url: https://code.grnet.gr/git/snf-image-creator/blobdiff_plain/f165adc0d7dd0816def505588dd184ed8c2d805f..e22aa3a9da0dbf00ac43fa3c5964c9688a1b6cb7:/image_creator/main.py diff --git a/image_creator/main.py b/image_creator/main.py index f2aba56..d073946 100755 --- a/image_creator/main.py +++ b/image_creator/main.py @@ -35,9 +35,10 @@ from image_creator import get_os_class from image_creator import __version__ as version +from image_creator import util from image_creator.disk import Disk from image_creator.util import get_command, error, success, output, FatalError -from image_creator import util +from image_creator.kamaki_wrapper import Kamaki import sys import os import optparse @@ -49,10 +50,10 @@ def check_writable_dir(option, opt_str, value, parser): dirname = os.path.dirname(value) name = os.path.basename(value) if dirname and not os.path.isdir(dirname): - parser.error("`%s' is not an existing directory" % dirname) + raise FatalError("`%s' is not an existing directory" % dirname) if not name: - parser.error("`%s' is not a valid file name" % dirname) + raise FatalError("`%s' is not a valid file name" % dirname) setattr(parser.values, option.dest, value) @@ -61,39 +62,56 @@ def parse_options(input_args): usage = "Usage: %prog [options] " parser = optparse.OptionParser(version=version, usage=usage) + account = os.environ["OKEANOS_USER"] if "OKEANOS_USER" in os.environ \ + else None + token = os.environ["OKEANOS_TOKEN"] if "OKEANOS_TOKEN" in os.environ \ + else None + + parser.add_option("-o", "--outfile", type="string", dest="outfile", + default=None, action="callback", callback=check_writable_dir, + help="dump image to FILE", metavar="FILE") + parser.add_option("-f", "--force", dest="force", default=False, action="store_true", help="overwrite output files if they exist") - parser.add_option("--no-sysprep", dest="sysprep", default=True, - help="don't perform system preperation", action="store_false") + parser.add_option("-s", "--silent", dest="silent", default=False, + help="silent mode, only output errors", action="store_true") - parser.add_option("--no-shrink", dest="shrink", default=True, - help="don't shrink any partition", action="store_false") + parser.add_option("-u", "--upload", dest="upload", type="string", + default=False, help="upload the image to pithos with name FILENAME", + metavar="FILENAME") - parser.add_option("-o", "--outfile", type="string", dest="outfile", - default=None, action="callback", callback=check_writable_dir, - help="dump image to FILE", metavar="FILE") + parser.add_option("-r", "--register", dest="register", type="string", + default=False, help="register the image to ~okeanos as IMAGENAME", + metavar="IMAGENAME") + + parser.add_option("-a", "--account", dest="account", type="string", + default=account, + help="Use this ACCOUNT when uploading/registring images [Default: %s]"\ + % account) + + parser.add_option("-t", "--token", dest="token", type="string", + default=token, + help="Use this token when uploading/registring images [Default: %s]"\ + % token) + + parser.add_option("--print-sysprep", dest="print_sysprep", default=False, + help="print the enabled and disabled system preparation operations " + "for this input media", action="store_true") parser.add_option("--enable-sysprep", dest="enabled_syspreps", default=[], - help="Run SYSPREP operation on the input media", + help="run SYSPREP operation on the input media", action="append", metavar="SYSPREP") parser.add_option("--disable-sysprep", dest="disabled_syspreps", - help="Prevent SYSPREP operation from running on the input media", + help="prevent SYSPREP operation from running on the input media", default=[], action="append", metavar="SYSPREP") - parser.add_option("--print-sysprep", dest="print_sysprep", default=False, - help="Print the enabled and disabled sysprep operations for this " - "input media", action="store_true") - - parser.add_option("-s", "--silent", dest="silent", default=False, - help="silent mode, only output errors", action="store_true") - - parser.add_option("-u", "--upload", dest="upload", default=False, - help="upload the image to pithos", action="store_true") + parser.add_option("--no-sysprep", dest="sysprep", default=True, + help="don't perform system preperation", action="store_false") - parser.add_option("-r", "--register", dest="register", default=False, - help="register the image to ~okeanos", action="store_true") + parser.add_option("--no-shrink", dest="shrink", default=True, + help="don't shrink any partition", action="store_false") options, args = parser.parse_args(input_args) @@ -101,10 +119,18 @@ def parse_options(input_args): parser.error('Wrong number of arguments') options.source = args[0] if not os.path.exists(options.source): - parser.error('input media is not accessible') + raise FatalError("Input media `%s' is not accessible" % options.source) + + if options.register and options.upload == False: + raise FatalError("You also need to set -u when -r option is set") + + if options.upload and options.account is None: + raise FatalError("Image uploading cannot be performed. No ~okeanos " + "account name is specified. Use -a to set an account name.") - if options.register: - options.upload = True + if options.upload and options.token is None: + raise FatalError("Image uploading cannot be performed. No ~okeanos " + "token is specified. User -t to set a token.") return options @@ -135,7 +161,9 @@ def image_creator(): disk = Disk(options.source) try: - dev = disk.get_device() + snapshot = disk.snapshot() + + dev = disk.get_device(snapshot) dev.mount() osclass = get_os_class(dev.distro, dev.ostype) @@ -174,6 +202,16 @@ def image_creator(): f.close() dev.dump(options.outfile) + + # Destroy the device. We only need the snapshot from now on + disk.destroy_device(dev) + + if options.upload: + output("Uploading image to pithos...", False) + kamaki = Kamaki(options.account, options.token) + kamaki.upload(snapshot, size, options.upload) + output("done") + finally: output('cleaning up...') disk.cleanup()