Merge pull request #52 from CanonicalLtd/fix-avail-disk-view

Don't display mounted disks except during dry-run
This commit is contained in:
Adam Stokes 2015-09-28 14:04:54 -04:00
commit 80ca9c1cae
4 changed files with 47 additions and 13 deletions

View File

@ -37,7 +37,7 @@ UEFI_GRUB_SIZE_BYTES = 512 * 1024 * 1024 # 512MiB EFI partition
class FilesystemController(ControllerPolicy): class FilesystemController(ControllerPolicy):
def __init__(self, common): def __init__(self, common):
super().__init__(common) super().__init__(common)
self.model = FilesystemModel(self.prober) self.model = FilesystemModel(self.prober, self.opts)
self.iscsi_model = IscsiDiskModel() self.iscsi_model = IscsiDiskModel()
self.ceph_model = CephDiskModel() self.ceph_model = CephDiskModel()
self.raid_model = RaidModel() self.raid_model = RaidModel()

View File

@ -169,10 +169,14 @@ class Blockdev():
def available(self): def available(self):
''' return True if has free space or partitions not ''' return True if has free space or partitions not
assigned ''' assigned '''
if self.freespace > 0.0: if not self.is_mounted() and self.freespace > 0.0:
return True return True
return False return False
@property
def mounted(self):
return self.is_mounted()
@property @property
def usedspace(self, unit='b'): def usedspace(self, unit='b'):
''' return amount of used space''' ''' return amount of used space'''
@ -269,8 +273,21 @@ class Blockdev():
with open('/proc/mounts') as pm: with open('/proc/mounts') as pm:
mounts = pm.read() mounts = pm.read()
regexp = '{}.*'.format(self.disk.devpath) # collect any /dev/* device and use
matches = re.findall(regexp, mounts) # dict to uniq the list of devices mounted
mounted_devs = {}
for mnt in re.findall('/dev/.*', mounts):
log.debug('mnt={}'.format(mnt))
(devpath, mount, *_) = mnt.split()
# resolve any symlinks
mounted_devs.update(
{os.path.realpath(devpath): mount})
log.debug('mounted_devs: {}'.format(mounted_devs))
matches = [dev for dev in mounted_devs.keys()
if dev.startswith(self.disk.devpath)]
log.debug('Checking if {} is in {}'.format(
self.disk.devpath, matches))
if len(matches) > 0: if len(matches) > 0:
log.debug('Device is mounted: {}'.format(matches)) log.debug('Device is mounted: {}'.format(matches))
return True return True

View File

@ -90,7 +90,8 @@ class FilesystemModel(ModelPolicy):
'leave unformatted' 'leave unformatted'
] ]
def __init__(self, prober): def __init__(self, prober, opts):
self.opts = opts
self.prober = prober self.prober = prober
self.info = {} self.info = {}
self.devices = {} self.devices = {}
@ -140,6 +141,10 @@ class FilesystemModel(ModelPolicy):
size=self.info[disk].size) size=self.info[disk].size)
return self.devices[disk] return self.devices[disk]
def get_disks(self):
return [self.get_disk(d) for d in sorted(self.info.keys())
if len(d) > 0]
def get_partitions(self): def get_partitions(self):
log.debug('probe_storage: get_partitions()') log.debug('probe_storage: get_partitions()')
partitions = [] partitions = []
@ -154,7 +159,8 @@ class FilesystemModel(ModelPolicy):
return partitions return partitions
def get_available_disks(self): def get_available_disks(self):
return sorted(self.info.keys()) return [dev.disk.devpath for dev in self.get_disks()
if self.opts.dry_run is True or dev.mounted is False]
def get_used_disks(self): def get_used_disks(self):
return [dev.disk.devpath for dev in self.devices.values() return [dev.disk.devpath for dev in self.devices.values()

View File

@ -380,6 +380,7 @@ class FilesystemView(ViewPolicy):
self.signal = signal self.signal = signal
self.items = [] self.items = []
self.model.probe_storage() # probe before we complete self.model.probe_storage() # probe before we complete
self.installable = True
self.body = [ self.body = [
Padding.center_79(Text("FILE SYSTEM")), Padding.center_79(Text("FILE SYSTEM")),
Padding.center_79(self._build_partition_list()), Padding.center_79(self._build_partition_list()),
@ -437,12 +438,17 @@ class FilesystemView(ViewPolicy):
def _build_buttons(self): def _build_buttons(self):
log.debug('FileSystemView: building buttons') log.debug('FileSystemView: building buttons')
buttons = [ buttons = []
Color.button(done_btn(on_press=self.done),
focus_map='button focus'), # don't enable done botton if we can't install
Color.button(reset_btn(on_press=self.reset), if self.installable:
focus_map='button focus') buttons.append(
] Color.button(done_btn(on_press=self.done),
focus_map='button focus'))
buttons.append(Color.button(reset_btn(on_press=self.reset),
focus_map='button focus'))
return Pile(buttons) return Pile(buttons)
def _get_percent_free(self, device): def _get_percent_free(self, device):
@ -459,7 +465,12 @@ class FilesystemView(ViewPolicy):
col_1 = [] col_1 = []
col_2 = [] col_2 = []
for dname in self.model.get_available_disks(): avail_disks = self.model.get_available_disks()
if len(avail_disks) == 0:
self.installable = False
return Pile([Color.info_minor(Text("No available disks."))])
for dname in avail_disks:
disk = self.model.get_disk_info(dname) disk = self.model.get_disk_info(dname)
device = self.model.get_disk(dname) device = self.model.get_disk(dname)
btn = menu_btn(label=disk.name, btn = menu_btn(label=disk.name,