Correct handling of "remaining" size

Deprecated storage scheme didn't take into account "remaining" size
claims. As and percentage sizes too. This change make it capable to
handle suze size "units".

But it calculate size based on disk size received from caller. Same as
it was done in old storage scheme.

Change-Id: I4d6a59065a1546163615ac4b65411898b942afe2
This commit is contained in:
Dmitry Bogun 2017-01-20 12:55:32 +02:00
parent 525051d0bc
commit 5104e6ae5f
1 changed files with 36 additions and 3 deletions

View File

@ -463,13 +463,12 @@ class DeprecatedPartitionSchemeBuilder(object):
name=disk.dev, label='gpt', install_bootloader=True,
disk_size=self._unpack_size(disk.size).bytes)
for claim in disk.items:
for claim, size_bytes in self._resolve_size_claims(disk):
args = {}
if isinstance(claim, objects.block_device.Partition):
args['keep_data'] = claim.keep_data_flag
partition = old_disk.add_partition(
size=self._unpack_size(claim.size).bytes, guid=claim.guid,
**args)
size=size_bytes, guid=claim.guid, **args)
if isinstance(claim, objects.block_device.FileSystemMixin):
self._add_fs(claim, partition.name)
@ -511,6 +510,40 @@ class DeprecatedPartitionSchemeBuilder(object):
self.schema.add_fs(
device=dev, mount=mount, fstab_enabled=claim.fstab_member, **args)
@classmethod
def _resolve_size_claims(cls, disk):
one_percent = cls._unpack_size(disk.size).bytes // 100
remaining_idx = None
size_used = 0
allocations = []
for claim in disk.items:
size = claim.size
if size.kind == size.KIND_EXACT:
size_bytes = cls._unpack_size(size).bytes
elif size.kind == size.KIND_PERCENTAGE:
size_bytes = cls._unpack_size(size).value_int * one_percent
elif size.kind == size.KIND_BIGGEST:
if remaining_idx is not None:
raise errors.WrongInputDataError(
'Multiple requests on "remaining" space.')
size_bytes = None
else:
raise errors.InternalError(exc_info=False)
if size_bytes is None:
remaining_idx = len(allocations)
else:
size_used += size_bytes
allocations.append((claim, size_bytes))
if remaining_idx is not None:
size_bytes = cls._unpack_size(disk.size).bytes - size_used
claim = allocations[remaining_idx][0]
allocations[remaining_idx] = claim, size_bytes
return allocations
@staticmethod
def _unpack_size(size):
return size.size