summaryrefslogtreecommitdiffstats
path: root/vstf/vstf/controller/sw_perf/perf_provider.py
diff options
context:
space:
mode:
Diffstat (limited to 'vstf/vstf/controller/sw_perf/perf_provider.py')
-rwxr-xr-xvstf/vstf/controller/sw_perf/perf_provider.py209
1 files changed, 209 insertions, 0 deletions
diff --git a/vstf/vstf/controller/sw_perf/perf_provider.py b/vstf/vstf/controller/sw_perf/perf_provider.py
new file mode 100755
index 00000000..bd1027ad
--- /dev/null
+++ b/vstf/vstf/controller/sw_perf/perf_provider.py
@@ -0,0 +1,209 @@
+#!/usr/bin/python
+# -*- coding: utf8 -*-
+# author: wly
+# date: 2015-09-21
+# see license for license details
+
+import logging
+
+LOG = logging.getLogger(__name__)
+
+
+def get_agent_dict(nodes):
+ """
+ :param:
+ nodes: list of flow info
+ and ever element must be a dict and kas key "agent"
+ :return : list for agent
+ :rtype : dict
+ """
+ agent_list = map(lambda x: x["agent"], nodes)
+ return {}.fromkeys(agent_list, False)
+
+
+class PerfProvider(object):
+ def __init__(self, flows_info, tool_info, tester_info):
+ self._flows_info = flows_info
+ self._tool_info = tool_info
+ self._tester_info = tester_info
+
+ def _islation(self):
+ flows = self._flows_info["flows"]
+ if flows == 2 and self._flows_info["senders"][0]["agent"] == self._flows_info["senders"][1]["agent"]:
+ return True
+ return False
+
+ def get_senders(self, tool, protocol):
+ result = []
+ flows = self._flows_info["flows"]
+ if self._islation() and "pktgen" == tool:
+ sender = {
+ "agent": self._flows_info["senders"][0]["agent"],
+ "params": {
+ "protocol": protocol,
+ "namespace": None,
+ "src": [],
+ "dst": [],
+ "time": self._tool_info[tool]["time"],
+ "threads": self._tool_info[tool]["threads"]
+ }
+ }
+ for i in range(flows):
+ sender['params']['src'].append(self._flows_info["senders"][i]['dev'])
+ sender['params']['dst'].append(self._flows_info["receivers"][i]['dev'])
+ result.append(sender)
+ else:
+ for i in range(flows):
+ sender = {
+ "agent": self._flows_info["senders"][i]["agent"],
+ "params": {
+ "protocol": protocol,
+ "namespace": None if "netmap" == tool else self._flows_info["senders"][i]['dev']['namespace'],
+ "src": [self._flows_info["senders"][i]['dev']],
+ "dst": [self._flows_info["receivers"][i]['dev']],
+ "time": self._tool_info[tool]["time"],
+ "threads": self._tool_info[tool]["threads"]
+ }
+ }
+ result.append(sender)
+ return result
+
+ def get_receivers(self, tool, protocol):
+ result = []
+ flows = self._flows_info["flows"]
+ if self._islation() and "pktgen" == tool:
+ receiver = {
+ "agent": self._flows_info["receivers"][0]["agent"],
+ "params": {
+ "namespace": None,
+ "protocol": protocol,
+ }
+ }
+ result.append(receiver)
+ else:
+ for i in range(flows):
+ receiver = {
+ "agent": self._flows_info["receivers"][i]["agent"],
+ "params": {
+ "namespace": None if "netmap" == tool else self._flows_info["receivers"][i]['dev']['namespace'],
+ "protocol": protocol,
+ "dst": [self._flows_info["receivers"][i]['dev']]
+ }
+ }
+ result.append(receiver)
+ return result
+
+ def get_watchers(self, tool):
+ result = []
+ for watcher in self._flows_info["watchers"]:
+ node = {
+ "agent": watcher["agent"],
+ "params": {
+ "iface": watcher['dev']["iface"],
+ "namespace": None if tool in ["pktgen", "netmap"] else watcher['dev']["namespace"],
+ }
+ }
+ result.append(node)
+ return result
+
+ def get_namespaces(self, tool):
+ result = []
+
+ for watcher in self._flows_info["namespaces"]:
+ node = {
+ "agent": watcher["agent"],
+ "params": {
+ "iface": watcher['dev']["iface"],
+ "namespace": watcher['dev']["namespace"] if tool not in ["pktgen", "netmap"] else None,
+ "ip": watcher['dev']["ip"] + '/24',
+ }
+ }
+ result.append(node)
+ return result
+
+ @property
+ def get_cpuwatcher(self):
+ LOG.info(self._flows_info["cpu_listens"])
+ result = {
+ "agent": self._flows_info["cpu_listens"][0]["agent"],
+ "params": {
+ }
+ }
+ return result
+
+ @property
+ def get_cpu_affctl(self):
+ LOG.info(self._flows_info["cpu_listens"])
+ result = {
+ "agent": self._flows_info["cpu_listens"][0]["agent"],
+ "params": {
+ "policy": self._flows_info["cpu_listens"][0]["affctl"]["policy"]
+ }
+ }
+ return result
+
+ def get_cleaners(self, tool, protocol):
+ nodes = self.get_senders(tool, protocol) + \
+ self.get_receivers(tool, protocol) + \
+ self.get_watchers(tool) + \
+ [self.get_cpuwatcher]
+ return get_agent_dict(nodes).keys()
+
+ @property
+ def get_testers(self):
+ agents = get_agent_dict(self._flows_info["namespaces"]).keys()
+ result = []
+ for agent in agents:
+ node = {
+ "agent": agent,
+ "params": {
+ "drivers": self._tester_info["drivers"]
+ }
+ }
+ result.append(node)
+ return result
+
+ def duration(self, tool):
+ return self._tool_info[tool]["time"]
+
+ def wait_balance(self, tool):
+ return self._tool_info[tool]["wait"]
+
+
+def unit_test():
+ from vstf.common.log import setup_logging
+ setup_logging(level=logging.DEBUG, log_file="/var/log/vstf/vstf-perf-provider.log", clevel=logging.INFO)
+
+ from vstf.controller.settings.flows_settings import FlowsSettings
+ from vstf.controller.settings.tool_settings import ToolSettings
+ from vstf.controller.settings.tester_settings import TesterSettings
+
+ flows_settings = FlowsSettings()
+ tool_settings = ToolSettings()
+ tester_settings = TesterSettings()
+
+ provider = PerfProvider(flows_settings.settings, tool_settings.settings, tester_settings.settings)
+
+ tools = ['pktgen']
+ protocols = ['udp_bw', 'udp_lat']
+
+ for tool in tools:
+ LOG.info(tool)
+ for protocol in protocols:
+ LOG.info(protocol)
+ senders = provider.get_senders(tool, protocols)
+ LOG.info(len(senders))
+ LOG.info(senders)
+
+ receivers = provider.get_receivers(tool, protocols)
+ LOG.info(len(receivers))
+ LOG.info(receivers)
+
+ LOG.info(provider.get_cpuwatcher)
+ LOG.info(provider.get_watchers(tool))
+ LOG.info(provider.get_namespaces(tool))
+ LOG.info(provider.duration(tool))
+
+
+if __name__ == '__main__':
+ unit_test()