[PATCH 4/5] KVM test: setup tap fd and pass it to qemu-kvm v3

2011-06-01 Thread Lucas Meneghel Rodrigues
We used to use qemu-ifup to manage the tap which have several
limitations:

1) If we want to specify a bridge, we must create a customized
qemu-ifup file as the default script always match the first bridge.
2) It's hard to add support for macvtap device.

So this patch let kvm subtest control the tap creation and setup then
pass it to qemu-kvm. User could specify the bridge he want to used in
configuration file.

The original autoconfiguration was changed by private bridge setup.

Changes from v1:
* Combine the private bridge config and TAP fd in one patchset,
dropped the auto mode
* Close TAP fds on VM.destroy() (thanks to Amos Kong for finding
the problem)

Signed-off-by: Jason Wang jasow...@redhat.com
Signed-off-by: Lucas Meneghel Rodrigues l...@redhat.com
---
 client/tests/kvm/scripts/qemu-ifup |   11 --
 client/virt/kvm_vm.py  |   63 ---
 client/virt/virt_utils.py  |8 +++-
 3 files changed, 49 insertions(+), 33 deletions(-)
 delete mode 100755 client/tests/kvm/scripts/qemu-ifup

diff --git a/client/tests/kvm/scripts/qemu-ifup 
b/client/tests/kvm/scripts/qemu-ifup
deleted file mode 100755
index c4debf5..000
--- a/client/tests/kvm/scripts/qemu-ifup
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# The following expression selects the first bridge listed by 'brctl show'.
-# Modify it to suit your needs.
-switch=$(/usr/sbin/brctl show | awk 'NR==2 { print $1 }')
-
-/bin/echo 1  /proc/sys/net/ipv6/conf/${switch}/disable_ipv6
-/sbin/ifconfig $1 0.0.0.0 up
-/usr/sbin/brctl addif ${switch} $1
-/usr/sbin/brctl setfd ${switch} 0
-/usr/sbin/brctl stp ${switch} off
diff --git a/client/virt/kvm_vm.py b/client/virt/kvm_vm.py
index 343488f..7cec1d0 100644
--- a/client/virt/kvm_vm.py
+++ b/client/virt/kvm_vm.py
@@ -7,7 +7,7 @@ Utility classes and functions to handle Virtual Machine 
creation using qemu.
 import time, os, logging, fcntl, re, commands, glob
 from autotest_lib.client.common_lib import error
 from autotest_lib.client.bin import utils
-import virt_utils, virt_vm, kvm_monitor, aexpect
+import virt_utils, virt_vm, virt_test_setup, kvm_monitor, aexpect
 
 
 class VM(virt_vm.BaseVM):
@@ -41,6 +41,7 @@ class VM(virt_vm.BaseVM):
 self.pci_assignable = None
 self.netdev_id = []
 self.device_id = []
+self.tapfds = []
 self.uuid = None
 
 
@@ -240,19 +241,17 @@ class VM(virt_vm.BaseVM):
 cmd += ,id='%s' % device_id
 return cmd
 
-def add_net(help, vlan, mode, ifname=None, script=None,
-downscript=None, tftp=None, bootfile=None, hostfwd=[],
-netdev_id=None, netdev_extra_params=None):
+def add_net(help, vlan, mode, ifname=None, tftp=None, bootfile=None,
+hostfwd=[], netdev_id=None, netdev_extra_params=None,
+tapfd=None):
 if has_option(help, netdev):
 cmd =  -netdev %s,id=%s % (mode, netdev_id)
 if netdev_extra_params:
 cmd += ,%s % netdev_extra_params
 else:
 cmd =  -net %s,vlan=%d % (mode, vlan)
-if mode == tap:
-if ifname: cmd += ,ifname='%s' % ifname
-if script: cmd += ,script='%s' % script
-cmd += ,downscript='%s' % (downscript or no)
+if mode == tap and tapfd:
+cmd += ,fd=%d % tapfd
 elif mode == user:
 if tftp and [,tftp= in help:
 cmd += ,tftp='%s' % tftp
@@ -422,20 +421,22 @@ class VM(virt_vm.BaseVM):
 qemu_cmd += add_nic(help, vlan, nic_params.get(nic_model), mac,
 device_id, netdev_id, 
nic_params.get(nic_extra_params))
 # Handle the '-net tap' or '-net user' or '-netdev' part
-script = nic_params.get(nic_script)
-downscript = nic_params.get(nic_downscript)
 tftp = nic_params.get(tftp)
-if script:
-script = virt_utils.get_path(root_dir, script)
-if downscript:
-downscript = virt_utils.get_path(root_dir, downscript)
 if tftp:
 tftp = virt_utils.get_path(root_dir, tftp)
-qemu_cmd += add_net(help, vlan, nic_params.get(nic_mode, user),
-vm.get_ifname(vlan),
-script, downscript, tftp,
+if nic_params.get(nic_mode) == tap:
+try:
+tapfd = vm.tapfds[vlan]
+except:
+tapfd = None
+else:
+tapfd = None
+qemu_cmd += add_net(help, vlan,
+nic_params.get(nic_mode, user),
+vm.get_ifname(vlan), tftp,
 nic_params.get(bootp), redirs, netdev_id,
-

[PATCH 4/5] KVM test: setup tap fd and pass it to qemu-kvm v3

2011-05-24 Thread Lucas Meneghel Rodrigues
We used to use qemu-ifup to manage the tap which have several
limitations:

1) If we want to specify a bridge, we must create a customized
qemu-ifup file as the default script always match the first bridge.
2) It's hard to add support for macvtap device.

So this patch let kvm subtest control the tap creation and setup then
pass it to qemu-kvm. User could specify the bridge he want to used in
configuration file.

The original autoconfiguration was changed by private bridge setup.

Changes from v1:
* Combine the private bridge config and TAP fd in one patchset,
dropped the auto mode
* Close TAP fds on VM.destroy() (thanks to Amos Kong for finding
the problem)

Signed-off-by: Jason Wang jasow...@redhat.com
Signed-off-by: Lucas Meneghel Rodrigues l...@redhat.com
---
 client/tests/kvm/scripts/qemu-ifup |   11 ---
 client/virt/kvm_vm.py  |   59 +++
 client/virt/virt_utils.py  |8 -
 3 files changed, 45 insertions(+), 33 deletions(-)
 delete mode 100755 client/tests/kvm/scripts/qemu-ifup

diff --git a/client/tests/kvm/scripts/qemu-ifup 
b/client/tests/kvm/scripts/qemu-ifup
deleted file mode 100755
index c4debf5..000
--- a/client/tests/kvm/scripts/qemu-ifup
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# The following expression selects the first bridge listed by 'brctl show'.
-# Modify it to suit your needs.
-switch=$(/usr/sbin/brctl show | awk 'NR==2 { print $1 }')
-
-/bin/echo 1  /proc/sys/net/ipv6/conf/${switch}/disable_ipv6
-/sbin/ifconfig $1 0.0.0.0 up
-/usr/sbin/brctl addif ${switch} $1
-/usr/sbin/brctl setfd ${switch} 0
-/usr/sbin/brctl stp ${switch} off
diff --git a/client/virt/kvm_vm.py b/client/virt/kvm_vm.py
index c9bb273..9b26dee 100644
--- a/client/virt/kvm_vm.py
+++ b/client/virt/kvm_vm.py
@@ -7,7 +7,7 @@ Utility classes and functions to handle Virtual Machine 
creation using qemu.
 import time, os, logging, fcntl, re, commands, glob
 from autotest_lib.client.common_lib import error
 from autotest_lib.client.bin import utils
-import virt_utils, virt_vm, kvm_monitor, aexpect
+import virt_utils, virt_vm, virt_test_setup, kvm_monitor, aexpect
 
 
 class VM(virt_vm.BaseVM):
@@ -41,6 +41,7 @@ class VM(virt_vm.BaseVM):
 self.pci_assignable = None
 self.netdev_id = []
 self.device_id = []
+self.tapfds = []
 self.uuid = None
 
 
@@ -240,19 +241,17 @@ class VM(virt_vm.BaseVM):
 cmd += ,id='%s' % device_id
 return cmd
 
-def add_net(help, vlan, mode, ifname=None, script=None,
-downscript=None, tftp=None, bootfile=None, hostfwd=[],
-netdev_id=None, netdev_extra_params=None):
+def add_net(help, vlan, mode, ifname=None, tftp=None, bootfile=None,
+hostfwd=[], netdev_id=None, netdev_extra_params=None,
+tapfd=None):
 if has_option(help, netdev):
 cmd =  -netdev %s,id=%s % (mode, netdev_id)
 if netdev_extra_params:
 cmd += ,%s % netdev_extra_params
 else:
 cmd =  -net %s,vlan=%d % (mode, vlan)
-if mode == tap:
-if ifname: cmd += ,ifname='%s' % ifname
-if script: cmd += ,script='%s' % script
-cmd += ,downscript='%s' % (downscript or no)
+if mode == tap and tapfd:
+cmd += ,fd=%d % tapfd
 elif mode == user:
 if tftp and [,tftp= in help:
 cmd += ,tftp='%s' % tftp
@@ -422,20 +421,22 @@ class VM(virt_vm.BaseVM):
 qemu_cmd += add_nic(help, vlan, nic_params.get(nic_model), mac,
 device_id, netdev_id, 
nic_params.get(nic_extra_params))
 # Handle the '-net tap' or '-net user' or '-netdev' part
-script = nic_params.get(nic_script)
-downscript = nic_params.get(nic_downscript)
 tftp = nic_params.get(tftp)
-if script:
-script = virt_utils.get_path(root_dir, script)
-if downscript:
-downscript = virt_utils.get_path(root_dir, downscript)
 if tftp:
 tftp = virt_utils.get_path(root_dir, tftp)
-qemu_cmd += add_net(help, vlan, nic_params.get(nic_mode, user),
-vm.get_ifname(vlan),
-script, downscript, tftp,
+if nic_params.get(nic_mode) == tap:
+try:
+tapfd = vm.tapfds[vlan]
+except:
+tapfd = None
+else:
+tapfd = None
+qemu_cmd += add_net(help, vlan,
+nic_params.get(nic_mode, user),
+vm.get_ifname(vlan), tftp,
 nic_params.get(bootp), redirs, netdev_id,
-