[Spice-devel] [PATCH] tests/migrate.py: refactor to allow importing for later use

Hans de Goede hdegoede at redhat.com
Fri Feb 11 05:39:51 PST 2011


Ack.

On 02/11/2011 02:31 PM, Alon Levy wrote:
> ---
> just a patch I had lying around, not used yet for anything, but makes it
> easier for later.
> ---
>   tests/migrate.py |  132 +++++++++++++++++++++++++++++++++---------------------
>   1 files changed, 81 insertions(+), 51 deletions(-)
>
> diff --git a/tests/migrate.py b/tests/migrate.py
> index c01b107..c5c87dc 100644
> --- a/tests/migrate.py
> +++ b/tests/migrate.py
> @@ -22,7 +22,7 @@ Will leave a log file, migrate_test.log, in current directory.
>   #  active migrate tcp:localhost:9000
>   #  _wait for event of quit
>   #  active stop, active<->passive
> -#
> +#
>   # wait until it's active
>   #  command query-status, if running good
>   #  if not listen to events until event of running
> @@ -47,9 +47,10 @@ import atexit
>   QMP_1, QMP_2 = "/tmp/migrate_test.1.qmp", "/tmp/migrate_test.2.qmp"
>   SPICE_PORT_1, SPICE_PORT_2 = 5911, 6911
>   MIGRATE_PORT = 9000
> +SPICEC_COUNT = 1
>   QEMU = "qemu.upstream"
>   LOG_FILENAME = "migrate_log.log"
> -IMAGE = "/store/images/f14_regular.qcow2"
> +IMAGE = "/store/images/F14_CCID.testing.qcow2"
>
>   qemu_exec = os.popen("which %s" % QEMU).read().strip()
>
> @@ -105,54 +106,83 @@ def wait_for_event(q, event):
>                   return
>           time.sleep(0.5)
>
> -def cleanup(*args):
> +def cleanup(migrator):
>       print "doing cleanup"
> -    os.system("killall %s" % qemu_exec)
> -    for x in [QMP_1, QMP_2]:
> -        if os.path.exists(x):
> -            os.unlink(x)
> -
> -#################### Main #######################
> -
> -cleanup()
> -atexit.register(cleanup)
> -
> -active = start_qemu(spice_port=SPICE_PORT_1, qmp_filename=QMP_1)
> -target = start_qemu(spice_port=SPICE_PORT_2, qmp_filename=QMP_2,
> -                    incoming_port=MIGRATE_PORT)
> -
> -i = 0
> -spicec = None
> -log = open(LOG_FILENAME, "a+")
> -log.write("# "+str(datetime.datetime.now())+"\n")
> -
> -while True:
> -    wait_active(active.qmp, True)
> -    wait_active(target.qmp, False)
> -    if spicec == None:
> -        spicec = start_spicec(spice_port=SPICE_PORT_1)
> -        wait_for_event(active.qmp, 'SPICE_INITIALIZED')
> -        print "waiting for Enter to start migrations"
> -        raw_input()
> -    active.qmp.cmd('client_migrate_info', {'protocol':'spice',
> -        'hostname':'localhost', 'port':target.spice_port})
> -    active.qmp.cmd('migrate', {'uri': 'tcp:localhost:%s' % MIGRATE_PORT})
> -    wait_active(active.qmp, False)
> -    wait_active(target.qmp, True)
> -    wait_for_event(target.qmp, 'SPICE_CONNECTED')
> -    dead = active
> -    dead.qmp.cmd("quit")
> -    dead.qmp.close()
> -    dead.wait()
> -    new_spice_port = dead.spice_port
> -    new_qmp_filename = dead.qmp_filename
> -    log.write("# STDOUT dead %s\n" % dead.pid)
> -    log.write(dead.stdout.read())
> -    del dead
> -    active = target
> -    target = start_qemu(spice_port=new_spice_port,
> -                        qmp_filename=new_qmp_filename,
> -                        incoming_port=MIGRATE_PORT)
> -    print i
> -    i += 1
> +    migrator.close()
> +
> +class Migrator(object):
> +
> +    migration_count = 0
> +
> +    def __init__(self, log, monitor_files, spicec_count, spice_ports, migration_port):
> +        self.log = log
> +        self.migration_port = migration_port
> +        self.spicec_count = spicec_count
> +        self.monitor_files = monitor_files
> +        self.spice_ports = spice_ports
> +        self.active = start_qemu(spice_port=SPICE_PORT_1, qmp_filename=QMP_1)
> +        self.target = start_qemu(spice_port=SPICE_PORT_2, qmp_filename=QMP_2,
> +                            incoming_port=MIGRATE_PORT)
> +        self.remove_monitor_files()
> +        self.spicec = []
> +
> +    def close(self):
> +        self.remove_monitor_files()
> +        self.kill_qemu()
> +
> +    def kill_qemu(self):
> +        for p in [self.active, self.target]:
> +            print "killing and waiting for qemu pid %s" % p.pid
> +            p.kill()
> +            p.wait()
> +
> +    def remove_monitor_files(self):
> +        for x in self.monitor_files:
> +            if os.path.exists(x):
> +                os.unlink(x)
> +
> +    def iterate(self, wait_for_user_input=False):
> +        wait_active(self.active.qmp, True)
> +        wait_active(self.target.qmp, False)
> +        if len(self.spicec) == 0:
> +            for i in range(self.spicec_count):
> +                self.spicec.append(start_spicec(spice_port=SPICE_PORT_1))
> +                wait_for_event(self.active.qmp, 'SPICE_INITIALIZED')
> +            if wait_for_user_input:
> +                print "waiting for Enter to start migrations"
> +                raw_input()
> +        self.active.qmp.cmd('client_migrate_info', {'protocol':'spice',
> +            'hostname':'localhost', 'port':self.target.spice_port})
> +        self.active.qmp.cmd('migrate', {'uri': 'tcp:localhost:%s' % MIGRATE_PORT})
> +        wait_active(self.active.qmp, False)
> +        wait_active(self.target.qmp, True)
> +        wait_for_event(self.target.qmp, 'SPICE_CONNECTED')
> +        dead = self.active
> +        dead.qmp.cmd("quit")
> +        dead.qmp.close()
> +        dead.wait()
> +        new_spice_port = dead.spice_port
> +        new_qmp_filename = dead.qmp_filename
> +        self.log.write("# STDOUT dead %s\n" % dead.pid)
> +        self.log.write(dead.stdout.read())
> +        del dead
> +        self.active = self.target
> +        self.target = start_qemu(spice_port=new_spice_port,
> +                            qmp_filename=new_qmp_filename,
> +                            incoming_port=MIGRATE_PORT)
> +        print self.migration_count
> +        self.migration_count += 1
> +
> +def main():
> +    log = open(LOG_FILENAME, "a+")
> +    log.write("# "+str(datetime.datetime.now())+"\n")
> +
> +    migrator = Migrator(log = log, monitor_files = [QMP_1, QMP_2], migration_port = MIGRATE_PORT,
> +        spice_ports = [SPICE_PORT_1, SPICE_PORT_2], spicec_count = SPICEC_COUNT)
> +    atexit.register(cleanup, migrator)
> +    while True:
> +        migrator.iterate()
> +
> +if __name__ == '__main__':
> +    main()
>


More information about the Spice-devel mailing list