Small interdiff due to lin errors:
diff --git a/lib/storage/filestorage.py b/lib/storage/filestorage.py
index 4f001b1..3e64018 100644
--- a/lib/storage/filestorage.py
+++ b/lib/storage/filestorage.py
@@ -26,7 +26,6 @@
import os
from ganeti import errors
-from ganeti import utils
def GetSpaceInfo(path):
@@ -37,6 +36,7 @@ def GetSpaceInfo(path):
@param path: Path of the file whose embracing device's capacity is
reported.
@return: a dictionary containing 'vg_size' and 'vg_free' given in
MebiBytes
+
"""
try:
result = os.statvfs(path)
@@ -44,5 +44,5 @@ def GetSpaceInfo(path):
size = (result.f_frsize * result.f_blocks) / (1024 * 1024)
return {"vg_size": size, "vg_free": free}
except OSError, e:
- raise errors.CommandError("Failed retrieve file system information
about"
+ raise errors.CommandError("Failed to retrieve file system information
about"
" path: %s - %s" % (path, e.strerror))
On Wed, May 15, 2013 at 12:13 PM, Helga Velroyen <[email protected]> wrote:
> This simplifies my previous commit (820bade90) by using os.statvfs
> instead of parsing the output of 'df'.
>
> Signed-off-by: Helga Velroyen <[email protected]>
> ---
> lib/storage/filestorage.py | 54
> ++++++--------------------
> test/py/ganeti.storage.filestorage_unittest.py | 44 ---------------------
> 2 files changed, 12 insertions(+), 86 deletions(-)
>
> diff --git a/lib/storage/filestorage.py b/lib/storage/filestorage.py
> index 65c963c..4f001b1 100644
> --- a/lib/storage/filestorage.py
> +++ b/lib/storage/filestorage.py
> @@ -23,56 +23,26 @@
>
> """
>
> +import os
> +
> from ganeti import errors
> from ganeti import utils
>
> -DF_M_UNIT = 'M'
> -DF_MIN_NUM_COLS = 4
> -DF_NUM_LINES = 2
> -
> -
> -def _ParseDfResult(dfresult):
> - """Parses the output of the call of the 'df' tool.
> -
> - @type dfresult: string
> - @param dfresult: output of the 'df' call
> - @return: tuple (size, free) of the total and free disk space in
> MebiBytes
> - """
> - df_lines = dfresult.splitlines()
> - if len(df_lines) != DF_NUM_LINES:
> - raise errors.CommandError("'df' output has wrong number of lines: %s"
> %
> - len(df_lines))
> - df_values = df_lines[1].strip().split()
> - if len(df_values) < DF_MIN_NUM_COLS:
> - raise errors.CommandError("'df' output does not have enough columns:
> %s" %
> - len(df_values))
> - size_str = df_values[1]
> - if size_str[-1] != DF_M_UNIT:
> - raise errors.CommandError("'df': 'size' not given in Mebibytes.")
> - free_str = df_values[3]
> - if free_str[-1] != DF_M_UNIT:
> - raise errors.CommandError("'df': 'free' not given in Mebibytes.")
> - size = int(size_str[:-1])
> - free = int(free_str[:-1])
> - return (size, free)
> -
>
> -def GetSpaceInfo(path, _parsefn=_ParseDfResult):
> +def GetSpaceInfo(path):
> """Retrieves the free and total space of the device where the file is
> located.
>
> @type path: string
> @param path: Path of the file whose embracing device's capacity is
> reported.
> - @type _parsefn: function
> - @param _parsefn: Function that parses the output of the 'df' command;
> - given as parameter to make this code more testable.
> - @return: a dictionary containing 'vg_size' and 'vg_free'
> + @return: a dictionary containing 'vg_size' and 'vg_free' given in
> MebiBytes
> """
> - cmd = ['df', '-BM', path]
> - result = utils.RunCmd(cmd)
> - if result.failed:
> - raise errors.CommandError("Failed to run 'df' command: %s - %s" %
> - (result.fail_reason, result.output))
> - (size, free) = _parsefn(result.stdout)
> - return {"vg_size": size, "vg_free": free}
> + try:
> + result = os.statvfs(path)
> + free = (result.f_frsize * result.f_bavail) / (1024 * 1024)
> + size = (result.f_frsize * result.f_blocks) / (1024 * 1024)
> + return {"vg_size": size, "vg_free": free}
> + except OSError, e:
> + raise errors.CommandError("Failed retrieve file system information
> about"
> + " path: %s - %s" % (path, e.strerror))
> diff --git a/test/py/ganeti.storage.filestorage_unittest.py b/test/py/
> ganeti.storage.filestorage_unittest.py
> index 03b03b2..53e1398 100755
> --- a/test/py/ganeti.storage.filestorage_unittest.py
> +++ b/test/py/ganeti.storage.filestorage_unittest.py
> @@ -45,50 +45,6 @@ class TestFileStorageSpaceInfo(unittest.TestCase):
> """
> info = filestorage.GetSpaceInfo("/")
>
> - def testParseDfOutputValidInput(self):
> - """Tests that parsing of the output of 'df' works correctly.
> -
> - """
> - valid_df_output = \
> - "Filesystem 1M-blocks Used Available Use% Mounted
> on\n" \
> - "/dev/mapper/sysvg-root 161002M 58421M 94403M 39% /"
> - expected_size = 161002
> - expected_free = 94403
> -
> - (size, free) = filestorage._ParseDfResult(valid_df_output)
> - self.assertEqual(expected_size, size,
> - "Calculation of total size is incorrect.")
> - self.assertEqual(expected_free, free,
> - "Calculation of free space is incorrect.")
> -
> -
> - def testParseDfOutputInvalidInput(self):
> - """Tests that parsing of the output of 'df' works correctly when
> invalid
> - input is given.
> -
> - """
> - invalid_output_header_missing = \
> - "/dev/mapper/sysvg-root 161002M 58421M 94403M 39% /"
> - invalid_output_dataline_missing = \
> - "Filesystem 1M-blocks Used Available Use% Mounted
> on\n"
> - invalid_output_wrong_num_columns = \
> - "Filesystem 1M-blocks Available\n" \
> - "/dev/mapper/sysvg-root 161002M 94403M"
> - invalid_output_units_wrong = \
> - "Filesystem 1M-blocks Used Available Use% Mounted
> on\n" \
> - "/dev/mapper/sysvg-root 161002G 58421G 94403G 39% /"
> - invalid_output_units_missing = \
> - "Filesystem 1M-blocks Used Available Use% Mounted
> on\n" \
> - "/dev/mapper/sysvg-root 161002 58421 94403 39% /"
> - invalid_outputs = [invalid_output_header_missing,
> - invalid_output_dataline_missing,
> - invalid_output_wrong_num_columns,
> - invalid_output_units_wrong,
> - invalid_output_units_missing]
> -
> - for output in invalid_outputs:
> - self.assertRaises(errors.CommandError, filestorage._ParseDfResult,
> output)
> -
>
> if __name__ == "__main__":
> testutils.GanetiTestProgram()
> --
> 1.8.2.1
>
>