125 lines
4.8 KiB
Diff
125 lines
4.8 KiB
Diff
|
Subject: storage: Move alloc/cap validation to validate()
|
||
|
From: Cole Robinson crobinso@redhat.com Fri Mar 17 12:00:03 2017 -0400
|
||
|
Date: Fri Mar 17 12:14:05 2017 -0400:
|
||
|
Git: 9c8ffe51dacee208af4d5d7cc3e439ae7197fc09
|
||
|
|
||
|
Doing this at property set time is overly noisy. Follow the same
|
||
|
pattern of VirtualDisk and only do this in the validate() function.
|
||
|
|
||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1433239
|
||
|
|
||
|
diff --git a/virtinst/diskbackend.py b/virtinst/diskbackend.py
|
||
|
index f70f5b21..5198057c 100644
|
||
|
--- a/virtinst/diskbackend.py
|
||
|
+++ b/virtinst/diskbackend.py
|
||
|
@@ -345,10 +345,11 @@ class _StorageCreator(_StorageBase):
|
||
|
|
||
|
if self._vol_install:
|
||
|
self._vol_install.validate()
|
||
|
- else:
|
||
|
- if self._size is None:
|
||
|
- raise ValueError(_("size is required for non-existent disk "
|
||
|
- "'%s'" % self.get_path()))
|
||
|
+ return
|
||
|
+
|
||
|
+ if self._size is None:
|
||
|
+ raise ValueError(_("size is required for non-existent disk "
|
||
|
+ "'%s'" % self.get_path()))
|
||
|
|
||
|
err, msg = self.is_size_conflict()
|
||
|
if err:
|
||
|
diff --git a/virtinst/storage.py b/virtinst/storage.py
|
||
|
index cd74467a..808891f3 100644
|
||
|
--- a/virtinst/storage.py
|
||
|
+++ b/virtinst/storage.py
|
||
|
@@ -683,22 +683,6 @@ class StorageVolume(_StorageObject):
|
||
|
raise ValueError(_("Name '%s' already in use by another volume." %
|
||
|
name))
|
||
|
|
||
|
- def _validate_allocation(self, val):
|
||
|
- ret = self.is_size_conflict(allocation=val)
|
||
|
- if ret[0]:
|
||
|
- raise ValueError(ret[1])
|
||
|
- elif ret[1]:
|
||
|
- logging.warn(ret[1])
|
||
|
- return val
|
||
|
-
|
||
|
- def _validate_capacity(self, val):
|
||
|
- ret = self.is_size_conflict(capacity=val)
|
||
|
- if ret[0]:
|
||
|
- raise ValueError(ret[1])
|
||
|
- elif ret[1]:
|
||
|
- logging.warn(ret[1])
|
||
|
- return val
|
||
|
-
|
||
|
def _default_format(self):
|
||
|
if self.file_type == self.TYPE_FILE:
|
||
|
return "raw"
|
||
|
@@ -728,10 +712,8 @@ class StorageVolume(_StorageObject):
|
||
|
|
||
|
type = XMLProperty("./@type")
|
||
|
key = XMLProperty("./key")
|
||
|
- capacity = XMLProperty("./capacity", is_int=True,
|
||
|
- validate_cb=_validate_capacity)
|
||
|
- allocation = XMLProperty("./allocation", is_int=True,
|
||
|
- validate_cb=_validate_allocation)
|
||
|
+ capacity = XMLProperty("./capacity", is_int=True)
|
||
|
+ allocation = XMLProperty("./allocation", is_int=True)
|
||
|
format = XMLProperty("./target/format/@type", default_cb=_default_format)
|
||
|
target_path = XMLProperty("./target/path")
|
||
|
backing_store = XMLProperty("./backingStore/path")
|
||
|
@@ -809,6 +791,12 @@ class StorageVolume(_StorageObject):
|
||
|
"setting allocation equal to capacity"))
|
||
|
self.allocation = self.capacity
|
||
|
|
||
|
+ isfatal, errmsg = self.is_size_conflict()
|
||
|
+ if isfatal:
|
||
|
+ raise ValueError(errmsg)
|
||
|
+ if errmsg:
|
||
|
+ logging.warn(errmsg)
|
||
|
+
|
||
|
def install(self, meter=None):
|
||
|
"""
|
||
|
Build and install storage volume from xml
|
||
|
@@ -891,7 +879,7 @@ class StorageVolume(_StorageObject):
|
||
|
time.sleep(1)
|
||
|
|
||
|
|
||
|
- def is_size_conflict(self, capacity=None, allocation=None):
|
||
|
+ def is_size_conflict(self):
|
||
|
"""
|
||
|
Report if requested size exceeds its pool's available amount
|
||
|
|
||
|
@@ -900,27 +888,22 @@ class StorageVolume(_StorageObject):
|
||
|
2. String message if some collision was encountered.
|
||
|
@rtype: 2 element C{tuple}: (C{bool}, C{str})
|
||
|
"""
|
||
|
- if capacity is None:
|
||
|
- capacity = self.capacity
|
||
|
- if allocation is None:
|
||
|
- allocation = self.allocation
|
||
|
-
|
||
|
if not self.pool:
|
||
|
return (False, "")
|
||
|
|
||
|
# pool info is [pool state, capacity, allocation, available]
|
||
|
avail = self.pool.info()[3]
|
||
|
- if allocation > avail:
|
||
|
+ if self.allocation > avail:
|
||
|
return (True, _("There is not enough free space on the storage "
|
||
|
"pool to create the volume. "
|
||
|
"(%d M requested allocation > %d M available)") %
|
||
|
- ((allocation / (1024 * 1024)),
|
||
|
+ ((self.allocation / (1024 * 1024)),
|
||
|
(avail / (1024 * 1024))))
|
||
|
- elif capacity > avail:
|
||
|
+ elif self.capacity > avail:
|
||
|
return (False, _("The requested volume capacity will exceed the "
|
||
|
"available pool space when the volume is fully "
|
||
|
"allocated. "
|
||
|
"(%d M requested capacity > %d M available)") %
|
||
|
- ((capacity / (1024 * 1024)),
|
||
|
+ ((self.capacity / (1024 * 1024)),
|
||
|
(avail / (1024 * 1024))))
|
||
|
return (False, "")
|