diff options
Diffstat (limited to 'glustolibs-gluster/glustolibs/gluster/quota_ops.py')
-rw-r--r-- | glustolibs-gluster/glustolibs/gluster/quota_ops.py | 520 |
1 files changed, 520 insertions, 0 deletions
diff --git a/glustolibs-gluster/glustolibs/gluster/quota_ops.py b/glustolibs-gluster/glustolibs/gluster/quota_ops.py new file mode 100644 index 000000000..f7121b05f --- /dev/null +++ b/glustolibs-gluster/glustolibs/gluster/quota_ops.py @@ -0,0 +1,520 @@ +#!/usr/bin/env python +# Copyright (C) 2015-2016 Red Hat, Inc. <http://www.redhat.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# 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 glusto.core import Glusto as g +import re +import time + +try: + import xml.etree.cElementTree as etree +except ImportError: + import xml.etree.ElementTree as etree + + +def enable_quota(mnode, volname): + """Enables quota on given volume + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + + 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("abc.xyz.com", testvol) + """ + + cmd = "gluster volume quota %s enable" % volname + return g.run(mnode, cmd) + + +def disable_quota(mnode, volname): + """Disables quota on given volume + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + + 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("abc.xyz.com", testvol) + """ + + cmd = "gluster volume quota %s disable --mode=script" % volname + return g.run(mnode, cmd) + + +def is_quota_enabled(mnode, volname): + """Checks if quota is enabled on given volume + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + + Returns: + bool: True, if quota is enabled + False, if quota is disabled + + Example: + is_quota_enabled(mnode, testvol) + """ + + from glustolibs.gluster.volume_ops import get_volume_options + + output = get_volume_options(mnode, volname, "features.quota") + if output is None: + return False + + g.log.info("Quota Status in volume %s %s" + % (volname, output["features.quota"])) + if output["features.quota"] != 'on': + return False + + return True + + +def quota_list(mnode, volname, path=None): + """Executes quota list command for given volume + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + + Kwargs: + path (str): Quota path + + 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(mnode, testvol) + """ + + if not path: + path = '' + + cmd = "gluster volume quota %s list %s" % (volname, path) + ret = g.run(mnode, cmd) + return ret + + +def set_quota_limit_usage(mnode, volname, path='/', limit='100GB', + soft_limit=''): + """Sets limit-usage on the path of the specified volume to + specified limit + + Args: + mnode (str): Node on which cmd has to be executed. + 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 + + 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("abc.com", "testvol") + + """ + + cmd = ("gluster volume quota %s limit-usage %s %s %s --mode=script" + % (volname, path, limit, soft_limit)) + return g.run(mnode, cmd) + + +def get_quota_list(mnode, volname, path=None): + """Parse the output of 'gluster quota list' command. + + Args: + mnode (str): Node on which command has to be executed. + volname (str): volume name + + Kwargs: + path (str): Quota path + + Returns: + NoneType: None if command execution fails, parse errors. + dict: dict on success. + + Examples: + >>> get_quota_list('abc.lab.eng.xyz.com', "testvol") + {'/': {'used_space': '0', 'hl_exceeded': 'No', 'soft_limit_percent': + '60%', 'avail_space': '2147483648', 'soft_limit_value': '1288490188', + 'sl_exceeded': 'No', 'hard_limit': '2147483648'}} + """ + if not path: + path = '' + + cmd = "gluster volume quota %s list %s --xml" % (volname, path) + ret, out, _ = g.run(mnode, cmd) + if ret != 0: + g.log.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: + g.log.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(mnode, volname, path='/', limit='10', + soft_limit=''): + """Sets limit-objects on the path of the specified volume to + specified limit + + Args: + mnode (str): Node on which command has to be executed. + 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 + + 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("abc.com", "testvol") + + """ + + cmd = ("gluster volume quota %s limit-objects %s %s %s --mode=script" + % (volname, path, limit, soft_limit)) + return g.run(mnode, cmd) + + +def quota_list_objects(mnode, volname, path=None): + """Executes quota list command for given volume + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + + Kwargs: + path (str): Quota path + + 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("abc.com", testvol) + + """ + + if not path: + path = '' + + cmd = "gluster volume quota %s list-objects %s" % (volname, path) + ret = g.run(mnode, cmd) + return ret + + +def get_quota_list_objects(mnode, volname, path=None): + """Parse the output of 'gluster quota list-objects' command. + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + + Kwargs: + path (str): Quota path + + Returns: + NoneType: None if command execution fails, parse errors. + dict: dict of dict on success. + + Examples: + >>> get_quota_list_objects('abc.lab.eng.xyz.com', "testvol") + {'/': {'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 not path: + path = '' + + cmd = "gluster volume quota %s list-objects %s --xml" % (volname, path) + ret, out, _ = g.run(mnode, cmd) + if ret != 0: + g.log.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: + g.log.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(mnode, volname, time): + """Sets quota alert time + + Args: + mnode (str): Node on which cmd has to be executed. + volname (str): volume name + time (str): quota alert time in seconds + + 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("abc.com", "testvol", <alert time>) + + """ + + cmd = ("gluster volume quota %s alert-time %s --mode=script" + % (volname, time)) + return g.run(mnode, cmd) + + +def set_quota_soft_timeout(mnode, volname, timeout): + """Sets quota soft timeout + + Args: + mnode (str): Node on which command has to be executed. + volname (str): volume name + timeout (str): quota soft limit timeout value + + 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("abc.com", "testvol", <timeout-value>) + + """ + + cmd = ("gluster volume quota %s soft-timeout %s --mode=script" + % (volname, timeout)) + return g.run(mnode, cmd) + + +def set_quota_hard_timeout(mnode, volname, timeout): + """Sets quota hard timeout + + Args: + mnode (str): Node on which command has to be executed. + volname (str): volume name + timeout (str): quota hard limit timeout value + + 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("abc.com", "testvol", <timeout-value>) + + """ + + cmd = ("gluster volume quota %s hard-timeout %s --mode=script" + % (volname, timeout)) + return g.run(mnode, cmd) + + +def set_quota_default_soft_limit(mnode, volname, timeout): + """Sets quota default soft limit + + Args: + mnode (str): Node on which command has to be executed. + volname (str): volume name + timeout (str): quota soft limit timeout value + + 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("abc.com", "testvol", + <timeout-value>) + + """ + + cmd = ("gluster volume quota %s default-soft-limit %s --mode=script" + % (volname, timeout)) + return g.run(mnode, cmd) + + +def remove_quota(mnode, volname, path): + """Removes quota for the given path + + Args: + mnode (str): Node on which command has to be executed. + volname (str): volume name + path (str): path to which quota limit usage is set. + Defaults to /. + + 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("abc.com", "testvol", <path>) + + """ + + cmd = "gluster volume quota %s remove %s --mode=script" % (volname, path) + return g.run(mnode, cmd) + + +def remove_quota_objects(mnode, volname, path): + """Removes quota objects for the given path + + Args: + mnode (str): Node on which command has to be executed. + volname (str): volume name + path (str): path to which quota limit usage is set. + Defaults to /. + + 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("abc.com", "testvol", <path>) + + """ + + cmd = ("gluster volume quota %s remove-objects %s --mode=script" + % (volname, path)) + return g.run(mnode, cmd) |