diff options
author | Alon Levy <alevy@redhat.com> | 2012-03-04 22:54:47 +0200 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2012-03-04 22:54:47 +0200 |
commit | ce0406e684ce9fec10df412f49ef79d175c8d78a (patch) | |
tree | 30264ba2a5207ead3917a1c97c0f61462ddad06c | |
parent | 029d510ddf28552a8bd2c7453b3c503b6f145fbe (diff) |
add gtk gui here
-rwxr-xr-x | spice_migrate.py | 90 |
1 files changed, 69 insertions, 21 deletions
diff --git a/spice_migrate.py b/spice_migrate.py index a2e99cb..548a2df 100755 --- a/spice_migrate.py +++ b/spice_migrate.py @@ -70,6 +70,7 @@ def get_args(): parser.add_argument('--secure', choices=['on', 'off'], default='off') parser.add_argument('--sleep', default=20, type=float) parser.add_argument('--glib', default=False, action='store_true') + parser.add_argument('--gtk', default=False, action='store_true') args = parser.parse_args(sys.argv[1:]) if os.path.exists(args.qemu): args.qemu_exec = args.qemu @@ -85,6 +86,9 @@ def get_args(): print "client %r not found" % orig_client sys.exit(1) print "qemu = %s" % args.qemu_exec + print "LD_LIBRARY_PATH=%s" % os.environ.get('LD_LIBRARY_PATH', None) + #print "ldd qemu:" + #os.system('ldd %s' % args.qemu_exec) return args def start_qemu(qemu_exec, image, spice_port, qmp_connection, @@ -245,7 +249,7 @@ class Migrator(object): def __init__(self, log, client, qemu_exec, image, monitor_files, client_count=1, spice_ports=[17000, 17001], migration_port=17002, vdagent=False, usbtablet=False, secure=False, host_subject='', - extra_args=[], sound=False): + extra_args=[], extra_per_vm=([], []), sound=False): self.client = client self.log = log self.qemu_exec = qemu_exec @@ -267,6 +271,7 @@ class Migrator(object): if sound: extra_args.extend(['-device', 'intel-hda,id=sound0', '-device', 'hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0']) self.extra_args = extra_args + self.extra_per_vm = extra_per_vm self.active = self.start_qemu(which=0, incoming=False) self.target = self.start_qemu(which=1, incoming=True) self.remove_monitor_files() @@ -276,14 +281,14 @@ class Migrator(object): kw = {} if incoming: kw['incoming_port'] = self.migration_port + extra_args = self.extra_args + self.extra_per_vm[which] return start_qemu(qemu_exec=self.qemu_exec, image=self.image, spice_port=self.spice_ports[which], qmp_connection=self.monitor_files[which], - extra_args=self.extra_args, + extra_args=extra_args, secure=self.secure, **kw) - def close(self): self.remove_monitor_files() self.kill_qemu() @@ -299,13 +304,23 @@ class Migrator(object): if os.path.exists(x): os.unlink(x) + def start_clients(self): + if len(self.clients) == self.client_count: + return 0 + start_count = len(self.clients) + for i in range(len(self.clients), self.client_count): + self.log.write("launching a client %d\n" % (len(self.clients) + 1)) + self.clients.append(start_client(client=self.client, + spice_port=self.spice_ports[0], secure=self.secure, host_subject=self.host_subject)) + return len(self.clients) - start_count + def _iterate(self, wait_for_user_input=False): yield 'wait_active', (self.active.qmp, True) yield 'wait_active', (self.target.qmp, False) - if len(self.clients) == 0: - for i in range(self.client_count): - self.clients.append(start_client(client=self.client, - spice_port=self.spice_ports[0], secure=self.secure, host_subject=self.host_subject)) + started = self.start_clients() + if started > 0: + # wait for all clients events + for i in xrange(started): yield 'wait_for_event', (self.active.qmp, 'SPICE_INITIALIZED') if wait_for_user_input: print "waiting for Enter to start migrations" @@ -345,7 +360,6 @@ class Migrator(object): def single(): def single_iter(): for cmd, args in self._iterate(False): - print cmd, args yield cmd, args self.count += 1 glib.timeout_add(dt, single) @@ -353,25 +367,46 @@ class Migrator(object): return False single() -def main(): - args = get_args() - host_subject = None - if args.secure == 'on': - if any([not os.path.exists(f) for f in "ca-key.pem ca-cert.pem server-cert.pem server-key.pem".split()]): - os.system('./spice_make_certs.sh') - host_subject = ','.join(os.popen('openssl x509 -noout -text -in server-cert.pem | grep Subject: | cut -f 10- -d " "').read().strip().split(', ')) - print "log file %s" % args.log_filename - log = open(args.log_filename, "a+") - log.write("# "+str(datetime.datetime.now())+"\n") +def start_migrator(args, extra_args, extra_per_vm): migrator = Migrator(client=args.client, qemu_exec=args.qemu_exec, image=args.image, log=log, monitor_files=[args.qmp1, args.qmp2], migration_port=args.migrate_port, spice_ports=[args.spice_port1, args.spice_port2], client_count=args.client_count, vdagent=(args.vdagent=='on'), usbtablet=(args.usbtablet=='on'), secure=(args.secure=='on'), host_subject=host_subject, - extra_args = ['-vga', 'qxl', '-device', 'qxl'], sound=False) + extra_args=extra_args, extra_per_vm=extra_per_vm, sound=False) atexit.register(cleanup, migrator) - #while True: + return migrator + +def qmp_gui(args, migrator): + import gtk + mainloop = glib.MainLoop() + def on_click(button): + migrator.loop(args.sleep*1000) + def on_quit(button): + mainloop.quit() + vbox = gtk.VBox() + w = gtk.Window() + w.add(vbox) + bquit = gtk.Button('quit') + bquit.connect("clicked", on_quit) + vbox.add(bquit) + b = gtk.Button("start migration") + vbox.add(b) + b.connect("clicked", on_click) + w.show_all() + return mainloop + +def main_gui(args, extra_args, extra_per_vm=([], [])): + migrator = start_migrator(args=args, extra_args=extra_args, + extra_per_vm=extra_per_vm) + migrator.start_clients() + mainloop = qmp_gui(args, migrator) + mainloop.run() + +def main_console(args, extra_args): + migrator = start_migrator(args, extra_args=extra_args, + extra_per_vm=([], [])) if args.glib: migrator.loop(args.sleep*1000) mainloop = glib.MainLoop() @@ -385,4 +420,17 @@ def main(): if __name__ == '__main__': # Limit core dumps to 10GB (default is no core dumps) resource.setrlimit(resource.RLIMIT_CORE, (10*1000*1000*1000, -1)) - main() + args = get_args() + extra_args = ['-vga', 'qxl', '-device', 'qxl'] + host_subject = None + if args.secure == 'on': + if any([not os.path.exists(f) for f in "ca-key.pem ca-cert.pem server-cert.pem server-key.pem".split()]): + os.system('./spice_make_certs.sh') + host_subject = ','.join(os.popen('openssl x509 -noout -text -in server-cert.pem | grep Subject: | cut -f 10- -d " "').read().strip().split(', ')) + print "log file %s" % args.log_filename + log = open(args.log_filename, "a+") + log.write("# "+str(datetime.datetime.now())+"\n") + if args.gtk: + main_gui(args, extra_args) + else: + main_console(args, extra_args) |