ovs_basic.py 10.3 KB
Newer Older
L
Lucas Meneghel Rodrigues 已提交
1 2 3
import logging
import time
import os
4 5 6

import aexpect

7
from avocado.utils import process
8 9 10 11 12 13
from virttest import utils_misc
from virttest import utils_net
from virttest import openvswitch
from virttest import ovs_utils
from virttest import versionable_class
from virttest import data_dir
14
from virttest import error_context
15

J
Jiří Župka 已提交
16 17 18 19 20 21 22

def allow_iperf_firewall(machine):
    machine.cmd("iptables -I INPUT -p tcp --dport 5001 --j ACCEPT")
    machine.cmd("iptables -I INPUT -p udp --dport 5001 --j ACCEPT")


class MiniSubtest(object):
L
Lucas Meneghel Rodrigues 已提交
23

J
Jiří Župka 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
    def __new__(cls, *args, **kargs):
        self = super(MiniSubtest, cls).__new__(cls)
        ret = None
        if args is None:
            args = []
        try:
            if hasattr(self, "setup"):
                self.setup(*args, **kargs)

            ret = self.test(*args, **kargs)
        finally:
            if hasattr(self, "clean"):
                self.clean(*args, **kargs)
        return ret


class InfrastructureInit(MiniSubtest):
L
Lucas Meneghel Rodrigues 已提交
41

J
Jiří Župka 已提交
42 43
    def setup(self, test, params, env):
        self.br0_name = "br0-%s" % (utils_misc.generate_random_string(3))
44
        while self.br0_name in utils_net.get_net_if():
J
Jiří Župka 已提交
45 46 47 48 49
            self.br0_name = "br0-%s" % (utils_misc.generate_random_string(3))
        self.br0_ip = params.get("bridge_ip", "192.168.250.1")

        self.ovs = None

50
        error_context.context("Try to log into guest.")
J
Jiří Župka 已提交
51 52 53 54
        self.vms = [env.get_vm(vm) for vm in params.get("vms").split()]
        for vm in self.vms:
            vm.verify_alive()

55
        error_context.context("Start OpenVSwitch.")
56
        self.ovs = versionable_class.factory(openvswitch.OpenVSwitchSystem)()
J
Jiří Župka 已提交
57 58
        self.ovs.init_system()
        self.ovs.check()
59
        error_context.context("Add new bridge %s." % (self.br0_name))
J
Jiří Župka 已提交
60
        self.ovs.add_br(self.br0_name)
61 62 63
        utils_net.set_net_if_ip(self.br0_name, self.br0_ip)
        utils_net.bring_up_ifname(self.br0_name)
        self.dns_pidf = (utils_net.check_add_dnsmasq_to_br(self.br0_name,
L
Lucas Meneghel Rodrigues 已提交
64
                                                           test.tmpdir))
65 66
        error_context.context("Add new ports from vms %s to bridge %s." %
                              (self.vms, self.br0_name))
J
Jiří Župka 已提交
67 68

        for vm in self.vms:
69
            utils_net.change_iface_bridge(vm.virtnet[1],
L
Lucas Meneghel Rodrigues 已提交
70 71
                                          self.br0_name,
                                          self.ovs)
J
Jiří Župka 已提交
72 73 74 75 76 77

        logging.debug(self.ovs.status())
        self.host = ovs_utils.Machine(src=test.srcdir)
        self.mvms = [ovs_utils.Machine(vm) for vm in self.vms]
        self.machines = [self.host] + self.mvms

L
Lucas Meneghel Rodrigues 已提交
78
        # ForAllP(self.mvms).cmd("dhclinet")
J
Jiří Župka 已提交
79 80 81 82 83 84 85

        time.sleep(5)
        utils_misc.ForAllP(self.machines).fill_addrs()

    def clean(self, test, params, env):
        if self.ovs:
            try:
86
                if self.dns_pidf is not None:
J
Jiří Župka 已提交
87 88 89 90 91 92 93 94 95 96 97 98
                    utils_misc.signal_program(self.dns_pidf[0:-4],
                                              pid_files_dir=test.tmpdir)
            except:
                pass
            try:
                self.ovs.del_br(self.br0_name)
            except Exception:
                pass
            if self.ovs.cleanup:
                self.ovs.clean()


99
@error_context.context_aware
100
def run(test, params, env):
J
Jiří Župka 已提交
101 102 103 104
    """
    Run basic test of OpenVSwitch driver.
    """
    class test_ping(InfrastructureInit):
L
Lucas Meneghel Rodrigues 已提交
105

J
Jiří Župka 已提交
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
        def test(self, test, params, env):
            count = params.get("ping_count", 10)
            for mvm in self.mvms:
                for p_mvm in self.mvms:
                    addr = None
                    if p_mvm.is_virtual():
                        addr = p_mvm.virtnet[1].ip["ipv6"][0]
                    else:
                        addr = p_mvm.addrs[self.br0_name]["ipv6"][0]

                    if p_mvm.is_virtual():
                        mvm.ping(addr, 1, count)
                    else:
                        mvm.ping(addr, self.br0_name, count)

    class test_iperf(InfrastructureInit):

L
Lucas Meneghel Rodrigues 已提交
123 124 125 126 127 128 129
        def start_servers(self):
            utils_misc.ForAllP(
                self.machines).cmd_in_src("%s -s &> /dev/null &" %
                                          (self.iperf_b_path))
            utils_misc.ForAllP(
                self.machines).cmd_in_src("%s -s -u &> /dev/null &" %
                                          (self.iperf_b_path))
J
Jiří Župka 已提交
130 131 132

        def iperf_client(self, machine, server_ip, add_params):
            out = machine.cmd_in_src("%s -c %s %s" %
133 134 135
                                     (self.iperf_b_path,
                                      server_ip,
                                      add_params))
J
Jiří Župka 已提交
136 137 138 139 140 141 142 143
            return " ".join(out.splitlines()[-1].split()[6:8])

        def test_bandwidth(self, add_params=None):
            if add_params is None:
                add_params = ""

            speeds = []
            speeds.append(self.iperf_client(self.mvms[0],
L
Lucas Meneghel Rodrigues 已提交
144 145 146
                                            self.host.addrs[
                                                self.br0_name]["ipv4"][0],
                                            add_params))
J
Jiří Župka 已提交
147 148

            speeds.append(self.iperf_client(self.host,
L
Lucas Meneghel Rodrigues 已提交
149 150 151
                                            self.mvms[0].virtnet[
                                                1].ip["ipv4"][0],
                                            add_params))
J
Jiří Župka 已提交
152 153

            speeds.append(self.iperf_client(self.mvms[0],
L
Lucas Meneghel Rodrigues 已提交
154 155 156
                                            self.mvms[1].virtnet[
                                                1].ip["ipv4"][0],
                                            add_params))
J
Jiří Župka 已提交
157 158 159 160

            return speeds

        def test(self, test, params, env):
161
            iperf_src_path = os.path.join(data_dir.get_deps_dir(), "iperf")
J
Jiří Župka 已提交
162 163
            self.iperf_b_path = os.path.join("iperf-2.0.4", "src", "iperf")

164
            error_context.context("Install iperf to vms machine.")
L
Lucas Meneghel Rodrigues 已提交
165 166
            utils_misc.ForAllP(
                self.machines).compile_autotools_app_tar(iperf_src_path,
J
Jiří Župka 已提交
167 168 169 170 171 172 173
                                                         "iperf-2.0.4.tar.gz")

            allow_iperf_firewall(self.host)
            utils_misc.ForAllP(self.mvms).cmd("iptables -F")

            self.start_servers()

L
Lucas Meneghel Rodrigues 已提交
174
            # Test TCP bandwidth
175
            error_context.context("Test iperf bandwidth tcp.")
J
Jiří Župka 已提交
176 177 178 179 180
            speeds = self.test_bandwidth()
            logging.info("TCP Bandwidth from vm->host: %s", speeds[0])
            logging.info("TCP Bandwidth from host->vm: %s", speeds[1])
            logging.info("TCP Bandwidth from vm->vm: %s", speeds[2])

L
Lucas Meneghel Rodrigues 已提交
181
            # test udp bandwidth limited to 1Gb
182
            error_context.context("Test iperf bandwidth udp.")
J
Jiří Župka 已提交
183 184 185 186 187 188 189 190 191 192
            speeds = self.test_bandwidth("-u -b 1G")
            logging.info("UDP Bandwidth from vm->host: %s", speeds[0])
            logging.info("UDP Bandwidth from host->vm: %s", speeds[1])
            logging.info("UDP Bandwidth from vm->vm: %s", speeds[2])

        def clean(self, test, params, env):
            self.host.cmd("killall -9 iperf")
            super(test_iperf, self).clean(test, params, env)

    class test_vlan_ping(InfrastructureInit):
L
Lucas Meneghel Rodrigues 已提交
193

J
Jiří Župka 已提交
194 195 196
        def test(self, test, params, env):
            count = params.get("ping_count", 10)
            ret = utils_misc.ForAllPSE(self.mvms).ping(
L
Lucas Meneghel Rodrigues 已提交
197 198
                self.host.addrs[self.br0_name]["ipv6"][0],
                1, count)
J
Jiří Župka 已提交
199 200
            for ret, vm in zip(ret, self.mvms):
                if "exception" in ret:
201 202
                    test.error("VM %s can't ping host:\n %s" %
                               (vm.name, ret.exception))
J
Jiří Župka 已提交
203

204
            error_context.context("Add OpenVSwitch device to vlan.")
J
Jiří Župka 已提交
205 206 207 208 209
            self.ovs.add_port_tag(self.mvms[0].virtnet[1].ifname, "1")
            self.ovs.add_port_tag(self.mvms[1].virtnet[1].ifname, "1")
            self.ovs.add_port_tag(self.mvms[2].virtnet[1].ifname, "2")
            self.ovs.add_port_tag(self.mvms[3].virtnet[1].ifname, "2")

210
            error_context.context("Ping all devices in vlan.")
J
Jiří Župka 已提交
211 212 213 214 215 216 217 218
            self.mvms[2].ping(self.mvms[3].virtnet[1].ip["ipv6"][0], 1, 2)
            self.mvms[3].ping(self.mvms[2].virtnet[1].ip["ipv6"][0], 1, 2)

            self.mvms[0].ping(self.mvms[1].virtnet[1].ip["ipv6"][0], 1, 1)
            self.mvms[1].ping(self.mvms[0].virtnet[1].ip["ipv6"][0], 1, 1)

            try:
                self.mvms[0].ping(self.mvms[2].virtnet[1].ip["ipv6"][0],
L
Lucas Meneghel Rodrigues 已提交
219
                                  1, 2)
220 221 222
                test.error("VM %s can't ping host:\n %s" %
                           (vm.name, ret.exception))
            except (process.CmdError, aexpect.ShellError):
J
Jiří Župka 已提交
223 224 225 226 227 228 229 230 231
                pass

            self.mvms[0].add_vlan_iface(self.mvms[0].virtnet[1].g_nic_name, 1)
            self.mvms[0].add_vlan_iface(self.mvms[0].virtnet[1].g_nic_name, 2)

            self.ovs.add_port_tag(self.mvms[0].virtnet[1].ifname, "[]")
            self.ovs.add_port_trunk(self.mvms[0].virtnet[1].ifname, [1, 2])

            time.sleep(1)
232
            error_context.context("Ping all devices in vlan.")
J
Jiří Župka 已提交
233
            self.mvms[0].ping(self.mvms[1].virtnet[1].ip["ipv6"][0], 1,
L
Lucas Meneghel Rodrigues 已提交
234
                              count, vlan=1)
J
Jiří Župka 已提交
235
            self.mvms[0].ping(self.mvms[2].virtnet[1].ip["ipv6"][0], 1,
L
Lucas Meneghel Rodrigues 已提交
236
                              count, vlan=2)
J
Jiří Župka 已提交
237
            self.mvms[1].ping(self.mvms[0].virtnet[1].ip["ipv6"][0], 1,
L
Lucas Meneghel Rodrigues 已提交
238
                              count)
J
Jiří Župka 已提交
239
            self.mvms[2].ping(self.mvms[0].virtnet[1].ip["ipv6"][0], 1,
L
Lucas Meneghel Rodrigues 已提交
240
                              count)
J
Jiří Župka 已提交
241 242 243

            try:
                self.mvms[0].ping(self.mvms[2].virtnet[1].ip["ipv6"][0],
L
Lucas Meneghel Rodrigues 已提交
244
                                  1, 2)
245 246 247
                test.error("VM %s shouldn't be able to ping"
                           " host:\n %s" % (vm.name, ret.exception))
            except (process.CmdError, aexpect.ShellError):
J
Jiří Župka 已提交
248 249 250 251 252 253 254
                pass

            for i in range(0, 4095, 10):
                self.ovs.add_port_tag(self.mvms[0].virtnet[1].ifname, "[]")
                self.ovs.add_port_trunk(self.mvms[0].virtnet[1].ifname, [i])

            self.ovs.add_port_trunk(self.mvms[0].virtnet[1].ifname,
255
                                    list(range(4095)))
J
Jiří Župka 已提交
256 257 258 259

            self.ovs.add_port_trunk(self.mvms[0].virtnet[1].ifname, [1])

            self.mvms[0].ping(self.mvms[1].virtnet[1].ip["ipv6"][0], 1,
L
Lucas Meneghel Rodrigues 已提交
260
                              count, vlan=1)
J
Jiří Župka 已提交
261 262 263 264 265 266

    test_type = "test_" + params.get("test_type")
    if (test_type in locals()):
        tests_group = locals()[test_type]
        tests_group(test, params, env)
    else:
267 268
        test.fail("Test type '%s' is not defined in"
                  " OpenVSwitch basic test" % test_type)