3 ##############################################################################
4 # Copyright (c) 2015 Ericsson AB and others.
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
12 # Unittest for yardstick.benchmark.scenarios.storage.fio.Fio
14 from __future__ import absolute_import
20 from oslo_serialization import jsonutils
22 from yardstick.benchmark.scenarios.storage import fio
25 @mock.patch('yardstick.benchmark.scenarios.storage.fio.ssh')
26 class FioTestCase(unittest.TestCase):
33 'key_filename': 'mykey.key'
36 self.sample_output = {
37 'read': 'fio_read_sample_output.json',
38 'write': 'fio_write_sample_output.json',
39 'rw': 'fio_rw_sample_output.json'
42 def test_fio_successful_setup(self, mock_ssh):
45 'filename': '/home/ubuntu/data.raw',
50 args = {'options': options}
51 p = fio.Fio(args, self.ctx)
54 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
55 self.assertIsNotNone(p.client)
56 self.assertTrue(p.setup_done)
58 def test_fio_job_file_successful_setup(self, mock_ssh):
61 'job_file': 'job_file.ini',
62 'directory': '/FIO_Test'
64 args = {'options': options}
65 p = fio.Fio(args, self.ctx)
66 mock_ssh.SSH.from_node().execute.return_value = (0, '/dev/vdb', '')
69 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
70 self.assertIsNotNone(p.client)
71 self.assertTrue(p.setup_done)
73 def test_fio_job_file_no_disk__setup(self, mock_ssh):
76 'job_file': 'job_file.ini',
77 'directory': '/FIO_Test'
79 args = {'options': options}
80 p = fio.Fio(args, self.ctx)
81 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
84 mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
85 self.assertIsNotNone(p.client)
86 self.assertTrue(p.setup_done)
88 def test_fio_successful_no_sla(self, mock_ssh):
91 'filename': '/home/ubuntu/data.raw',
96 args = {'options': options}
97 p = fio.Fio(args, self.ctx)
100 p.client = mock_ssh.SSH.from_node()
102 sample_output = self._read_sample_output(self.sample_output['rw'])
103 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
107 expected_result = '{"read_bw": 83888, "read_iops": 20972,' \
108 '"read_lat": 236.8, "write_bw": 84182, "write_iops": 21045,'\
109 '"write_lat": 233.55}'
110 expected_result = jsonutils.loads(expected_result)
111 self.assertEqual(result, expected_result)
113 def test_fio_successful_read_no_sla(self, mock_ssh):
116 'filename': '/home/ubuntu/data.raw',
121 args = {'options': options}
122 p = fio.Fio(args, self.ctx)
125 p.client = mock_ssh.SSH.from_node()
127 sample_output = self._read_sample_output(self.sample_output['read'])
128 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
132 expected_result = '{"read_bw": 36113, "read_iops": 9028,' \
134 expected_result = jsonutils.loads(expected_result)
135 self.assertEqual(result, expected_result)
137 def test_fio_successful_write_no_sla(self, mock_ssh):
140 'filename': '/home/ubuntu/data.raw',
145 args = {'options': options}
146 p = fio.Fio(args, self.ctx)
149 p.client = mock_ssh.SSH.from_node()
151 sample_output = self._read_sample_output(self.sample_output['write'])
152 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
156 expected_result = '{"write_bw": 35107, "write_iops": 8776,'\
157 '"write_lat": 111.74}'
158 expected_result = jsonutils.loads(expected_result)
159 self.assertEqual(result, expected_result)
161 def test_fio_successful_lat_sla(self, mock_ssh):
164 'filename': '/home/ubuntu/data.raw',
171 'sla': {'write_lat': 300.1}
173 p = fio.Fio(args, self.ctx)
176 p.client = mock_ssh.SSH.from_node()
178 sample_output = self._read_sample_output(self.sample_output['rw'])
179 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
183 expected_result = '{"read_bw": 83888, "read_iops": 20972,' \
184 '"read_lat": 236.8, "write_bw": 84182, "write_iops": 21045,'\
185 '"write_lat": 233.55}'
186 expected_result = jsonutils.loads(expected_result)
187 self.assertEqual(result, expected_result)
189 def test_fio_unsuccessful_lat_sla(self, mock_ssh):
192 'filename': '/home/ubuntu/data.raw',
199 'sla': {'write_lat': 200.1}
201 p = fio.Fio(args, self.ctx)
204 p.client = mock_ssh.SSH.from_node()
206 sample_output = self._read_sample_output(self.sample_output['rw'])
207 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
208 self.assertRaises(AssertionError, p.run, result)
210 def test_fio_successful_bw_iops_sla(self, mock_ssh):
213 'filename': '/home/ubuntu/data.raw',
220 'sla': {'read_iops': 20000}
222 p = fio.Fio(args, self.ctx)
225 p.client = mock_ssh.SSH.from_node()
227 sample_output = self._read_sample_output(self.sample_output['rw'])
228 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
232 expected_result = '{"read_bw": 83888, "read_iops": 20972,' \
233 '"read_lat": 236.8, "write_bw": 84182, "write_iops": 21045,'\
234 '"write_lat": 233.55}'
235 expected_result = jsonutils.loads(expected_result)
236 self.assertEqual(result, expected_result)
238 def test_fio_unsuccessful_bw_iops_sla(self, mock_ssh):
241 'filename': '/home/ubuntu/data.raw',
248 'sla': {'read_iops': 30000}
250 p = fio.Fio(args, self.ctx)
253 p.client = mock_ssh.SSH.from_node()
255 sample_output = self._read_sample_output(self.sample_output['rw'])
256 mock_ssh.SSH.from_node().execute.return_value = (0, sample_output, '')
257 self.assertRaises(AssertionError, p.run, result)
259 def test_fio_unsuccessful_script_error(self, mock_ssh):
262 'filename': '/home/ubuntu/data.raw',
267 args = {'options': options}
268 p = fio.Fio(args, self.ctx)
271 p.client = mock_ssh.SSH.from_node()
273 mock_ssh.SSH.from_node().execute.return_value = (1, '', 'FOOBAR')
274 self.assertRaises(RuntimeError, p.run, result)
276 def _read_sample_output(self, file_name):
277 curr_path = os.path.dirname(os.path.abspath(__file__))
278 output = os.path.join(curr_path, file_name)
279 with open(output) as f:
280 sample_output = f.read()
288 if __name__ == '__main__':