From c97efd9029424340d7ce280843b3a1eb8833153a Mon Sep 17 00:00:00 2001 From: Arun Kumar Date: Mon, 20 Jul 2020 19:58:37 +0530 Subject: [TestFix] Remove the skip marker from TC and add the validation Change-Id: I1734d0f9ed535176abb5f7741d00efc817aec222 Signed-off-by: Arun Kumar --- tests/functional/arbiter/test_arbiter.py | 100 ++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 34 deletions(-) (limited to 'tests/functional/arbiter') diff --git a/tests/functional/arbiter/test_arbiter.py b/tests/functional/arbiter/test_arbiter.py index 0b5ff751..06beef67 100755 --- a/tests/functional/arbiter/test_arbiter.py +++ b/tests/functional/arbiter/test_arbiter.py @@ -4,7 +4,6 @@ import ddt from glusto.core import Glusto as g from glustolibs.gluster import volume_ops import pytest -from unittest import skip from openshiftstoragelibs import baseclass from openshiftstoragelibs import exceptions @@ -16,6 +15,7 @@ from openshiftstoragelibs import openshift_ops from openshiftstoragelibs import openshift_version from openshiftstoragelibs import podcmd from openshiftstoragelibs import utils +from openshiftstoragelibs import waiter BRICK_REGEX = r"^(.*):\/var\/lib\/heketi\/mounts\/(.*)\/brick$" HEKETI_VOLS = re.compile(r"Id:(\S+)\s+Cluster:(\S+)\s+Name:(\S+)") @@ -1492,7 +1492,6 @@ class TestArbiterVolumeCreateExpandDelete(baseclass.BaseClass): "expansion".format( arbiter_brick_size_after, arbiter_brick_size_before)) - @skip("Blocked by BZ-1848895") @pytest.mark.tier2 def test_poweroff_gluster_nodes_after_filling_inodes_arbiter_brick(self): """Validate io after filling up the arbiter brick and node poweroff""" @@ -1500,14 +1499,16 @@ class TestArbiterVolumeCreateExpandDelete(baseclass.BaseClass): # Create sc with gluster arbiter info sc_name = self.create_storage_class(is_arbiter_vol=True) - # Get list of all gluster nodes and mark them unschedulable - g_nodes = openshift_ops.oc_get_custom_resource( - self.node, 'pod', ':.spec.nodeName', selector='glusterfs-node=pod') - g_nodes = [node[0] for node in g_nodes] - openshift_ops.oc_adm_manage_node( - self.node, '--schedulable=false', nodes=g_nodes) - self.addCleanup(openshift_ops.oc_adm_manage_node, - self.node, '--schedulable=true', nodes=g_nodes) + if self.is_containerized_gluster(): + # Get list of all gluster nodes and mark them unschedulable + g_nodes = openshift_ops.oc_get_custom_resource( + self.node, 'pod', ':.spec.nodeName', + selector='glusterfs-node=pod') + g_nodes = [node[0] for node in g_nodes] + openshift_ops.oc_adm_manage_node( + self.node, '--schedulable=false', nodes=g_nodes) + self.addCleanup(openshift_ops.oc_adm_manage_node, + self.node, '--schedulable=true', nodes=g_nodes) # Create PVC and corresponding App pod self.create_and_wait_for_pvc(sc_name=sc_name) @@ -1530,36 +1531,67 @@ class TestArbiterVolumeCreateExpandDelete(baseclass.BaseClass): for node_ip, inodes_info in hosts_with_inodes_info.items(): for brick, inodes in inodes_info.items(): if arbiter_brick == brick: - arb_free_inodes = inodes + arb_free_inodes = int(inodes) - 450 break - # Create masterfile of size equal to free inodes in bytes - mount_path, filename = "/mnt/", "masterfile" - dd_cmd = ( - "dd if=/dev/urandom of={}{} bs=1 count={}".format( - mount_path, filename, arb_free_inodes)) - ret, out, err = openshift_ops.oc_rsh(self.node, pod_name, dd_cmd) - self.assertFalse(ret, "Failed to execute command {} on pod {}".format( - dd_cmd, pod_name)) - - # Split masterfile to a number which is equal to free inodes - split_cmd = ( - "oc exec {} -- /bin/sh -c 'cd {}; split -b 1 -a 10 {}'".format( - pod_name, mount_path, filename)) - self.cmd_run(split_cmd) - - # Poweroff the node with arbiter brick + # Completely fill free inodes of arbiter brick + while(arb_free_inodes > 0): + + # Create a randome master file at the mount point + path = "/mnt/{}/".format(utils.get_random_str()) + filename = "masterfile" + dd_cmd = ( + "oc exec {} -- /bin/sh -c 'mkdir {};" + "dd if=/dev/urandom of={}{} bs=1 count=4000'".format( + pod_name, path, path, filename)) + self.cmd_run(dd_cmd) + + # Split masterfile into multiple smaller files of 1 byte each + split_cmd = ( + "oc exec {} -- /bin/sh -c 'cd {}; split -b 1 -a 10 {}'".format( + pod_name, path, filename)) + self.cmd_run(split_cmd) + arb_free_inodes -= 4000 + + # Check if there pending heals then break the loop, + # because inodes of arbiter brick are filled + try: + gluster_ops.wait_to_heal_complete( + timeout=60, vol_name=vol_name) + except AssertionError: + break + + # Poweroff the one of the node with data brick target_ip = bricks_list['data_list'][0]['name'].split(":")[0] target_vm_name = node_ops.find_vm_name_by_ip_or_hostname(target_ip) - self.power_off_gluster_node_vm(target_vm_name, target_ip) + for ip, info in self.gluster_servers_info.items(): + if ip == target_ip: + target_hostname = info['manage'] + break + self.power_off_gluster_node_vm(target_vm_name, target_hostname) + + # Create a file with text test and check if message is "no space left" + try: + file_cmd = ("oc exec {} -- /bin/sh -c \"echo 'test' > " + "/mnt/".format(pod_name)) + self.cmd_run(file_cmd + '{}"'.format(utils.get_random_str())) + except AssertionError as err: + msg = "No space left on device" + if msg not in str(err): + raise - # Create a file with text test - file_cmd = ("oc exec {} -- /bin/sh -c \"echo 'test' > " - "/mnt/file\"".format(pod_name)) - self.cmd_run(file_cmd) + # Power on gluster node + self.power_on_gluster_node_vm(target_vm_name, target_hostname) - # Power on gluster node and wait for the services to be up - self.power_on_gluster_node_vm(target_vm_name, target_ip) + # Try to create a file + for w in waiter.Waiter(120, 5): + try: + self.cmd_run(file_cmd + '{}"'.format(utils.get_random_str())) + break + except AssertionError: + continue + if w.expired: + raise def _arbiter_volume_device_tag_operations( self, device_tag_count, vol_creation): -- cgit