reserved-space specifies reserved space in MB
reserved-percent specifies a percentage of total space to reserve
Resolves: rhbz#663647
---
anaconda.spec.in | 2 +-
pyanaconda/iw/lvm_dialog_gui.py | 37 +++++++++++++++++++++++++++++++++--
pyanaconda/kickstart.py | 8 +++++++
pyanaconda/storage/devices.py | 25 +++++++++++++++++++++++-
pyanaconda/storage/partitioning.py | 3 +-
5 files changed, 69 insertions(+), 6 deletions(-)
diff --git a/anaconda.spec.in b/anaconda.spec.in
index 2d380c2..04a5ea6 100644
--- a/anaconda.spec.in
+++ b/anaconda.spec.in
@@ -28,7 +28,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
%define intltoolver 0.31.2-3
%define libnlver 1.0
%define libselinuxver 1.6
-%define pykickstartver 1.99.3
+%define pykickstartver 1.99.4
%define rpmpythonver 4.2-0.61
%define slangver 2.0.6-2
%define yumver 2.9.2
diff --git a/pyanaconda/iw/lvm_dialog_gui.py b/pyanaconda/iw/lvm_dialog_gui.py
index 46587a2..349fafe 100644
--- a/pyanaconda/iw/lvm_dialog_gui.py
+++ b/pyanaconda/iw/lvm_dialog_gui.py
@@ -71,7 +71,8 @@ class VolumeGroupEditor:
vgfree = vg.freeSpace
vgused = vgsize - vgfree
vgsnapshots = vg.snapshotSpace
- return (vgsize, vgused, vgfree, vgsnapshots)
+ vgreserved = vg.reservedSpace
+ return (vgsize, vgused, vgfree, vgsnapshots, vgreserved)
def getPVWastedRatio(self, newpe):
""" given a new pe value, return percentage of smallest PV wasted
@@ -852,7 +853,7 @@ class VolumeGroupEditor:
custom_icon="error")
return
- (total, used, free, snapshots) = self.computeSpaceValues()
+ (total, used, free, snapshots, reserved) = self.computeSpaceValues()
if free <= 0:
self.intf.messageWindow(_("No free space"),
_("There is no room left in the "
@@ -958,7 +959,7 @@ class VolumeGroupEditor:
self.logvolstore.set_value(iter, 2, "%Ld" % lv['size'])
def updateVGSpaceLabels(self):
- (total, used, free, snapshots) = self.computeSpaceValues()
+ (total, used, free, snapshots, reserved) = self.computeSpaceValues()
self.totalSpaceLabel.set_text("%10.2f MB" % (total,))
self.usedSpaceLabel.set_text("%10.2f MB" % (used,))
@@ -987,6 +988,15 @@ class VolumeGroupEditor:
self.snapshotPercentLabel.set_text("(%4.1f %%)" % snapshotpercent)
+ if reserved:
+ self.reservedSpaceLabel.set_text("%10.2f MB" % reserved)
+ if total > 0:
+ reservedpercent = (100.0*reserved)/total
+ else:
+ reservedpercent = 0.0
+
+ self.reservedPercentLabel.set_text("(%4.1f %%)" % reservedpercent)
+
#
# run the VG editor we created
#
@@ -1431,6 +1441,27 @@ class VolumeGroupEditor:
maintable.set_row_spacing(row, 0)
row = row + 1
+ if self.vg.reservedSpace:
+ maintable.attach(createAlignedLabel(_("Reserved Space:")),
+ 0, 1, row, row + 1, gtk.EXPAND|gtk.FILL,
+ gtk.SHRINK)
+ lbox = gtk.HBox()
+ self.reservedSpaceLabel = gtk.Label("")
+ labelalign = gtk.Alignment()
+ labelalign.set(1.0, 0.5, 0.0, 0.0)
+ labelalign.add(self.reservedSpaceLabel)
+ lbox.pack_start(labelalign, False, False)
+ self.reservedPercentLabel = gtk.Label("")
+ labelalign = gtk.Alignment()
+ labelalign.set(1.0, 0.5, 0.0, 0.0)
+ labelalign.add(self.reservedPercentLabel)
+ lbox.pack_start(labelalign, False, False, padding=10)
+
+ maintable.attach(lbox, 1, 2, row, row + 1, gtk.EXPAND|gtk.FILL,
+ gtk.SHRINK)
+ maintable.set_row_spacing(row, 0)
+ row = row + 1
+
maintable.attach(createAlignedLabel(_("Free Space:")), 0, 1, row,
row + 1, gtk.EXPAND|gtk.FILL, gtk.SHRINK)
lbox = gtk.HBox()
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
index cff041f..38353d7 100644
--- a/pyanaconda/kickstart.py
+++ b/pyanaconda/kickstart.py
@@ -1116,6 +1116,14 @@ class VolGroupData(commands.volgroup.FC3_VolGroupData):
peSize=self.pesize/1024.0)
storage.createDevice(request)
+ if self.reserved_space:
+ if self.reserved_space < 0:
+ raise KickstartValueError(formatErrorMsg(self.lineno, msg="Volume group reserved space must be a positive integer."))
+ request.reserved_space = self.reserved_space
+ elif self.reserved_percent:
+ if not 0 < self.reserved_percent < 100:
+ raise KickstartValueError(formatErrorMsg(self.lineno, msg="Volume group reserved space percentage must be between 1 and 99."))
+ request.reserved_percent = self.reserved_percent
class XConfig(commands.xconfig.F14_XConfig):
def execute(self):
diff --git a/pyanaconda/storage/devices.py b/pyanaconda/storage/devices.py
index 0491e1c..9aa77a6 100644
--- a/pyanaconda/storage/devices.py
+++ b/pyanaconda/storage/devices.py
@@ -2007,6 +2007,8 @@ class LVMVolumeGroupDevice(DMDevice):
self.lv_sizes = []
self.lv_attr = []
self.hasDuplicate = False
+ self.reserved_percent = 0
+ self.reserved_space = 0
# circular references, here I come
self._lvs = []
@@ -2028,7 +2030,8 @@ class LVMVolumeGroupDevice(DMDevice):
" PE Free = %(peFree)s PV Count = %(pvCount)s\n"
" LV Names = %(lv_names)s modified = %(modified)s\n"
" extents = %(extents)s free space = %(freeSpace)s\n"
- " free extents = %(freeExtents)s\n"
+ " free extents = %(freeExtents)s"
+ " reserved percent = %(rpct)s reserved space = %(res)s\n"
" PVs = %(pvs)s\n"
" LVs = %(lvs)s" %
{"free": self.free, "peSize": self.peSize, "peCount": self.peCount,
@@ -2036,6 +2039,7 @@ class LVMVolumeGroupDevice(DMDevice):
"lv_names": self.lv_names, "modified": self.isModified,
"extents": self.extents, "freeSpace": self.freeSpace,
"freeExtents": self.freeExtents,
+ "rpct": self.reserved_percent, "res": self.reserved_space,
"pvs": pprint.pformat([str(p) for p in self.pvs]),
"lvs": pprint.pformat([str(l) for l in self.lvs])})
return s
@@ -2052,6 +2056,8 @@ class LVMVolumeGroupDevice(DMDevice):
"lv_uuids": self.lv_uuids,
"lv_sizes": self.lv_sizes,
"lv_attr": self.lv_attr,
+ "reserved_percent": self.reserved_percent,
+ "reserved_space": self.reserved_space,
"lvNames": [lv.name for lv in self.lvs]})
return d
@@ -2067,6 +2073,11 @@ class LVMVolumeGroupDevice(DMDevice):
if noformat:
args.append("--noformat")
+ if self.reserved_space:
+ args.append("--reserved-space=%d" % self.reserved_space)
+ elif self.reserved_percent:
+ args.append("--reserved-percent=%d" % self.reserved_percent)
+
f.write("#volgroup %s %s %s" % (self.name, " ".join(args), " ".join(pvs)))
if s:
f.write(" %s" % s)
@@ -2281,6 +2292,17 @@ class LVMVolumeGroupDevice(DMDevice):
return used
@property
+ def reservedSpace(self):
+ """ Reserved space in this VG, in MB """
+ reserved = 0
+ if self.reserved_percent > 0:
+ reserved = self.reserved_percent * 0.01 * self.size
+ elif self.reserved_space > 0:
+ reserved = self.reserved_space
+
+ return self.align(reserved, roundup=True)
+
+ @property
def size(self):
""" The size of this VG """
# TODO: just ask lvm if isModified returns False
@@ -2307,6 +2329,7 @@ class LVMVolumeGroupDevice(DMDevice):
# total the sizes of any LVs
log.debug("%s size is %dMB" % (self.name, self.size))
used = sum(lv.vgSpaceUsed for lv in self.lvs) + self.snapshotSpace
+ used += self.reservedSpace
free = self.size - used
log.debug("vg %s has %dMB free" % (self.name, free))
return free
diff --git a/pyanaconda/storage/partitioning.py b/pyanaconda/storage/partitioning.py
index 82d35f5..537b38f 100644
--- a/pyanaconda/storage/partitioning.py
+++ b/pyanaconda/storage/partitioning.py
@@ -1647,7 +1647,8 @@ class VGChunk(Chunk):
"""
self.vg = vg
self.path = vg.path
- super(VGChunk, self).__init__(self.vg.extents, requests=requests)
+ usable_extents = vg.extents - (vg.reservedSpace / vg.peSize)
+ super(VGChunk, self).__init__(usable_extents, requests=requests)
def addRequest(self, req):
""" Add a Request to this chunk. """
--
1.7.3.4