- for line in result.stdout.splitlines():
- fields = line.strip().split(':')
- if len(fields) != 4:
- logging.error("Can't parse pvs output: line '%s'", line)
- return None
- # skip over pvs from another vg or ones which are not allocatable
- if fields[1] != vg_name or fields[3][0] != 'a':
+ for pv_name, vg_name, pv_free, pv_attr in info:
+ # (possibly) skip over pvs which are not allocatable
+ if filter_allocatable and pv_attr[0] != "a":
+ continue
+ # (possibly) skip over pvs which are not in the right volume group(s)
+ if vg_names and vg_name not in vg_names:
+ continue
+ data.append((float(pv_free), pv_name, vg_name))
+
+ return data
+
+ @classmethod
+ def GetVGInfo(cls, vg_names, filter_readonly=True):
+ """Get the free space info for specific VGs.
+
+ @param vg_names: list of volume group names, if empty all will be returned
+ @param filter_readonly: whether to skip over readonly VGs
+
+ @rtype: list
+ @return: list of tuples (free_space, total_size, name) with free_space in
+ MiB
+
+ """
+ try:
+ info = cls._GetVolumeInfo("vgs", ["vg_name", "vg_free", "vg_attr",
+ "vg_size"])
+ except errors.GenericError, err:
+ logging.error("Can't get VG information: %s", err)
+ return None
+
+ data = []
+ for vg_name, vg_free, vg_attr, vg_size in info:
+ # (possibly) skip over vgs which are not writable
+ if filter_readonly and vg_attr[0] == "r":
+ continue
+ # (possibly) skip over vgs which are not in the right volume group(s)
+ if vg_names and vg_name not in vg_names: