summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormandaltapesh <tmandal@redhat.com>2017-12-11 16:19:38 +0530
committermandaltapesh <tmandal@redhat.com>2018-02-01 20:10:07 +0530
commit4fc10f413c586431444f42a8b1b5855dad3221cb (patch)
treee46fc4e1db17124195eddeca7fe85a2c9578ecb3
parentb627cd9eb0289a0d3e261b6f83cb9c1bf7d98313 (diff)
Initial commit for heketi test cases
The initial batch of testcases pushed includes testcases related to volume creation and deletion. Change-Id: I754155c85fb764f0e0600b0c0b88d55fa999361b Signed-off-by: mandaltapesh <tmandal@redhat.com>
-rw-r--r--tests/functional/common/heketi/test_volume_creation.py133
-rw-r--r--tests/functional/common/heketi/test_volume_deletion.py122
2 files changed, 255 insertions, 0 deletions
diff --git a/tests/functional/common/heketi/test_volume_creation.py b/tests/functional/common/heketi/test_volume_creation.py
new file mode 100644
index 00000000..a2c8f73a
--- /dev/null
+++ b/tests/functional/common/heketi/test_volume_creation.py
@@ -0,0 +1,133 @@
+from __future__ import division
+import json
+import math
+import unittest
+
+from glusto.core import Glusto as g
+from glustolibs.gluster import volume_ops
+
+from cnslibs.common.exceptions import ExecutionError, ConfigError
+from cnslibs.common.heketi_libs import HeketiClientSetupBaseClass
+from cnslibs.common.openshift_ops import get_ocp_gluster_pod_names
+from cnslibs.common import heketi_ops, podcmd
+
+
+class TestVolumeCreationTestCases(HeketiClientSetupBaseClass):
+ """
+ Class for volume creation related test cases
+ """
+
+ @podcmd.GlustoPod()
+ def test_create_heketi_volume(self):
+ """
+ Method to test heketi volume creation and
+ background gluster validation
+ """
+
+ hosts = []
+ gluster_servers = []
+ brick_info = []
+
+ output_dict = heketi_ops.heketi_volume_create(
+ self.heketi_client_node, self.heketi_server_url, 10, json=True)
+
+ self.assertNotEqual(output_dict, False,
+ "Volume could not be created")
+
+ volume_name = output_dict["name"]
+ volume_id = output_dict["id"]
+
+ self.addCleanup(self.delete_volumes, volume_id)
+
+ self.assertEqual(output_dict["durability"]
+ ["replicate"]["replica"], 3,
+ "Volume %s is not replica 3" % volume_id)
+
+ self.assertEqual(output_dict["size"], 10,
+ "Volume %s is not of intended size"
+ % volume_id)
+
+ mount_node = (output_dict["mount"]["glusterfs"]
+ ["device"].strip().split(":")[0])
+ hosts.append(mount_node)
+
+ for backup_volfile_server in (output_dict["mount"]["glusterfs"]
+ ["options"]["backup-volfile-servers"]
+ .strip().split(",")):
+ hosts.append(backup_volfile_server)
+
+ for gluster_server in self.gluster_servers:
+ gluster_servers.append(g.config["gluster_servers"]
+ [gluster_server]["storage"])
+
+ self.assertEqual(set(hosts), set(gluster_servers),
+ "Hosts and gluster servers not matching for %s"
+ % volume_id)
+
+ if self.deployment_type == "cns":
+ gluster_pod = get_ocp_gluster_pod_names(
+ self.heketi_client_node)[1]
+
+ p = podcmd.Pod(self.heketi_client_node, gluster_pod)
+
+ volume_info = volume_ops.get_volume_info(p, volume_name)
+ volume_status = volume_ops.get_volume_status(p, volume_name)
+
+ elif self.deployment_type == "crs":
+ volume_info = volume_ops.get_volume_info(
+ self.heketi_client_node, volume_name)
+ volume_status = volume_ops.get_volume_status(
+ self.heketi_client_node, volume_name)
+
+ self.assertNotEqual(volume_info, None,
+ "get_volume_info returned None")
+ self.assertNotEqual(volume_status, None,
+ "get_volume_status returned None")
+
+ self.assertEqual(int(volume_info[volume_name]["status"]), 1,
+ "Volume %s status down" % volume_id)
+ for brick_details in volume_info[volume_name]["bricks"]["brick"]:
+ brick_info.append(brick_details["name"])
+
+ if brick_info == []:
+ raise ExecutionError("Brick details empty for %s" % volume_name)
+
+ for brick in brick_info:
+ brick_data = brick.strip().split(":")
+ brick_ip = brick_data[0]
+ brick_name = brick_data[1]
+ self.assertEqual(int(volume_status
+ [volume_name][brick_ip]
+ [brick_name]["status"]), 1,
+ "Brick %s is not up" % brick_name)
+
+ def test_volume_creation_no_free_devices(self):
+ """
+ To test volume creation when there are no free devices
+ """
+
+ large_volume = heketi_ops.heketi_volume_create(
+ self.heketi_client_node, self.heketi_server_url,
+ 595, json=True)
+
+ self.assertNotEqual(large_volume, False, "Volume creation failed")
+ self.addCleanup(self.delete_volumes, large_volume["id"])
+
+ small_volume = heketi_ops.heketi_volume_create(
+ self.heketi_client_node, self.heketi_server_url,
+ 90, json=True)
+
+ self.assertNotEqual(small_volume, False, "Volume creation failed")
+ self.addCleanup(self.delete_volumes, small_volume["id"])
+
+ ret, out, err = heketi_ops.heketi_volume_create(
+ self.heketi_client_node, self.heketi_server_url,
+ 50, raw_cli_output=True)
+
+ self.assertEqual(err.strip(), "Error: No space",
+ "Volume creation failed with invalid reason")
+
+ if ret == 0:
+ out_json = json.loads(out)
+ self.addCleanup(self.delete_volumes, out_json["id"])
+
diff --git a/tests/functional/common/heketi/test_volume_deletion.py b/tests/functional/common/heketi/test_volume_deletion.py
new file mode 100644
index 00000000..bf7b6835
--- /dev/null
+++ b/tests/functional/common/heketi/test_volume_deletion.py
@@ -0,0 +1,122 @@
+from __future__ import division
+import math
+import unittest
+
+from glusto.core import Glusto as g
+
+from cnslibs.common.exceptions import ExecutionError, ConfigError
+from cnslibs.common.heketi_libs import HeketiClientSetupBaseClass
+from cnslibs.common import heketi_ops
+
+
+class TestVolumeDeleteTestCases(HeketiClientSetupBaseClass):
+ """
+ Class for volume deletion related test cases
+
+ """
+
+ def get_free_space_summary_devices(self):
+ """
+ Calculates free space across all devices
+ """
+ total_free_space = 0
+ heketi_node_id_list = []
+
+ heketi_node_list_string = heketi_ops.heketi_node_list(
+ self.heketi_client_node,
+ self.heketi_server_url, mode="cli", json=True)
+
+ self.assertNotEqual(heketi_node_list_string, False,
+ "Heketi node list command failed")
+
+ for line in heketi_node_list_string.strip().split("\n"):
+ heketi_node_id_list.append(line.strip().split(
+ "Cluster")[0].strip().split(":")[1])
+
+ for node_id in heketi_node_id_list:
+ node_info_dict = heketi_ops.heketi_node_info(
+ self.heketi_client_node, self.heketi_server_url,
+ node_id, json=True)
+ for device in node_info_dict["devices"]:
+ total_free_space += (device["storage"]
+ ["free"] / (1024 ** 2))
+
+ return total_free_space
+
+ def test_delete_heketi_volume(self):
+ """
+ Method to test heketi volume deletion and whether it
+ frees up used space after deletion
+ """
+
+ creation_output_dict = heketi_ops.heketi_volume_create(
+ self.heketi_client_node,
+ self.heketi_server_url, 10, json=True)
+
+ self.assertNotEqual(creation_output_dict, False,
+ "Volume creation failed")
+
+ volume_id = creation_output_dict["name"].strip().split("_")[1]
+ free_space_after_creation = self.get_free_space_summary_devices()
+
+ deletion_output = heketi_ops.heketi_volume_delete(
+ self.heketi_client_node, self.heketi_server_url, volume_id)
+
+ self.assertNotEqual(deletion_output, False,
+ "Deletion of volume failed, id: %s" % volume_id)
+
+ free_space_after_deletion = self.get_free_space_summary_devices()
+
+ self.assertTrue(
+ free_space_after_deletion > free_space_after_creation,
+ "Free space is not reclaimed after deletion of %s" % volume_id)
+
+ def test_delete_heketidb_volume(self):
+ """
+ Method to test heketidb volume deletion via heketi-cli
+ """
+ volume_id_list = []
+ heketidbexists = False
+ msg = "Error: Cannot delete volume containing the Heketi database"
+
+ for i in range(0, 2):
+ volume_info = heketi_ops.heketi_volume_create(
+ self.heketi_client_node, self.heketi_server_url,
+ 10, json=True)
+ self.assertNotEqual(volume_info, False, "Volume creation failed")
+ volume_id_list.append(volume_info["id"])
+
+ self.addCleanup(self.delete_volumes, volume_id_list)
+
+ volume_list_info = heketi_ops.heketi_volume_list(
+ self.heketi_client_node,
+ self.heketi_server_url, json=True)
+
+ self.assertNotEqual(volume_list_info, False,
+ "Heketi volume list command failed")
+
+ if volume_list_info["volumes"] == []:
+ raise ExecutionError("Heketi volume list empty")
+
+ for volume_id in volume_list_info["volumes"]:
+ volume_info = heketi_ops.heketi_volume_info(
+ self.heketi_client_node, self.heketi_server_url,
+ volume_id, json=True)
+
+ if volume_info["name"] == "heketidbstorage":
+ heketidbexists = True
+ delete_ret, delete_output, delete_error = (
+ heketi_ops.heketi_volume_delete(
+ self.heketi_client_node,
+ self.heketi_server_url, volume_id,
+ raw_cli_output=True))
+
+ self.assertNotEqual(delete_ret, 0, "Return code not 0")
+ self.assertEqual(
+ delete_error.strip(), msg,
+ "Invalid reason for heketidb deletion failure")
+
+ if not heketidbexists:
+ raise ExecutionError(
+ "Warning: heketidbstorage doesn't exist in list of volumes")
+