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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
import ddt
import pytest
from openshiftstoragelibs import command
from openshiftstoragelibs import baseclass
from openshiftstoragelibs import heketi_version
from openshiftstoragelibs import openshift_ops
from openshiftstoragelibs import openshift_version
# The script exec-on-host prevents from executing LVM commands on pod.
# It has been introduced as LVM wrapper in heketi v9.0.0-9
ENV_NAME = "HEKETI_LVM_WRAPPER"
ENV_VALUE = "/usr/sbin/exec-on-host"
@ddt.ddt
class TestHeketiLvmWrapper(baseclass.BaseClass):
"""Class to validate heketi LVM wrapper functionality"""
def setUp(self):
super(TestHeketiLvmWrapper, self).setUp()
self.oc_node = self.ocp_master_node[0]
self.pod_name = openshift_ops.get_ocp_gluster_pod_details(self.oc_node)
self.h_pod_name = openshift_ops.get_pod_name_from_dc(
self.oc_node, self.heketi_dc_name)
ocp_version = openshift_version.get_openshift_version()
if ocp_version < "3.11.170":
self.skipTest("Heketi LVM Wrapper functionality does not "
"support on OCP {}".format(ocp_version.v_str))
h_version = heketi_version.get_heketi_version(self.heketi_client_node)
if h_version < '9.0.0-9':
self.skipTest("heketi-client package {} does not support Heketi "
"LVM Wrapper functionality".format(h_version.v_str))
@pytest.mark.tier0
def test_lvm_script_and_wrapper_environments(self):
"""Validate lvm script present on glusterfs pods
lvm wrapper environment is present on heketi pod"""
# Check script /usr/sbin/exec-on-host is present in pod
if self.is_containerized_gluster():
cmd = "ls -lrt {}".format(ENV_VALUE)
ret, _, err = openshift_ops.oc_rsh(
self.oc_node, self.pod_name[0]['pod_name'], cmd)
self.assertFalse(
ret, "failed to execute command {} on pod {} with error:"
" {}".format(cmd, self.pod_name[0]['pod_name'], err))
# Get a value associated with HEKETI_LVM_WRAPPER
custom = (r'":spec.containers[*].env[?(@.name==\"{}\")]'
r'.value"'.format(ENV_NAME))
env_var_value = openshift_ops.oc_get_custom_resource(
self.oc_node, "pod", custom, self.h_pod_name)
# Check value /usr/sbin/exec-on-host is present in converged mode
# and absent in independent mode deployment
err_msg = "Heketi LVM environment {} match failed".format(ENV_VALUE)
if self.is_containerized_gluster():
self.assertEqual(env_var_value[0], ENV_VALUE, err_msg)
else:
self.assertIsNotNone(env_var_value[0], err_msg)
@pytest.mark.tier0
def test_lvm_script_executable_on_host(self):
"""Validate lvm script is executable on host instead
of container"""
# Skip the TC if independent mode deployment
if not self.is_containerized_gluster():
self.skipTest(
"Skipping this test as LVM script is not available in "
"independent mode deployment")
pod_name = self.pod_name[0]['pod_name']
gluster_pod_label = "glusterfs=storage-pod"
# Remove LVM banaries to validate /usr/sbin/exec-on-host script
# is execute LVM commands on host instead on pod
cmd = "rm /usr/sbin/lvm"
ret, _, err = openshift_ops.oc_rsh(self.oc_node, pod_name, cmd)
self.addCleanup(
openshift_ops.wait_for_pods_be_ready, self.oc_node,
len(self.gluster_servers), gluster_pod_label)
self.addCleanup(
openshift_ops.wait_for_resource_absence, self.oc_node, "pod",
pod_name)
self.addCleanup(
openshift_ops.oc_delete, self.oc_node, "pod", pod_name)
err_msg = (
"failed to execute command {} on pod {} with error: {}"
"".format(cmd, pod_name, err))
self.assertFalse(ret, err_msg)
# Validate LVM command is not executable in pod
cmd = "oc rsh {} lvs".format(pod_name)
stdout = command.cmd_run(cmd, self.oc_node, raise_on_error=False)
self.assertIn(
'exec: \\"lvs\\": executable file not found in $PATH', stdout)
# Run LVM command with /usr/sbin/exec-on-host
cmd = "{} lvs".format(ENV_VALUE)
ret, out, err = openshift_ops.oc_rsh(self.oc_node, pod_name, cmd)
err_msg = (
"failed to execute command {} on pod {} with error: {}"
"".format(cmd, pod_name, err))
self.assertFalse(ret, err_msg)
self.assertIn("VG", out)
|