summaryrefslogtreecommitdiffstats
path: root/glustolibs-gluster/glustolibs/gluster/gluster_init.py
diff options
context:
space:
mode:
Diffstat (limited to 'glustolibs-gluster/glustolibs/gluster/gluster_init.py')
-rw-r--r--glustolibs-gluster/glustolibs/gluster/gluster_init.py120
1 files changed, 101 insertions, 19 deletions
diff --git a/glustolibs-gluster/glustolibs/gluster/gluster_init.py b/glustolibs-gluster/glustolibs/gluster/gluster_init.py
index e59d36fa1..6a49ffc8b 100644
--- a/glustolibs-gluster/glustolibs/gluster/gluster_init.py
+++ b/glustolibs-gluster/glustolibs/gluster/gluster_init.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright (C) 2015-2016 Red Hat, Inc. <http://www.redhat.com>
+# Copyright (C) 2015-2020 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
@@ -19,36 +19,44 @@
Description: This file contains the methods for starting/stopping glusterd
and other initial gluster environment setup helpers.
"""
+from time import sleep
from glusto.core import Glusto as g
-def start_glusterd(servers):
+def start_glusterd(servers, enable_retry=True):
"""Starts glusterd on specified servers if they are not running.
Args:
servers (str|list): A server|List of server hosts on which glusterd
has to be started.
+ Kwargs:
+ enable_retry(Bool): If set to True then runs reset-failed else
+ do nothing.
+
Returns:
bool : True if starting glusterd is successful on all servers.
False otherwise.
"""
- if isinstance(servers, str):
+ if not isinstance(servers, list):
servers = [servers]
cmd = "pgrep glusterd || service glusterd start"
results = g.run_parallel(servers, cmd)
_rc = True
- for server, ret_values in results.iteritems():
+ for server, ret_values in results.items():
retcode, _, _ = ret_values
if retcode != 0:
g.log.error("Unable to start glusterd on server %s", server)
_rc = False
- if not _rc:
- return False
+ if not _rc and enable_retry:
+ ret = reset_failed_glusterd(servers)
+ if ret:
+ ret = start_glusterd(servers)
+ return ret
- return True
+ return _rc
def stop_glusterd(servers):
@@ -62,14 +70,14 @@ def stop_glusterd(servers):
bool : True if stopping glusterd is successful on all servers.
False otherwise.
"""
- if isinstance(servers, str):
+ if not isinstance(servers, list):
servers = [servers]
cmd = "service glusterd stop"
results = g.run_parallel(servers, cmd)
_rc = True
- for server, ret_values in results.iteritems():
+ for server, ret_values in results.items():
retcode, _, _ = ret_values
if retcode != 0:
g.log.error("Unable to stop glusterd on server %s", server)
@@ -80,32 +88,62 @@ def stop_glusterd(servers):
return True
-def restart_glusterd(servers):
+def restart_glusterd(servers, enable_retry=True):
"""Restart the glusterd on specified servers.
Args:
servers (str|list): A server|List of server hosts on which glusterd
has to be restarted.
+ Kwargs:
+ enable_retry(Bool): If set to True than runs reset-failed else
+ do nothing.
+
Returns:
bool : True if restarting glusterd is successful on all servers.
False otherwise.
"""
- if isinstance(servers, str):
+ if not isinstance(servers, list):
servers = [servers]
cmd = "service glusterd restart"
results = g.run_parallel(servers, cmd)
_rc = True
- for server, ret_values in results.iteritems():
+ for server, ret_values in results.items():
retcode, _, _ = ret_values
if retcode != 0:
g.log.error("Unable to restart glusterd on server %s", server)
_rc = False
- if not _rc:
- return False
+ if not _rc and enable_retry:
+ ret = reset_failed_glusterd(servers)
+ if ret:
+ ret = restart_glusterd(servers)
+ return ret
+ return _rc
+
+
+def reset_failed_glusterd(servers):
+ """Reset-failed glusterd on specified servers.
+
+ Args:
+ servers (str|list): A server|List of server hosts on which glusterd
+ has to be reset-failed.
+
+ Returns:
+ bool : True if reset-failed glusterd is successful on all servers.
+ False otherwise.
+ """
+ if not isinstance(servers, list):
+ servers = [servers]
+
+ cmd = "systemctl reset-failed glusterd"
+ results = g.run_parallel(servers, cmd)
+ for server, (retcode, _, _) in results.items():
+ if retcode:
+ g.log.error("Unable to reset glusterd on server %s", server)
+ return False
return True
@@ -122,7 +160,7 @@ def is_glusterd_running(servers):
-1 : if glusterd not running and PID is alive
"""
- if isinstance(servers, str):
+ if not isinstance(servers, list):
servers = [servers]
cmd1 = "service glusterd status"
@@ -131,7 +169,7 @@ def is_glusterd_running(servers):
cmd2_results = g.run_parallel(servers, cmd2)
_rc = 0
- for server, ret_values in cmd1_results.iteritems():
+ for server, ret_values in cmd1_results.items():
retcode, _, _ = ret_values
if retcode != 0:
g.log.error("glusterd is not running on the server %s", server)
@@ -157,7 +195,7 @@ def env_setup_servers(servers):
False otherwise.
"""
- if isinstance(servers, str):
+ if not isinstance(servers, list):
servers = [servers]
g.log.info("The function isn't implemented fully")
@@ -175,7 +213,7 @@ def get_glusterd_pids(nodes):
return the process id's in dictionary format
Args:
- nodes ( str|list ) : Node/Nodes of the cluster
+ nodes (str|list) : Node(s) of the cluster
Returns:
tuple : Tuple containing two elements (ret, gluster_pids).
@@ -190,7 +228,7 @@ def get_glusterd_pids(nodes):
"""
glusterd_pids = {}
_rc = True
- if isinstance(nodes, str):
+ if not isinstance(nodes, list):
nodes = [nodes]
cmd = "pidof glusterd"
@@ -222,3 +260,47 @@ def get_glusterd_pids(nodes):
glusterd_pids[node] = ['-1']
return _rc, glusterd_pids
+
+
+def wait_for_glusterd_to_start(servers, glusterd_start_wait_timeout=80):
+ """Checks glusterd is running on nodes with timeout.
+
+ Args:
+ servers (str|list): A server|List of server hosts on which glusterd
+ status has to be checked.
+ glusterd_start_wait_timeout: timeout to retry glusterd running
+ check in node.
+
+ Returns:
+ bool : True if glusterd is running on servers.
+ False otherwise.
+
+ """
+ if not isinstance(servers, list):
+ servers = [servers]
+ count = 0
+ while count <= glusterd_start_wait_timeout:
+ ret = is_glusterd_running(servers)
+ if not ret:
+ g.log.info("glusterd is running on %s", servers)
+ return True
+ sleep(1)
+ count += 1
+ g.log.error("glusterd is not running on %s", servers)
+ return False
+
+
+def get_gluster_version(host):
+ """Checks the gluster version on the nodes
+
+ Args:
+ host(str): IP of the host whose gluster version has to be checked.
+
+ Returns:
+ str: The gluster version value.
+ """
+ command = 'gluster --version'
+ _, out, _ = g.run(host, command)
+ g.log.info("The Gluster verion of the cluster under test is %s",
+ out)
+ return out.split(' ')[1]