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):
def __init__(self, common):
super().__init__(common)
self.model = FilesystemModel(self.prober)
self.model = FilesystemModel(self.prober, self.opts)
self.iscsi_model = IscsiDiskModel()
self.ceph_model = CephDiskModel()
self.raid_model = RaidModel()

View File

@ -169,10 +169,14 @@ class Blockdev():
def available(self):
''' return True if has free space or partitions not
assigned '''
if self.freespace > 0.0:
if not self.is_mounted() and self.freespace > 0.0:
return True
return False
@property
def mounted(self):
return self.is_mounted()
@property
def usedspace(self, unit='b'):
''' return amount of used space'''
@ -269,8 +273,21 @@ class Blockdev():
with open('/proc/mounts') as pm:
mounts = pm.read()
regexp = '{}.*'.format(self.disk.devpath)
matches = re.findall(regexp, mounts)
# collect any /dev/* device and use
# 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:
log.debug('Device is mounted: {}'.format(matches))
return True

View File

@ -90,7 +90,8 @@ class FilesystemModel(ModelPolicy):
'leave unformatted'
]
def __init__(self, prober):
def __init__(self, prober, opts):
self.opts = opts
self.prober = prober
self.info = {}
self.devices = {}
@ -140,6 +141,10 @@ class FilesystemModel(ModelPolicy):
size=self.info[disk].size)
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):
log.debug('probe_storage: get_partitions()')
partitions = []
@ -154,7 +159,8 @@ class FilesystemModel(ModelPolicy):
return partitions
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):
return [dev.disk.devpath for dev in self.devices.values()

View File

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