diff --git a/scripts/gnt-backup b/scripts/gnt-backup index 112ed7506a64cc20c0c713bfe5238bc74cd77907..b32f109ca0dbaa78dd3acf73a0574629204b81c5 100755 --- a/scripts/gnt-backup +++ b/scripts/gnt-backup @@ -29,6 +29,8 @@ from optparse import make_option from ganeti.cli import * from ganeti import opcodes from ganeti import constants +from ganeti import errors +from ganeti import utils _VALUE_TRUE = "true" @@ -94,17 +96,58 @@ def ImportInstance(opts, args): if opts.hypervisor: hypervisor, hvparams = opts.hypervisor + if opts.nics: + try: + nic_max = max(int(nidx[0])+1 for nidx in opts.nics) + except ValueError, err: + raise errors.OpPrereqError("Invalid NIC index passed: %s" % str(err)) + nics = [{}] * nic_max + for nidx, ndict in opts.nics.items(): + nidx = int(nidx) + nics[nidx] = ndict + elif opts.no_nics: + # no nics + nics = [] + else: + # default of one nic, all auto + nics = [{}] + + if opts.disk_template == constants.DT_DISKLESS: + if opts.disks: + raise errors.OpPrereqError("Diskless instance but disk" + " information passed") + disks = [] + else: + if not opts.disks: + raise errors.OpPrereqError("No disk information specified") + try: + disk_max = max(int(didx[0])+1 for didx in opts.disks) + except ValueError, err: + raise errors.OpPrereqError("Invalid disk index passed: %s" % str(err)) + disks = [{}] * disk_max + for didx, ddict in opts.disks: + didx = int(didx) + if "size" not in ddict: + raise errors.OpPrereqError("Missing size for disk %d" % didx) + try: + ddict["size"] = utils.ParseUnit(ddict["size"]) + except ValueError, err: + raise errors.OpPrereqError("Invalid disk size for disk %d: %s" % + (didx, err)) + disks[didx] = ddict + ValidateBeParams(opts.beparams) op = opcodes.OpCreateInstance(instance_name=instance, - disk_size=opts.size, swap_size=opts.swap, disk_template=opts.disk_template, + disks=disks, + nics=nics, mode=constants.INSTANCE_IMPORT, pnode=pnode, snode=snode, ip_check=opts.ip_check, - ip=opts.ip, bridge=opts.bridge, start=False, + start=False, src_node=opts.src_node, src_path=opts.src_dir, - wait_for_sync=opts.wait_for_sync, mac=opts.mac, + wait_for_sync=opts.wait_for_sync, file_storage_dir=opts.file_storage_dir, file_driver=opts.file_driver, iallocator=opts.iallocator, @@ -140,28 +183,24 @@ import_opts = [ make_option("-n", "--node", dest="node", help="Target node and optional secondary node", metavar="<pnode>[:<snode>]"), - cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless" - " a suffix is used", - default=20 * 1024, type="unit", metavar="<size>"), - cli_option("--swap-size", dest="swap", help="Swap size", - default=4 * 1024, type="unit", metavar="<size>"), keyval_option("-B", "--backend", dest="beparams", type="keyval", default={}, help="Backend parameters"), make_option("-t", "--disk-template", dest="disk_template", help="Custom disk setup (diskless, file, plain, drbd)", default=None, metavar="TEMPL"), - make_option("-i", "--ip", dest="ip", - help="IP address ('none' [default], 'auto', or specify address)", - default='none', type="string", metavar="<ADDRESS>"), + ikv_option("--disk", help="Disk information", + default=[], dest="disks", + action="append", + type="identkeyval"), + ikv_option("--net", help="NIC information", + default=[], dest="nics", + action="append", + type="identkeyval"), + make_option("--no-nics", default=False, action="store_true", + help="Do not create any network cards for the instance"), make_option("--no-wait-for-sync", dest="wait_for_sync", default=True, action="store_false", help="Don't wait for sync (DANGEROUS!)"), - make_option("-b", "--bridge", dest="bridge", - help="Bridge to connect this instance to", - default=None, metavar="<bridge>"), - make_option("--mac", dest="mac", - help="MAC address ('auto' [default], or specify address)", - default='auto', type="string", metavar="<MACADDRESS>"), make_option("--src-node", dest="src_node", help="Source node", metavar="<node>"), make_option("--src-dir", dest="src_dir", help="Source directory",