Skip to content

Commit

Permalink
Merge pull request ceph#43982 from guits/refactor_cv_human_readable_func
Browse files Browse the repository at this point in the history
ceph-volume: human_readable_size() refactor
  • Loading branch information
guits committed Nov 23, 2021
2 parents 292b9a3 + 6940856 commit b93262f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
15 changes: 13 additions & 2 deletions src/ceph-volume/ceph_volume/tests/util/test_disk.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ def test_terabytes(self):
result = disk.human_readable_size(81.2*1024*1024*1024*1024)
assert result == '81.20 TB'

def test_petabytes(self):
result = disk.human_readable_size(9.23*1024*1024*1024*1024*1024)
assert result == '9.23 PB'

class TestSizeFromHumanReadable(object):

Expand All @@ -143,10 +146,14 @@ def test_gigabytes(self):
result = disk.size_from_human_readable('2 G')
assert result == disk.Size(gb=2)

def test_terrabytes(self):
def test_terabytes(self):
result = disk.size_from_human_readable('2 T')
assert result == disk.Size(tb=2)

def test_petabytes(self):
result = disk.size_from_human_readable('2 P')
assert result == disk.Size(pb=2)

def test_case(self):
result = disk.size_from_human_readable('2 t')
assert result == disk.Size(tb=2)
Expand Down Expand Up @@ -182,10 +189,14 @@ def test_gigabytes(self):
result = disk.Size.parse('2G')
assert result == disk.Size(gb=2)

def test_terrabytes(self):
def test_terabytes(self):
result = disk.Size.parse('2T')
assert result == disk.Size(tb=2)

def test_petabytes(self):
result = disk.Size.parse('2P')
assert result == disk.Size(pb=2)

def test_tb(self):
result = disk.Size.parse('2Tb')
assert result == disk.Size(tb=2)
Expand Down
25 changes: 16 additions & 9 deletions src/ceph-volume/ceph_volume/util/disk.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,8 @@ class FloatKB(BaseFloatUnit):
class FloatTB(BaseFloatUnit):
pass

class FloatPB(BaseFloatUnit):
pass

class Size(object):
"""
Expand Down Expand Up @@ -456,10 +458,10 @@ class Size(object):
@classmethod
def parse(cls, size):
if (len(size) > 2 and
size[-2].lower() in ['k', 'm', 'g', 't'] and
size[-2].lower() in ['k', 'm', 'g', 't', 'p'] and
size[-1].lower() == 'b'):
return cls(**{size[-2:].lower(): float(size[0:-2])})
elif size[-1].lower() in ['b', 'k', 'm', 'g', 't']:
elif size[-1].lower() in ['b', 'k', 'm', 'g', 't', 'p']:
return cls(**{size[-1].lower(): float(size[0:-1])})
else:
return cls(b=float(size))
Expand All @@ -474,6 +476,7 @@ def __init__(self, multiplier=1024, **kw):
[('m', 'mb', 'megabytes'), self._multiplier ** 2],
[('g', 'gb', 'gigabytes'), self._multiplier ** 3],
[('t', 'tb', 'terabytes'), self._multiplier ** 4],
[('p', 'pb', 'petabytes'), self._multiplier ** 5]
]
# and mappings for units-to-formatters, including bytes and aliases for
# each
Expand All @@ -483,6 +486,7 @@ def __init__(self, multiplier=1024, **kw):
[('mb', 'megabytes'), FloatMB],
[('gb', 'gigabytes'), FloatGB],
[('tb', 'terabytes'), FloatTB],
[('pb', 'petabytes'), FloatPB],
]
self._formatters = {}
for key, value in format_aliases:
Expand Down Expand Up @@ -516,7 +520,7 @@ def _get_best_format(self):
than 1024. This allows to represent size in the most readable format
available
"""
for unit in ['b', 'kb', 'mb', 'gb', 'tb']:
for unit in ['b', 'kb', 'mb', 'gb', 'tb', 'pb']:
if getattr(self, unit) > 1024:
continue
return getattr(self, unit)
Expand Down Expand Up @@ -632,14 +636,15 @@ def human_readable_size(size):
Take a size in bytes, and transform it into a human readable size with up
to two decimals of precision.
"""
suffixes = ['B', 'KB', 'MB', 'GB', 'TB']
suffix_index = 0
while size > 1024:
suffix_index += 1
size = size / 1024.0
suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
for suffix in suffixes:
if size >= 1024:
size = size / 1024
else:
break
return "{size:.2f} {suffix}".format(
size=size,
suffix=suffixes[suffix_index])
suffix=suffix)


def size_from_human_readable(s):
Expand All @@ -651,6 +656,8 @@ def size_from_human_readable(s):
if s[-1].isdigit():
return Size(b=float(s))
n = float(s[:-1])
if s[-1].lower() == 'p':
return Size(pb=n)
if s[-1].lower() == 't':
return Size(tb=n)
if s[-1].lower() == 'g':
Expand Down

0 comments on commit b93262f

Please sign in to comment.