aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMartin Klozik <martinx.klozik@intel.com>2016-09-20 15:49:46 +0100
committerMartin Klozik <martinx.klozik@intel.com>2016-10-05 12:39:17 +0100
commitf437566cf8c52619d062dd05447e6d512a138ce9 (patch)
tree1d500099492721c56acde5f5b001634900f5855b /tools
parente3c52e2eeacc1ec995b9492ce8315fb166886fdd (diff)
integration: Test vHost User numa awareness
Open vSwitch with DPDK can optimize memory usage in case of NUMA architecture to avoid unnecessary memory access across NUMA slots. In a nutshell, PMD threads serving virtual NICs are co-located at the same NUMA slot as QEMU instance, which is using these NICs. This patch adds new (functional) integration testcase, which verifies OVS vHost User numa awareness feature. Step driven test objects were updated to allow a call of OS utilies and evaluation of conditions. Also the documentation was updated with the list of supported test objects and their methods. JIRA: VSPERF-377 Change-Id: I184e71e066d27b5b9fc9e6a9f7e240e2d1b5a0fa Signed-off-by: Martin Klozik <martinx.klozik@intel.com> Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com> Reviewed-by: Ciara Loftus <ciara.loftus@intel.com> Reviewed-by: Al Morton <acmorton@att.com> Reviewed-by: Christian Trautman <ctrautma@redhat.com> Reviewed-by: Bill Michalowski <bmichalo@redhat.com> Reviewed-by: Antonio Fischetti <antonio.fischetti@intel.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/teststepstools.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/tools/teststepstools.py b/tools/teststepstools.py
new file mode 100644
index 00000000..d39f7f40
--- /dev/null
+++ b/tools/teststepstools.py
@@ -0,0 +1,90 @@
+# 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.
+
+"""Various helper functions for step driven testcases
+"""
+
+import re
+import logging
+import subprocess
+import locale
+
+class TestStepsTools(object):
+ """ Various tools and functions used by step driven testcases
+ """
+ # Functions use nonstandard names to avoid conflicts with
+ # standard python keywords.
+ # pylint: disable=invalid-name
+ def __init__(self):
+ """ TestStepsTools initialization
+ """
+ self._logger = logging.getLogger(__name__)
+
+ def Assert(self, condition):
+ """ Evaluate given `condition' and raise AssertionError
+ in case, that evaluation fails
+ """
+ try:
+ assert self.Eval(condition)
+ except AssertionError:
+ self._logger.error('Condition %s is not True', condition)
+ raise
+
+ return True
+
+ @staticmethod
+ def validate_Assert(result, dummy_condition):
+ """ Validate evaluation of given `condition'
+ """
+ return result
+
+ @staticmethod
+ def Eval(expression):
+ """ Evaluate python `expression' and return its result
+ """
+ # pylint: disable=eval-used
+ return eval(expression)
+
+ @staticmethod
+ def validate_Eval(result, dummy_expression):
+ """ Validate result of python `expression' evaluation
+ """
+ return result is not None
+
+ @staticmethod
+ def Exec(command, regex=None):
+ """ Execute a shell `command' and return its output filtered
+ out by optional `regex' expression.
+ """
+ try:
+ output = subprocess.check_output(command, shell=True)
+ except OSError:
+ return None
+
+ output = output.decode(locale.getdefaultlocale()[1])
+
+ if regex:
+ for line in output.split('\n'):
+ result = re.findall(regex, line)
+ if result:
+ return result
+ return []
+
+ return output
+
+ @staticmethod
+ def validate_Exec(result, dummy_command, dummy_regex=None):
+ """ validate result of shell `command' execution
+ """
+ return result is not None