Move this tapfd_helper tool from autotest repo into
this virt-test repo, since it's a virt-test only tool.

This script can help us boot up guest with autotest
generated qemu command line, it creates tap device
and updates the tapfd in given qemu cli.

Signed-off-by: Qingtang Zhou <[email protected]>
---
 tools/tapfd_helper.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100755 tools/tapfd_helper.py

diff --git a/tools/tapfd_helper.py b/tools/tapfd_helper.py
new file mode 100755
index 0000000..0ab695e
--- /dev/null
+++ b/tools/tapfd_helper.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+import sys, os, re, logging
+import common
+from autotest.client.shared import logging_manager
+from virttest import utils_misc
+
+
+def destroy_tap(tapfd_list):
+    for tapfd in tapfd_list:
+        try:
+            os.close(tapfd)
+        # File descriptor is already closed
+        except OSError:
+            pass
+
+
+if __name__ == "__main__":
+    logging_manager.configure_logging(utils_misc.VirtLoggingConfig(),
+                                      verbose=True)
+    if len(sys.argv) <= 2:
+        logging.info("Usage: %s bridge_name qemu_command_line", sys.argv[0])
+        sys.exit(255)
+
+    brname = sys.argv[1]
+    cmd_line = ' '.join(sys.argv[2:])
+
+    if re.findall("-netdev\s", cmd_line):
+        # so we get the new qemu cli with netdev parameter.
+        tap_list_re = r"tap,id=(.*?),"
+        tap_replace_re = r"(tap,id=%s.*?,fd=)\d+"
+    else:
+        # the old cli contain "-net" parameter.
+        tap_list_re = r"tap,vlan=(\d+),"
+        tap_replace_re = r"(tap,vlan=%s,fd=)\d+"
+
+    tap_list = re.findall(tap_list_re, cmd_line)
+    if not tap_list:
+        print "Could not find tap device."
+        sys.exit(1)
+
+    tapfd_list = []
+
+    for tap in tap_list:
+        try:
+            ifname = "tap-%s" % tap
+            tapfd = utils_misc.open_tap("/dev/net/tun", ifname)
+            utils_misc.add_to_bridge(ifname, brname)
+            utils_misc.bring_up_ifname(ifname)
+            pattern = tap_replace_re % tap
+            cmd_line = re.sub(pattern, "\g<1>%s " % tapfd, cmd_line)
+            tapfd_list.append(tapfd)
+        except Exception, e:
+            destroy_tap(tapfd_list)
+            print "Error: %s" % e
+            sys.exit(2)
+
+    try:
+        # Run qemu command.
+        logging.info("TAP fd open to %s: %s", brname, tapfd_list)
+        os.system(cmd_line)
+    finally:
+        destroy_tap(tapfd_list)
-- 
1.7.12.1

_______________________________________________
Autotest-kernel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/autotest-kernel

Reply via email to