diff options
-rw-r--r-- | openshift-storage-libs/openshiftstoragelibs/openshift_ops.py | 39 | ||||
-rw-r--r-- | tests/functional/provisioning/test_dynamic_provisioning_block.py | 129 |
2 files changed, 167 insertions, 1 deletions
diff --git a/openshift-storage-libs/openshiftstoragelibs/openshift_ops.py b/openshift-storage-libs/openshiftstoragelibs/openshift_ops.py index 57c4dee7..b6d086a6 100644 --- a/openshift-storage-libs/openshiftstoragelibs/openshift_ops.py +++ b/openshift-storage-libs/openshiftstoragelibs/openshift_ops.py @@ -1532,3 +1532,42 @@ def oc_get_schedulable_nodes(ocp_client): out = command.cmd_run(cmd, ocp_client) return out.split('\n') if out else out + + +def get_default_block_hosting_volume_size(hostname, heketi_dc_name): + """Get the default size of block hosting volume. + + Args: + hostname (str): Node where we want to run our commands. + heketi_dc_name (str): Name of heketi DC. + + Raises: + exceptions.ExecutionError: if command fails. + + Returns: + integer: if successful + """ + heketi_pod = get_pod_name_from_dc( + hostname, heketi_dc_name, timeout=10) + cmd = 'cat /etc/heketi/heketi.json' + ret, out, err = oc_rsh(hostname, heketi_pod, cmd) + if ret or not out: + msg = ("Failed to get the default size of block hosting volume with" + " err: '%s' and output: '%s'" % (err, out)) + g.log.error(msg) + raise exceptions.ExecutionError(msg) + + try: + out = json.loads(out) + except ValueError: + msg = "Not able to load data into json format \n data: %s" % out + g.log.error(msg) + raise exceptions.ExecutionError(msg) + + if ('glusterfs' in out.keys() and + 'block_hosting_volume_size' in out['glusterfs'].keys()): + return int(out['glusterfs']['block_hosting_volume_size']) + msg = ("Not able to get the value of " + "out['glusterfs']['block_hosting_volume_size'] from out:\n" % out) + g.log.error(msg) + raise exceptions.ExecutionError(msg) diff --git a/tests/functional/provisioning/test_dynamic_provisioning_block.py b/tests/functional/provisioning/test_dynamic_provisioning_block.py index 88d9c9f8..8aeed74c 100644 --- a/tests/functional/provisioning/test_dynamic_provisioning_block.py +++ b/tests/functional/provisioning/test_dynamic_provisioning_block.py @@ -1,3 +1,5 @@ +import math + from glusto.core import Glusto as g from openshiftstoragelibs.baseclass import GlusterBlockBaseClass @@ -10,12 +12,18 @@ from openshiftstoragelibs.openshift_storage_libs import ( from openshiftstoragelibs.command import cmd_run from openshiftstoragelibs.exceptions import ExecutionError from openshiftstoragelibs.heketi_ops import ( + heketi_blockvolume_create, heketi_blockvolume_delete, heketi_blockvolume_info, - heketi_blockvolume_list + heketi_blockvolume_list, + heketi_node_info, + heketi_node_list, + heketi_volume_create, + heketi_volume_delete, ) from openshiftstoragelibs.openshift_ops import ( cmd_run_on_gluster_pod_or_node, + get_default_block_hosting_volume_size, get_gluster_pod_names_by_pvc_name, get_pod_name_from_dc, get_pv_name_from_pvc, @@ -29,6 +37,7 @@ from openshiftstoragelibs.openshift_ops import ( oc_rsh, scale_dc_pod_amount_and_wait, verify_pvc_status_is_bound, + wait_for_events, wait_for_pod_be_ready, wait_for_resource_absence, ) @@ -500,3 +509,121 @@ class TestDynamicProvisioningBlockP0(GlusterBlockBaseClass): oc_adm_manage_node, self.node, '--schedulable=true', nodes=o_nodes) self.initiator_side_failures() + + def verify_free_space(self, free_space): + # verify free space on nodes otherwise skip test case + node_list = heketi_node_list( + self.heketi_client_node, self.heketi_server_url) + self.assertTrue(node_list) + + free_nodes = 0 + for node in node_list: + node_info = heketi_node_info( + self.heketi_client_node, self.heketi_server_url, node, + json=True) + + if node_info['state'] != 'online': + continue + + free_size = 0 + self.assertTrue(node_info['devices']) + + for device in node_info['devices']: + if device['state'] != 'online': + continue + # convert size kb into gb + device_f_size = device['storage']['free'] / 1048576 + free_size += device_f_size + + if free_size > free_space: + free_nodes += 1 + break + + if free_nodes >= 3: + break + + if free_nodes < 3: + self.skipTest("skip test case because required free space is " + "not available for creating BHV of size %s /n" + "only %s free space is available" + % (free_space, free_size)) + + def test_creation_of_block_vol_greater_than_the_default_size_of_BHV_neg( + self): + """Verify that block volume creation fails when we create block + volume of size greater than the default size of BHV. + Verify that block volume creation succeed when we create BHV + of size greater than the default size of BHV. + """ + + default_bhv_size = get_default_block_hosting_volume_size( + self.node, self.heketi_dc_name) + reserve_size = default_bhv_size * 0.02 + reserve_size = int(math.ceil(reserve_size)) + + self.verify_free_space(default_bhv_size + reserve_size + 2) + + with self.assertRaises(ExecutionError): + # create a block vol greater than default BHV size + bvol_info = heketi_blockvolume_create( + self.heketi_client_node, self.heketi_server_url, + (default_bhv_size + 1), json=True) + self.addCleanup( + heketi_blockvolume_delete, self.heketi_client_node, + self.heketi_server_url, bvol_info['id']) + + sc_name = self.create_storage_class() + + # create a block pvc greater than default BHV size + pvc_name = oc_create_pvc( + self.node, sc_name, pvc_size=(default_bhv_size + 1)) + self.addCleanup( + wait_for_resource_absence, self.node, 'pvc', pvc_name) + self.addCleanup( + oc_delete, self.node, 'pvc', pvc_name, raise_on_absence=False) + + wait_for_events( + self.node, pvc_name, obj_type='PersistentVolumeClaim', + event_type='Warning', event_reason='ProvisioningFailed') + + # create block hosting volume greater than default BHV size + vol_info = heketi_volume_create( + self.heketi_client_node, self.heketi_server_url, + (default_bhv_size + reserve_size + 2), block=True, + json=True) + self.addCleanup( + heketi_volume_delete, self.heketi_client_node, + self.heketi_server_url, vol_info['id']) + + # Cleanup PVC before block hosting volume to avoid failures + self.addCleanup( + wait_for_resource_absence, self.node, 'pvc', pvc_name) + self.addCleanup( + oc_delete, self.node, 'pvc', pvc_name, raise_on_absence=False) + + verify_pvc_status_is_bound(self.node, pvc_name) + + def test_creation_of_block_vol_greater_than_the_default_size_of_BHV_pos( + self): + """Verify that block volume creation succeed when we create BHV + of size greater than the default size of BHV. + """ + + default_bhv_size = get_default_block_hosting_volume_size( + self.node, self.heketi_dc_name) + reserve_size = default_bhv_size * 0.02 + reserve_size = int(math.ceil(reserve_size)) + + self.verify_free_space(default_bhv_size + reserve_size + 2) + + # create block hosting volume greater than default BHV size + vol_info = heketi_volume_create( + self.heketi_client_node, self.heketi_server_url, + (default_bhv_size + reserve_size + 2), block=True, + json=True) + self.addCleanup( + heketi_volume_delete, self.heketi_client_node, + self.heketi_server_url, vol_info['id']) + + # create a block pvc greater than default BHV size + self.create_and_wait_for_pvc(pvc_size=(default_bhv_size + 1)) |