standardize ssh auth
[yardstick.git] / yardstick / benchmark / scenarios / networking / pktgen_dpdk.py
1 ##############################################################################
2 # Copyright (c) 2016 ZTE corporation and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9 from __future__ import absolute_import
10 import pkg_resources
11 import logging
12 import time
13
14 import yardstick.ssh as ssh
15 from yardstick.benchmark.scenarios import base
16
17 LOG = logging.getLogger(__name__)
18
19
20 class PktgenDPDKLatency(base.Scenario):
21     """Execute pktgen-dpdk on one vm and execute testpmd on the other vm
22
23   Parameters
24     packetsize - packet size in bytes without the CRC
25         type:    int
26         unit:    bytes
27         default: 64
28     """
29     __scenario_type__ = "PktgenDPDKLatency"
30
31     PKTGEN_DPDK_SCRIPT = 'pktgen_dpdk_latency_benchmark.bash'
32     TESTPMD_SCRIPT = 'testpmd_fwd.bash'
33
34     def __init__(self, scenario_cfg, context_cfg):
35         self.scenario_cfg = scenario_cfg
36         self.context_cfg = context_cfg
37         self.setup_done = False
38
39     def setup(self):
40         """scenario setup"""
41         self.pktgen_dpdk_script = pkg_resources.resource_filename(
42             'yardstick.benchmark.scenarios.networking',
43             PktgenDPDKLatency.PKTGEN_DPDK_SCRIPT)
44         self.testpmd_script = pkg_resources.resource_filename(
45             'yardstick.benchmark.scenarios.networking',
46             PktgenDPDKLatency.TESTPMD_SCRIPT)
47         host = self.context_cfg['host']
48         target = self.context_cfg['target']
49         LOG.info("user:%s, target:%s", target['user'], target['ip'])
50         self.server = ssh.SSH.from_node(target, defaults={"user": "ubuntu"})
51         self.server.wait(timeout=600)
52
53         # copy script to host
54         self.server._put_file_shell(self.testpmd_script, '~/testpmd_fwd.sh')
55
56         LOG.info("user:%s, host:%s", host['user'], host['ip'])
57         self.client = ssh.SSH.from_node(host, defaults={"user": "ubuntu"})
58         self.client.wait(timeout=600)
59
60         # copy script to host
61         self.client._put_file_shell(
62             self.pktgen_dpdk_script, '~/pktgen_dpdk.sh')
63
64         self.setup_done = True
65         self.testpmd_args = ''
66         self.pktgen_args = []
67
68     @staticmethod
69     def get_port_mac(sshclient, port):
70         cmd = "ifconfig |grep HWaddr |grep %s |awk '{print $5}' " % port
71         LOG.debug("Executing command: %s", cmd)
72         status, stdout, stderr = sshclient.execute(cmd)
73
74         if status:
75             raise RuntimeError(stderr)
76         else:
77             return stdout.rstrip()
78
79     @staticmethod
80     def get_port_ip(sshclient, port):
81         cmd = "ifconfig %s |grep 'inet addr' |awk '{print $2}' \
82             |cut -d ':' -f2 " % port
83         LOG.debug("Executing command: %s", cmd)
84         status, stdout, stderr = sshclient.execute(cmd)
85
86         if status:
87             raise RuntimeError(stderr)
88         else:
89             return stdout.rstrip()
90
91     def run(self, result):
92         """execute the benchmark"""
93
94         if not self.setup_done:
95             self.setup()
96
97         if not self.testpmd_args:
98             self.testpmd_args = self.get_port_mac(self.client, 'eth2')
99
100         if not self.pktgen_args:
101             server_rev_mac = self.get_port_mac(self.server, 'eth1')
102             server_send_mac = self.get_port_mac(self.server, 'eth2')
103             client_src_ip = self.get_port_ip(self.client, 'eth1')
104             client_dst_ip = self.get_port_ip(self.client, 'eth2')
105
106             self.pktgen_args = [client_src_ip, client_dst_ip,
107                                 server_rev_mac, server_send_mac]
108
109         options = self.scenario_cfg['options']
110         packetsize = options.get("packetsize", 64)
111         rate = options.get("rate", 100)
112
113         cmd = "screen sudo -E bash ~/testpmd_fwd.sh %s " % (self.testpmd_args)
114         LOG.debug("Executing command: %s", cmd)
115         self.server.send_command(cmd)
116
117         time.sleep(1)
118
119         cmd = "screen sudo -E bash ~/pktgen_dpdk.sh %s %s %s %s %s %s" % \
120             (self.pktgen_args[0], self.pktgen_args[1], self.pktgen_args[2],
121              self.pktgen_args[3], rate, packetsize)
122         LOG.debug("Executing command: %s", cmd)
123         self.client.send_command(cmd)
124
125         # wait for finishing test
126         time.sleep(1)
127
128         cmd = r"""\
129 cat ~/result.log -vT \
130 |awk '{match($0,/\[8;40H +[0-9]+/)} \
131 {print substr($0,RSTART,RLENGTH)}' \
132 |grep -v ^$ |awk '{if ($2 != 0) print $2}'\
133 """
134         client_status, client_stdout, client_stderr = self.client.execute(cmd)
135
136         if client_status:
137             raise RuntimeError(client_stderr)
138
139         avg_latency = 0
140         if client_stdout:
141             latency_list = client_stdout.split('\n')[0:-2]
142             LOG.info("10 samples of latency: %s", latency_list)
143             latency_sum = 0
144             for i in latency_list:
145                 latency_sum += int(i)
146             avg_latency = latency_sum / len(latency_list)
147
148         result.update({"avg_latency": avg_latency})
149
150         if avg_latency and "sla" in self.scenario_cfg:
151             sla_max_latency = int(self.scenario_cfg["sla"]["max_latency"])
152             LOG.info("avg_latency : %d ", avg_latency)
153             LOG.info("sla_max_latency: %d", sla_max_latency)
154             debug_info = "avg_latency %d > sla_max_latency %d" \
155                 % (avg_latency, sla_max_latency)
156             assert avg_latency <= sla_max_latency, debug_info