can render actions now
This commit is contained in:
parent
df0a3cfad9
commit
52127d1997
|
@ -45,6 +45,7 @@ class FilesystemController(BaseController):
|
||||||
# self.iscsi_model = IscsiDiskModel()
|
# self.iscsi_model = IscsiDiskModel()
|
||||||
# self.ceph_model = CephDiskModel()
|
# self.ceph_model = CephDiskModel()
|
||||||
self.raid_model = RaidModel()
|
self.raid_model = RaidModel()
|
||||||
|
self.model.probe() # probe before we complete
|
||||||
|
|
||||||
@view
|
@view
|
||||||
def default(self, reset=False):
|
def default(self, reset=False):
|
||||||
|
@ -76,17 +77,20 @@ class FilesystemController(BaseController):
|
||||||
self.ui.set_footer(footer, 30)
|
self.ui.set_footer(footer, 30)
|
||||||
self.ui.set_body(ErrorView(self.signal, error_msg))
|
self.ui.set_body(ErrorView(self.signal, error_msg))
|
||||||
|
|
||||||
def finish(self, actions):
|
def finish(self):
|
||||||
log.info("Rendering curtin config from user choices")
|
log.info("Rendering curtin config from user choices")
|
||||||
try:
|
try:
|
||||||
curtin_write_storage_actions(actions=actions)
|
curtin_write_storage_actions(actions=self.model.render())
|
||||||
except PermissionError:
|
except PermissionError:
|
||||||
log.exception('Failed to write storage actions')
|
log.exception('Failed to write storage actions')
|
||||||
self.filesystem_error('curtin_write_storage_actions')
|
self.filesystem_error('curtin_write_storage_actions')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
log.info("Rendering preserved config for post install")
|
log.info("Rendering preserved config for post install")
|
||||||
preserved_actions = [preserve_action(a) for a in actions]
|
preserved_actions = []
|
||||||
|
for a in self.model.render():
|
||||||
|
a['preserve'] = True
|
||||||
|
preserved_actions.append(a)
|
||||||
try:
|
try:
|
||||||
curtin_write_preserved_actions(actions=preserved_actions)
|
curtin_write_preserved_actions(actions=preserved_actions)
|
||||||
except PermissionError:
|
except PermissionError:
|
||||||
|
|
|
@ -132,6 +132,12 @@ def curtin_write_storage_actions(actions):
|
||||||
conf.write(curtin_config)
|
conf.write(curtin_config)
|
||||||
conf.close()
|
conf.close()
|
||||||
|
|
||||||
|
from collections import OrderedDict
|
||||||
|
def setup_yaml():
|
||||||
|
""" http://stackoverflow.com/a/8661021 """
|
||||||
|
represent_dict_order = lambda self, data: self.represent_mapping('tag:yaml.org,2002:map', data.items())
|
||||||
|
yaml.add_representer(OrderedDict, represent_dict_order)
|
||||||
|
setup_yaml()
|
||||||
|
|
||||||
def curtin_write_network_actions(actions):
|
def curtin_write_network_actions(actions):
|
||||||
curtin_config = yaml.dump(actions, default_flow_style=False)
|
curtin_config = yaml.dump(actions, default_flow_style=False)
|
||||||
|
|
|
@ -620,14 +620,17 @@ def id_factory(name):
|
||||||
return r
|
return r
|
||||||
return attr.Factory(factory)
|
return attr.Factory(factory)
|
||||||
|
|
||||||
def filter_false(attr, val):
|
|
||||||
if attr.name.startswith('_'):
|
|
||||||
return False
|
|
||||||
return bool(val)
|
|
||||||
|
|
||||||
def asdict(inst):
|
def asdict(inst):
|
||||||
return inst.asdict(
|
r = collections.OrderedDict()
|
||||||
recurse=False, filter=filter_false, dict_factory=collections.OrderedDict)
|
for field in attr.fields(type(inst)):
|
||||||
|
if field.name.startswith('_'):
|
||||||
|
continue
|
||||||
|
v = getattr(inst, field.name)
|
||||||
|
if v:
|
||||||
|
if hasattr(v, 'id'):
|
||||||
|
v = v.id
|
||||||
|
r[field.name] = v
|
||||||
|
return r
|
||||||
|
|
||||||
@attr.s
|
@attr.s
|
||||||
class Disk:
|
class Disk:
|
||||||
|
@ -655,7 +658,7 @@ class Disk:
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def available(self):
|
def available(self):
|
||||||
return self.used < self.size and self._fs is None
|
return self.used < self.size
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def next_partnum(self):
|
def next_partnum(self):
|
||||||
|
@ -678,9 +681,6 @@ class Disk:
|
||||||
def free(self):
|
def free(self):
|
||||||
return self.size - self.used
|
return self.size - self.used
|
||||||
|
|
||||||
def render(self):
|
|
||||||
return asdict(self)
|
|
||||||
|
|
||||||
@attr.s
|
@attr.s
|
||||||
class Partition:
|
class Partition:
|
||||||
id = attr.ib(default=id_factory("part"))
|
id = attr.ib(default=id_factory("part"))
|
||||||
|
@ -730,6 +730,11 @@ class Mount:
|
||||||
device = attr.ib(default=None) # validator=attr.validators.instance_of((Filesystem, type(None))),
|
device = attr.ib(default=None) # validator=attr.validators.instance_of((Filesystem, type(None))),
|
||||||
path = attr.ib(default=None)
|
path = attr.ib(default=None)
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
r = asdict(self)
|
||||||
|
r['device'] = self.device.id
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
class FilesystemModel(object):
|
class FilesystemModel(object):
|
||||||
|
|
||||||
|
@ -760,13 +765,13 @@ class FilesystemModel(object):
|
||||||
def render(self):
|
def render(self):
|
||||||
r = []
|
r = []
|
||||||
for d in self._disks.values():
|
for d in self._disks.values():
|
||||||
r.append(d.render())
|
r.append(asdict(d))
|
||||||
for p in self._partitions:
|
for p in self._partitions:
|
||||||
r.append(p.render())
|
r.append(asdict(p))
|
||||||
for f in self._formats:
|
for f in self._filesystems:
|
||||||
r.append(f.format())
|
r.append(asdict(f))
|
||||||
for m in self._mounts:
|
for m in self._mounts:
|
||||||
r.append(m.format())
|
r.append(asdict(m))
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def _get_system_mounted_disks(self):
|
def _get_system_mounted_disks(self):
|
||||||
|
@ -813,12 +818,15 @@ class FilesystemModel(object):
|
||||||
def add_partition(self, disk, partnum, size, flag=""):
|
def add_partition(self, disk, partnum, size, flag=""):
|
||||||
## XXX check, round, maybe adjust size?
|
## XXX check, round, maybe adjust size?
|
||||||
self._use_disk(disk)
|
self._use_disk(disk)
|
||||||
|
if disk._fs is not None:
|
||||||
|
raise Exception("%s is already formatted" % (disk.path,))
|
||||||
p = Partition(device=disk, number=partnum, size=size, flag=flag)
|
p = Partition(device=disk, number=partnum, size=size, flag=flag)
|
||||||
disk._partitions.append(p)
|
disk._partitions.append(p)
|
||||||
self._partitions.append(p)
|
self._partitions.append(p)
|
||||||
return p
|
return p
|
||||||
|
|
||||||
def add_filesystem(self, volume, fstype):
|
def add_filesystem(self, volume, fstype):
|
||||||
|
log.debug("adding %s to %s", fstype, volume)
|
||||||
if not volume.available:
|
if not volume.available:
|
||||||
raise Exception("%s is not available", volume)
|
raise Exception("%s is not available", volume)
|
||||||
if isinstance(volume, Disk):
|
if isinstance(volume, Disk):
|
||||||
|
@ -843,8 +851,8 @@ class FilesystemModel(object):
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def can_install(self):
|
def can_install(self):
|
||||||
# Need to figure out stuff to do with grub & a boot partition
|
# Do we need to check that there is a disk with the boot flag?
|
||||||
return '/' in self.get_mountpoint_to_devpath_mapping()
|
return '/' in self.get_mountpoint_to_devpath_mapping() and self.bootable()
|
||||||
|
|
||||||
def validate_mount(self, mountpoint):
|
def validate_mount(self, mountpoint):
|
||||||
if mountpoint is None:
|
if mountpoint is None:
|
||||||
|
|
|
@ -56,7 +56,7 @@ class DiskPartitionView(BaseView):
|
||||||
def _build_model_inputs(self):
|
def _build_model_inputs(self):
|
||||||
partitioned_disks = []
|
partitioned_disks = []
|
||||||
|
|
||||||
for part in self.disk._partitions:
|
def format_volume(part):
|
||||||
path = part.path
|
path = part.path
|
||||||
size = _humanize_size(part.size)
|
size = _humanize_size(part.size)
|
||||||
if part._fs is None:
|
if part._fs is None:
|
||||||
|
@ -68,13 +68,18 @@ class DiskPartitionView(BaseView):
|
||||||
else:
|
else:
|
||||||
fstype = part._fs.fstype
|
fstype = part._fs.fstype
|
||||||
mountpoint = part._fs._mount.path
|
mountpoint = part._fs._mount.path
|
||||||
partition_column = Columns([
|
return Columns([
|
||||||
(15, Text(path)),
|
(15, Text(path)),
|
||||||
Text(size),
|
Text(size),
|
||||||
Text(fstype),
|
Text(fstype),
|
||||||
Text(mountpoint),
|
Text(mountpoint),
|
||||||
], 4)
|
], 4)
|
||||||
partitioned_disks.append(partition_column)
|
if self.disk._fs is not None:
|
||||||
|
partitioned_disks.append(format_volume(self.disk))
|
||||||
|
else:
|
||||||
|
for part in self.disk._partitions:
|
||||||
|
partitioned_disks.append(format_volume(part))
|
||||||
|
if self.disk.free > 0:
|
||||||
free_space = _humanize_size(self.disk.free)
|
free_space = _humanize_size(self.disk.free)
|
||||||
partitioned_disks.append(Columns([
|
partitioned_disks.append(Columns([
|
||||||
(15, Text("FREE SPACE")),
|
(15, Text("FREE SPACE")),
|
||||||
|
|
|
@ -43,7 +43,6 @@ class FilesystemView(BaseView):
|
||||||
self.model = model
|
self.model = model
|
||||||
self.controller = controller
|
self.controller = controller
|
||||||
self.items = []
|
self.items = []
|
||||||
self.model.probe() # probe before we complete
|
|
||||||
self.body = [
|
self.body = [
|
||||||
Padding.center_79(Text("FILE SYSTEM")),
|
Padding.center_79(Text("FILE SYSTEM")),
|
||||||
Padding.center_79(self._build_filesystem_list()),
|
Padding.center_79(self._build_filesystem_list()),
|
||||||
|
@ -88,10 +87,10 @@ class FilesystemView(BaseView):
|
||||||
pl = []
|
pl = []
|
||||||
for m in mounts:
|
for m in mounts:
|
||||||
col = Columns([
|
col = Columns([
|
||||||
(15, m.device.volume.path),
|
(15, Text(m.device.volume.path)),
|
||||||
_humanize_size(m.device.volume.size),
|
Text(_humanize_size(m.device.volume.size)),
|
||||||
m.device.fstype,
|
Text(m.device.fstype),
|
||||||
m.path,
|
Text(m.path),
|
||||||
], 4)
|
], 4)
|
||||||
pl.append(col)
|
pl.append(col)
|
||||||
return Pile(pl)
|
return Pile(pl)
|
||||||
|
@ -136,6 +135,9 @@ class FilesystemView(BaseView):
|
||||||
inputs.append(Columns([col1, col2]))
|
inputs.append(Columns([col1, col2]))
|
||||||
else:
|
else:
|
||||||
inputs.append(disk_btn)
|
inputs.append(disk_btn)
|
||||||
|
if len(inputs) == 0:
|
||||||
|
return Pile([Color.info_minor(
|
||||||
|
Text("No disks available."))])
|
||||||
return Pile(inputs)
|
return Pile(inputs)
|
||||||
|
|
||||||
def click_disk(self, sender, disk):
|
def click_disk(self, sender, disk):
|
||||||
|
@ -172,5 +174,4 @@ class FilesystemView(BaseView):
|
||||||
self.controller.reset()
|
self.controller.reset()
|
||||||
|
|
||||||
def done(self, button):
|
def done(self, button):
|
||||||
actions = self.model.get_actions()
|
self.controller.finish()
|
||||||
self.controller.finish(actions)
|
|
||||||
|
|
Loading…
Reference in New Issue