summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2012-03-04 22:54:47 +0200
committerAlon Levy <alevy@redhat.com>2012-03-04 22:54:47 +0200
commitce0406e684ce9fec10df412f49ef79d175c8d78a (patch)
tree30264ba2a5207ead3917a1c97c0f61462ddad06c
parent029d510ddf28552a8bd2c7453b3c503b6f145fbe (diff)
add gtk gui here
-rwxr-xr-xspice_migrate.py90
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)