1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import pytest
from glustolibs.gluster import volume_ops
from openshiftstoragelibs.baseclass import BaseClass
from openshiftstoragelibs import heketi_ops
from openshiftstoragelibs import heketi_version
from openshiftstoragelibs import podcmd
class TestHeketiBrickEvict(BaseClass):
"""Test Heketi brick evict functionality."""
def setUp(self):
super(TestHeketiBrickEvict, self).setUp()
version = heketi_version.get_heketi_version(self.heketi_client_node)
if version < '9.0.0-14':
self.skipTest(
"heketi-client package {} does not support brick evict".format(
version.v_str))
node_list = heketi_ops.heketi_node_list(
self.heketi_client_node, self.heketi_server_url)
if len(node_list) > 3:
return
for node_id in node_list:
node_info = heketi_ops.heketi_node_info(
self.heketi_client_node, self.heketi_server_url, node_id,
json=True)
if len(node_info["devices"]) < 2:
self.skipTest("does not have extra device/node to evict brick")
@podcmd.GlustoPod()
def _get_gluster_vol_info(self, file_vol):
"""Get Gluster vol info.
Args:
ocp_client (str): Node to execute OCP commands.
file_vol (str): file volume name.
Returns:
dict: Info of the given gluster vol.
"""
g_vol_info = volume_ops.get_volume_info(
"auto_get_gluster_endpoint", file_vol)
if not g_vol_info:
raise AssertionError("Failed to get volume info for gluster "
"volume {}".format(file_vol))
if file_vol in g_vol_info:
g_vol_info = g_vol_info.get(file_vol)
return g_vol_info
@pytest.mark.tier1
def test_heketi_brick_evict(self):
"""Test brick evict basic functionality and verify it replace a brick
properly
"""
h_node, h_server = self.heketi_client_node, self.heketi_server_url
size = 1
vol_info_old = heketi_ops.heketi_volume_create(
h_node, h_server, size, json=True)
self.addCleanup(
heketi_ops.heketi_volume_delete, h_node, h_server,
vol_info_old['id'])
heketi_ops.heketi_brick_evict(
h_node, h_server, vol_info_old["bricks"][0]['id'])
vol_info_new = heketi_ops.heketi_volume_info(
h_node, h_server, vol_info_old['id'], json=True)
bricks_old = set({brick['path'] for brick in vol_info_old["bricks"]})
bricks_new = set({brick['path'] for brick in vol_info_new["bricks"]})
self.assertEqual(
len(bricks_new - bricks_old), 1,
"Brick was not replaced with brick evict for vol \n {}".format(
vol_info_new))
gvol_info = self._get_gluster_vol_info(vol_info_new['name'])
gbricks = set(
{brick['name'].split(":")[1]
for brick in gvol_info["bricks"]["brick"]})
self.assertEqual(
bricks_new, gbricks, "gluster vol info and heketi vol info "
"mismatched after brick evict {} \n {}".format(
gvol_info, vol_info_new))
|