Merge pull request #29 from CanonicalLtd/fix_add_partition_default_values
Valid partition size input on AddPartition View
This commit is contained in:
commit
0100ed708c
|
@ -24,6 +24,7 @@ import math
|
||||||
from subiquity.model import ModelPolicy
|
from subiquity.model import ModelPolicy
|
||||||
|
|
||||||
|
|
||||||
|
HUMAN_UNITS = ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
|
||||||
log = logging.getLogger('subiquity.models.filesystem')
|
log = logging.getLogger('subiquity.models.filesystem')
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,9 +173,8 @@ def _humanize_size(size):
|
||||||
size = abs(size)
|
size = abs(size)
|
||||||
if size == 0:
|
if size == 0:
|
||||||
return "0B"
|
return "0B"
|
||||||
units = ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
|
|
||||||
p = math.floor(math.log(size, 2) / 10)
|
p = math.floor(math.log(size, 2) / 10)
|
||||||
return "%.3f%s" % (size / math.pow(1024, p), units[int(p)])
|
return "%.3f%s" % (size / math.pow(1024, p), HUMAN_UNITS[int(p)])
|
||||||
|
|
||||||
|
|
||||||
def _dehumanize_size(size):
|
def _dehumanize_size(size):
|
||||||
|
|
|
@ -20,6 +20,7 @@ configuration.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
from urwid import (WidgetWrap, ListBox, Pile, BoxAdapter,
|
from urwid import (WidgetWrap, ListBox, Pile, BoxAdapter,
|
||||||
Text, Columns)
|
Text, Columns)
|
||||||
from subiquity.ui.lists import SimpleList
|
from subiquity.ui.lists import SimpleList
|
||||||
|
@ -30,9 +31,13 @@ from subiquity.ui.buttons import (done_btn,
|
||||||
from subiquity.ui.widgets import Box
|
from subiquity.ui.widgets import Box
|
||||||
from subiquity.ui.utils import Padding, Color
|
from subiquity.ui.utils import Padding, Color
|
||||||
from subiquity.ui.interactive import (StringEditor, IntegerEditor, Selector)
|
from subiquity.ui.interactive import (StringEditor, IntegerEditor, Selector)
|
||||||
from subiquity.models.filesystem import _humanize_size, _dehumanize_size
|
from subiquity.models.filesystem import (_humanize_size,
|
||||||
|
_dehumanize_size,
|
||||||
|
HUMAN_UNITS)
|
||||||
from subiquity.view import ViewPolicy
|
from subiquity.view import ViewPolicy
|
||||||
|
|
||||||
|
INVALID_PARTITION_SIZE = 'Invalid Partition Size'
|
||||||
|
|
||||||
log = logging.getLogger('subiquity.filesystem')
|
log = logging.getLogger('subiquity.filesystem')
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,32 +103,78 @@ class AddPartitionView(WidgetWrap):
|
||||||
'mount_point': Str
|
'mount_point': Str
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
def __get_valid_size(size_str):
|
||||||
|
r = '(\d*)(\d+[\.]?\d*)[BKMGTPEZY]*$'
|
||||||
|
match = re.match(r, size_str, re.IGNORECASE)
|
||||||
|
log.debug('valid_size: input:{} match:{}'.format(size_str, match))
|
||||||
|
if match:
|
||||||
|
return match.group(0)
|
||||||
|
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def __append_unit(input_size):
|
||||||
|
''' examine the input for a unit string.
|
||||||
|
if not present, use the unit string from
|
||||||
|
the displayed maximum size
|
||||||
|
|
||||||
|
returns: number string with unit size
|
||||||
|
'''
|
||||||
|
unit_regex = '[{}]$'.format(''.join(HUMAN_UNITS))
|
||||||
|
input_has_unit = re.findall(unit_regex, input_size, re.IGNORECASE)
|
||||||
|
log.debug('input:{} re:{}'.format(input_size, input_has_unit))
|
||||||
|
if len(input_has_unit) == 0:
|
||||||
|
# input does not have unit string
|
||||||
|
displayed_unit = re.search(unit_regex, self.size_str,
|
||||||
|
re.IGNORECASE)
|
||||||
|
log.debug('input:{} re:{}'.format(self.size_str,
|
||||||
|
displayed_unit))
|
||||||
|
input_size += displayed_unit.group(0)
|
||||||
|
|
||||||
|
return input_size
|
||||||
|
|
||||||
|
def __get_size():
|
||||||
|
if self.size.value == '' or \
|
||||||
|
self.size.value == self.size_str:
|
||||||
|
log.debug('Using default value: {}'.format(
|
||||||
|
self.selected_disk.freespace))
|
||||||
|
return int(self.selected_disk.freespace)
|
||||||
|
else:
|
||||||
|
# 120B 120
|
||||||
|
valid_size = __get_valid_size(self.size.value)
|
||||||
|
if len(valid_size) == 0:
|
||||||
|
return INVALID_PARTITION_SIZE
|
||||||
|
|
||||||
|
self.size.value = __append_unit(valid_size)
|
||||||
|
log.debug('dehumanize_size({})'.format(self.size.value))
|
||||||
|
return _dehumanize_size(self.size.value)
|
||||||
|
|
||||||
result = {
|
result = {
|
||||||
"partnum": self.partnum.value,
|
"partnum": self.partnum.value,
|
||||||
"raw_size": self.size.value,
|
"raw_size": self.size.value,
|
||||||
"bytes": _dehumanize_size(self.size.value),
|
"bytes": __get_size(),
|
||||||
"fstype": self.fstype.value,
|
"fstype": self.fstype.value,
|
||||||
"mountpoint": self.mountpoint.value
|
"mountpoint": self.mountpoint.value
|
||||||
}
|
}
|
||||||
# Validate mountpoint input
|
|
||||||
if self.mountpoint.value in self.selected_disk.mounts:
|
# Validate size (bytes) input
|
||||||
log.error('provided mountpoint already allocated' +
|
if result['bytes'] == INVALID_PARTITION_SIZE:
|
||||||
' ({}'.format(self.mountpoint.value))
|
errmsg = 'Invalid size input'
|
||||||
val = self.mountpoint.value
|
log.error(errmsg)
|
||||||
# FIXME: update the error message widget instead
|
self.size.value = 'ERROR: ' + errmsg
|
||||||
self.mountpoint.value = 'ERROR: {} already mounted'.format(val)
|
self.signal.emit_signal(
|
||||||
|
'filesystem:add-disk-partiion',
|
||||||
|
self.selected_disk)
|
||||||
|
return
|
||||||
|
# Validate mountpoint input
|
||||||
|
if self.mountpoint.value in self.selected_disk.mounts:
|
||||||
|
log.error('provided mountpoint already allocated'
|
||||||
|
' ({}'.format(self.mountpoint.value))
|
||||||
|
# FIXME: update the error message widget instead
|
||||||
|
self.mountpoint.value = 'ERROR: already mounted'
|
||||||
self.signal.emit_signal(
|
self.signal.emit_signal(
|
||||||
'filesystem:add-disk-partiion',
|
'filesystem:add-disk-partiion',
|
||||||
self.selected_disk)
|
self.selected_disk)
|
||||||
return
|
return
|
||||||
# Validate size (bytes) input
|
|
||||||
if self.size.value == self.size_str:
|
|
||||||
log.debug(
|
|
||||||
'User specified max value({}), fixing up: {} -> {}'.format(
|
|
||||||
self.size.value,
|
|
||||||
result['bytes'],
|
|
||||||
int(self.selected_disk.freespace)))
|
|
||||||
result['bytes'] = int(self.selected_disk.freespace)
|
|
||||||
log.debug("Add Partition Result: {}".format(result))
|
log.debug("Add Partition Result: {}".format(result))
|
||||||
self.signal.emit_signal(
|
self.signal.emit_signal(
|
||||||
'filesystem:finish-add-disk-partition',
|
'filesystem:finish-add-disk-partition',
|
||||||
|
|
Loading…
Reference in New Issue