diff options
4 files changed, 109 insertions, 13 deletions
diff --git a/samples/iperf3-jitter.yaml b/samples/iperf3-jitter.yaml new file mode 100644 index 000000000..0544c4186 --- /dev/null +++ b/samples/iperf3-jitter.yaml @@ -0,0 +1,45 @@ +--- +# Sample benchmark task config file +# measure packet delay variation (jitter) using iperf3 + +schema: "yardstick:task:0.1" + +scenarios: +- + type: Iperf3 + options: + udp: udp + bandwidth: 20m + host: zeus.demo + target: hera.demo + + runner: + type: Duration + duration: 3 + + sla: + jitter: 10 + action: monitor + +context: + name: demo + image: yardstick-trusty-server + flavor: yardstick-flavor + user: ec2-user + + placement_groups: + pgrp1: + policy: "availability" + + servers: + zeus: + floating_ip: true + placement: "pgrp1" + hera: + floating_ip: true + placement: "pgrp1" + + networks: + test: + cidr: '10.0.1.0/24' + diff --git a/tests/unit/benchmark/scenarios/networking/iperf3_sample_output_udp.json b/tests/unit/benchmark/scenarios/networking/iperf3_sample_output_udp.json new file mode 100644 index 000000000..8173c8f64 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/iperf3_sample_output_udp.json @@ -0,0 +1 @@ +{"start":{"connected":[{"socket":4, "local_host":"10.0.1.2", "local_port":46384, "remote_host":"172.16.9.195", "remote_port":5201}], "version":"iperf 3.0.7", "system_info":"Linux zeus 3.13.0-61-generic #100-Ubuntu SMP Wed Jul 29 11:21:34 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux\n", "timestamp":{"time":"Tue, 29 Sep 2015 01:48:23 GMT", "timesecs":1443491303}, "connecting_to":{"host":"172.16.9.195", "port":5201}, "cookie":"zeus.1443491303.539703.3479129b58a5b", "test_start":{"protocol":"UDP", "num_streams":1, "blksize":8192, "omit":0, "duration":10, "bytes":0, "blocks":0, "reverse":0}}, "intervals":[{"streams":[{"socket":4, "start":0, "end":1.00022, "seconds":1.00022, "bytes":2252800, "bits_per_second":1.80184e+07, "packets":275, "omitted":false}], "sum":{"start":0, "end":1.00022, "seconds":1.00022, "bytes":2252800, "bits_per_second":1.80184e+07, "packets":275, "omitted":false}}, {"streams":[{"socket":4, "start":1.00022, "end":2.00022, "seconds":0.999993, "bytes":2498560, "bits_per_second":1.99886e+07, "packets":305, "omitted":false}], "sum":{"start":1.00022, "end":2.00022, "seconds":0.999993, "bytes":2498560, "bits_per_second":1.99886e+07, "packets":305, "omitted":false}}, {"streams":[{"socket":4, "start":2.00022, "end":3.00022, "seconds":1, "bytes":2506752, "bits_per_second":2.0054e+07, "packets":306, "omitted":false}], "sum":{"start":2.00022, "end":3.00022, "seconds":1, "bytes":2506752, "bits_per_second":2.0054e+07, "packets":306, "omitted":false}}, {"streams":[{"socket":4, "start":3.00022, "end":4.00022, "seconds":1, "bytes":2498560, "bits_per_second":19988480, "packets":305, "omitted":false}], "sum":{"start":3.00022, "end":4.00022, "seconds":1, "bytes":2498560, "bits_per_second":19988480, "packets":305, "omitted":false}}, {"streams":[{"socket":4, "start":4.00022, "end":5.0002, "seconds":0.999977, "bytes":2498560, "bits_per_second":1.99889e+07, "packets":305, "omitted":false}], "sum":{"start":4.00022, "end":5.0002, "seconds":0.999977, "bytes":2498560, "bits_per_second":1.99889e+07, "packets":305, "omitted":false}}, {"streams":[{"socket":4, "start":5.0002, "end":6.00024, "seconds":1.00004, "bytes":2498560, "bits_per_second":1.99877e+07, "packets":305, "omitted":false}], "sum":{"start":5.0002, "end":6.00024, "seconds":1.00004, "bytes":2498560, "bits_per_second":1.99877e+07, "packets":305, "omitted":false}}, {"streams":[{"socket":4, "start":6.00024, "end":7.00023, "seconds":0.999998, "bytes":2498560, "bits_per_second":1.99885e+07, "packets":305, "omitted":false}], "sum":{"start":6.00024, "end":7.00023, "seconds":0.999998, "bytes":2498560, "bits_per_second":1.99885e+07, "packets":305, "omitted":false}}, {"streams":[{"socket":4, "start":7.00023, "end":8.00023, "seconds":0.999999, "bytes":2506752, "bits_per_second":2.0054e+07, "packets":306, "omitted":false}], "sum":{"start":7.00023, "end":8.00023, "seconds":0.999999, "bytes":2506752, "bits_per_second":2.0054e+07, "packets":306, "omitted":false}}, {"streams":[{"socket":4, "start":8.00023, "end":9.00018, "seconds":0.999945, "bytes":2498560, "bits_per_second":1.99896e+07, "packets":305, "omitted":false}], "sum":{"start":8.00023, "end":9.00018, "seconds":0.999945, "bytes":2498560, "bits_per_second":1.99896e+07, "packets":305, "omitted":false}}, {"streams":[{"socket":4, "start":9.00018, "end":10.0002, "seconds":1.00004, "bytes":2498560, "bits_per_second":1.99876e+07, "packets":305, "omitted":false}], "sum":{"start":9.00018, "end":10.0002, "seconds":1.00004, "bytes":2498560, "bits_per_second":1.99876e+07, "packets":305, "omitted":false}}], "end":{"streams":[{"udp":{"socket":4, "start":0, "end":10.0002, "seconds":10.0002, "bytes":24756224, "bits_per_second":1.98045e+07, "jitter_ms":0.0113579, "lost_packets":0, "packets":3022, "lost_percent":0}}], "sum":{"start":0, "end":10.0002, "seconds":10.0002, "bytes":24756224, "bits_per_second":1.98045e+07, "jitter_ms":0.0113579, "lost_packets":0, "packets":3022, "lost_percent":0}, "cpu_utilization_percent":{"host_total":0.647561, "host_user":0.146468, "host_system":0.501083, "remote_total":0.31751, "remote_user":0, "remote_system":0.31751}}} diff --git a/tests/unit/benchmark/scenarios/networking/test_iperf3.py b/tests/unit/benchmark/scenarios/networking/test_iperf3.py index 239e46a1c..8b0da655b 100644 --- a/tests/unit/benchmark/scenarios/networking/test_iperf3.py +++ b/tests/unit/benchmark/scenarios/networking/test_iperf3.py @@ -21,6 +21,8 @@ from yardstick.benchmark.scenarios.networking import iperf3 @mock.patch('yardstick.benchmark.scenarios.networking.iperf3.ssh') class IperfTestCase(unittest.TestCase): + output_name_tcp = 'iperf3_sample_output.json' + output_name_udp = 'iperf3_sample_output_udp.json' def setUp(self): self.ctx = { @@ -66,7 +68,7 @@ class IperfTestCase(unittest.TestCase): options = {} args = {'options': options} - sample_output = self._read_sample_output() + sample_output = self._read_sample_output(self.output_name_tcp) mock_ssh.SSH().execute.return_value = (0, sample_output, '') expected_result = json.loads(sample_output) result = p.run(args) @@ -84,7 +86,7 @@ class IperfTestCase(unittest.TestCase): 'sla': {'bytes_per_second': 15000000} } - sample_output = self._read_sample_output() + sample_output = self._read_sample_output(self.output_name_tcp) mock_ssh.SSH().execute.return_value = (0, sample_output, '') expected_result = json.loads(sample_output) result = p.run(args) @@ -102,7 +104,41 @@ class IperfTestCase(unittest.TestCase): 'sla': {'bytes_per_second': 25000000} } - sample_output = self._read_sample_output() + sample_output = self._read_sample_output(self.output_name_tcp) + mock_ssh.SSH().execute.return_value = (0, sample_output, '') + self.assertRaises(AssertionError, p.run, args) + + def test_iperf_successful_sla_jitter(self, mock_ssh): + + p = iperf3.Iperf(self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + p.host = mock_ssh.SSH() + + options = {"udp":"udp","bandwidth":"20m"} + args = { + 'options': options, + 'sla': {'jitter': 10} + } + + sample_output = self._read_sample_output(self.output_name_udp) + mock_ssh.SSH().execute.return_value = (0, sample_output, '') + expected_result = json.loads(sample_output) + result = p.run(args) + self.assertEqual(result, expected_result) + + def test_iperf_unsuccessful_sla_jitter(self, mock_ssh): + + p = iperf3.Iperf(self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + p.host = mock_ssh.SSH() + + options = {"udp":"udp","bandwidth":"20m"} + args = { + 'options': options, + 'sla': {'jitter': 0.0001} + } + + sample_output = self._read_sample_output(self.output_name_udp) mock_ssh.SSH().execute.return_value = (0, sample_output, '') self.assertRaises(AssertionError, p.run, args) @@ -118,9 +154,9 @@ class IperfTestCase(unittest.TestCase): mock_ssh.SSH().execute.return_value = (1, '', 'FOOBAR') self.assertRaises(RuntimeError, p.run, args) - def _read_sample_output(self): + def _read_sample_output(self,filename): curr_path = os.path.dirname(os.path.abspath(__file__)) - output = os.path.join(curr_path, 'iperf3_sample_output.json') + output = os.path.join(curr_path, filename) with open(output) as f: sample_output = f.read() return sample_output diff --git a/yardstick/benchmark/scenarios/networking/iperf3.py b/yardstick/benchmark/scenarios/networking/iperf3.py index ff625de4d..e31a892d2 100644 --- a/yardstick/benchmark/scenarios/networking/iperf3.py +++ b/yardstick/benchmark/scenarios/networking/iperf3.py @@ -95,8 +95,12 @@ For more info see http://software.es.net/iperf if not options: options = "" + use_UDP = False if "udp" in options: cmd += " --udp" + use_UDP = True + if "bandwidth" in options: + cmd += " --bandwidth %s" % options["bandwidth"] else: # tcp obviously if "nodelay" in options: @@ -120,15 +124,25 @@ For more info see http://software.es.net/iperf output = json.loads(stdout) - # convert bits per second to bytes per second - bytes_per_second = \ - int((output["end"]["sum_received"]["bits_per_second"])) / 8 - if "sla" in args: - sla_bytes_per_second = int(args["sla"]["bytes_per_second"]) - assert bytes_per_second >= sla_bytes_per_second, \ - "bytes_per_second %d < sla (%d)" % \ - (bytes_per_second, sla_bytes_per_second) + sla_iperf = args["sla"] + if not use_UDP: + sla_bytes_per_second = int(sla_iperf["bytes_per_second"]) + + # convert bits per second to bytes per second + bit_per_second = \ + int(output["end"]["sum_received"]["bits_per_second"]) + bytes_per_second = bit_per_second / 8 + assert bytes_per_second >= sla_bytes_per_second, \ + "bytes_per_second %d < sla:bytes_per_second (%d)" % \ + (bytes_per_second, sla_bytes_per_second) + else: + sla_jitter = float(sla_iperf["jitter"]) + + jitter_ms = float(output["end"]["sum"]["jitter_ms"]) + assert jitter_ms <= sla_jitter, \ + "jitter_ms %f > sla:jitter %f" % \ + (jitter_ms, sla_jitter) return output |