summaryrefslogtreecommitdiffstats
path: root/tests/functional/common/provisioning/test_pv_resize.py
blob: 1e92efe94977763eaf32730fbc03c71ea02154f0 (plain)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import ddt
from cnslibs.common.cns_libs import (
    enable_pvc_resize)
from cnslibs.common.heketi_ops import (
    verify_volume_name_prefix)
from cnslibs.common.openshift_ops import (
    resize_pvc,
    get_pod_name_from_dc,
    get_pv_name_from_pvc,
    oc_create_app_dc_with_io,
    oc_create_pvc,
    oc_create_secret,
    oc_create_sc,
    oc_delete,
    oc_rsh,
    oc_version,
    scale_dc_pod_amount_and_wait,
    verify_pv_size,
    verify_pvc_size,
    verify_pvc_status_is_bound,
    wait_for_pod_be_ready,
    wait_for_resource_absence)
from cnslibs.cns.cns_baseclass import CnsBaseClass
from glusto.core import Glusto as g


@ddt.ddt
class TestPvResizeClass(CnsBaseClass):
    '''
     Class that contain test cases for
     pv resize
    '''
    @classmethod
    def setUpClass(cls):
        super(TestPvResizeClass, cls).setUpClass()
        version = oc_version(cls.ocp_master_node[0])
        if any(v in version for v in ("3.6", "3.7", "3.8")):
            return
        enable_pvc_resize(cls.ocp_master_node[0])

    def setUp(self):
        super(TestPvResizeClass, self).setUp()
        version = oc_version(self.ocp_master_node[0])
        if any(v in version for v in ("3.6", "3.7", "3.8")):
            msg = ("pv resize is not available in openshift "
                   "version %s " % version)
            g.log.error(msg)
            raise self.skipTest(msg)

    def _create_storage_class(self, volname_prefix=False):
        sc = self.cns_storage_class['storage_class1']
        secret = self.cns_secret['secret1']

        # create secret
        self.secret_name = oc_create_secret(
            self.ocp_master_node[0],
            namespace=secret['namespace'],
            data_key=self.heketi_cli_key,
            secret_type=secret['type'])
        self.addCleanup(
            oc_delete, self.ocp_master_node[0], 'secret', self.secret_name)

        # create storageclass
        self.sc_name = oc_create_sc(
            self.ocp_master_node[0], provisioner='kubernetes.io/glusterfs',
            resturl=sc['resturl'], restuser=sc['restuser'],
            secretnamespace=sc['secretnamespace'],
            secretname=self.secret_name,
            allow_volume_expansion=True,
            **({"volumenameprefix": sc['volumenameprefix']}
                if volname_prefix else {})
        )
        self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', self.sc_name)

        return self.sc_name

    @ddt.data(False, True)
    def test_pv_resize_with_prefix_for_name(self, volname_prefix=False):
        """testcases CNS-1037 and CNS-1038 """
        dir_path = "/mnt/"
        self._create_storage_class(volname_prefix)
        node = self.ocp_master_node[0]

        # Create PVC
        pvc_name = oc_create_pvc(node, self.sc_name, pvc_size=1)
        self.addCleanup(wait_for_resource_absence,
                        node, 'pvc', pvc_name)
        self.addCleanup(oc_delete, node, 'pvc', pvc_name)
        verify_pvc_status_is_bound(node, pvc_name)

        # Create DC with POD and attached PVC to it.
        dc_name = oc_create_app_dc_with_io(node, pvc_name)
        self.addCleanup(oc_delete, node, 'dc', dc_name)
        self.addCleanup(scale_dc_pod_amount_and_wait,
                        node, dc_name, 0)

        pod_name = get_pod_name_from_dc(node, dc_name)
        wait_for_pod_be_ready(node, pod_name)
        if volname_prefix:
            storage_class = self.cns_storage_class['storage_class1']
            ret = verify_volume_name_prefix(node,
                                            storage_class['volumenameprefix'],
                                            storage_class['secretnamespace'],
                                            pvc_name, self.heketi_server_url)
            self.assertTrue(ret, "verify volnameprefix failed")
        cmd = ("dd if=/dev/urandom of=%sfile "
               "bs=100K count=1000") % dir_path
        ret, out, err = oc_rsh(node, pod_name, cmd)
        self.assertEqual(ret, 0, "failed to execute command %s on %s" % (
                             cmd, node))
        cmd = ("dd if=/dev/urandom of=%sfile2 "
               "bs=100K count=10000") % dir_path
        ret, out, err = oc_rsh(node, pod_name, cmd)
        self.assertNotEqual(ret, 0, " This IO did not fail as expected "
                            "command %s on %s" % (cmd, node))
        pvc_size = 2
        resize_pvc(node, pvc_name, pvc_size)
        verify_pvc_size(node, pvc_name, pvc_size)
        pv_name = get_pv_name_from_pvc(node, pvc_name)
        verify_pv_size(node, pv_name, pvc_size)
        oc_delete(node, 'pod', pod_name)
        wait_for_resource_absence(node, 'pod', pod_name)
        pod_name = get_pod_name_from_dc(node, dc_name)
        wait_for_pod_be_ready(node, pod_name)
        cmd = ("dd if=/dev/urandom of=%sfile_new "
               "bs=50K count=10000") % dir_path
        ret, out, err = oc_rsh(node, pod_name, cmd)
        self.assertEqual(ret, 0, "failed to execute command %s on %s" % (
                             cmd, node))