summaryrefslogtreecommitdiffstats
path: root/glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py
diff options
context:
space:
mode:
Diffstat (limited to 'glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py')
-rwxr-xr-x[-rw-r--r--]glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py500
1 files changed, 99 insertions, 401 deletions
diff --git a/glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py b/glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py
index 20dbe430d..5f69e68f6 100644..100755
--- a/glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py
+++ b/glustolibs-gluster/glustolibs/gluster/nfs_ganesha_libs.py
@@ -30,427 +30,125 @@ from glustolibs.gluster.nfs_ganesha_ops import (
is_nfs_ganesha_cluster_in_healthy_state,
teardown_nfs_ganesha_cluster,
create_nfs_ganesha_cluster,
- export_nfs_ganesha_volume,
- unexport_nfs_ganesha_volume,
configure_ports_on_clients,
ganesha_client_firewall_settings)
-from glustolibs.gluster.gluster_base_class import GlusterBaseClass
-from glustolibs.gluster.exceptions import ExecutionError, ConfigError
-from glustolibs.gluster.peer_ops import peer_probe_servers, peer_status
-from glustolibs.gluster.volume_ops import volume_info, get_volume_info
-from glustolibs.gluster.volume_libs import (setup_volume, cleanup_volume,
- log_volume_info_and_status,
- get_volume_options,
- is_volume_exported)
-from glustolibs.gluster.mount_ops import create_mount_objs
-from glustolibs.io.utils import log_mounts_info, wait_for_io_to_complete
-from glustolibs.misc.misc_libs import upload_scripts
-
-
-class NfsGaneshaClusterSetupClass(GlusterBaseClass):
- """Creates nfs ganesha cluster
+from glustolibs.gluster.volume_libs import is_volume_exported
+from glustolibs.gluster.lib_utils import is_rhel7
+
+
+def setup_nfs_ganesha(cls):
"""
- @classmethod
- def setUpClass(cls):
- """
- Setup variable for nfs-ganesha tests.
- """
- # pylint: disable=too-many-statements, too-many-branches
- GlusterBaseClass.setUpClass.im_func(cls)
-
- # Check if enable_nfs_ganesha is set in config file
- if not cls.enable_nfs_ganesha:
- raise ConfigError("Please enable nfs ganesha in config")
-
- # Read num_of_nfs_ganesha_nodes from config file and create
- # nfs ganesha cluster accordingly
- cls.num_of_nfs_ganesha_nodes = int(cls.num_of_nfs_ganesha_nodes)
- cls.servers_in_nfs_ganesha_cluster = (
- cls.servers[:cls.num_of_nfs_ganesha_nodes])
- cls.vips_in_nfs_ganesha_cluster = (
- cls.vips[:cls.num_of_nfs_ganesha_nodes])
-
- # Obtain hostname of servers in ganesha cluster
- cls.ganesha_servers_hostname = []
- for ganesha_server in cls.servers_in_nfs_ganesha_cluster:
- ret, hostname, _ = g.run(ganesha_server, "hostname")
- if ret:
- raise ExecutionError("Failed to obtain hostname of %s"
- % ganesha_server)
- hostname = hostname.strip()
- g.log.info("Obtained hostname: IP- %s, hostname- %s",
- ganesha_server, hostname)
- cls.ganesha_servers_hostname.append(hostname)
-
- @classmethod
- def setup_nfs_ganesha(cls):
- """
- Create nfs-ganesha cluster if not exists
- Set client configurations for nfs-ganesha
-
- Returns:
- True(bool): If setup is successful
- False(bool): If setup is failure
- """
- # pylint: disable = too-many-statements, too-many-branches
- # pylint: disable = too-many-return-statements
- cluster_exists = is_nfs_ganesha_cluster_exists(
- cls.servers_in_nfs_ganesha_cluster[0])
- if cluster_exists:
- is_healthy = is_nfs_ganesha_cluster_in_healthy_state(
- cls.servers_in_nfs_ganesha_cluster[0])
-
- if is_healthy:
- g.log.info("Nfs-ganesha Cluster exists and is in healthy "
- "state. Skipping cluster creation...")
- else:
- g.log.info("Nfs-ganesha Cluster exists and is not in "
- "healthy state.")
- g.log.info("Tearing down existing cluster which is not in "
- "healthy state")
- ganesha_ha_file = ("/var/run/gluster/shared_storage/"
- "nfs-ganesha/ganesha-ha.conf")
-
- g.log.info("Collecting server details of existing "
- "nfs ganesha cluster")
- conn = g.rpyc_get_connection(
- cls.servers_in_nfs_ganesha_cluster[0], user="root")
- if not conn:
- tmp_node = cls.servers_in_nfs_ganesha_cluster[0]
- g.log.error("Unable to get connection to 'root' of node"
- " %s", tmp_node)
- return False
-
- if not conn.modules.os.path.exists(ganesha_ha_file):
- g.log.error("Unable to locate %s", ganesha_ha_file)
- return False
- with conn.builtin.open(ganesha_ha_file, "r") as fhand:
- ganesha_ha_contents = fhand.read()
- g.rpyc_close_connection(
- host=cls.servers_in_nfs_ganesha_cluster[0], user="root")
- servers_in_existing_cluster = re.findall(r'VIP_(.*)\=.*',
- ganesha_ha_contents)
-
- ret = teardown_nfs_ganesha_cluster(
- servers_in_existing_cluster, force=True)
- if not ret:
- g.log.error("Failed to teardown unhealthy ganesha "
- "cluster")
- return False
-
- g.log.info("Existing unhealthy cluster got teardown "
- "successfully")
-
- if (not cluster_exists) or (not is_healthy):
- g.log.info("Creating nfs-ganesha cluster of %s nodes"
- % str(cls.num_of_nfs_ganesha_nodes))
- g.log.info("Nfs-ganesha cluster node info: %s"
- % cls.servers_in_nfs_ganesha_cluster)
- g.log.info("Nfs-ganesha cluster vip info: %s"
- % cls.vips_in_nfs_ganesha_cluster)
-
- ret = create_nfs_ganesha_cluster(
- cls.ganesha_servers_hostname,
- cls.vips_in_nfs_ganesha_cluster)
- if not ret:
- g.log.error("Creation of nfs-ganesha cluster failed")
- return False
+ Create nfs-ganesha cluster if not exists
+ Set client configurations for nfs-ganesha
- if not is_nfs_ganesha_cluster_in_healthy_state(
- cls.servers_in_nfs_ganesha_cluster[0]):
- g.log.error("Nfs-ganesha cluster is not healthy")
- return False
- g.log.info("Nfs-ganesha Cluster exists is in healthy state")
+ Returns:
+ True(bool): If setup is successful
+ False(bool): If setup is failure
+ """
+ # pylint: disable = too-many-statements, too-many-branches
+ # pylint: disable = too-many-return-statements
+ cluster_exists = is_nfs_ganesha_cluster_exists(
+ cls.servers_in_nfs_ganesha_cluster[0])
+ if cluster_exists:
+ is_healthy = is_nfs_ganesha_cluster_in_healthy_state(
+ cls.servers_in_nfs_ganesha_cluster[0])
- ret = configure_ports_on_clients(cls.clients)
- if not ret:
- g.log.error("Failed to configure ports on clients")
- return False
+ if is_healthy:
+ g.log.info("Nfs-ganesha Cluster exists and is in healthy "
+ "state. Skipping cluster creation...")
+ else:
+ g.log.info("Nfs-ganesha Cluster exists and is not in "
+ "healthy state.")
+ g.log.info("Tearing down existing cluster which is not in "
+ "healthy state")
+ ganesha_ha_file = ("/var/run/gluster/shared_storage/"
+ "nfs-ganesha/ganesha-ha.conf")
+ g_node = cls.servers_in_nfs_ganesha_cluster[0]
+
+ g.log.info("Collecting server details of existing "
+ "nfs ganesha cluster")
+
+ # Check whether ganesha ha file exists
+ cmd = "[ -f {} ]".format(ganesha_ha_file)
+ ret, _, _ = g.run(g_node, cmd)
+ if ret:
+ g.log.error("Unable to locate %s", ganesha_ha_file)
+ return False
- ret = ganesha_client_firewall_settings(cls.clients)
- if not ret:
- g.log.error("Failed to do firewall setting in clients")
- return False
+ # Read contents of ganesha_ha_file
+ cmd = "cat {}".format(ganesha_ha_file)
+ ret, ganesha_ha_contents, _ = g.run(g_node, cmd)
+ if ret:
+ g.log.error("Failed to read %s", ganesha_ha_file)
+ return False
- for server in cls.servers:
- for client in cls.clients:
- cmd = ("if [ -z \"$(grep -R \"%s\" /etc/hosts)\" ]; then "
- "echo \"%s %s\" >> /etc/hosts; fi"
- % (client, socket.gethostbyname(client), client))
- ret, _, _ = g.run(server, cmd)
- if ret != 0:
- g.log.error("Failed to add entry of client %s in "
- "/etc/hosts of server %s"
- % (client, server))
+ servers_in_existing_cluster = re.findall(r'VIP_(.*)\=.*',
+ ganesha_ha_contents)
- for client in cls.clients:
- for server in cls.servers:
- cmd = ("if [ -z \"$(grep -R \"%s\" /etc/hosts)\" ]; then "
- "echo \"%s %s\" >> /etc/hosts; fi"
- % (server, socket.gethostbyname(server), server))
- ret, _, _ = g.run(client, cmd)
- if ret != 0:
- g.log.error("Failed to add entry of server %s in "
- "/etc/hosts of client %s"
- % (server, client))
- return True
-
- @classmethod
- def tearDownClass(cls, delete_nfs_ganesha_cluster=True):
- """Teardown nfs ganesha cluster.
- """
- GlusterBaseClass.tearDownClass.im_func(cls)
-
- if delete_nfs_ganesha_cluster:
ret = teardown_nfs_ganesha_cluster(
- cls.servers_in_nfs_ganesha_cluster)
+ servers_in_existing_cluster, force=True)
if not ret:
- g.log.error("Teardown got failed. Hence, cleaning up "
- "nfs-ganesha cluster forcefully")
- ret = teardown_nfs_ganesha_cluster(
- cls.servers_in_nfs_ganesha_cluster, force=True)
- if not ret:
- raise ExecutionError("Force cleanup of nfs-ganesha "
- "cluster failed")
- g.log.info("Teardown nfs ganesha cluster succeeded")
- else:
- g.log.info("Skipping teardown nfs-ganesha cluster...")
-
-
-class NfsGaneshaVolumeBaseClass(NfsGaneshaClusterSetupClass):
- """Sets up the nfs ganesha cluster, volume for testing purposes.
- """
- @classmethod
- def setUpClass(cls):
- """Setup volume exports volume with nfs-ganesha,
- mounts the volume.
- """
- # pylint: disable=too-many-branches
- NfsGaneshaClusterSetupClass.setUpClass.im_func(cls)
-
- # Peer probe servers
- ret = peer_probe_servers(cls.mnode, cls.servers)
- if not ret:
- raise ExecutionError("Failed to peer probe servers")
+ g.log.error("Failed to teardown unhealthy ganesha "
+ "cluster")
+ return False
- g.log.info("All peers are in connected state")
+ g.log.info("Existing unhealthy cluster got teardown "
+ "successfully")
- # Peer Status from mnode
- peer_status(cls.mnode)
+ if (not cluster_exists) or (not is_healthy):
+ g.log.info("Creating nfs-ganesha cluster of %s nodes"
+ % str(cls.num_of_nfs_ganesha_nodes))
+ g.log.info("Nfs-ganesha cluster node info: %s"
+ % cls.servers_in_nfs_ganesha_cluster)
+ g.log.info("Nfs-ganesha cluster vip info: %s"
+ % cls.vips_in_nfs_ganesha_cluster)
- for server in cls.servers:
- mount_info = [
- {'protocol': 'glusterfs',
- 'mountpoint': '/run/gluster/shared_storage',
- 'server': server,
- 'client': {'host': server},
- 'volname': 'gluster_shared_storage',
- 'options': ''}]
-
- mount_obj = create_mount_objs(mount_info)
- if not mount_obj[0].is_mounted():
- ret = mount_obj[0].mount()
- if not ret:
- raise ExecutionError("Unable to mount volume '%s:%s' "
- "on '%s:%s'"
- % (mount_obj.server_system,
- mount_obj.volname,
- mount_obj.client_system,
- mount_obj.mountpoint))
-
- # Setup Volume
- ret = setup_volume(mnode=cls.mnode,
- all_servers_info=cls.all_servers_info,
- volume_config=cls.volume)
+ ret = create_nfs_ganesha_cluster(
+ cls.ganesha_servers_hostname,
+ cls.vips_in_nfs_ganesha_cluster)
if not ret:
- raise ExecutionError("Setup volume %s failed", cls.volume)
- time.sleep(10)
-
- # Export volume with nfs ganesha, if it is not exported already
- vol_option = get_volume_options(cls.mnode, cls.volname,
- option='ganesha.enable')
- if vol_option is None:
- raise ExecutionError("Failed to get ganesha.enable volume option "
- "for %s " % cls.volume)
- if vol_option['ganesha.enable'] != 'on':
- ret, _, _ = export_nfs_ganesha_volume(
- mnode=cls.mnode, volname=cls.volname)
- if ret != 0:
- raise ExecutionError("Failed to export volume %s "
- "as NFS export", cls.volname)
- time.sleep(5)
+ g.log.error("Creation of nfs-ganesha cluster failed")
+ return False
- ret = wait_for_nfs_ganesha_volume_to_get_exported(cls.mnode,
- cls.volname)
- if not ret:
- raise ExecutionError("Failed to export volume %s. volume is "
- "not listed in showmount" % cls.volname)
- else:
- g.log.info("Volume %s is exported successfully"
- % cls.volname)
+ if not is_nfs_ganesha_cluster_in_healthy_state(
+ cls.servers_in_nfs_ganesha_cluster[0]):
+ g.log.error("Nfs-ganesha cluster is not healthy")
+ return False
+ g.log.info("Nfs-ganesha Cluster exists is in healthy state")
- # Log Volume Info and Status
- ret = log_volume_info_and_status(cls.mnode, cls.volname)
+ if is_rhel7(cls.clients):
+ ret = configure_ports_on_clients(cls.clients)
if not ret:
- raise ExecutionError("Logging volume %s info and status failed",
- cls.volname)
-
- # Create Mounts
- _rc = True
- for mount_obj in cls.mounts:
- ret = mount_obj.mount()
- if not ret:
- g.log.error("Unable to mount volume '%s:%s' on '%s:%s'",
- mount_obj.server_system, mount_obj.volname,
- mount_obj.client_system, mount_obj.mountpoint)
- _rc = False
- if not _rc:
- raise ExecutionError("Mounting volume %s on few clients failed",
- cls.volname)
-
- # Get info of mount before the IO
- log_mounts_info(cls.mounts)
-
- @classmethod
- def tearDownClass(cls, umount_vol=True, cleanup_vol=True,
- teardown_nfs_ganesha_cluster=True):
- """Teardown the export, mounts and volume.
- """
- # pylint: disable=too-many-branches
- # Unmount volume
- if umount_vol:
- _rc = True
- for mount_obj in cls.mounts:
- ret = mount_obj.unmount()
- if not ret:
- g.log.error("Unable to unmount volume '%s:%s' on '%s:%s'",
- mount_obj.server_system, mount_obj.volname,
- mount_obj.client_system, mount_obj.mountpoint)
- _rc = False
- if not _rc:
- raise ExecutionError("Unmount of all mounts are not "
- "successful")
-
- # Cleanup volume
- if cleanup_vol:
-
- volinfo = get_volume_info(cls.mnode, cls.volname)
- if volinfo is None or cls.volname not in volinfo:
- g.log.info("Volume %s does not exist in %s"
- % (cls.volname, cls.mnode))
- else:
- # Unexport volume, if it is not unexported already
- vol_option = get_volume_options(cls.mnode, cls.volname,
- option='ganesha.enable')
- if vol_option is None:
- raise ExecutionError("Failed to get ganesha.enable volume "
- " option for %s " % cls.volume)
- if vol_option['ganesha.enable'] != 'off':
- if is_volume_exported(cls.mnode, cls.volname, "nfs"):
- ret, _, _ = unexport_nfs_ganesha_volume(
- mnode=cls.mnode, volname=cls.volname)
- if ret != 0:
- raise ExecutionError("Failed to unexport volume %s"
- % cls.volname)
- time.sleep(5)
- else:
- g.log.info("Volume %s is unexported already"
- % cls.volname)
-
- _, _, _ = g.run(cls.mnode, "showmount -e")
-
- ret = cleanup_volume(mnode=cls.mnode, volname=cls.volname)
- if not ret:
- raise ExecutionError("cleanup volume %s failed", cls.volname)
-
- # All Volume Info
- volume_info(cls.mnode)
-
- (NfsGaneshaClusterSetupClass.
- tearDownClass.
- im_func(cls,
- delete_nfs_ganesha_cluster=teardown_nfs_ganesha_cluster))
-
-
-class NfsGaneshaIOBaseClass(NfsGaneshaVolumeBaseClass):
- """ Nfs Ganesha IO base class to run the tests when IO is in progress """
+ g.log.error("Failed to configure ports on clients")
+ return False
- @classmethod
- def setUpClass(cls):
+ ret = ganesha_client_firewall_settings(cls.clients)
+ if not ret:
+ g.log.error("Failed to do firewall setting in clients")
+ return False
- NfsGaneshaVolumeBaseClass.setUpClass.im_func(cls)
+ for server in cls.servers:
+ for client in cls.clients:
+ cmd = ("if [ -z \"$(grep -R \"%s\" /etc/hosts)\" ]; then "
+ "echo \"%s %s\" >> /etc/hosts; fi"
+ % (client, socket.gethostbyname(client), client))
+ ret, _, _ = g.run(server, cmd)
+ if ret != 0:
+ g.log.error("Failed to add entry of client %s in "
+ "/etc/hosts of server %s"
+ % (client, server))
- # Upload io scripts for running IO on mounts
- script_local_path = ("/usr/share/glustolibs/io/scripts/"
- "file_dir_ops.py")
- cls.script_upload_path = ("/usr/share/glustolibs/io/scripts/"
- "file_dir_ops.py")
- ret = upload_scripts(cls.clients, script_local_path)
- if not ret:
- raise ExecutionError("Failed to upload IO scripts")
-
- cls.counter = 1
-
- def setUp(self):
- """setUp starts the io from all the mounts.
- IO creates deep dirs and files.
- """
-
- NfsGaneshaVolumeBaseClass.setUp.im_func(self)
-
- # Start IO on mounts
- g.log.info("Starting IO on all mounts...")
- self.all_mounts_procs = []
- for mount_obj in self.mounts:
- cmd = ("python %s create_deep_dirs_with_files "
- "--dirname-start-num %d "
- "--dir-depth 2 "
- "--dir-length 15 "
- "--max-num-of-dirs 5 "
- "--num-of-files 10 %s" % (self.script_upload_path,
- self.counter,
- mount_obj.mountpoint))
- proc = g.run_async(mount_obj.client_system, cmd,
- user=mount_obj.user)
- self.all_mounts_procs.append(proc)
- self.counter = self.counter + 10
- self.io_validation_complete = False
-
- # Adding a delay of 15 seconds before test method starts. This
- # is to ensure IO's are in progress and giving some time to fill data
- time.sleep(15)
-
- def tearDown(self):
- """If test method failed before validating IO, tearDown waits for the
- IO's to complete and checks for the IO exit status
- """
-
- # Wait for IO to complete if io validation is not executed in the
- # test method
- if not self.io_validation_complete:
- g.log.info("Wait for IO to complete as IO validation did not "
- "succeed in test method")
- ret = wait_for_io_to_complete(self.all_mounts_procs, self.mounts)
- if not ret:
- raise ExecutionError("IO failed on some of the clients")
- g.log.info("IO is successful on all mounts")
- NfsGaneshaVolumeBaseClass.tearDown.im_func(self)
-
- @classmethod
- def tearDownClass(cls, umount_volume=True, cleanup_volume=True,
- teardown_nfsganesha_cluster=True):
- """Cleanup data from mount, cleanup volume and delete nfs ganesha
- cluster.
- """
- # Log Mounts info
- g.log.info("Log mounts info")
- log_mounts_info(cls.mounts)
-
- (NfsGaneshaVolumeBaseClass.
- tearDownClass.
- im_func(cls,
- umount_vol=umount_volume, cleanup_vol=cleanup_volume,
- teardown_nfs_ganesha_cluster=teardown_nfsganesha_cluster))
+ for client in cls.clients:
+ for server in cls.servers:
+ cmd = ("if [ -z \"$(grep -R \"%s\" /etc/hosts)\" ]; then "
+ "echo \"%s %s\" >> /etc/hosts; fi"
+ % (server, socket.gethostbyname(server), server))
+ ret, _, _ = g.run(client, cmd)
+ if ret != 0:
+ g.log.error("Failed to add entry of server %s in "
+ "/etc/hosts of client %s"
+ % (server, client))
+ return True
def wait_for_nfs_ganesha_volume_to_get_exported(mnode, volname, timeout=120):