def migrate(src_host, src_vmid, dst_host, dst_vmid, template, ifaces): assert getState(dst_host, dst_vmid) == generic.State.CREATED, "Destination VM already exists" state = getState(src_host, src_vmid) if state == generic.State.CREATED: #nothing to do return #create a tmp directory on both hosts src_tmp = "/tmp/%s" % uuid.uuid1() dst_tmp = "/tmp/%s" % uuid.uuid1() fileutil.mkdir(src_host, src_tmp) fileutil.mkdir(dst_host, dst_tmp) #create destination vm create(dst_host, dst_vmid, template) try: #transfer vm disk image copyImage(src_host, src_vmid, "%s/disk.tar" % src_tmp) fileutil.fileTransfer(src_host, "%s/disk.tar" % src_tmp, dst_host, "%s/disk.tar" % dst_tmp, compressed=True) if state == generic.State.STARTED: #prepare rdiff before snapshot to save time src_host.execute("rdiff signature %(tmp)s/disk.tar %(tmp)s/rdiff.sigs" % {"tmp": src_tmp}) #create a memory snapshot on old host res = _vzctl(src_host, src_vmid, "chkpnt", ["--dumpfile", "%s/openvz.dump" % src_tmp]) assert fileutil.existsFile(src_host, "%s/openvz.dump" % src_tmp), "Failed to create snapshot: %s" % res try: fileutil.fileTransfer(src_host, "%s/openvz.dump" % src_tmp, dst_host, "%s/openvz.dump" % dst_tmp, compressed=True) #create and transfer a disk image rdiff copyImage(src_host, src_vmid, "%s/disk2.tar" % src_tmp) src_host.execute("rdiff -- delta %(tmp)s/rdiff.sigs %(disk)s - | gzip > %(tmp)s/disk.rdiff.gz" % {"tmp": src_tmp, "disk": "%s/disk2.tar" % src_tmp}) fileutil.fileTransfer(src_host, "%s/disk.rdiff.gz" % src_tmp, dst_host, "%s/disk.rdiff.gz" % dst_tmp, direct=True) #patch disk image with the rdiff dst_host.execute("gunzip < %(tmp)s/disk.rdiff.gz | rdiff -- patch %(tmp)s/disk.tar - %(tmp)s/disk-patched.tar" % {"tmp": dst_tmp}) fileutil.move(dst_host,"%s/disk-patched.tar" % dst_tmp, "%s/disk.tar" % dst_tmp) except: _vzctl(src_host, src_vmid, "restore", ["--dumpfile", "%s/openvz.dump" % src_tmp]) raise #use disk image on new host useImage(dst_host, dst_vmid, "%s/disk.tar" % dst_tmp) for iface in ifaces: addInterface(dst_host, dst_vmid, iface) if state == generic.State.STARTED: try: #restore snapshot _vzctl(dst_host, dst_vmid, "restore", ["--dumpfile", "%s/openvz.dump" % dst_tmp]) assert getState(dst_host, dst_vmid) == generic.State.STARTED except: _vzctl(src_host, src_vmid, "restore", ["--dumpfile", "%s/openvz.dump" % src_tmp]) raise except: destroy(dst_host, dst_vmid) fileutil.delete(src_host, src_tmp, recursive=True) fileutil.delete(dst_host, dst_tmp, recursive=True) raise #destroy vm on old host destroy(src_host, src_vmid) #remove tmp directories fileutil.delete(src_host, src_tmp, recursive=True) fileutil.delete(dst_host, dst_tmp, recursive=True)
def useImage(host, vmid, image, move=False): assert fileutil.existsFile(host, image), "Image file does not exist" assert getState(host, vmid) == generic.State.PREPARED, "VM must be stopped to change image" _qm(host, vmid, "set", "--ide0 undef") imagePath = _imagePath(vmid) fileutil.mkdir(host, _imagePathDir(vmid)) if move: fileutil.move(host, image, imagePath) else: fileutil.copy(host, image, imagePath) fileutil.chown(host, imagePath, "root:root") _qm(host, vmid, "set", "--ide0=local:%s/disk.qcow2" % vmid) assert fileutil.existsFile(host, imagePath)
def migrate(src_host, src_vmid, dst_host, dst_vmid, ifaces): assert getState(dst_host, dst_vmid) == generic.State.CREATED, "Destination VM already exists" state = getState(src_host, src_vmid) if state == generic.State.CREATED: #nothing to do return #create a tmp directory on both hosts src_tmp = "/tmp/%s" % uuid.uuid1() dst_tmp = "/tmp/%s" % uuid.uuid1() fileutil.mkdir(src_host, src_tmp) fileutil.mkdir(dst_host, dst_tmp) #create destination vm create(dst_host, dst_vmid) #transfer vm disk image fileutil.copy(src_host, _imagePath(src_vmid), "%s/disk.qcow2" % src_tmp) fileutil.fileTransfer(src_host, "%s/disk.qcow2" % src_tmp, dst_host, "%s/disk.qcow2" % dst_tmp, direct=True) if state == generic.State.STARTED: #prepare rdiff before snapshot to save time src_host.execute("rdiff signature %(tmp)s/disk.qcow2 %(tmp)s/rdiff.sigs" % {"tmp": src_tmp}) #create a memory snapshot on old host _monitor(src_host, src_vmid, "stop") _monitor(src_host, src_vmid, "savevm migrate", timeout=900) #stop vm stop(src_host, src_vmid) #create and transfer a disk image rdiff src_host.execute("rdiff -- delta %(tmp)s/rdiff.sigs %(disk)s - | gzip > %(tmp)s/disk.rdiff.gz" % {"tmp": src_tmp, "disk": _imagePath(src_vmid)}) fileutil.fileTransfer(src_host, "%s/disk.rdiff.gz" % src_tmp, dst_host, "%s/disk.rdiff.gz" % dst_tmp) #patch disk image with the rdiff dst_host.execute("gunzip < %(tmp)s/disk.rdiff.gz | rdiff -- patch %(tmp)s/disk.qcow2 - %(tmp)s/disk-patched.qcow2" % {"tmp": dst_tmp}) fileutil.move(dst_host,"%s/disk-patched.qcow2" % dst_tmp, "%s/disk.qcow2" % dst_tmp) #use disk image on new host useImage(dst_host, dst_vmid, "%s/disk.qcow2" % dst_tmp) for iface in ifaces: addInterface(dst_host, dst_vmid, iface) if state == generic.State.STARTED: start(dst_host, dst_vmid) #restore snapshot _monitor(dst_host, dst_vmid, "stop") _monitor(dst_host, dst_vmid, "loadvm migrate", timeout=900) _monitor(dst_host, dst_vmid, "cont") _monitor(dst_host, dst_vmid, "delvm migrate", timeout=900) #destroy vm on old host destroy(src_host, src_vmid) #remove tmp directories fileutil.delete(src_host, src_tmp, recursive=True) fileutil.delete(dst_host, dst_tmp, recursive=True)
else: with zipfile.ZipFile(filename) as f: f.extractall(ampl_demo_dir) shutil.copy('ampl.lic', ampl_demo_dir) basename = 'ampl-demo-' + system package(basename, archive_format, package_dir) # Prepare the IDE demo package. amplide_demo_dir = os.path.join(package_dir, 'amplide-demo') amplide_url = 'http://www.ampl.com/dl/IDE/amplide.' + sys2ide[system] amplide = retrieve_cached(amplide_url) iszip = amplide_url.endswith('zip') archive_open = zipfile.ZipFile if iszip else tarfile.open with archive_open(amplide) as archive: archive.extractall(package_dir) shutil.move(os.path.join(package_dir, 'amplide'), amplide_demo_dir) shutil.move(ampl_demo_dir, os.path.join(amplide_demo_dir, 'ampl')) basename = 'amplide-demo-' + system package(basename, archive_format, package_dir) shutil.rmtree(amplide_demo_dir) finally: shutil.rmtree(workdir) # Move packages to the server. if args['update']: demo_dir = '/var/www/dl/demo' for system in ['linux32', 'linux64', 'macosx', 'mswin']: ext = '.zip' if system == 'mswin' else '.tar.gz' fileutil.move('ampl-demo-' + system + ext, demo_dir) fileutil.move('amplide-demo-' + system + ext, demo_dir)
path = os.path.join('licenses', package.license) zip.write(path, package.license) if package.is_open: paths.add(path) # Careate a full package. with zipfile.ZipFile(get_archive_name(system), 'w', zipfile.ZIP_DEFLATED) as zip: for path in paths: zip.write(path, os.path.join('ampl-open', os.path.basename(path))) shutil.rmtree(artifact_dir) systems = ['linux32', 'linux64', 'osx', 'win32', 'win64'] if __name__ == '__main__': args = docopt.docopt(__doc__) workdir = tempfile.mkdtemp() try: for system in systems: create_packages(system, workdir) if args['update']: target_dir = '/var/www/dl/open' for system in systems: for package in packages: dest = os.path.join(target_dir, package.name) if not os.path.exists(dest): os.mkdir(dest) fileutil.move(get_archive_name(system, package), dest) fileutil.move(get_archive_name(system), target_dir) finally: shutil.rmtree(workdir)
assert False, "Unable to determine kvm state" def useImage(host, vmid, image, move=False): assert fileutil.existsFile(host, image), "Image file does not exist" try: host.execute("qemu-img check -f qcow2 %s; echo $?" % util.escape(image)) except exceptions.CommandError, exc: #Error 1: Leaked clusters, "This means waste of disk space, but no harm to data." if not exc.errorCode in [1]: raise assert getState(host, vmid) == generic.State.PREPARED, "VM must be stopped to change image" _qm(host, vmid, "set", ["--ide0", "undef"]) imagePath = _imagePath(vmid) fileutil.mkdir(host, _imagePathDir(vmid)) if move: fileutil.move(host, image, imagePath) else: fileutil.copy(host, image, imagePath) fileutil.chown(host, imagePath, "root:root") _qm(host, vmid, "set", ["--ide0", "local:%d/disk.qcow2" % vmid]) assert fileutil.existsFile(host, imagePath) def _vncPidfile(vmid): return "%s/vnc-%d.pid" % (config.REMOTE_DIR, vmid) def vncRunning(host, vmid, port): return process.processRunning(host, _vncPidfile(vmid), "tcpserver") def startVnc(host, vmid, port, password): assert getState(host, vmid) == generic.State.STARTED, "VM must be running to start vnc" assert process.portFree(host, port)
if package.is_open: paths.add(path) # Create a full package. with zipfile.ZipFile(get_archive_name(system), 'w', zipfile.ZIP_DEFLATED) as zip: for path in paths: zip.write(path, os.path.join('ampl-open', os.path.basename(path))) shutil.rmtree(artifact_dir) systems = ['linux32', 'linux64', 'osx', 'win32', 'win64'] if __name__ == '__main__': args = docopt.docopt(__doc__) workdir = tempfile.mkdtemp() try: for system in systems: create_packages(system, workdir) if args['update']: target_dir = '/var/www/dl/open' for system in systems: for package in packages: dest = os.path.join(target_dir, package.name) if not os.path.exists(dest): os.mkdir(dest) fileutil.move(get_archive_name(system, package), dest) fileutil.move(get_archive_name(system), target_dir) finally: shutil.rmtree(workdir)
with zipfile.ZipFile(filename) as f: f.extractall(ampl_demo_dir) shutil.copy('ampl.lic', ampl_demo_dir) basename = 'ampl-demo-' + system package(basename, archive_format, package_dir) # Prepare the IDE demo package. amplide_demo_dir = os.path.join(package_dir, 'amplide-demo') amplide_url = 'http://www.ampl.com/dl/IDE/amplide.' + sys2ide[ system] amplide = retrieve_cached(amplide_url) iszip = amplide_url.endswith('zip') archive_open = zipfile.ZipFile if iszip else tarfile.open with archive_open(amplide) as archive: archive.extractall(package_dir) shutil.move(os.path.join(package_dir, 'amplide'), amplide_demo_dir) shutil.move(ampl_demo_dir, os.path.join(amplide_demo_dir, 'ampl')) basename = 'amplide-demo-' + system package(basename, archive_format, package_dir) shutil.rmtree(amplide_demo_dir) finally: shutil.rmtree(workdir) # Move packages to the server. if args['update']: demo_dir = '/var/www/dl/demo' for system in ['linux32', 'linux64', 'macosx', 'mswin']: ext = '.zip' if system == 'mswin' else '.tar.gz' fileutil.move('ampl-demo-' + system + ext, demo_dir) fileutil.move('amplide-demo-' + system + ext, demo_dir)