From 7a67efc52703882646015edbdaf52a090062844b Mon Sep 17 00:00:00 2001 From: Valerii Ponomarov Date: Fri, 31 Aug 2018 17:26:35 +0530 Subject: [CNS-1265] Recreate PVCs to make Gluster reuse released space Create and delete lots of volumes so summary vol size is bigger than total available size making sure Gluster really reuses space of deleted volumes. Change-Id: I3cdc85df488a66cfed55c92438a126736dc06ff2 --- tests/functional/common/arbiter/test_arbiter.py | 95 +++++++++++++++++++++++++ 1 file changed, 95 insertions(+) (limited to 'tests') diff --git a/tests/functional/common/arbiter/test_arbiter.py b/tests/functional/common/arbiter/test_arbiter.py index 7ff383a6..8b86c640 100644 --- a/tests/functional/common/arbiter/test_arbiter.py +++ b/tests/functional/common/arbiter/test_arbiter.py @@ -496,3 +496,98 @@ class TestArbiterVolumeCreateExpandDelete(cns_baseclass.CnsBaseClass): for data_brick in data_bricks: self.assertIn( data_brick.split(':')[0], data_nodes_ip_addresses) + + def test_create_delete_pvcs_to_make_gluster_reuse_released_space(self): + """Test case CNS-1265""" + min_storage_gb = 10 + + # Set arbiter:disabled tags to the first 2 nodes + data_nodes = [] + biggest_disks = [] + heketi_server_url = self.cns_storage_class['storage_class1']['resturl'] + self.assertGreater(len(self.node_id_list), 2) + for node_id in self.node_id_list[0:2]: + node_info = heketi_ops.heketi_node_info( + self.heketi_client_node, heketi_server_url, node_id, json=True) + biggest_disk_free_space = 0 + for device in node_info['devices']: + disk_free_space = int(device['storage']['free']) + if disk_free_space < (min_storage_gb * 1024**2): + self.skipTest( + "Devices are expected to have more than " + "%sGb of free space" % min_storage_gb) + if disk_free_space > biggest_disk_free_space: + biggest_disk_free_space = disk_free_space + self._set_arbiter_tag_with_further_revert( + self.heketi_client_node, heketi_server_url, 'device', + device['id'], 'disabled', + revert_to=device.get('tags', {}).get('arbiter')) + biggest_disks.append(biggest_disk_free_space) + self._set_arbiter_tag_with_further_revert( + self.heketi_client_node, heketi_server_url, 'node', + node_id, 'disabled', + revert_to=node_info.get('tags', {}).get('arbiter')) + data_nodes.append(node_info) + + # Set arbiter:required tag to all other nodes and their devices + arbiter_nodes = [] + for node_id in self.node_id_list[2:]: + node_info = heketi_ops.heketi_node_info( + self.heketi_client_node, heketi_server_url, node_id, json=True) + for device in node_info['devices']: + self._set_arbiter_tag_with_further_revert( + self.heketi_client_node, heketi_server_url, 'device', + device['id'], 'required', + revert_to=device.get('tags', {}).get('arbiter')) + self._set_arbiter_tag_with_further_revert( + self.heketi_client_node, heketi_server_url, 'node', + node_id, 'required', + revert_to=node_info.get('tags', {}).get('arbiter')) + arbiter_nodes.append(node_info) + + # Calculate size and amount of volumes to be created + pvc_size = int(min(biggest_disks) / 1024**2) + pvc_amount = max([len(n['devices']) for n in data_nodes]) + 1 + + # Create sc with gluster arbiter info + self._create_storage_class() + + # Create and delete 3 small volumes concurrently + pvc_names = [] + for i in range(3): + pvc_name = oc_create_pvc( + self.node, self.sc_name, pvc_name_prefix='arbiter-pvc', + pvc_size=int(pvc_size / 3)) + pvc_names.append(pvc_name) + exception_exists = False + for pvc_name in pvc_names: + try: + verify_pvc_status_is_bound(self.node, pvc_name) + except Exception: + for pvc_name in pvc_names: + self.addCleanup( + wait_for_resource_absence, self.node, 'pvc', pvc_name) + for pvc_name in pvc_names: + self.addCleanup(oc_delete, self.node, 'pvc', pvc_name) + exception_exists = True + if exception_exists: + raise + for pvc_name in pvc_names: + oc_delete(self.node, 'pvc', pvc_name) + for pvc_name in pvc_names: + wait_for_resource_absence(self.node, 'pvc', pvc_name) + + # Create and delete big volumes in a loop + for i in range(pvc_amount): + pvc_name = oc_create_pvc( + self.node, self.sc_name, pvc_name_prefix='arbiter-pvc', + pvc_size=pvc_size) + try: + verify_pvc_status_is_bound(self.node, pvc_name) + except Exception: + self.addCleanup( + wait_for_resource_absence, self.node, 'pvc', pvc_name) + self.addCleanup(oc_delete, self.node, 'pvc', pvc_name) + raise + oc_delete(self.node, 'pvc', pvc_name) + wait_for_resource_absence(self.node, 'pvc', pvc_name) -- cgit