def test_msdos_disk_chunk1(self): disk_size = Size("100 MiB") with sparsetmpfile("chunktest", disk_size) as disk_file: disk = DiskFile(disk_file) disk.format = get_format("disklabel", device=disk.path, exists=False, label_type="msdos") p1 = PartitionDevice("p1", size=Size("10 MiB"), grow=True) p2 = PartitionDevice("p2", size=Size("30 MiB"), grow=True) disks = [disk] partitions = [p1, p2] free = get_free_regions([disk]) self.assertEqual(len(free), 1, "free region count %d not expected" % len(free)) b = Mock(spec=Blivet) allocate_partitions(b, disks, partitions, free) requests = [PartitionRequest(p) for p in partitions] chunk = DiskChunk(free[0], requests=requests) # parted reports a first free sector of 32 for msdos on disk files. whatever. # XXX on gpt, the start is increased to 34 and the end is reduced from 204799 to 204766, # yielding an expected length of 204733 length_expected = 204768 self.assertEqual(chunk.length, length_expected) base_expected = sum(p.parted_partition.geometry.length for p in partitions) self.assertEqual(chunk.base, base_expected) pool_expected = chunk.length - base_expected self.assertEqual(chunk.pool, pool_expected) self.assertEqual(chunk.done, False) self.assertEqual(chunk.remaining, 2) chunk.grow_requests() self.assertEqual(chunk.done, True) self.assertEqual(chunk.pool, 0) self.assertEqual(chunk.remaining, 2) # # validate the growth (everything in sectors) # # The chunk length is 204768. The base of p1 is 20480. The base of # p2 is 61440. The chunk has a base of 81920 and a pool of 122848. # # p1 should grow by 30712 while p2 grows by 92136 since p2's base # size is exactly three times that of p1. self.assertEqual(requests[0].growth, 30712) self.assertEqual(requests[1].growth, 92136)
def test_msdos_disk_chunk2(self): disk_size = Size("100 MiB") with sparsetmpfile("chunktest", disk_size) as disk_file: disk = DiskFile(disk_file) disk.format = get_format("disklabel", device=disk.path, exists=False, label_type="msdos") p1 = PartitionDevice("p1", size=Size("10 MiB"), grow=True) p2 = PartitionDevice("p2", size=Size("30 MiB"), grow=True) # format max size should be reflected in request max growth fmt = get_format("dummy") fmt._max_size = Size("12 MiB") p3 = PartitionDevice("p3", size=Size("10 MiB"), grow=True, fmt=fmt) p4 = PartitionDevice("p4", size=Size("7 MiB")) # partition max size should be reflected in request max growth p5 = PartitionDevice("p5", size=Size("5 MiB"), grow=True, maxsize=Size("6 MiB")) disks = [disk] partitions = [p1, p2, p3, p4, p5] free = get_free_regions([disk]) self.assertEqual(len(free), 1, "free region count %d not expected" % len(free)) b = Mock(spec=Blivet) allocate_partitions(b, disks, partitions, free) requests = [PartitionRequest(p) for p in partitions] chunk = DiskChunk(free[0], requests=requests) self.assertEqual(len(chunk.requests), len(partitions)) # parted reports a first free sector of 32 for disk files. whatever. length_expected = 204768 self.assertEqual(chunk.length, length_expected) growable = [p for p in partitions if p.req_grow] fixed = [p for p in partitions if not p.req_grow] base_expected = sum(p.parted_partition.geometry.length for p in growable) self.assertEqual(chunk.base, base_expected) base_fixed = sum(p.parted_partition.geometry.length for p in fixed) pool_expected = chunk.length - base_expected - base_fixed self.assertEqual(chunk.pool, pool_expected) self.assertEqual(chunk.done, False) # since p5 is not growable it is initially done self.assertEqual(chunk.remaining, 4) chunk.grow_requests() # # validate the growth (in sectors) # # The chunk length is 204768. # Request bases: # p1 20480 # p2 61440 # p3 20480 # p4 14336 (not included in chunk base since it isn't growable) # p5 10240 # # The chunk has a base 112640 and a pool of 77792. # # Request max growth: # p1 0 # p2 0 # p3 4096 # p4 0 # p5 2048 # # The first round should allocate to p1, p2, p3, p5 at a ratio of # 2:6:2:1, which is 14144, 42432, 14144, 7072. Due to max growth, # p3 and p5 will be limited and the extra (10048, 5024) will remain # in the pool. In the second round the remaining requests will be # p1 and p2. They will divide up the pool of 15072 at a ratio of # 1:3, which is 3768 and 11304. At this point the pool should be # empty. # # Total growth: # p1 17912 # p2 53736 # p3 4096 # p4 0 # p5 2048 # self.assertEqual(chunk.done, True) self.assertEqual(chunk.pool, 0) self.assertEqual(chunk.remaining, 2) # p1, p2 have no max # chunk.requests got sorted, so use the list whose order we know self.assertEqual(requests[0].growth, 17912) self.assertEqual(requests[1].growth, 53736) self.assertEqual(requests[2].growth, 4096) self.assertEqual(requests[3].growth, 0) self.assertEqual(requests[4].growth, 2048)
def test_disk_chunk2(self): disk_size = Size("100 MiB") with sparsetmpfile("chunktest", disk_size) as disk_file: disk = DiskFile(disk_file) disk.format = get_format("disklabel", device=disk.path, exists=False) p1 = PartitionDevice("p1", size=Size("10 MiB"), grow=True) p2 = PartitionDevice("p2", size=Size("30 MiB"), grow=True) # format max size should be reflected in request max growth fmt = get_format("dummy") fmt._max_size = Size("12 MiB") p3 = PartitionDevice("p3", size=Size("10 MiB"), grow=True, fmt=fmt) p4 = PartitionDevice("p4", size=Size("7 MiB")) # partition max size should be reflected in request max growth p5 = PartitionDevice("p5", size=Size("5 MiB"), grow=True, maxsize=Size("6 MiB")) disks = [disk] partitions = [p1, p2, p3, p4, p5] free = get_free_regions([disk]) self.assertEqual(len(free), 1, "free region count %d not expected" % len(free)) b = Mock(spec=Blivet) allocate_partitions(b, disks, partitions, free) requests = [PartitionRequest(p) for p in partitions] chunk = DiskChunk(free[0], requests=requests) self.assertEqual(len(chunk.requests), len(partitions)) # parted reports a first free sector of 32 for disk files. whatever. length_expected = 204768 self.assertEqual(chunk.length, length_expected) growable = [p for p in partitions if p.req_grow] fixed = [p for p in partitions if not p.req_grow] base_expected = sum(p.parted_partition.geometry.length for p in growable) self.assertEqual(chunk.base, base_expected) base_fixed = sum(p.parted_partition.geometry.length for p in fixed) pool_expected = chunk.length - base_expected - base_fixed self.assertEqual(chunk.pool, pool_expected) self.assertEqual(chunk.done, False) # since p5 is not growable it is initially done self.assertEqual(chunk.remaining, 4) chunk.grow_requests() # # validate the growth (in sectors) # # The chunk length is 204768. # Request bases: # p1 20480 # p2 61440 # p3 20480 # p4 14336 (not included in chunk base since it isn't growable) # p5 10240 # # The chunk has a base 112640 and a pool of 77792. # # Request max growth: # p1 0 # p2 0 # p3 4096 # p4 0 # p5 2048 # # The first round should allocate to p1, p2, p3, p5 at a ratio of # 2:6:2:1, which is 14144, 42432, 14144, 7072. Due to max growth, # p3 and p5 will be limited and the extra (10048, 5024) will remain # in the pool. In the second round the remaining requests will be # p1 and p2. They will divide up the pool of 15072 at a ratio of # 1:3, which is 3768 and 11304. At this point the pool should be # empty. # # Total growth: # p1 17912 # p2 53736 # p3 4096 # p4 0 # p5 2048 # self.assertEqual(chunk.done, True) self.assertEqual(chunk.pool, 0) self.assertEqual(chunk.remaining, 2) # p1, p2 have no max # chunk.requests got sorted, so use the list whose order we know self.assertEqual(requests[0].growth, 17912) self.assertEqual(requests[1].growth, 53736) self.assertEqual(requests[2].growth, 4096) self.assertEqual(requests[3].growth, 0) self.assertEqual(requests[4].growth, 2048)