diff options
| author | M S Vishwanath Bhat <msvbhat@gmail.com> | 2016-03-30 17:05:05 +0530 |
|---|---|---|
| committer | Jeff Darcy <jdarcy@redhat.com> | 2016-04-07 08:08:32 -0700 |
| commit | 0fa83a3310274845fa9b445d1aed124e9fb43410 (patch) | |
| tree | 090787d7b5435fe36817760b7e5cb66499c420a8 /tests/distaf/distaf_libs/gluster_libs/rebalance.py | |
| parent | 6602376e3e9e6d9f4f695475569322b61ccc2411 (diff) | |
Adding distaf tests directory structure to tests dir
Since it was decided to have distaf test cases and related
libraries inside of glusterfs.git, this patch has the basic
skeleton directory structure and few of the libs.
Please note that, this patch by itself will not enable to
run any distaf tests right away. The distaf package needs to
be installed from the github.com/gluster/distaf. Once that
package is installed, it will put all the libs into respective
standard location and only then the tests in this patch can be
executed.
The plan to have distaf_libs packaged or installable using setup.py
This will enable tests to assume that all the libs are present in
the standard location.
Change-Id: I925ac0ad7e9cf6164c4380319a1f786b5241c74a
Signed-off-by: M S Vishwanath Bhat <msvbhat@gmail.com>
Reviewed-on: http://review.gluster.org/13853
Smoke: Gluster Build System <jenkins@build.gluster.com>
Tested-by: Raghavendra Talur <rtalur@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
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 |
