Allow users to specify object sizes with k/M/G suffixes

Change-Id: Ie8671e2313b76376d123c9d4eafcc1aff44ba0b8
This commit is contained in:
Tim Burke 2019-08-29 13:17:24 -07:00
parent f221632a82
commit fc53cbf147
3 changed files with 59 additions and 4 deletions

View File

@ -33,7 +33,8 @@ from six.moves import range
import swiftclient as client
from swiftbench.utils import config_true_value, using_http_proxy
from swiftbench.utils import config_true_value, using_http_proxy, \
get_size_bytes
try:
@ -219,10 +220,10 @@ class Bench(object):
logger.warn("Communication with Swift server is going through "
"HTTP proxy server. This could affect test result")
self.object_size = int(conf.object_size)
self.object_size = get_size_bytes(conf.object_size)
self.object_sources = conf.object_sources
self.lower_object_size = int(conf.lower_object_size)
self.upper_object_size = int(conf.upper_object_size)
self.lower_object_size = get_size_bytes(conf.lower_object_size)
self.upper_object_size = get_size_bytes(conf.upper_object_size)
self.files = []
if self.object_sources:
self.object_sources = self.object_sources.split()

View File

@ -89,3 +89,22 @@ def using_http_proxy(url):
"""
up = urlparse(url)
return up.scheme.lower() in getproxies() and not proxy_bypass(up.netloc)
def get_size_bytes(value):
"""
Expand suffixes for object sizes.
For example, '10k' becomes 10240, and '2M' becomes 2097152.
"""
if not isinstance(value, six.string_types):
raise TypeError
value = value.strip()
multiple = {
'G': 1024 ** 3,
'M': 1024 ** 2,
'k': 1024,
}.get(value[-1])
if multiple is None:
return int(value)
return multiple * int(value[:-1])

View File

@ -120,5 +120,40 @@ log_name = %(yarr)s'''
self.assertFalse(utils.using_http_proxy("dummy://localhost/"))
self.assertFalse(utils.using_http_proxy("dummy://host1/"))
def test_get_size_bytes(self):
self.assertEqual(utils.get_size_bytes('10M'), 10 * 1024 * 1024)
self.assertEqual(utils.get_size_bytes('4k'), 4096)
self.assertEqual(utils.get_size_bytes('5G'), 5 * 1024 * 1024 * 1024)
self.assertEqual(utils.get_size_bytes('1234'), 1234)
self.assertEqual(utils.get_size_bytes('1 k'), 1024)
self.assertEqual(utils.get_size_bytes(' 1k'), 1024)
self.assertEqual(utils.get_size_bytes('1k '), 1024)
with self.assertRaises(ValueError):
utils.get_size_bytes('1K')
with self.assertRaises(ValueError):
utils.get_size_bytes('1m')
with self.assertRaises(ValueError):
utils.get_size_bytes('1g')
with self.assertRaises(ValueError):
utils.get_size_bytes('1kb')
with self.assertRaises(ValueError):
utils.get_size_bytes('1kB')
with self.assertRaises(ValueError):
utils.get_size_bytes('1T')
with self.assertRaises(ValueError):
utils.get_size_bytes('1P')
with self.assertRaises(ValueError):
utils.get_size_bytes('1E')
with self.assertRaises(ValueError):
utils.get_size_bytes('1Y')
with self.assertRaises(ValueError):
utils.get_size_bytes('asdf')
with self.assertRaises(TypeError):
utils.get_size_bytes(1)
if __name__ == '__main__':
unittest.main()