From d2842f1b58ed31a45f9fb69efa4f4c7ae5ffd984 Mon Sep 17 00:00:00 2001 From: Shwetha Panduranga Date: Mon, 27 Jun 2016 02:26:06 +0530 Subject: Modifying gluster_base_class and mount_ops to suit the config file changes made Change-Id: Ic551724dd27fcc2cc618e8de04110752bf5a8786 BUG: 1350017 Signed-off-by: Shwetha Panduranga Reviewed-on: http://review.gluster.org/14808 Tested-by: ShwethaHPanduranga NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Jonathan Holloway Smoke: Gluster Build System --- .../distaflibs/gluster/gluster_base_class.py | 93 +++++++--- .../distaflibs/gluster/gluster_init.py | 9 +- .../distaflibs/gluster/mount_ops.py | 192 ++++++++++++++++++--- tests/distaf/tests_d/distaf_gluster_config.yml | 13 +- 4 files changed, 251 insertions(+), 56 deletions(-) diff --git a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_base_class.py b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_base_class.py index 128288bb10f..367570d6e0e 100644 --- a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_base_class.py +++ b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_base_class.py @@ -19,6 +19,8 @@ from distaf.util import tc from distaflibs.gluster.volume_ops import (setup_vol, get_volume_info, cleanup_volume) +from distaflibs.gluster.mount_ops import GlusterMount +from distaflibs.gluster.gluster_init import env_setup_servers class GlusterBaseClass(): @@ -33,25 +35,48 @@ class GlusterBaseClass(): Initialise the class with the config values """ if config_data['global_mode']: - self.volname = config_data['volumes'].keys()[0] - self.voltype = config_data['volumes'][self.volname]['voltype'] - self.servers = config_data['volumes'][self.volname]['servers'] - self.peers = config_data['volumes'][self.volname]['peers'] - self.clients = config_data['volumes'][self.volname]['clients'] - self.mount_proto = (config_data['volumes'][self.volname] - ['mount_proto']) - self.mountpoint = (config_data['volumes'][self.volname] - ['mountpoint']) + self.volname = config_data['gluster']['volumes'][0]['name'] + self.voltype = (config_data['gluster']['volumes'][0]['voltype'] + ['type']) + self.servers = [] + for server in config_data['gluster']['volumes'][0]['servers']: + self.servers.append(server['host']) + self.peers = config_data['gluster']['volumes'][0]['peers'] + self.mounts = [] + for mount in config_data['gluster']['mounts']: + mount['client'] = mount['client']['host'] + mount['server'] = mount['server']['host'] + self.mounts.append(GlusterMount(mount)) + self.clients = [] + for mount_obj in self.mounts: + self.clients.append(mount_obj.client_system) + self.clients = filter(None, self.clients) + else: self.voltype = config_data['voltype'] self.volname = "%s-testvol" % self.voltype - self.servers = config_data['servers'].keys() - self.clients = config_data['clients'].keys() + self.servers = [] + for server in config_data['servers']: + self.servers.append(server['host']) + self.clients = [] + for client in config_data['clients']: + self.clients.append(client['host']) self.peers = [] if config_data['peers'] is not None: - self.peers = config_data['peers'].keys() + for peer in config_data['peers']: + self.peers.append(peers['host']) + self.mounts = [] self.mount_proto = config_data['mount_proto'] self.mountpoint = "/mnt/%s_mount" % self.mount_proto + for client in self.clients: + mount = {} + mount['protocol'] = config_data['mount_proto'] + mount['mountpoint'] = "/mnt/%s_mount" % self.mount_proto + mount['server'] = self.servers[0] + mount['client'] = client + mount['volname'] = self.volname + mount['options'] = "" + self.mounts.append(GlusterMount(mount)) self.mnode = self.servers[0] self.config_data = config_data @@ -62,29 +87,39 @@ class GlusterBaseClass(): dist = rep = dispd = red = stripe = 1 trans = '' if self.voltype == 'distribute': - dist = self.config_data[self.voltype]['dist_count'] - trans = self.config_data[self.voltype]['transport'] + dist = (self.config_data['gluster']['volume_types'][self.voltype] + ['dist_count']) + trans = (self.config_data['gluster']['volume_types'][self.voltype] + ['transport']) elif self.voltype == 'replicate': - rep = self.config_data[self.voltype]['replica'] - trans = self.config_data[self.voltype]['transport'] + rep = (self.config_data['gluster']['volume_types'][self.voltype] + ['replica_count']) + trans = (self.config_data['gluster']['volume_types'][self.voltype] + ['transport']) elif self.voltype == 'dist_rep': - dist = self.config_data[self.voltype]['dist_count'] - rep = self.config_data[self.voltype]['replica'] - trans = self.config_data[self.voltype]['transport'] + dist = (self.config_data['gluster']['volume_types'][self.voltype] + ['dist_count']) + rep = (self.config_data['gluster']['volume_types'][self.voltype] + ['replica_count']) + trans = (self.config_data['gluster']['volume_types'][self.voltype] + ['transport']) elif self.voltype == 'disperse': - dispd = self.config_data[self.voltype]['disperse'] - red = self.config_data[self.voltype]['redundancy'] - trans = self.config_data[self.voltype]['transport'] + dispd = (self.config_data['gluster']['volume_types'][self.voltype] + ['disperse_count']) + red = (self.config_data['gluster']['volume_types'][self.voltype] + ['redundancy_count']) + trans = (self.config_data['gluster']['volume_types'][self.voltype] + ['transport']) elif self.voltype == 'dist_disperse': dist = self.config_data[self.voltype]['dist_count'] - dispd = self.config_data[self.voltype]['disperse'] - red = self.config_data[self.voltype]['redundancy'] + dispd = self.config_data[self.voltype]['disperse_count'] + red = self.config_data[self.voltype]['redundancy_count'] trans = self.config_data[self.voltype]['transport'] else: tc.logger.error("The volume type is not present") return False - ret = setup_vol(self.volname, dist, rep, dispd, red, stripe, trans, - servers=self.servers) + ret = setup_vol(self.volname, self.mnode, dist, rep, dispd, red, + stripe, trans, servers=self.servers) if not ret: tc.logger.error("Unable to setup volume %s", self.volname) return False @@ -94,7 +129,11 @@ class GlusterBaseClass(): """ Function to setup the volume for testing. """ - volinfo = get_volume_info(server=self.servers[0]) + if not env_setup_servers(): + tc.logger.error("Unable to setup testenv") + return False + + volinfo = get_volume_info(mnode=self.servers[0]) if volinfo is not None and self.volname in volinfo.keys(): tc.logger.debug("The volume %s is already present in %s", self.volname, self.mnode) diff --git a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_init.py b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_init.py index 633208ca49c..9a3c8599724 100644 --- a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_init.py +++ b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/gluster_init.py @@ -17,7 +17,7 @@ from distaf.util import tc - +import re """ This file contains the glusterd and other initial gluster options like start/stop glusterd and env_setup_servers for @@ -67,4 +67,11 @@ def env_setup_servers(snap=True, servers=''): """ tc.logger.info("The function isn't implemented yet") tc.logger.info("Please setup the bricks manually.") + + if servers == '': + servers = tc.servers + + if not start_glusterd(servers): + return False + return True diff --git a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/mount_ops.py b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/mount_ops.py index 2d435f40d53..3082da0484f 100644 --- a/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/mount_ops.py +++ b/tests/distaf/distaf_libs/distaflibs-gluster/distaflibs/gluster/mount_ops.py @@ -18,15 +18,140 @@ from distaf.util import tc +class GlusterMount(): + """Gluster Mount class -def mount_volume(volname, mtype='glusterfs', mpoint='/mnt/glusterfs', \ - mserver='', mclient='', options=''): + Args: + mount (dict): Mount dict with 'mount_protocol', 'mountpoint', + 'server', 'client', 'volname', 'options' as keys + + Returns: + Instance of GlusterMount class + """ + client_register = 0 + + def __init__(self, mount): + if mount['protocol']: + self.mounttype = mount['protocol'] + else: + self.mounttype = "glusterfs" + + if mount['mountpoint']: + self.mountpoint = mount['mountpoint'] + else: + self.mountpoint = "/mnt/%s" % self.mounttype + + self.server_system = mount['server'] + self.client_system = mount['client'] + self.volname = mount['volname'] + self.options = mount['options'] + + def mount(self): + """Mounts the volume + + Args: + uses instance args passed at init + + Returns: + bool: True on success and False on failure. + """ + (_retcode, _, _) = mount_volume(self.volname, + mtype=self.mounttype, + mpoint=self.mountpoint, + mserver=self.server_system, + mclient=self.client_system, + options=self.options) + + if _retcode == 0: + return True + else: + return False + + def is_mounted(self): + """Tests for mount on client + + Args: + uses instance args passed at init + + Returns: + bool: True on success and False on failure. + """ + _retcode = is_mounted(self.volname, + mpoint=self.mountpoint, + mserver=self.server_system, + mclient=self.client_system) + + if _retcode: + return True + else: + return False + + def unmount(self): + """Unmounts the volume + + Args: + uses instance args passed at init + + Returns: + bool: True on success and False on failure. + """ + (_retcode, _, _) = umount_volume(self.client_system, + self.mountpoint) + + if _retcode == 0: + return True + else: + return False + +def is_mounted(volname, mpoint, mserver, mclient): + """Check if mount exist. + + Args: + volname (str): Name of the volume + mpoint (str): Mountpoint dir + mserver (str): Server to which it is mounted to + mclient (str): Client from which it is mounted. + + Returns: + bool: True if mounted and False otherwise. """ - Mount the gluster volume with specified options - Takes the volume name as mandatory argument + # python will error on missing arg, so just checking for empty args here + if not volname or not mpoint or not mserver or not mclient: + tc.logger.error("Missing arguments for mount.") + return False + + ret, _, _ = tc.run(mclient, "mount | grep %s | grep %s | grep \"%s\"" + % (volname, mpoint, mserver), verbose=False) + if ret == 0: + tc.logger.debug("Volume %s is mounted at %s:%s" % (volname, + mclient, + mpoint)) + return True + else: + tc.logger.error("Volume %s is not mounted at %s:%s" % (volname, + mclient, + mpoint)) + return False + +def mount_volume(volname, mtype='glusterfs', mpoint='/mnt/glusterfs', + mserver='', mclient='', options=''): + """Mount the gluster volume with specified options. - Returns a tuple of (returncode, stdout, stderr) - Returns (0, '', '') if already mounted + Args: + volname (str): Name of the volume to mount. + + Kwargs: + mtype (str): Protocol to be used to mount. + mpoint (str): Mountpoint dir. + mserver (str): Server to mount. + mclient (str): Client from which it has to be mounted. + option (str): Options for the mount command. + + Returns: + tuple: Tuple containing three elements (ret, out, err). + (0, '', '') if already mounted. + (1, '', '') if setup_samba_service fails in case of smb. + (ret, out, err) of mount commnd execution otherwise. """ global tc if mserver == '': @@ -39,24 +164,47 @@ def mount_volume(volname, mtype='glusterfs', mpoint='/mnt/glusterfs', \ options = "%s" % options elif mtype == 'nfs' and options == '': options = '-o vers=3' - ret, _, _ = tc.run(mclient, "mount | grep %s | grep %s | grep \"%s\"" \ - % (volname, mpoint, mserver), verbose=False) - if ret == 0: - tc.logger.debug("Volume %s is already mounted at %s" \ - % (volname, mpoint)) + + if is_mounted(volname, mpoint, mserver, mclient): + tc.logger.debug("Volume %s is already mounted at %s" % + (volname, mpoint)) return (0, '', '') - mcmd = "mount -t %s %s %s:/%s %s" % \ - (mtype, options, mserver, volname, mpoint) - tc.run(mclient, "test -d %s || mkdir -p %s" % (mpoint, mpoint), \ - verbose=False) + + mcmd = ("mount -t %s %s %s:/%s %s" % + (mtype, options, mserver, volname, mpoint)) + + if mtype == 'cifs': + from distaflibs.gluster.samba_ops import setup_samba_service + smbuser = tc.global_config['gluster']['cluster_config']['smb']['user'] + smbpasswd = (tc.global_config['gluster']['cluster_config']['smb'] + ['passwd']) + + if not setup_samba_service(volname, mserver, smbuser, smbpasswd): + tc.logger.error("Failed to setup samba service %s" % mserver) + return (1, '', '') + + mcmd = ("mount -t cifs -o username=root,password=%s " + "\\\\\\\\%s\\\\gluster-%s %s" % (smbpasswd, mserver, + volname, mpoint)) + # Create mount dir + _, _, _ = tc.run(mclient, "test -d %s || mkdir -p %s" % (mpoint, mpoint), + verbose=False) + + # Create mount return tc.run(mclient, mcmd) -def umount_volume(client, mountpoint): - """ - unmounts the mountpoint - Returns the output of umount command +def umount_volume(mclient, mpoint): + """Unmounts the mountpoint. + + Args: + mclient (str): Client from which it has to be mounted. + mpoint (str): Mountpoint dir. + + Returns: + tuple: Tuple containing three elements (ret, out, err) as returned by + umount command execution. """ - cmd = "umount %s || umount -f %s || umount -l %s" \ - % (mountpoint, mountpoint, mountpoint) - return tc.run(client, cmd) + cmd = ("umount %s || umount -f %s || umount -l %s" % + (mpoint, mpoint, mpoint)) + return tc.run(mclient, cmd) diff --git a/tests/distaf/tests_d/distaf_gluster_config.yml b/tests/distaf/tests_d/distaf_gluster_config.yml index 28ae6e2894e..c9e8d824b64 100644 --- a/tests/distaf/tests_d/distaf_gluster_config.yml +++ b/tests/distaf/tests_d/distaf_gluster_config.yml @@ -68,10 +68,10 @@ gluster: ctdb_vips: - vip: vip1 routing_prefix: '23' - interfaces: 'eth0' + interface: 'eth0' - vip: vip2 routing_prefix: '22' - interfaces: 'eth0' + interface: 'eth0' ctdb_metavol_brick_path: '' nfs_ganesha: @@ -81,24 +81,25 @@ gluster: volume_types: distribute: &distribute + type: distribute dist_count: 4 transport: tcp - replicate: &replicate + type: replicate replica_count: 3 transport: tcp - dist_rep: &dist_rep + type: dist_rep dist_count: 2 replica_count: 2 transport: tcp - disperse: &disperse + type: disperse disperse_count: 4 redundancy_count: 2 transport: tcp - dist_disperse: &dist_disperse + type: dist_disperse dist_count: 2 disperse_count: 4 redundancy_count: 2 -- cgit