'Retrieve info about LVs (all, in a VG, or a single LV).
:param root_helper: root_helper to use for execute
:param vg_name: optional, gathers info for only the specified VG
:param lv_name: optional, gathers info for only the specified LV
:returns: List of Dictionaries with LV info'

@staticmethod
def get_lv_info(root_helper, vg_name=None, lv_name=None):

    cmd = (LVM.LVM_CMD_PREFIX + ['lvs', '--noheadings', '--unit=g', '-o', 'vg_name,name,size', '--nosuffix'])
    if ((lv_name is not None) and (vg_name is not None)):
        cmd.append(('%s/%s' % (vg_name, lv_name)))
    elif (vg_name is not None):
        cmd.append(vg_name)
    try:
        (out, _err) = putils.execute(root_helper=root_helper, run_as_root=True, *cmd)
    except putils.ProcessExecutionError as err:
        with excutils.save_and_reraise_exception(reraise=True) as ctx:
            if (('not    found' in err.stderr) or ('Failed    to    find' in err.stderr)):
                ctx.reraise = False
                LOG.info('Logical    Volume    not    found    when    querying    LVM    info.    (vg_name=%(vg)s,    lv_name=%(lv)s', {'vg': vg_name, 'lv': lv_name})
                out = None
    lv_list = []
    if (out is not None):
        volumes = out.split()
        iterator = moves.zip(*([iter(volumes)] * 3))
        for (vg, name, size) in iterator:
            lv_list.append({'vg': vg, 'name': name, 'size': size})
    return lv_list
