diff options
Diffstat (limited to 'tests/distaf/distaf_libs/gluster_libs/rebalance.py')
| -rw-r--r-- | tests/distaf/distaf_libs/gluster_libs/rebalance.py | 121 | 
1 files changed, 121 insertions, 0 deletions
diff --git a/tests/distaf/distaf_libs/gluster_libs/rebalance.py b/tests/distaf/distaf_libs/gluster_libs/rebalance.py new file mode 100644 index 00000000000..e36b7ee9855 --- /dev/null +++ b/tests/distaf/distaf_libs/gluster_libs/rebalance.py @@ -0,0 +1,121 @@ +#  This file is part of DiSTAF +#  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. + + +import re +import time +from distaf.util import tc + +""" +    Libraries containing gluster rebalance operations +""" + +def get_rebal_nodes(server): +    ''' +    This function finds out the number of rebalance nodes from +    gluster v info command + +    Returns the number of nodes participating in rebalance process +    ''' +    val = tc.run(server, \ +"gluster v info | grep 'Brick[0-9]' | cut -d ':' -f 2 | sed 's/\ //'") +    nlist = val[1].rstrip().split('\n') +    nnodes = list(set(nlist)) +    return len(nnodes) + +def get_rebal_dict(status): +    ''' +    This function returns the rebalance status info in the form of dictionary +    ''' +    _list = status.split('\n') +    rebal_dict = {} +    for _item in _list: +        _match = re.search('.*?(\S+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\w+\s*\w+)\s+(\S+).*', _item, re.S) +        if _match is not None: +            rebal_dict[_match.group(1)] = [_match.group(2), _match.group(3), \ +                    _match.group(4), _match.group(5), _match.group(6), \ +                    _match.group(7),_match.group(8)] +    return rebal_dict + + +def get_rebal_status(volname, server=''): +    ''' +    This function gives rebalance status +    Valid states are started/failed/in progress/completed +    if the server pararmeter is empty it takes node info from config file +    ''' +    if server == "": +        server = tc.nodes[0] +    status = tc.run(server, "gluster v rebalance %s status" %volname) +    if status[0] != 0: +        if "not started" in status[2]: +            tc.logger.error("Rebalance has not started") +            return ("not started", " ") +        else: +            tc.logger.error("error") +            return ("error", " ") +    else: +        rebal_dict = get_rebal_dict(status[1]) +        if "failed" in status[1]: +            tc.logger.error("Rebalance status command failed") +            return ("failed", rebal_dict) +        elif "in progress" in status[1]: +            tc.logger.info("Rebalance is in progress") +            return ("in progress", rebal_dict) +        elif "completed" in status[1]: +            counter = status[1].count("completed") +            nnodes = get_rebal_nodes(server) +            if counter == nnodes: +                tc.logger.info("Rebalance is completed") +                return ("completed", rebal_dict) +            else: +                tc.logger.error("Rebalacne has not completed on all nodes") +                return ("invalid status", rebal_dict) + +def wait_rebal_complete(volname, time_out = 300, server=''): +    ''' +    This function calls rebalance_status_once function and +    waits if the rebalance status is in progress, exists on timeout, +    default timeout is 300sec(5 min) +    ''' +    ret = get_rebal_status(volname, server) +    while time_out != 0 and ret[0] == "in progress": +        time_out = time_out - 20 +        time.sleep(20) +        ret = get_rebal_status(volname, server) +    return ret + + +def rebal_start(volname, server=''): +    """ +        Simple interface to start the gluster rebalance +        @ pararmeter: +            * volname +            * server - defaults to tc.nodes[0] +        @ returns: +            True on success +            False otherwise +    """ +    if server == '': +        server = tc.nodes[0] +    ret = tc.run(server, "gluster volume rebalance %s start" % volname) +    if ret[0] != 0: +        tc.logger.error("rebalance start %s failed" % volname) +        return False +    else: +        tc.logger.debug("rebalance start %s successful" % volname) +        return True  | 
