[blivet:master 6/8] Add a method to extract information about an mdraid array

Vratislav Podzimek vpodzime at redhat.com
Wed Jul 16 05:01:18 UTC 2014


On Tue, 2014-07-15 at 17:35 -0400, mulhern wrote:
> mdadm --detail can give useful information about the number of spare devices
> and other things that mdadm --examine can not. According to the man page
> --examine applies to devices which are components of an array, while --detail
> applies to a whole array which is currently active.
> 
> Signed-off-by: mulhern <amulhern at redhat.com>
> ---
>  blivet/devicelibs/mdraid.py | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py
> index af04aa2..a2745b6 100644
> --- a/blivet/devicelibs/mdraid.py
> +++ b/blivet/devicelibs/mdraid.py
> @@ -21,6 +21,7 @@
>  #
>  
>  import os
> +import re
>  import uuid
>  
>  from .. import util
> @@ -269,6 +270,35 @@ def mdexamine(device):
>  
>      return info
>  
> +def mddetail(device):
> +    """Run mdadm --detail in order to read information about an array.
> +
> +       Note: The --export flag is not used. According to the man pages
> +       the export flag just formats the output as key=value pairs for
> +       easy import, but in the case of --detail it also omits the majority
> +       of the information, including information of real use like the
> +       number of spares in the array.
> +
> +       :rtype: a dict of strings
> +       :returns: a dict containing labels and values extracted from output
> +    """
> +    lines = util.capture_output(["mdadm", "--detail", device]).split("\n")
> +    info = {}
> +    for (name, equals, value) in (line.strip().partition(":") for line in lines):
> +        if equals and value.strip():
> +            name = name.strip().upper()
> +            value = value.strip()
> +
> +            info[name] = value
Would you mind replacing this if with:
          value = value.strip()
          name = naem.strip().upper()
          if equals and name and value:
               info[name] = value

? It seems more robust to me and it doesn't call value.strip() twice for
lines that match (should be majority of lines, right?).

> +
> +    # extract the UUID proper
> +    the_uuid = re.match(r"(([a-f0-9]){8}:){3}([a-f0-9]){8}", info['UUID'])
This regex should be compiled as a global constant of the module.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list