Merge pull request #709 from wllacer/master

Solves issue #689. Attribute Error.'None type' has no attribute 'form…
This commit is contained in:
Anton Hvornum 2021-11-11 07:55:16 +00:00 committed by GitHub
commit 273b7aaa99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 14 deletions

View File

@ -1,9 +1,11 @@
import os import os
import json import json
import logging import logging
import time
from ..exceptions import DiskError from ..exceptions import DiskError
from ..output import log from ..output import log
from ..general import SysCommand from ..general import SysCommand
from ..storage import storage
GIGA = 2 ** 30 GIGA = 2 ** 30
@ -213,6 +215,15 @@ class BlockDevice:
self.part_cache = {} self.part_cache = {}
def get_partition(self, uuid): def get_partition(self, uuid):
for partition in self: count = 0
if partition.uuid == uuid: while count < 5:
return partition for partition in self:
if partition.uuid == uuid:
return partition
else:
log(f"uuid {uuid} not found. Waiting for {count +1} time",level=logging.DEBUG)
time.sleep(float(storage['arguments'].get('disk-sleep', 0.2)))
count += 1
else:
log(f"Could not find {uuid} in disk after 5 retries",level=logging.INFO)
raise DiskError(f"New partition {uuid} never showed up after adding new partition on {self}")

View File

@ -167,17 +167,21 @@ class Filesystem:
parted_string = f'{self.blockdevice.device} mkpart {partition_type} {start} {end}' parted_string = f'{self.blockdevice.device} mkpart {partition_type} {start} {end}'
if self.parted(parted_string): if self.parted(parted_string):
start_wait = time.time() count = 0
while count < 10:
while previous_partition_uuids == {partition.uuid for partition in self.blockdevice.partitions.values()}: new_uuid = None
if time.time() - start_wait > 10: new_uuid_set = (previous_partition_uuids ^ {partition.uuid for partition in self.blockdevice.partitions.values()})
raise DiskError(f"New partition never showed up after adding new partition on {self} (timeout 10 seconds).") if len(new_uuid_set) > 0:
time.sleep(0.025) new_uuid = new_uuid_set.pop()
if new_uuid:
# Todo: Find a better way to detect if the new UUID of the partition has showed up. return self.blockdevice.get_partition(new_uuid)
# But this will address (among other issues) else:
time.sleep(float(storage['arguments'].get('disk-sleep', 2.0))) # Let the kernel catch up with quick block devices (nvme for instance) count += 1
return self.blockdevice.get_partition(uuid=(previous_partition_uuids ^ {partition.uuid for partition in self.blockdevice.partitions.values()}).pop()) log(f"Could not get uuid for partition. Waiting for the {count} time",level=logging.DEBUG)
time.sleep(float(storage['arguments'].get('disk-sleep', 0.2)))
else:
log("Add partition exiting due to excesive wait time",level=logging.INFO)
raise DiskError(f"New partition never showed up after adding new partition on {self}.")
def set_name(self, partition: int, name: str): def set_name(self, partition: int, name: str):
return self.parted(f'{self.blockdevice.device} name {partition + 1} "{name}"') == 0 return self.parted(f'{self.blockdevice.device} name {partition + 1} "{name}"') == 0