summaryrefslogtreecommitdiffstats
path: root/vnfs/qemu
diff options
context:
space:
mode:
authorMartin Klozik <martinx.klozik@intel.com>2015-10-02 02:18:09 +0100
committerMaryam Tahhan <maryam.tahhan@intel.com>2015-10-12 14:58:14 +0000
commit9b590e2282714e3b5aae26c3ac2d8c857b1ddb82 (patch)
tree3739c9f042949c02e3254be342f0076d6ed2f9f2 /vnfs/qemu
parentf8b7dd0a2611061fed7134474ae10ab85e80cf3d (diff)
Enable PVP and PVVP deployments for Vanilla OVS
Support for PVP and PVVP scenerios using Vanilla OVS was added. VMs are configured to forward traffic between virtual interfaces by standard linux capabilities. Traffic generator script was updated to accept MAC and IP address configuration to allow VM forwarding configuration. VSPERF-66, VSPERF-70 Change-Id: Ia70ab6be547b39928a1eae319faba779d4e29284 Signed-off-by: Martin Klozik <martinx.klozik@intel.com> Signed-off-by: Dino Simeon Madarang <dino.simeonx.madarang@intel.com> Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com> Reviewed-by: Brian Castelli <brian.castelli@spirent.com> Reviewed-by: Gene Snider <eugene.snider@huawei.com> Reviewed-by: Al Morton <acmorton@att.com> Reviewed-by: Tv Rao <tv.rao@freescale.com>
Diffstat (limited to 'vnfs/qemu')
-rw-r--r--vnfs/qemu/qemu.py14
-rw-r--r--vnfs/qemu/qemu_dpdk.py13
-rw-r--r--vnfs/qemu/qemu_virtio_net.py115
3 files changed, 123 insertions, 19 deletions
diff --git a/vnfs/qemu/qemu.py b/vnfs/qemu/qemu.py
index 338ca771..2e2c63df 100644
--- a/vnfs/qemu/qemu.py
+++ b/vnfs/qemu/qemu.py
@@ -41,13 +41,7 @@ class IVnfQemu(IVnf):
def __init__(self):
"""
- :param timeout: Time to wait for login prompt. If set to
- 0 do not wait.
- :param number: Number of QEMU instance, used when multiple QEMU
- instances are started at once.
- :param args: Arguments to pass to QEMU.
-
- :returns: None
+ Initialisation function.
"""
super(IVnfQemu, self).__init__()
self._logger = logging.getLogger(__name__)
@@ -67,9 +61,6 @@ class IVnfQemu(IVnf):
'-cpu', 'host',
'-drive', 'if=scsi,file=' +
S.getValue('GUEST_IMAGE')[self._number],
- '-drive',
- 'if=scsi,file=fat:rw:%s,snapshot=off' %
- S.getValue('GUEST_SHARE_DIR')[self._number],
'-boot', 'c', '--enable-kvm',
'-monitor', 'unix:%s,server,nowait' % self._monitor,
'-object',
@@ -104,7 +95,8 @@ class IVnfQemu(IVnf):
Start QEMU instance, login and prepare for commands.
"""
super(IVnfQemu, self).start()
- self._affinitize()
+ if S.getValue('VNF_AFFINITIZATION_ON'):
+ self._affinitize()
if self._timeout:
self._login()
diff --git a/vnfs/qemu/qemu_dpdk.py b/vnfs/qemu/qemu_dpdk.py
index 0b8f90a0..02d720f3 100644
--- a/vnfs/qemu/qemu_dpdk.py
+++ b/vnfs/qemu/qemu_dpdk.py
@@ -25,16 +25,13 @@ class IVnfQemuDpdk(IVnfQemu):
def __init__(self):
"""
- :param timeout: Time to wait for login prompt. If set to
- 0 do not wait.
- :param number: Number of QEMU instance, used when multiple QEMU
- instances are started at once.
- :param args: Arguments to pass to QEMU.
-
- :returns: None
+ Initialisation function.
"""
super(IVnfQemuDpdk, self).__init__()
- self._cmd += []
+ self._cmd += ['-drive',
+ 'if=scsi,file=fat:rw:%s,snapshot=off' %
+ S.getValue('GUEST_SHARE_DIR')[self._number],
+ ]
def _modify_dpdk_makefile(self):
"""
diff --git a/vnfs/qemu/qemu_virtio_net.py b/vnfs/qemu/qemu_virtio_net.py
new file mode 100644
index 00000000..7de5ea1c
--- /dev/null
+++ b/vnfs/qemu/qemu_virtio_net.py
@@ -0,0 +1,115 @@
+# Copyright 2016 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Automation of QEMU hypervisor for launching virtio-net enabled guests.
+"""
+
+import logging
+from vnfs.qemu.qemu import IVnfQemu
+from conf import settings as S
+from conf import get_test_param
+from tools import tasks
+
+class QemuVirtioNet(IVnfQemu):
+ """
+ Control an instance of QEMU with virtio-net guest communication.
+ """
+
+ def __init__(self):
+ """
+ Initialisation function.
+ """
+ super(QemuVirtioNet, self).__init__()
+ self._logger = logging.getLogger(__name__)
+
+ # insert vanilla ovs specific modules
+ tasks.run_task(['sudo', 'modprobe', 'vhost_net'], self._logger,
+ 'Loading vhost_net module...', True)
+
+ # calculate indexes of guest devices (e.g. charx, dpdkvhostuserx)
+ i = self._number * 2
+ if1 = str(i)
+ if2 = str(i + 1)
+ self._net1 = S.getValue('VANILLA_NIC1_NAME')[self._number]
+ self._net2 = S.getValue('VANILLA_NIC2_NAME')[self._number]
+
+ self._cmd += ['-netdev',
+ 'type=tap,id=' + self._net1 +
+ ',script=no,downscript=no,' +
+ 'ifname=tap' + if1 + ',vhost=on',
+ '-device',
+ 'virtio-net-pci,mac=' +
+ S.getValue('GUEST_NET1_MAC')[self._number] +
+ ',netdev=' + self._net1 + ',csum=off,gso=off,' +
+ 'guest_tso4=off,guest_tso6=off,guest_ecn=off',
+ '-netdev',
+ 'type=tap,id=' + self._net2 +
+ ',script=no,downscript=no,' +
+ 'ifname=tap' + if2 + ',vhost=on',
+ '-device',
+ 'virtio-net-pci,mac=' +
+ S.getValue('GUEST_NET2_MAC')[self._number] +
+ ',netdev=' + self._net2 + ',csum=off,gso=off,' +
+ 'guest_tso4=off,guest_tso6=off,guest_ecn=off',
+ ]
+
+ # helper functions
+
+ def _config_guest_loopback(self):
+ """
+ Configure VM to perform forwarding between NICs
+ """
+
+ # Disable services (F16)
+ self.execute_and_wait('systemctl stop iptables.service')
+ self.execute_and_wait('systemctl stop irqbalance.service')
+
+ nic1_name = get_test_param('vanilla_nic1_name', self._net1)
+ self.execute('ifconfig ' + nic1_name + ' ' +
+ S.getValue('VANILLA_NIC1_IP_CIDR')[self._number])
+
+ nic2_name = get_test_param('vanilla_nic2_name', self._net2)
+ self.execute('ifconfig ' + nic2_name + ' ' +
+ S.getValue('VANILLA_NIC2_IP_CIDR')[self._number])
+
+ # configure linux bridge
+ self.execute('brctl addbr br0')
+ self.execute('brctl addif br0 ' + self._net1 + ' ' + self._net2)
+ self.execute('ifconfig br0 ' +
+ S.getValue('VANILLA_BRIDGE_IP')[self._number])
+
+ # Add the arp entries for the IXIA ports and the bridge you are using.
+ # Use command line values if provided.
+ trafficgen_mac = get_test_param('vanilla_tgen_port1_mac',
+ S.getValue('VANILLA_TGEN_PORT1_MAC'))
+ trafficgen_ip = get_test_param('vanilla_tgen_port1_ip',
+ S.getValue('VANILLA_TGEN_PORT1_IP'))
+
+ self.execute('arp -s ' + trafficgen_ip + ' ' + trafficgen_mac)
+
+ trafficgen_mac = get_test_param('vanilla_tgen_port2_mac',
+ S.getValue('VANILLA_TGEN_PORT2_MAC'))
+ trafficgen_ip = get_test_param('vanilla_tgen_port2_ip',
+ S.getValue('VANILLA_TGEN_PORT2_IP'))
+
+ self.execute('arp -s ' + trafficgen_ip + ' ' + trafficgen_mac)
+
+ # Enable forwarding
+ self.execute('sysctl -w net.ipv4.ip_forward=1')
+
+ # Controls source route verification
+ # 0 means no source validation
+ self.execute('sysctl -w net.ipv4.conf.all.rp_filter=0')
+ self.execute('sysctl -w net.ipv4.conf.' + self._net1 + '.rp_filter=0')
+ self.execute('sysctl -w net.ipv4.conf.' + self._net2 + '.rp_filter=0')