Modifying gluster_base_class and mount_ops to suit the config file changes made

Change-Id: Ic551724dd27fcc2cc618e8de04110752bf5a8786
BUG: 1350017
Signed-off-by: Shwetha Panduranga <spandura@redhat.com>
Reviewed-on: http://review.gluster.org/14808
Tested-by: ShwethaHPanduranga
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Jonathan Holloway <jholloway@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
This commit is contained in:
Shwetha Panduranga 2016-06-27 02:26:06 +05:30 committed by Kaushal M
parent eaadde082e
commit d2842f1b58
4 changed files with 251 additions and 56 deletions

View File

@ -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)

View File

@ -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

View File

@ -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
Returns a tuple of (returncode, stdout, stderr)
Returns (0, '', '') if already mounted
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.
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):
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.
"""
unmounts the mountpoint
Returns the output of umount command
"""
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)

View File

@ -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