add VolGroupStretchy
This commit is contained in:
parent
65dc65f13e
commit
5880443a73
|
@ -0,0 +1,128 @@
|
||||||
|
# Copyright 2015 Canonical, Ltd.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from urwid import (
|
||||||
|
connect_signal,
|
||||||
|
Text,
|
||||||
|
)
|
||||||
|
|
||||||
|
from subiquitycore.ui.container import (
|
||||||
|
Pile,
|
||||||
|
)
|
||||||
|
from subiquitycore.ui.form import (
|
||||||
|
ReadOnlyField,
|
||||||
|
StringField,
|
||||||
|
)
|
||||||
|
from subiquitycore.ui.stretchy import (
|
||||||
|
Stretchy,
|
||||||
|
)
|
||||||
|
|
||||||
|
from subiquity.models.filesystem import (
|
||||||
|
get_lvm_size,
|
||||||
|
humanize_size,
|
||||||
|
)
|
||||||
|
from subiquity.ui.views.filesystem.compound import (
|
||||||
|
CompoundDiskForm,
|
||||||
|
get_possible_components,
|
||||||
|
MultiDeviceField,
|
||||||
|
)
|
||||||
|
|
||||||
|
log = logging.getLogger('subiquity.ui.lvm')
|
||||||
|
|
||||||
|
|
||||||
|
class VolGroupForm(CompoundDiskForm):
|
||||||
|
|
||||||
|
def __init__(self, model, possible_components, initial, vg_names):
|
||||||
|
self.vg_names = vg_names
|
||||||
|
super().__init__(model, possible_components, initial)
|
||||||
|
|
||||||
|
name = StringField(_("Name:"))
|
||||||
|
devices = MultiDeviceField(_("Devices:"))
|
||||||
|
size = ReadOnlyField(_("Size:"))
|
||||||
|
|
||||||
|
def validate_name(self):
|
||||||
|
if self.name.value in self.vg_names:
|
||||||
|
return _("There is already a volume group named '{}'").format(
|
||||||
|
self.name.value)
|
||||||
|
|
||||||
|
|
||||||
|
class VolGroupStretchy(Stretchy):
|
||||||
|
def __init__(self, parent, existing=None):
|
||||||
|
self.parent = parent
|
||||||
|
self.existing = existing
|
||||||
|
vg_names = {vg.name for vg in parent.model.all_vgs()}
|
||||||
|
if existing is None:
|
||||||
|
title = _('Create LVM volume group')
|
||||||
|
x = 0
|
||||||
|
while True:
|
||||||
|
name = 'vg{}'.format(x)
|
||||||
|
if name not in vg_names:
|
||||||
|
break
|
||||||
|
x += 1
|
||||||
|
initial = {
|
||||||
|
'devices': {},
|
||||||
|
'name': name,
|
||||||
|
'size': '-',
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
vg_names.remove(existing.name)
|
||||||
|
title = _('Edit volume group "{}"').format(existing.name)
|
||||||
|
devices = {d:'active' for d in existing.devices}
|
||||||
|
initial = {
|
||||||
|
'devices': devices,
|
||||||
|
'name': existing.name,
|
||||||
|
}
|
||||||
|
|
||||||
|
possible_components = get_possible_components(
|
||||||
|
self.parent.model, existing, initial['devices'],
|
||||||
|
lambda dev: dev.ok_for_lvm)
|
||||||
|
|
||||||
|
form = self.form = VolGroupForm(
|
||||||
|
self.parent.model, possible_components, initial, vg_names)
|
||||||
|
|
||||||
|
self.form.devices.widget.set_supports_spares(False)
|
||||||
|
|
||||||
|
connect_signal(form.devices.widget, 'change', self._change_devices)
|
||||||
|
connect_signal(form, 'submit', self.done)
|
||||||
|
connect_signal(form, 'cancel', self.cancel)
|
||||||
|
|
||||||
|
rows = form.as_rows()
|
||||||
|
|
||||||
|
super().__init__(
|
||||||
|
title,
|
||||||
|
[Pile(rows), Text(""), self.form.buttons],
|
||||||
|
0, 0)
|
||||||
|
|
||||||
|
def _change_devices(self, sender, new_devices):
|
||||||
|
if len(sender.active_devices) >= 1:
|
||||||
|
self.form.size.value = humanize_size(
|
||||||
|
get_lvm_size(self.form.level.value.value, new_devices))
|
||||||
|
else:
|
||||||
|
self.form.size.value = '-'
|
||||||
|
|
||||||
|
def done(self, sender):
|
||||||
|
result = self.form.as_data()
|
||||||
|
mdc = self.form.devices.widget
|
||||||
|
result['devices'] = mdc.active_devices
|
||||||
|
result['spare_devices'] = mdc.spare_devices
|
||||||
|
log.debug('vg_done: result = {}'.format(result))
|
||||||
|
self.parent.controller.volgroup_handler(self.existing, result)
|
||||||
|
self.parent.refresh_model_inputs()
|
||||||
|
self.parent.remove_overlay()
|
||||||
|
|
||||||
|
def cancel(self, sender):
|
||||||
|
self.parent.remove_overlay()
|
|
@ -51,9 +51,6 @@ from subiquity.ui.views.filesystem.compound import (
|
||||||
log = logging.getLogger('subiquity.ui.raid')
|
log = logging.getLogger('subiquity.ui.raid')
|
||||||
|
|
||||||
|
|
||||||
LABEL, DEVICE, PART = range(3)
|
|
||||||
|
|
||||||
|
|
||||||
raidlevel_choices = [
|
raidlevel_choices = [
|
||||||
Option((_(level.name), True, level)) for level in raidlevels]
|
Option((_(level.name), True, level)) for level in raidlevels]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue