Esempio n. 1
0
File: vzctl.py Progetto: m3z/ToMaTo
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
          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)
Esempio n. 5
0
      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)
Esempio n. 6
0
	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)
Esempio n. 7
0
            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)
Esempio n. 8
0
                        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)