Add integration tests to iperf3

Justification
Adds tests according to the CI wiki specifically the standard test interface in the spec.
The playbook includes Tier1 level test cases that have been tested in the following contexts and
is passing reliably: Classic. Test logs are stored in the artifacts directory.
The following steps are used to execute the tests using the standard test interface:

Test enveronment
Make sure you have installed packages from the spec
```
ansible-2.4.1.0-2.fc27.noarch
python2-dnf-2.7.5-1.fc27.noarch
libselinux-python-2.7-2.fc27.x86_64
standard-test-roles-2.5-1.fc27.noarch
Run tests for Classic
Snip of the example test run for Classic tests:
```

```
posix          	on

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   TEST PROTOCOL
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    Package       : iperf3
    Installed     : iperf3-3.5-1.fc29.x86_64
    beakerlib RPM : beakerlib-1.17-13.fc29.noarch
    Test started  : 2018-04-30 12:21:09 UTC
    Test finished :
    Test duration :
    Test name     : miscellaneous-tests
    Distro        : Fedora release 29 (Rawhide)
    Hostname      : localhost
    Architecture  : x86_64
    CPUs          : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C)
    RAM size      : 5938 MB
    HDD size      : 39.12 GB
:: [ 12:21:09 ] :: [ WARNING  ] :: POSIX mode detected and switched off
:: [ 12:21:09 ] :: [ WARNING  ] :: POSIX mode detected and switched off
:: [ 12:21:09 ] :: [ WARNING  ] :: Please fix your test to have /bin/bash shebang
:: [ 12:21:09 ] :: [ WARNING  ] :: Please fix your test to have /bin/bash shebang

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Setup
::   Setup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [   PASS   ] :: Checking for the presence of iperf3 rpm
:: [ 12:21:09 ] :: [   PASS   ] :: Checking for the presence of iperf3 rpm
:: [ 12:21:09 ] :: [   LOG    ] :: Package versions:
:: [ 12:21:09 ] :: [   LOG    ] :: Package versions:
:: [ 12:21:09 ] :: [   LOG    ] ::   iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [   LOG    ] ::   iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [  BEGIN   ] :: Running 'cp iperf3-test.py /usr/bin/'
:: [ 12:21:09 ] :: [   PASS   ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0)
:: [ 12:21:09 ] :: [   PASS   ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 2 good, 0 bad
::   Assertions: 2 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Test
::   Test
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:21:09 ] :: [   LOG    ] :: iperf3 tests
:: [ 12:21:09 ] :: [   LOG    ] :: iperf3 tests
:: [ 12:21:09 ] :: [  BEGIN   ] :: Running '/usr/bin/python3 /usr/bin/iperf3-test.py'
test_basic_tcp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok
test_basic_udp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok
test_server_daemon_pid_equal_to_pid_file (__main__.Iperf3SanityTests) ... ok
test_server_log_file_exists (__main__.Iperf3SanityTests) ... ok
test_server_pid_file_exists (__main__.Iperf3SanityTests) ... ok
test_tcp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_custom_client_port (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_dscp (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_get_server_output (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_mss (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_parallel (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_reverse (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_time_15sec (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_title (__main__.Iperf3Tests) ... ok
test_tcp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok
test_udp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok
test_udp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok
test_tcp_client_bind_to_interface_default_port (__main__.Iperf3TestsBindToInterface) ... ok

----------------------------------------------------------------------
Ran 18 tests in 266.543s

OK
:: [ 12:25:36 ] :: [   PASS   ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   PASS   ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 267s
::   Duration: 267s
::   Assertions: 1 good, 0 bad
::   Assertions: 1 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Cleanup
::   Cleanup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:25:36 ] :: [  BEGIN   ] :: Running 'rm /usr/bin/iperf3-test.py'
:: [ 12:25:36 ] :: [   PASS   ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   PASS   ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   LOG    ] :: iperf3 tests done
:: [ 12:25:36 ] :: [   LOG    ] :: iperf3 tests done
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 1 good, 0 bad
::   Assertions: 1 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   TEST PROTOCOL
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    Package       : iperf3
    Installed     : iperf3-3.5-1.fc29.x86_64
    beakerlib RPM : beakerlib-1.17-13.fc29.noarch
    Test started  : 2018-04-30 12:21:09 UTC
    Test finished : 2018-04-30 12:25:36 UTC (still running)
    Test duration : 267 seconds
    Test name     : miscellaneous-tests
    Distro        : Fedora release 29 (Rawhide)
    Hostname      : localhost
    Architecture  : x86_64
    CPUs          : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C)
    RAM size      : 5938 MB
    HDD size      : 39.12 GB
:: [ 12:21:09 ] :: [ WARNING  ] :: POSIX mode detected and switched off
:: [ 12:21:09 ] :: [ WARNING  ] :: Please fix your test to have /bin/bash shebang

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Setup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:21:09 ] :: [   PASS   ] :: Checking for the presence of iperf3 rpm
:: [ 12:21:09 ] :: [   LOG    ] :: Package versions:
:: [ 12:21:09 ] :: [   LOG    ] ::   iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [   PASS   ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Assertions: 2 good, 0 bad
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Test
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:21:09 ] :: [   LOG    ] :: iperf3 tests
:: [ 12:25:36 ] :: [   PASS   ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 267s
::   Assertions: 1 good, 0 bad
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Cleanup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:25:36 ] :: [   PASS   ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   LOG    ] :: iperf3 tests done
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Assertions: 1 good, 0 bad
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   miscellaneous-tests
::   miscellaneous-tests
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml
:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml
:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt
:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 267s
::   Duration: 267s
::   Phases: 3 good, 0 bad
::   Phases: 3 good, 0 bad
::   OVERALL RESULT: PASS
::   OVERALL RESULT: PASS

posix          	on

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   TEST PROTOCOL
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    Package       : iperf3
    Installed     : iperf3-3.5-1.fc29.x86_64
    beakerlib RPM : beakerlib-1.17-13.fc29.noarch
    Test started  : 2018-04-30 12:21:09 UTC
    Test finished :
    Test duration :
    Test name     : miscellaneous-tests
    Distro        : Fedora release 29 (Rawhide)
    Hostname      : localhost
    Architecture  : x86_64
    CPUs          : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C)
    RAM size      : 5938 MB
    HDD size      : 39.12 GB
:: [ 12:21:09 ] :: [ WARNING  ] :: POSIX mode detected and switched off
:: [ 12:21:09 ] :: [ WARNING  ] :: POSIX mode detected and switched off
:: [ 12:21:09 ] :: [ WARNING  ] :: Please fix your test to have /bin/bash shebang
:: [ 12:21:09 ] :: [ WARNING  ] :: Please fix your test to have /bin/bash shebang

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Setup
::   Setup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [   PASS   ] :: Checking for the presence of iperf3 rpm
:: [ 12:21:09 ] :: [   PASS   ] :: Checking for the presence of iperf3 rpm
:: [ 12:21:09 ] :: [   LOG    ] :: Package versions:
:: [ 12:21:09 ] :: [   LOG    ] :: Package versions:
:: [ 12:21:09 ] :: [   LOG    ] ::   iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [   LOG    ] ::   iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [  BEGIN   ] :: Running 'cp iperf3-test.py /usr/bin/'
:: [ 12:21:09 ] :: [   PASS   ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0)
:: [ 12:21:09 ] :: [   PASS   ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 2 good, 0 bad
::   Assertions: 2 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Test
::   Test
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:21:09 ] :: [   LOG    ] :: iperf3 tests
:: [ 12:21:09 ] :: [   LOG    ] :: iperf3 tests
:: [ 12:21:09 ] :: [  BEGIN   ] :: Running '/usr/bin/python3 /usr/bin/iperf3-test.py'
test_basic_tcp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok
test_basic_udp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok
test_server_daemon_pid_equal_to_pid_file (__main__.Iperf3SanityTests) ... ok
test_server_log_file_exists (__main__.Iperf3SanityTests) ... ok
test_server_pid_file_exists (__main__.Iperf3SanityTests) ... ok
test_tcp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_custom_client_port (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_dscp (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_get_server_output (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_mss (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_parallel (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_reverse (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_time_15sec (__main__.Iperf3Tests) ... ok
test_tcp_client_custom_port_5202_title (__main__.Iperf3Tests) ... ok
test_tcp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok
test_udp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok
test_udp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok
test_tcp_client_bind_to_interface_default_port (__main__.Iperf3TestsBindToInterface) ... ok

----------------------------------------------------------------------
Ran 18 tests in 266.543s

OK
:: [ 12:25:36 ] :: [   PASS   ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   PASS   ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 267s
::   Duration: 267s
::   Assertions: 1 good, 0 bad
::   Assertions: 1 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Cleanup
::   Cleanup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:25:36 ] :: [  BEGIN   ] :: Running 'rm /usr/bin/iperf3-test.py'
:: [ 12:25:36 ] :: [   PASS   ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   PASS   ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   LOG    ] :: iperf3 tests done
:: [ 12:25:36 ] :: [   LOG    ] :: iperf3 tests done
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 1 good, 0 bad
::   Assertions: 1 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   TEST PROTOCOL
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    Package       : iperf3
    Installed     : iperf3-3.5-1.fc29.x86_64
    beakerlib RPM : beakerlib-1.17-13.fc29.noarch
    Test started  : 2018-04-30 12:21:09 UTC
    Test finished : 2018-04-30 12:25:36 UTC (still running)
    Test duration : 267 seconds
    Test name     : miscellaneous-tests
    Distro        : Fedora release 29 (Rawhide)
    Hostname      : localhost
    Architecture  : x86_64
    CPUs          : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C)
    RAM size      : 5938 MB
    HDD size      : 39.12 GB
:: [ 12:21:09 ] :: [ WARNING  ] :: POSIX mode detected and switched off
:: [ 12:21:09 ] :: [ WARNING  ] :: Please fix your test to have /bin/bash shebang

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Setup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:21:09 ] :: [   PASS   ] :: Checking for the presence of iperf3 rpm
:: [ 12:21:09 ] :: [   LOG    ] :: Package versions:
:: [ 12:21:09 ] :: [   LOG    ] ::   iperf3-3.5-1.fc29.x86_64
:: [ 12:21:09 ] :: [   PASS   ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Assertions: 2 good, 0 bad
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Test
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:21:09 ] :: [   LOG    ] :: iperf3 tests
:: [ 12:25:36 ] :: [   PASS   ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 267s
::   Assertions: 1 good, 0 bad
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Cleanup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:25:36 ] :: [   PASS   ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0)
:: [ 12:25:36 ] :: [   LOG    ] :: iperf3 tests done
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Assertions: 1 good, 0 bad
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   miscellaneous-tests
::   miscellaneous-tests
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml
:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml
:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt
:: [ 12:25:36 ] :: [   LOG    ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 267s
::   Duration: 267s
::   Phases: 3 good, 0 bad
::   Phases: 3 good, 0 bad
::   OVERALL RESULT: PASS
::   OVERALL RESULT: PASS
```
Tested by : Bruno Goncalves <bgoncalv@redhat.com>
This commit is contained in:
Susant Sahani 2018-04-30 17:37:45 +05:30
parent 7b371cc0f0
commit 151d610ce0
3 changed files with 432 additions and 0 deletions

View File

@ -0,0 +1,348 @@
#!/usr/bin/env python3
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# iperf3 integration test
# Description: Test for ipertf3
# Author: Susant Sahani <susant@redhat.com>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Copyright (c) 2018 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing
# to use, modify, copy, or redistribute it subject to the terms
# and conditions of the GNU General Public License version 2.
#
# This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import errno
import os
import sys
import time
import unittest
import subprocess
import signal
import shutil
import re
import psutil
IPERF3_SERVER_LOGS='/var/run/iperf3-test-log'
IPERF3_PID_FILE='/var/run/iperf3-test-pid'
TEST_COMPLETE='Test Complete. Summary Results:'
SERVER_TEST_PROTOCOL_TCP_MSG='Starting Test: protocol: TCP'
SERVER_TEST_PROTOCOL_UDP_MSG='Starting Test: protocol: UDP'
SERVER_LISTENING_PORT_5202_MSG='Server listening on 5202'
SERVER_LISTENING_PORT_5201_MSG='Server listening on 5201'
SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG='local 127.0.0.1 port 5202 connected to 127.0.0.1 port \d+'
SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_IPV6_MSG='local ::1 port 5202 connected to ::1 port \d+'
SERVER_CONNECTED_LOCAL_PORT_5201_WITH_REMOTE_PORT_MSG='local 127.0.0.1 port 5201 connected to 127.0.0.1 port \d+'
SERVER_INCOMING_CONNECTION_MSG='Accepted connection from 127.0.0.1, port \d+'
SERVER_INCOMING_CONNECTION_IPV6_MSG='Accepted connection from ::1, port \d+'
CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG='local 127.0.0.1 port \d+ connected to 127.0.0.1 port 5202'
CLIENT_CONNECTED_TO_SERVER_PORT_5201_MSG='local 127.0.0.1 port \d+ connected to 127.0.0.1 port 5201'
CLIENT_CONNECTED_TO_SERVER_PORT_5202_IPV6_MSG='local ::1 port \d+ connected to ::1 port 5202'
CLIENT_TEST_COMPLETE_MSG='iperf Done'
def setUpModule():
"""Initialize the environment, and perform sanity checks on it."""
if shutil.which('iperf3') is None:
raise OSError(errno.ENOENT, 'iperf3 not found')
for pid in psutil.pids():
p = psutil.Process(pid)
if p.name() == "iperf3":
raise unittest.SkipTest('iperf3 is already active')
class Iperf3ServerLogUtilities():
"""Provide a set of utility functions to facilitate iperf3 tests.
This class must be inherited along with unittest.TestCase to define
some required methods.
"""
def findTextInServerLog(self, **kwargs):
"""Look various success lines from iperf3 server logs."""
if kwargs is not None:
with open (IPERF3_SERVER_LOGS, 'rt') as in_file:
contents = in_file.read()
for key in kwargs:
self.assertRegex(contents, kwargs[key])
def KillIperf3Server(self):
time.sleep(3)
try:
with open(IPERF3_PID_FILE, 'r') as f:
pid = f.read().rstrip(' \t\r\n\0')
os.kill(int(pid), signal.SIGTERM)
os.remove(IPERF3_SERVER_LOGS)
os.remove(IPERF3_PID_FILE)
except IOError:
pass
def VerifyPortIsOpenAuto(self, port):
""" Tests whether iperf3 is listening on given port """
netstat_output = subprocess.check_output(['netstat', '-antpl']).rstrip().decode('utf-8')
self.assertIsNotNone(netstat_output)
match='tcp.*' + str(port) +'.*LISTEN.*/iperf3'
self.assertRegex(netstat_output, match)
class Iperf3TestsBindToInterface(unittest.TestCase, Iperf3ServerLogUtilities):
def setUp(self):
"""Setup veth interface"""
subprocess.check_output(['ip', 'link', 'add', 'iperf-veth', 'type', 'veth', 'peer', 'name', 'iperf-veth-peer'])
subprocess.check_output(['ip', 'addr', 'add', '192.168.50.5', 'dev', 'iperf-veth'])
subprocess.check_output(['ip', 'addr', 'add', '192.168.50.6', 'dev', 'iperf-veth-peer'])
subprocess.check_output(['ip', 'link', 'set', 'iperf-veth', 'up'])
subprocess.check_output(['ip', 'link', 'set', 'iperf-veth-peer', 'up'])
"""Start iperf3."""
subprocess.check_output(['iperf3', '-s', '--daemon', '--verbose' , '--logfile', '/var/run/iperf3-test-log', '--pidfile', '/var/run/iperf3-test-pid', '--bind', '192.168.50.5'])
time.sleep(3)
self.VerifyPortIsOpenAuto(5201)
def tearDown(self):
self.KillIperf3Server()
subprocess.check_output(['ip', 'link', 'del', 'iperf-veth'])
def test_tcp_client_bind_to_interface_default_port(self):
client_output = subprocess.check_output(['iperf3', '-c', '192.168.50.5', '--bind', '192.168.50.6']).rstrip().decode('utf-8')
self.assertRegex(client_output, 'Connecting to host 192.168.50.5, port 5201')
self.assertRegex(client_output, 'local 192.168.50.6 port \d+ connected to 192.168.50.5 port 5201')
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1='Accepted connection from 192.168.50.6, port \d+',
test2='local 192.168.50.5 port 5201 connected to 192.168.50.6 port \d+',
test3=SERVER_TEST_PROTOCOL_TCP_MSG,
test4=TEST_COMPLETE)
class Iperf3Tests(unittest.TestCase, Iperf3ServerLogUtilities):
def setUp(self):
"""Start iperf3."""
subprocess.check_output(['iperf3', '-s', '-p', '5202', '--daemon', '--verbose' , '--logfile', '/var/run/iperf3-test-log', '--pidfile', '/var/run/iperf3-test-pid'])
time.sleep(3)
self.VerifyPortIsOpenAuto(5202)
def tearDown(self):
self.KillIperf3Server()
def test_tcp_client_custom_port_5202(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4=SERVER_TEST_PROTOCOL_TCP_MSG,
test5=TEST_COMPLETE)
def test_udp_client_custom_port_5202(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-u', '-p', '5202']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, "Total Datagrams")
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4=SERVER_TEST_PROTOCOL_UDP_MSG,
test5=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_time_15sec(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '-t','15']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4=SERVER_TEST_PROTOCOL_TCP_MSG,
test5='15 second test',
test6=TEST_COMPLETE)
def test_tcp_client_port_5202_ipv6(self):
client_output = subprocess.check_output(['iperf3', '-c', '::1', '-p', '5202']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_IPV6_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_IPV6_MSG,
test2=SERVER_INCOMING_CONNECTION_IPV6_MSG,
test3=SERVER_TEST_PROTOCOL_TCP_MSG,
test4=TEST_COMPLETE)
def test_udp_client_port_5202_ipv6(self):
client_output = subprocess.check_output(['iperf3', '-c', '::1', '-u', '-p', '5202']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_IPV6_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_IPV6_MSG,
test2=SERVER_INCOMING_CONNECTION_IPV6_MSG,
test3=SERVER_TEST_PROTOCOL_UDP_MSG,
test4=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_parallel(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--parallel', '10']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4='Starting Test: protocol: TCP, 10 streams',
test5=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_reverse(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '-R']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, 'Reverse mode, remote host 127.0.0.1 is sending')
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_dscp(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--dscp', '22']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4='tos 22',
test5=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_mss(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--set-mss', '400']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4='TCP MSS: 400',
test5=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_title(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--title', 'Susant']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, "Susant")
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test4=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_get_server_output(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--get-server-output']).rstrip().decode('utf-8')
self.assertRegex(client_output, "Server output:")
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test5=TEST_COMPLETE)
def test_tcp_client_custom_port_5202_custom_client_port(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--bind', '127.0.0.1', '--cport', '5203']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG,
test2='port 5203',
test3=TEST_COMPLETE)
class Iperf3SanityTests(unittest.TestCase, Iperf3ServerLogUtilities):
def setUp(self):
"""Start iperf3 default TCP mode."""
subprocess.check_output(['iperf3', '--daemon', '--server', '--verbose' , '--logfile', '/var/run/iperf3-test-log', '--pidfile', '/var/run/iperf3-test-pid'])
time.sleep(3)
self.VerifyPortIsOpenAuto(5201)
def tearDown(self):
self.KillIperf3Server()
def test_basic_tcp_client_default_port_5201(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1',]).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5201_MSG)
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_LISTENING_PORT_5201_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5201_WITH_REMOTE_PORT_MSG,
test4=SERVER_TEST_PROTOCOL_TCP_MSG,
test5=TEST_COMPLETE)
def test_server_log_file_exists(self):
self.assertTrue(os.path.exists(IPERF3_SERVER_LOGS))
def test_server_pid_file_exists(self):
self.assertTrue(os.path.exists(IPERF3_PID_FILE))
def test_server_daemon_pid_equal_to_pid_file(self):
with open(IPERF3_PID_FILE, 'r') as f:
pid = f.read().rstrip(' \t\r\n\0')
proc_path = os.path.join('/proc/', pid)
self.assertTrue(os.path.exists(proc_path))
process = psutil.Process(int(pid))
self.assertEqual(process.name(), 'iperf3')
f.close()
def test_basic_udp_client_default_port_5201(self):
client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-u']).rstrip().decode('utf-8')
self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5201_MSG)
self.assertRegex(client_output, 'Total Datagrams')
self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG)
self.findTextInServerLog(test1=SERVER_LISTENING_PORT_5201_MSG,
test2=SERVER_INCOMING_CONNECTION_MSG,
test3=SERVER_CONNECTED_LOCAL_PORT_5201_WITH_REMOTE_PORT_MSG,
test4=SERVER_TEST_PROTOCOL_UDP_MSG,
test5=TEST_COMPLETE)
if __name__ == '__main__':
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout,
verbosity=2))

View File

@ -0,0 +1,73 @@
#!/bin/bash
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# runtest.sh of iperf3
# Description: iPerf3 is a tool for active measurements of the maximum
# achievable bandwidth on IP networks.
# Author: Susant Sahani <susant@redhat.com>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Copyright (c) 2018 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing
# to use, modify, copy, or redistribute it subject to the terms
# and conditions of the GNU General Public License version 2.
#
# This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Include Beaker environment
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="iperf3"
Iperf3PidFile="/var/run/iperf3-test-pid"
rlJournalStart
rlPhaseStartSetup
rlAssertRpm $PACKAGE
if pgrep -x "iperf3" > /dev/null
then
rlLog "Iperf3 is already Running"
fi
rlRun "cp iperf3-test.py /usr/bin/"
rlPhaseEnd
rlPhaseStartTest
rlLog "iperf3 tests"
rlRun "/usr/bin/python3 /usr/bin/iperf3-test.py"
rlPhaseEnd
rlPhaseStartCleanup
rlRun "rm /usr/bin/iperf3-test.py"
if [ -f "$Iperf3PidFile" ]
then
rlRun "read Iperf3Pid < $Iperf3PidFile"
rlRun "echo $Iperf3Pid"
if [ -z $Iperf3Pid ]
then
rlRun "kill -9 $Iperf3Pid"
rlRun "rm Iperf3PidFile"
fi
fi
rlLog "iperf3 tests done"
rlPhaseEnd
rlJournalPrintText
rlJournalEnd
rlGetTestState

11
tests/tests.yml Normal file
View File

@ -0,0 +1,11 @@
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- classic
tests:
- miscellaneous-tests
required_packages:
- iperf3
- python3
- net-tools