Statistics
| Branch: | Tag: | Revision:

root / lib / storage / filestorage.py @ 820bade9

History | View | Annotate | Download (2.6 kB)

1
#
2
#
3

    
4
# Copyright (C) 2013 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""File storage functions.
23

24
"""
25

    
26
from ganeti import errors
27
from ganeti import utils
28

    
29
DF_M_UNIT = 'M'
30
DF_MIN_NUM_COLS = 4
31
DF_NUM_LINES = 2
32

    
33

    
34
def _ParseDfResult(dfresult):
35
  """Parses the output of the call of the 'df' tool.
36

37
     @type dfresult: string
38
     @param dfresult: output of the 'df' call
39
     @return: tuple (size, free) of the total and free disk space in MebiBytes
40
  """
41
  df_lines = dfresult.splitlines()
42
  if len(df_lines) != DF_NUM_LINES:
43
    raise errors.CommandError("'df' output has wrong number of lines: %s" %
44
                              len(df_lines))
45
  df_values = df_lines[1].strip().split()
46
  if len(df_values) < DF_MIN_NUM_COLS:
47
    raise errors.CommandError("'df' output does not have enough columns: %s" %
48
                              len(df_values))
49
  size_str = df_values[1]
50
  if size_str[-1] != DF_M_UNIT:
51
    raise errors.CommandError("'df': 'size' not given in Mebibytes.")
52
  free_str = df_values[3]
53
  if free_str[-1] != DF_M_UNIT:
54
    raise errors.CommandError("'df': 'free' not given in Mebibytes.")
55
  size = int(size_str[:-1])
56
  free = int(free_str[:-1])
57
  return (size, free)
58

    
59

    
60
def GetSpaceInfo(path, _parsefn=_ParseDfResult):
61
  """Retrieves the free and total space of the device where the file is
62
     located.
63

64
     @type path: string
65
     @param path: Path of the file whose embracing device's capacity is
66
       reported.
67
     @type _parsefn: function
68
     @param _parsefn: Function that parses the output of the 'df' command;
69
       given as parameter to make this code more testable.
70
     @return: a dictionary containing 'vg_size' and 'vg_free'
71
  """
72
  cmd = ['df', '-BM', path]
73
  result = utils.RunCmd(cmd)
74
  if result.failed:
75
    raise errors.CommandError("Failed to run 'df' command: %s - %s" %
76
                              (result.fail_reason, result.output))
77
  (size, free) = _parsefn(result.stdout)
78
  return {"vg_size": size, "vg_free": free}