diff options
Diffstat (limited to 'cns-libs/cnslibs/common/gluster_ops.py')
-rw-r--r-- | cns-libs/cnslibs/common/gluster_ops.py | 262 |
1 files changed, 0 insertions, 262 deletions
diff --git a/cns-libs/cnslibs/common/gluster_ops.py b/cns-libs/cnslibs/common/gluster_ops.py deleted file mode 100644 index e740daa3..00000000 --- a/cns-libs/cnslibs/common/gluster_ops.py +++ /dev/null @@ -1,262 +0,0 @@ -import time -import json -import re - -from glusto.core import Glusto as g -from glustolibs.gluster.block_ops import block_list -from glustolibs.gluster.heal_libs import is_heal_complete -from glustolibs.gluster.volume_ops import ( - get_volume_status, - get_volume_list, - volume_status, - volume_start, - volume_stop -) - -from cnslibs.common import exceptions -from cnslibs.common.heketi_ops import heketi_blockvolume_info -from cnslibs.common.openshift_ops import ( - cmd_run_on_gluster_pod_or_node, -) -from cnslibs.common import podcmd -from cnslibs.common import waiter - - -@podcmd.GlustoPod() -def wait_to_heal_complete(timeout=300, wait_step=5): - """Monitors heal for volumes on gluster""" - gluster_vol_list = get_volume_list("auto_get_gluster_endpoint") - if not gluster_vol_list: - raise AssertionError("failed to get gluster volume list") - - _waiter = waiter.Waiter(timeout=timeout, interval=wait_step) - for gluster_vol in gluster_vol_list: - for w in _waiter: - if is_heal_complete("auto_get_gluster_endpoint", gluster_vol): - break - - if w.expired: - err_msg = ("reached timeout waiting for all the gluster volumes " - "to reach the 'healed' state.") - g.log.error(err_msg) - raise AssertionError(err_msg) - - -@podcmd.GlustoPod() -def get_gluster_vol_status(file_vol): - """Get Gluster vol hosting nodes. - - Args: - file_vol (str): file volume name. - """ - # Get Gluster vol info - gluster_volume_status = get_volume_status( - "auto_get_gluster_endpoint", file_vol) - if not gluster_volume_status: - raise AssertionError("Failed to get volume status for gluster " - "volume '%s'" % file_vol) - if file_vol in gluster_volume_status: - gluster_volume_status = gluster_volume_status.get(file_vol) - return gluster_volume_status - - -@podcmd.GlustoPod() -def get_gluster_vol_hosting_nodes(file_vol): - """Get Gluster vol hosting nodes. - - Args: - file_vol (str): file volume name. - """ - vol_status = get_gluster_vol_status(file_vol) - g_nodes = [] - for g_node, g_node_data in vol_status.items(): - for process_name, process_data in g_node_data.items(): - if not process_name.startswith("/var"): - continue - g_nodes.append(g_node) - return g_nodes - - -@podcmd.GlustoPod() -def restart_gluster_vol_brick_processes(ocp_client_node, file_vol, - gluster_nodes): - """Restarts brick process of a file volume. - - Args: - ocp_client_node (str): Node to execute OCP commands on. - file_vol (str): file volume name. - gluster_nodes (str/list): One or several IPv4 addresses of Gluster - nodes, where 'file_vol' brick processes must be recreated. - """ - if not isinstance(gluster_nodes, (list, set, tuple)): - gluster_nodes = [gluster_nodes] - - # Get Gluster vol brick PIDs - gluster_volume_status = get_gluster_vol_status(file_vol) - pids = () - for gluster_node in gluster_nodes: - pid = None - for g_node, g_node_data in gluster_volume_status.items(): - if g_node != gluster_node: - continue - for process_name, process_data in g_node_data.items(): - if not process_name.startswith("/var"): - continue - pid = process_data["pid"] - # When birck is down, pid of the brick is returned as -1. - # Which is unexepeted situation. So, add appropriate assertion. - assert pid != "-1", ( - "Got unexpected PID (-1) for '%s' gluster vol on '%s' " - "node." % file_vol, gluster_node) - assert pid, ("Could not find 'pid' in Gluster vol data for '%s' " - "Gluster node. Data: %s" % ( - gluster_node, gluster_volume_status)) - pids.append((gluster_node, pid)) - - # Restart Gluster vol brick processes using found PIDs - for gluster_node, pid in pids: - cmd = "kill -9 %s" % pid - cmd_run_on_gluster_pod_or_node(ocp_client_node, cmd, gluster_node) - - # Wait for Gluster vol brick processes to be recreated - for gluster_node, pid in pids: - killed_pid_cmd = "ps -eaf | grep %s | grep -v grep | awk '{print $2}'" - _waiter = waiter.Waiter(timeout=60, interval=2) - for w in _waiter: - result = cmd_run_on_gluster_pod_or_node( - ocp_client_node, killed_pid_cmd, gluster_node) - if result.strip() == pid: - continue - g.log.info("Brick process '%s' was killed successfully on '%s'" % ( - pid, gluster_node)) - break - if w.expired: - error_msg = ("Process ID '%s' still exists on '%s' after waiting " - "for it 60 seconds to get killed." % ( - pid, gluster_node)) - g.log.error(error_msg) - raise exceptions.ExecutionError(error_msg) - - # Start volume after gluster vol brick processes recreation - ret, out, err = volume_start( - "auto_get_gluster_endpoint", file_vol, force=True) - if ret != 0: - err_msg = "Failed to start gluster volume %s on %s. error: %s" % ( - file_vol, gluster_node, err) - g.log.error(err_msg) - raise AssertionError(err_msg) - - -@podcmd.GlustoPod() -def restart_file_volume(file_vol, sleep_time=120): - """Restars file volume service. - - Args: - file_vol (str): name of a file volume - """ - gluster_volume_status = get_volume_status( - "auto_get_gluster_endpoint", file_vol) - if not gluster_volume_status: - raise AssertionError("failed to get gluster volume status") - - g.log.info("Gluster volume %s status\n%s : " % ( - file_vol, gluster_volume_status) - ) - - ret, out, err = volume_stop("auto_get_gluster_endpoint", file_vol) - if ret != 0: - err_msg = "Failed to stop gluster volume %s. error: %s" % ( - file_vol, err) - g.log.error(err_msg) - raise AssertionError(err_msg) - - # Explicit wait to stop ios and pvc creation for 2 mins - time.sleep(sleep_time) - - ret, out, err = volume_start( - "auto_get_gluster_endpoint", file_vol, force=True) - if ret != 0: - err_msg = "failed to start gluster volume %s error: %s" % ( - file_vol, err) - g.log.error(err_msg) - raise AssertionError(err_msg) - - ret, out, err = volume_status("auto_get_gluster_endpoint", file_vol) - if ret != 0: - err_msg = ("Failed to get status for gluster volume %s error: %s" % ( - file_vol, err)) - g.log.error(err_msg) - raise AssertionError(err_msg) - - -@podcmd.GlustoPod() -def match_heketi_and_gluster_block_volumes_by_prefix( - heketi_block_volumes, block_vol_prefix): - """Match block volumes from heketi and gluster. This function can't - be used for block volumes with custom prefixes - - Args: - heketi_block_volumes (list): list of heketi block volumes with - which gluster block volumes need to - be matched - block_vol_prefix (str): block volume prefix by which the block - volumes needs to be filtered - """ - gluster_vol_list = get_volume_list("auto_get_gluster_endpoint") - - gluster_vol_block_list = [] - for gluster_vol in gluster_vol_list[1:]: - ret, out, err = block_list("auto_get_gluster_endpoint", gluster_vol) - try: - if ret != 0 and json.loads(out)["RESULT"] == "FAIL": - msg = "failed to get block volume list with error: %s" % err - g.log.error(msg) - raise AssertionError(msg) - except Exception as e: - g.log.error(e) - raise - - gluster_vol_block_list.extend([ - block_vol.replace(block_vol_prefix, "") - for block_vol in json.loads(out)["blocks"] - if block_vol.startswith(block_vol_prefix) - ]) - - if cmp(sorted(gluster_vol_block_list), heketi_block_volumes) != 0: - err_msg = "Gluster and Heketi Block volume list match failed" - err_msg += "\nGluster Volumes: %s, " % gluster_vol_block_list - err_msg += "\nBlock volumes %s" % heketi_block_volumes - err_msg += "\nDifference: %s" % (set(gluster_vol_block_list) ^ - set(heketi_block_volumes)) - raise AssertionError(err_msg) - - -@podcmd.GlustoPod() -def get_block_hosting_volume_name(heketi_client_node, heketi_server_url, - block_volume): - """Returns block hosting volume name of given block volume - - Args: - heketi_client_node (str): Node on which cmd has to be executed. - heketi_server_url (str): Heketi server url - block_volume (str): Block volume of which block hosting volume - returned - Returns: - str : Name of the block hosting volume for given block volume - """ - block_vol_info = heketi_blockvolume_info( - heketi_client_node, heketi_server_url, block_volume - ) - - for line in block_vol_info.splitlines(): - block_hosting_vol_match = re.search( - "^Block Hosting Volume: (.*)$", line - ) - - if not block_hosting_vol_match: - continue - - gluster_vol_list = get_volume_list("auto_get_gluster_endpoint") - for vol in gluster_vol_list: - if block_hosting_vol_match.group(1).strip() in vol: - return vol |