Benchmark Kubernetes Networking Performance
[functest-kubernetes.git] / functest_kubernetes / netperf / netperf.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2021 Orange and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9
10 """
11 Benchmarking Kubernetes Networking Performance
12 """
13
14 import glob
15 import logging
16 import os
17 import shutil
18 import subprocess
19 import time
20
21 from xtesting.core import testcase
22
23
24 class Netperf(testcase.TestCase):
25     """Run Benchmarking Kubernetes Networking Performance"""
26
27     __logger = logging.getLogger(__name__)
28
29     def __init__(self, **kwargs):
30         super(Netperf, self).__init__(**kwargs)
31         self.output_log_name = 'functest-kubernetes.log'
32         self.output_debug_log_name = 'functest-kubernetes.debug.log'
33
34     def check_requirements(self):
35         """Check if launch is in $PATH"""
36         self.is_skipped = not (
37             shutil.which("launch") and shutil.which("plotperf"))
38         if self.is_skipped:
39             self.__logger.warning("launch or plotperf is missing")
40
41     def run(self, **kwargs):
42         self.start_time = time.time()
43         try:
44             if not os.path.exists(self.res_dir):
45                 os.makedirs(self.res_dir)
46             cmd = ['launch', '-iterations', '1', '-kubeConfig',
47                    '/root/.kube/config']
48             output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
49             self.__logger.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
50             lfiles = glob.glob(os.path.join(
51                 'results_netperf-latest', 'netperf-latest*.csv'))
52             results = max(lfiles, key=os.path.getmtime)
53             shutil.move(results, os.path.join(self.res_dir, 'netperf.csv'))
54             cmd = ['plotperf', '-c',
55                    os.path.join(self.res_dir, 'netperf.csv'),
56                    '-o', self.res_dir, '-s', 'netperf']
57             output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
58             self.__logger.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
59             self.result = 100
60             status = testcase.TestCase.EX_OK
61         except Exception:  # pylint: disable=broad-except
62             self.__logger.exception("Can not run Netperf")
63             self.result = 0
64             status = testcase.TestCase.EX_RUN_ERROR
65         self.stop_time = time.time()
66         return status