summaryrefslogtreecommitdiffstats
path: root/SharedModules/Utils/glusterutils.py
diff options
context:
space:
mode:
Diffstat (limited to 'SharedModules/Utils/glusterutils.py')
-rw-r--r--SharedModules/Utils/glusterutils.py644
1 files changed, 644 insertions, 0 deletions
diff --git a/SharedModules/Utils/glusterutils.py b/SharedModules/Utils/glusterutils.py
new file mode 100644
index 0000000..0c15af1
--- /dev/null
+++ b/SharedModules/Utils/glusterutils.py
@@ -0,0 +1,644 @@
+"""glusterutils module contains wrappers for gluster commands.
+
+*) glusterd_start
+*) glusterd_start_allservers
+*) glusterd_stop
+*) glusterd_stop_allservers
+*) glusterd_restart
+*) glusterd_remove_dir
+*) glusterd_remove_dir_allservers
+*) glusterd_remove_logs_allservers
+*) volume_delete
+*) volume_create
+*) volume_start
+*) volume_stop
+*) volume_addbrick
+*) volume_replacebrick
+*) volume_set
+*) volume_reset
+*) peer_probe
+*) create_brick
+*) mount_exportdir
+*) umount_exportdir
+"""
+
+import re
+import atfutils
+import hostutils
+from atfglobals import GlobalObj
+
+
+def glusterd_start(serverkey, force=False):
+ """
+ """
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ commands_to_execute = ["which glusterd", "ps -e | grep glusterd"]
+ gluster_version = env.getServer(serverkey).glusterversion
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ """ Check if gluster is already running. If already Running and force=True,
+ restart glusterd process"""
+ command = commands_to_execute.pop()
+ output = host_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ if not return_status:
+ if force:
+ return_status = glusterd_restart(serverkey)
+ return return_status
+ else:
+ return return_status
+
+ command = commands_to_execute.pop()
+ output = host_connection.executecommand(command)
+ if output["exitstatus"]:
+ print "Unable to start glusterd"
+ return_status = atfutils.assert_success(**output)
+ return return_status
+ else:
+ if output["stdoutdata"]:
+ gluster_path = None
+ gluster_path = output["stdoutdata"][0].strip("\n")
+ else:
+ print "Unable to find gluster path"
+ return_status = atfutils.assert_success(**output)
+ return return_status
+
+ if gluster_path:
+ command = gluster_path + " --version"
+ output = host_connection.executecommand(command)
+ if not output["stdoutdata"] == None:
+ if re.search(gluster_version, str(output["stdoutdata"])):
+ print "%s : %s" % (serverkey, gluster_path)
+ output = host_connection.executecommand(gluster_path)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+ else:
+ print "Unable to start glusterd"
+ return 1
+ else:
+ print "Unable to start glusterd"
+ return 1
+
+def glusterd_start_allservers(force=False):
+ """
+ """
+ env = GlobalObj.getTestenvObj()
+ all_servers = env.getServers()
+ for serverkey in all_servers.keys():
+ return_status = glusterd_start(serverkey)
+ if return_status:
+ return return_status
+
+ return 0
+
+def glusterd_stop(serverkey):
+ """
+ """
+ base_command = "kill -KILL "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ gluster_pid_list = []
+ output = host_connection.executecommand("pidof glusterd")
+ return_status = atfutils.assert_failure(**output)
+ if not return_status:
+ return return_status
+
+ else:
+ if output["stdoutdata"]:
+ for output in output["stdoutdata"]:
+ gluster_pid_list.append(output)
+
+ for pid in gluster_pid_list:
+ command = base_command + pid
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ if return_status:
+ break
+
+ return return_status
+
+def glusterd_stop_allservers():
+ """
+ """
+ env = GlobalObj.getTestenvObj()
+ all_servers = env.getServers()
+ for serverkey in all_servers.keys():
+ return_status = glusterd_stop(serverkey)
+ if return_status:
+ return return_status
+
+ return 0
+
+def glusterd_restart(serverkey):
+ """
+ """
+ return_status = glusterd_stop(serverkey)
+ if return_status:
+ return return_status
+ else:
+ return_status = glusterd_start(serverkey)
+ return return_status
+
+def glusterd_remove_dir(serverkey):
+ """
+ """
+ command = "rm -rf /etc/glusterd/*"
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+
+ server_obj = env.getServer(serverkey)
+ if not server_obj:
+ print "Invalid Host. %s not defined in TestEnvironment" % serverkey
+ return 1
+
+ server_connection = cm.getConnection(serverkey)
+ if not server_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = server_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return 0
+
+def glusterd_remove_dir_allservers():
+ """
+ """
+ env = GlobalObj.getTestenvObj()
+ all_servers = env.getServers()
+ for serverkey in all_servers.keys():
+ return_status = glusterd_remove_dir(serverkey)
+
+ return 0
+
+
+def glusterd_remove_logs(serverkey):
+ """
+ """
+ base_command = "rm -rf "
+ log_paths = ["/var/log/glusterfs/*.log", "/var/log/glusterfs/bricks/*"]
+ absolute_path_list = []
+ prefix_path = ''
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+
+ server_obj = env.getServer(serverkey)
+ if not server_obj:
+ print "Invalid Host. %s not defined in TestEnvironment" % serverkey
+ return 1
+
+ server_connection = cm.getConnection(serverkey)
+ if not server_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ if server_obj.installpath:
+ prefix_path = server_obj.installpath
+
+ for path in log_paths:
+ absolute_path_list.append(prefix_path + path)
+
+ for path in absolute_path_list:
+ command = base_command + path
+ print "%s : %s" % (serverkey, command)
+ output = server_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+
+ return 0
+
+def glusterd_remove_logs_allservers():
+ """
+ """
+ env = GlobalObj.getTestenvObj()
+ all_servers = env.getServers()
+ for serverkey in all_servers.keys():
+ return_status = glusterd_remove_logs(serverkey)
+
+ return 0
+
+def volume_delete(serverkey):
+ """
+ """
+ base_command = "gluster volume delete "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "Invalid Volume.ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumename
+ command = base_command + volumename
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_create(serverkey):
+ """
+ """
+ base_command = "gluster volume create "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+
+ command = base_command + \
+ active_volume.volumename + " " + \
+ active_volume.volumetype + " " + \
+ active_volume.count + " " + \
+ "transport " + active_volume.transporttype + " "
+
+ for brick_obj in active_volume.bricks:
+ brick_value = brick_obj.hostname + ":" + brick_obj.path
+ command = command + brick_value + " "
+
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ if return_status:
+ if str(output["stdoutdata"]).rfind("already exists"):
+ return_status = 0
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_start(serverkey, force=False):
+ """
+ """
+ base_command = "gluster volume start "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumename
+ command = base_command + volumename
+ if force:
+ command = command + " force"
+
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ if return_status:
+ if str(output["stdoutdata"]).rfind("already started"):
+ return_status = 0
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_stop(serverkey, force=False):
+ """
+ """
+ base_command = "gluster volume stop "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumename
+ command = base_command + volumename
+ if force:
+ command = command + " force"
+
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_addbrick(serverkey, *bricks):
+ """
+ """
+ base_command = "gluster volume add-brick "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumenameGlobalObj.getConnectionsManagerObj()
+ command = base_command + volumename + " "
+ for brick in bricks:
+ brick_obj = env.getBrick(brick)
+ if not brick_obj:
+ print "Invalid Brick. Brick Not defined in TestEnvironment"
+ return 1
+ brick_value = brick_obj.hostname + ":" + brick_obj.path
+ command = command + brick_value
+
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ if not return_status:
+ if env.addBricksToVolume(*bricks):
+ return 1
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_replacebrick(serverkey, replacebrick_key, tobrick_key):
+ """
+ """
+ base_command = "gluster volume replace-brick "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumename
+ command = base_command + volumename + " "
+ replace_brick = env.getbrick(replacebrick_key)
+ to_brick = env.getbrick(tobrick_key)
+ command = command + replace_brick + " " + to_brick
+
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ if not return_status:
+ if env.replaceBrickInVolume(replacebrick_key, tobrick_key):
+ return 1
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_set(serverkey, key, value):
+ """
+ """
+ base_command = "gluster volume set "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumename
+ command = base_command + volumename + " " + key + " " + value
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def volume_reset(serverkey):
+ """
+ """
+ base_command = "gluster volume reset "
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ active_volume = env.getActiveVolume()
+ if not active_volume:
+ print "ActiveVolume not defined for the TestEnvironment"
+ return 1
+ volumename = active_volume.volumename
+ command = base_command + volumename
+ host_connection = cm.getConnection(serverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (serverkey, command)
+ output = host_connection.executecommand(command, commandInput="y\n")
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def peer_probe(fromserverkey):
+ """
+ """
+ base_command = "gluster peer probe "
+ command = base_command
+ all_servers = {}
+ env = GlobalObj.getTestenvObj()
+ cm = GlobalObj.getConnectionsManagerObj()
+ all_servers = env.getServers()
+ all_servers.pop(fromserverkey)
+
+ for key in all_servers.keys():
+ if key is fromserverkey:
+ continue
+ else:
+ server_obj = all_servers[key]
+ command = command + server_obj.hostname + " "
+
+ host_connection = cm.getConnection(fromserverkey)
+ if not host_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ print "%s : %s" % (fromserverkey, command)
+ output = host_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def create_brick(brickkey):
+ """
+ """
+ return_status = 1
+ env = GlobalObj.getTestenvObj()
+ brick_obj = env.getRawBrick(brickkey)
+
+ hostname_value = brick_obj.hostname
+ serverkey = re.split("\.", hostname_value, maxsplit=1)[0]
+
+ exportdir = brick_obj.path
+ device = fstype = None
+ """If the exportdir is not a mount point of a device:
+ 1) Remove the existing exportdir
+ 2) Create new exportdir"""
+
+ if re.match("^\/", exportdir):
+ dirpath = exportdir
+ command = base_command + dirpath
+ else:
+ export_obj = env.getExportdir(exportdir)
+ dirpath = export_obj.dir
+ device = export_obj.device
+ fstype = export_obj.fstype
+
+ print "%s : %s" % (serverkey, 'create_brick')
+ if device:
+ if umount_device(serverkey, device):
+ return return_status
+ if hostutils.mkfs(serverkey, device, fstype):
+ return return_status
+ if mount_exportdir(serverkey, device, fstype, dirpath):
+ return return_status
+ return 0
+
+ else:
+ if hostutils.rmdir(serverkey, dirpath):
+ return return_status
+ if hostutils.mkdir(serverkey, dirpath):
+ return return_status
+
+ return 0
+
+def umount_device(serverkey, device):
+ """
+ """
+ base_command = "umount "
+ cm = GlobalObj.getConnectionsManagerObj()
+
+ server_connection = cm.getConnection(serverkey)
+ if not server_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ mountpoints = hostutils.find_mountpoints(serverkey, device)
+
+ for mountpoint in mountpoints:
+ command = base_command + mountpoint
+ print "%s : %s" % (serverkey, command)
+ output = server_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ if return_status:
+ stdoutdata = str(output["stdoutdata"])
+ if ((stdoutdata.rfind("not found")) or (stdoutdata.rfind("not mount"))):
+ return_status = 0
+
+ else:
+ return return_status
+
+ return 0
+
+def mount_exportdir(serverkey, device, fstype, dirpath):
+ """
+ """
+ base_command = "mount "
+ cm = GlobalObj.getConnectionsManagerObj()
+
+ server_connection = cm.getConnection(serverkey)
+ if not server_connection:
+ print "SSH connection to host '%s' has not been established" % serverkey
+ return 1
+
+ if fstype is None:
+ fstype = "xfs"
+
+ command = base_command + "-t " + fstype + " " + device + " " + dirpath
+
+ print "%s : %s" % (serverkey, command)
+ output = server_connection.executecommand(command)
+ return_status = atfutils.assert_success(**output)
+ atfutils.print_stdout(output['stdoutdata'])
+ atfutils.print_stderr(output['stderrdata'])
+ return return_status
+
+def create_brick_allservers():
+ """
+ """
+ env = GlobalObj.getTestenvObj()
+ brick_keys = env.getBrickKeys()
+ for brickkey in brick_keys:
+ return_status = create_brick(brickkey)
+ if return_status:
+ return return_status
+
+ return 0
+
+
+__all__ = ['glusterd_start',
+ 'glusterd_start_allservers',
+ 'glusterd_stop',
+ 'glusterd_stop_allservers',
+ 'glusterd_restart',
+ 'glusterd_remove_dir',
+ 'glusterd_remove_dir_allservers',
+ 'glusterd_remove_logs_allservers',
+ 'volume_delete',
+ 'volume_create',
+ 'volume_start',
+ 'volume_stop',
+ 'volume_addbrick',
+ 'volume_replacebrick',
+ 'volume_set',
+ 'volume_reset',
+ 'peer_probe',
+ 'create_brick',
+ 'create_brick_allservers',
+ 'mount_exportdir',
+ 'umount_device']
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+