aboutsummaryrefslogtreecommitdiffstats
path: root/testcases/testcase.py
diff options
context:
space:
mode:
Diffstat (limited to 'testcases/testcase.py')
-rw-r--r--testcases/testcase.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/testcases/testcase.py b/testcases/testcase.py
new file mode 100644
index 00000000..76758c8f
--- /dev/null
+++ b/testcases/testcase.py
@@ -0,0 +1,128 @@
+# Copyright 2015 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.
+"""TestCase base class
+"""
+
+import time
+import csv
+import os
+import logging
+from collections import OrderedDict
+
+import core.component_factory as component_factory
+from core.loader import Loader
+
+class TestCase(object):
+ """TestCase base class
+
+ In this basic form runs RFC2544 throughput test
+ """
+ def __init__(self, cfg, results_dir):
+ """Pull out fields from test config
+
+ No external actions yet.
+ """
+ self._logger = logging.getLogger(__name__)
+ self.name = cfg['Name']
+ self.desc = cfg.get('Description', 'No description given.')
+ self._traffic_type = cfg['Traffic Type']
+ self._deployment = cfg['Deployment']
+ self._collector = cfg['Collector']
+ self._results_dir = results_dir
+
+ def run(self):
+ """Run the test
+
+ All setup and teardown through controllers is included.
+ """
+ self._logger.debug(self.name)
+
+ self._logger.debug("Controllers:")
+ loader = Loader()
+ traffic_ctl = component_factory.create_traffic(
+ self._traffic_type,
+ loader.get_trafficgen_class())
+ vnf_ctl = component_factory.create_vnf(
+ self._deployment,
+ loader.get_vnf_class())
+ vswitch_ctl = component_factory.create_vswitch(
+ self._deployment,
+ loader.get_vswitch_class())
+ collector_ctl = component_factory.create_collector(
+ self._collector,
+ loader.get_collector_class())
+
+ self._logger.debug("Setup:")
+ collector_ctl.log_cpu_stats()
+ with vswitch_ctl:
+ if vnf_ctl:
+ vnf_ctl.start()
+ #TODO 'traffic' is placeholder for traffic dict
+ traffic = {'test': 'rfc2544'}
+ with traffic_ctl:
+ traffic_ctl.send_traffic(traffic)
+
+
+ self._logger.debug("Traffic Results:")
+ traffic_ctl.print_results()
+
+ self._logger.debug("Collector Results:")
+ self._logger.debug(collector_ctl.get_results())
+
+
+ output_file = "result_" + self.name + "_" + self._deployment +".csv"
+
+ self._write_result_to_file(
+ traffic_ctl.get_results(),
+ os.path.join(self._results_dir, output_file))
+
+ @staticmethod
+ def _write_result_to_file(results, output):
+ """Write list of dictionaries to a CSV file.
+
+ Each element on list will create separate row in output file.
+ If output file already exists, data will be appended at the end,
+ otherwise it will be created.
+
+ :param results: list of dictionaries.
+ :param output: path to output file.
+ """
+ with open(output, 'a') as csvfile:
+
+ logging.info("Write results to file: " + output)
+ fieldnames = TestCase._get_unique_keys(results)
+
+ writer = csv.DictWriter(csvfile, fieldnames)
+
+ if not csvfile.tell(): # file is now empty
+ writer.writeheader()
+
+ for result in results:
+ writer.writerow(result)
+
+
+ @staticmethod
+ def _get_unique_keys(list_of_dicts):
+ """Gets unique key values as ordered list of strings in given dicts
+
+ :param list_of_dicts: list of dictionaries.
+
+ :returns: list of unique keys(strings).
+ """
+ result = OrderedDict()
+ for item in list_of_dicts:
+ for key in item.keys():
+ result[key] = ''
+
+ return list(result.keys())