summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorApeksha D Khakharia <akhakhar@redhat.com>2016-06-24 11:06:17 +0530
committerRaghavendra Talur <rtalur@redhat.com>2016-06-26 10:47:29 -0700
commit453709554c1b870883e34fd11bd9f845fbb53368 (patch)
tree136e413768a3ffcf5821f07ee748a685ee7b4ad9
parent4935dd67443ac52c20dfaee82892f2524c990c71 (diff)
distaf: adding libraries to get server_brick dictionaries
Change-Id: I9046126739a126ee2d40249919e1fe58adf2fa27 BUG: 1349723 Signed-off-by: Apeksha D Khakharia <akhakhar@redhat.com> Reviewed-on: http://review.gluster.org/14788 Smoke: Gluster Build System <jenkins@build.gluster.org> Tested-by: ShwethaHPanduranga NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: ShwethaHPanduranga
-rw-r--r--tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/lib_utils.py170
1 files changed, 165 insertions, 5 deletions
diff --git a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/lib_utils.py b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/lib_utils.py
index 36db4de47b3..9349295381d 100644
--- a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/lib_utils.py
+++ b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/lib_utils.py
@@ -25,6 +25,7 @@ from distaflibs.gluster.volume_ops import get_volume_info
from distaflibs.gluster.mount_ops import mount_volume, umount_volume
import re
import time
+from collections import OrderedDict
try:
import xml.etree.cElementTree as etree
@@ -95,8 +96,8 @@ def search_pattern_in_file(mnode, search_pattern, filename, start_str_to_parse,
"""
cmd = ("awk '{a[NR]=$0}/" + start_str_to_parse + "/{s=NR}/" +
- end_str_to_parse + "/{e=NR}END{for(i=s;i<=e;++i)print a[i]}' "
- + filename)
+ end_str_to_parse + "/{e=NR}END{for(i=s;i<=e;++i)print "
+ "a[i]}' " + filename)
ret, out, err = tc.run(mnode, cmd)
if ret != 0:
@@ -231,9 +232,9 @@ def get_pathinfo(filename, volname, client=None):
server = get_volume_info(volname)[volname]['bricks'][0].split(':')[0]
mount_point = '/mnt/tmp_fuse'
- #Performing glusterfs mount because only with glusterfs mount
- #the file location in gluster server can be identified from client
- #machine
+ # Performing glusterfs mount because only with glusterfs mount
+ # the file location in gluster server can be identified from client
+ # machine
ret, _, _ = mount_volume(volname, mtype='glusterfs',
mpoint=mount_point,
mserver=server,
@@ -304,3 +305,162 @@ def list_files(dir_path, parse_str="", mnode=None):
finally:
conn.close()
+
+
+def get_servers_bricks_dict(servers):
+ """This module returns servers_bricks dictionary.
+ Args:
+ servers (list): List of servers for which we need the
+ list of bricks available on it.
+ Returns:
+ OrderedDict: key - server
+ value - list of bricks
+ Example:
+ get_servers_bricks_dict(tc.servers)
+ """
+ servers_bricks_dict = OrderedDict()
+ if not isinstance(servers, list):
+ servers = [servers]
+ for server in servers:
+ for server_list in tc.global_config["servers"]:
+ if server_list["host"] == server:
+ brick_root = server_list["brick_root"]
+ ret, out, err = tc.run(server, "cat /proc/mounts | grep %s"
+ " | awk '{ print $2}'" % brick_root)
+ if ret != 0:
+ tc.logger.error("bricks not available on %s" % server)
+ else:
+ servers_bricks_dict[server] = out.strip().split("\n")
+
+ for key, value in servers_bricks_dict.items():
+ value.sort()
+
+ return servers_bricks_dict
+
+
+def get_servers_used_bricks_dict(servers, mnode):
+ """This module returns servers_used_bricks dictionary.
+ This information is fetched from gluster volume info command.
+ Args:
+ servers (list): List of servers for which we need the
+ list of unused bricks on it.
+ mnode (str): The node on which gluster volume info command has
+ to be executed.
+ Returns:
+ OrderedDict: key - server
+ value - list of used bricks
+ or empty list(if all bricks are free)
+ Example:
+ get_servers_used_bricks_dict(tc.servers[:], tc.servers[0])
+ """
+ if not isinstance(servers, list):
+ servers = [servers]
+
+ servers_used_bricks_dict = OrderedDict()
+ for server in servers:
+ servers_used_bricks_dict[server] = []
+
+ ret, out, err = tc.run(mnode, "gluster volume info | egrep "
+ "\"^Brick[0-9]+\" | grep -v \"ss_brick\"",
+ verbose=False)
+ if ret != 0:
+ tc.logger.error("error in getting bricklist using gluster v info")
+ else:
+ list1 = list2 = []
+ list1 = out.strip().split('\n')
+ for item in list1:
+ x = re.search(':(.*)/(.*)', item)
+ list2 = x.group(1).strip().split(':')
+ if servers_used_bricks_dict.has_key(list2[0]):
+ value = servers_used_bricks_dict[list2[0]]
+ value.append(list2[1])
+ else:
+ servers_used_bricks_dict[list2[0]] = [list2[1]]
+
+ for key, value in servers_used_bricks_dict.items():
+ value.sort()
+
+ return servers_used_bricks_dict
+
+
+def get_servers_unused_bricks_dict(servers, mnode):
+ """This module returns servers_unused_bricks dictionary.
+ Gets a list of unused bricks for each server by using functions,
+ get_servers_bricks_dict() and get_servers_used_bricks_dict()
+ Args:
+ servers (list): List of servers for which we need the
+ list of unused bricks available on it.
+ mnode (str): The node on which gluster volume info command has
+ to be executed.
+ Returns:
+ OrderedDict: key - server
+ value - list of unused bricks
+ Example:
+ get_servers_unused_bricks_dict(tc.servers, tc.servers[0])
+ """
+ if not isinstance(servers, list):
+ servers = [servers]
+ dict1 = get_servers_bricks_dict(servers)
+ dict2 = get_servers_used_bricks_dict(servers, mnode)
+ servers_unused_bricks_dict = OrderedDict()
+ for key, value in dict1.items():
+ if dict2.has_key(key):
+ unused_bricks = list(set(value) - set(dict2[key]))
+ servers_unused_bricks_dict[key] = unused_bricks
+ else:
+ servers_unused_bricks_dict[key] = value
+
+ for key, value in servers_unused_bricks_dict.items():
+ value.sort()
+
+ return servers_unused_bricks_dict
+
+
+def form_bricks_path(number_of_bricks, servers, mnode, volname):
+ """Forms complete bricks path for create-volume/add-brick
+ given the num_of_bricks
+ Args:
+ number_of_bricks (int): The number of bricks for which brick list
+ has to be created.
+ servers (list): The list of servers from which the bricks
+ needs to be selected for creating the brick list.
+ mnode (str): The node on which the command has to be run.
+ volname (str): Volume name for which we require brick-list.
+ Returns:
+ str - complete brick path.
+ None - if number_of_bricks is greater than unused bricks.
+ Example:
+ form_bricks_path(6, tc.servers, tc.servers(0), "testvol")
+ """
+ if not isinstance(servers, list):
+ servers = [servers]
+ dict_index = 0
+ bricks_path = ''
+
+ server_bricks_dict = get_servers_unused_bricks_dict(servers, servers[0])
+ num_of_unused_bricks = 0
+ for server_brick in server_bricks_dict.values():
+ num_of_unused_bricks = num_of_unused_bricks + len(server_brick)
+
+ if num_of_unused_bricks < number_of_bricks:
+ tc.logger.error("Not enough bricks available for creating the bricks")
+ return None
+
+ brick_index = 0
+ vol_info_dict = get_volume_info(volname, mnode)
+ if vol_info_dict:
+ brick_index = int(vol_info_dict[volname]['brickCount'])
+
+ for num in range(brick_index, brick_index + number_of_bricks):
+ if server_bricks_dict.values()[dict_index]:
+ bricks_path = ("%s %s:%s/%s_brick%s" % (bricks_path,
+ server_bricks_dict.keys()[dict_index],
+ server_bricks_dict.values()[dict_index][0],
+ volname, num))
+ server_bricks_dict.values()[dict_index].pop(0)
+ if dict_index < len(server_bricks_dict) - 1:
+ dict_index = dict_index + 1
+ else:
+ dict_index = 0
+
+ return bricks_path