diff options
| author | Arthy Loganathan <aloganat@redhat.com> | 2016-05-24 15:06:27 +0530 | 
|---|---|---|
| committer | M S Vishwanath Bhat <msvbhat@gmail.com> | 2016-06-04 11:33:31 -0700 | 
| commit | d4b9d7f120b8742e68b2d020b3ed50aa40394a89 (patch) | |
| tree | 69924ad537e2f36ade81e7edbe4a59f1defc77a1 | |
| parent | 04b5886132ee0fe84011033cd2db08285cc75e31 (diff) | |
distaf: Added library functions for gluster quota operations
Change-Id: I4968918fc2bf5b67e3415fc7b9beb1b414ca6eb4
BUG: 1332952
Signed-off-by: Arthy Loganathan <aloganat@redhat.com>
Reviewed-on: http://review.gluster.org/14210
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: M S Vishwanath Bhat <msvbhat@gmail.com>
| -rw-r--r-- | tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/quota_ops.py | 559 | 
1 files changed, 545 insertions, 14 deletions
diff --git a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/quota_ops.py b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/quota_ops.py index ad41c460c47..13ad13dd8d4 100644 --- a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/quota_ops.py +++ b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/quota_ops.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python  #  This file is part of DiSTAF  #  Copyright (C) 2015-2016  Red Hat, Inc. <http://www.redhat.com>  # @@ -15,30 +16,560 @@  #  with this program; if not, write to the Free Software Foundation, Inc.,  #  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" +    Description: Library for gluster quota operations. +"""  from distaf.util import tc +import re +import time +try: +    import xml.etree.cElementTree as etree +except ImportError: +    import xml.etree.ElementTree as etree -def enable_quota(volname, server=''): -    """ -        Enables quota on the specified volume -        Returns the output of quota cli command +def enable_quota(volname, mnode=None): +    """Enables quota on given volume + +    Args: +        volname (str): volume name + +    Kwargs: +        mnode (str): Node on which cmd has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Example: +        enable_quota(testvol)      """ -    if server == '': -        server = tc.servers[0] +    if mnode is None: +        mnode = tc.servers[0] +      cmd = "gluster volume quota %s enable" % volname -    return tc.run(server, cmd) +    ret = tc.run(mnode, cmd) +    return ret + + +def disable_quota(volname, mnode=None): +    """Disables quota on given volume + +    Args: +        volname (str): volume name + +    Kwargs: +        mnode (str): Node on which cmd has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Example: +        disable_quota(testvol) +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = "gluster volume quota %s disable --mode=script" % volname +    ret = tc.run(mnode, cmd) +    return ret + + +def is_quota_enabled(volname, mnode=None): +    """Checks if quota is enabled on given volume +    Args: +        volname (str): volume name -def set_quota_limit(volname, path='/', limit='100GB', server=''): +    Kwargs: +        mnode (str): Node on which cmd has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        bool: True, if quota is enabled +            False, if quota is disabled + +    Example: +        is_quota_enabled(testvol) +    """ + +    import distaflibs.gluster.volume_ops + +    if mnode is None: +        mnode = tc.servers[0] + +    output = distaflibs.gluster.volume_ops.get_volume_option(volname, +                                                             "features.quota", +                                                             mnode) +    if output is None: +        return False + +    tc.logger.info("Quota Status in volume %s %s" +                   % (volname, output["features.quota"])) +    if output["features.quota"] != 'on': +        return False + +    return True + + +def quota_list(volname, mnode=None): +    """Executes quota list command for given volume + +    Args: +        volname (str): volume name + +    Kwargs: +        mnode (str): Node on which cmd has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Example: +        quota_list(testvol)      """ -        Sets limit-usage on the path of the specified volume to +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = "gluster volume quota %s list" % volname +    ret = tc.run(mnode, cmd) +    return ret + + +def set_quota_limit_usage(volname, path='/', limit='100GB', soft_limit='', +                          mnode=None): +    """Sets limit-usage on the path of the specified volume to          specified limit -        Returs the output of quota limit-usage command +    Args: +        volname (str): volume name + +    Kwargs: +        path (str): path to which quota limit usage is set. +            Defaults to /. +        limit (str): quota limit usage. defaults to 100GB +        soft_limit (str): quota soft limit to be set +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> set_quota_limit_usage("testvol") + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s limit-usage %s %s %s --mode=script" +           % (volname, path, limit, soft_limit)) +    return tc.run(mnode, cmd) + + +def get_quota_list(volname, mnode=None): +    """Parse the output of 'gluster quota list' command. + +    Args: +        volname (str): volume name + +    Kwargs: +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        NoneType: None if command execution fails, parse errors. +        dict: dict on success. + +    Examples: +        >>> get_quota_list("testvol", mnode = 'abc.lab.eng.xyz.com') +        {'/': {'used_space': '0', 'hl_exceeded': 'No', 'soft_limit_percent': +        '60%', 'avail_space': '2147483648', 'soft_limit_value': '1288490188', +        'sl_exceeded': 'No', 'hard_limit': '2147483648'}} +    """ + +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = "gluster volume quota %s list --xml" % volname +    ret, out, _ = tc.run(mnode, cmd, verbose=False) +    if ret != 0: +        tc.logger.error("Failed to execute 'quota list' on node %s. " +                        "Hence failed to get the quota list.", mnode) +        return None + +    try: +        root = etree.XML(out) +    except etree.ParseError: +        tc.logger.error("Failed to parse the gluster quota list xml output.") +        return None + +    quotalist = {} +    for path in root.findall("volQuota/limit"): +        for elem in path.getchildren(): +            if elem.tag == "path": +                path = elem.text +                quotalist[path] = {} +            else: +                quotalist[path][elem.tag] = elem.text +    return quotalist + + +def set_quota_limit_objects(volname, path='/', limit='10', soft_limit='', +                            mnode=None): +    """Sets limit-objects on the path of the specified volume to +        specified limit + +    Args: +        volname (str): volume name + +    Kwargs: +        path (str): path to which quota limit usage is set. +            Defaults to /. +        limit (str): quota limit objects. defaults to 10. +        soft_limit (str): quota soft limit to be set +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> set_quota_limit_objects("testvol") + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s limit-objects %s %s %s --mode=script" +           % (volname, path, limit, soft_limit)) +    return tc.run(mnode, cmd) + + +def quota_list_objects(volname, mnode=None): +    """Executes quota list command for given volume + +    Args: +        volname (str): volume name + +    Kwargs: +        mnode (str): Node on which cmd has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Example: +        quota_list_objects(testvol) +      """ -    if server == '': -        server = tc.servers[0] -    cmd = "gluster volume quota %s limit-usage %s %s" % (volname, path, limit) -    return tc.run(server, cmd) +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = "gluster volume quota %s list-objects" % volname +    ret = tc.run(mnode, cmd) +    return ret + + +def get_quota_list_objects(volname, mnode=None): +    """Parse the output of 'gluster quota list-objects' command. + +    Args: +        volname (str): volume name + +    Kwargs: +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        NoneType: None if command execution fails, parse errors. +        dict: dict of dict on success. + +    Examples: +        >>> get_quota_list_objects("testvol", mnode = 'abc.lab.eng.xyz.com') +        {'/': {'available': '7', 'hl_exceeded': 'No', 'soft_limit_percent': +        '80%', 'soft_limit_value': '8', 'dir_count': '3', 'sl_exceeded': +        'No', 'file_count': '0', 'hard_limit': '10'}} +    """ + +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = "gluster volume quota %s list-objects --xml" % volname +    ret, out, _ = tc.run(mnode, cmd, verbose=False) +    if ret != 0: +        tc.logger.error("Failed to execute 'quota list' on node %s. " +                        "Hence failed to get the quota list.", mnode) +        return None + +    try: +        root = etree.XML(out) +    except etree.ParseError: +        tc.logger.error("Failed to parse the gluster quota list xml output.") +        return None + +    quotalist = {} +    for path in root.findall("volQuota/limit"): +        for elem in path.getchildren(): +            if elem.tag == "path": +                path = elem.text +                quotalist[path] = {} +            else: +                quotalist[path][elem.tag] = elem.text +    return quotalist + + +def set_quota_alert_time(volname, time, mnode=None): +    """Sets quota alert time + +    Args: +        volname (str): volume name + +    Kwargs: +        time (str): quota limit usage. defaults to 100GB +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> set_quota_alert_time("testvol", <alert time>) + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s alert-time %s --mode=script" +           % (volname, time)) +    return tc.run(mnode, cmd) + + +def set_quota_soft_timeout(volname, timeout, mnode=None): +    """Sets quota soft timeout + +    Args: +        volname (str): volume name + +    Kwargs: +        timeout (str): quota soft limit timeout value +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> set_quota_soft_timeout("testvol", <timeout-value>) + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s soft-timeout %s --mode=script" +           % (volname, timeout)) +    return tc.run(mnode, cmd) + + +def set_quota_hard_timeout(volname, timeout, mnode=None): +    """Sets quota hard timeout + +    Args: +        volname (str): volume name +        timeout (str): quota hard limit timeout value + +    Kwargs: +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> set_quota_hard_timeout("testvol", <timeout-value>) + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s hard-timeout %s --mode=script" +           % (volname, timeout)) +    return tc.run(mnode, cmd) + + +def set_quota_default_soft_limit(volname, timeout, mnode=None): +    """Sets quota default soft limit + +    Args: +        volname (str): volume name +        timeout (str): quota soft limit timeout value + +    Kwargs: +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> set_quota_default_soft_limit("testvol", <timeout-value>) + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s default-soft-limit %s --mode=script" +           % (volname, timeout)) +    return tc.run(mnode, cmd) + + +def remove_quota(volname, path, mnode=None): +    """Removes quota for the given path + +    Args: +        volname (str): volume name +        path (str): path to which quota limit usage is set. +            Defaults to /. + +    Kwargs: +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> remove_quota("testvol", <path>) + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = "gluster volume quota %s remove %s --mode=script" % (volname, path) +    return tc.run(mnode, cmd) + + +def remove_quota_objects(volname, path, mnode=None): +    """Removes quota objects for the given path + +    Args: +        volname (str): volume name +        path (str): path to which quota limit usage is set. +            Defaults to /. + +    Kwargs: +        mnode (str): Node on which command has to be executed. +            If None, defaults to servers[0]. + +    Returns: +        tuple: Tuple containing three elements (ret, out, err). +            The first element 'ret' is of type 'int' and is the return value +            of command execution. + +            The second element 'out' is of type 'str' and is the stdout value +            of the command execution. + +            The third element 'err' is of type 'str' and is the stderr value +            of the command execution. + +    Examples: +        >>> remove_quota_objects("testvol", <path>) + +    """ +    if mnode is None: +        mnode = tc.servers[0] + +    cmd = ("gluster volume quota %s remove-objects %s --mode=script" +           % (volname, path)) +    return tc.run(mnode, cmd)  | 
