summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cns-libs/cnslibs/common/openshift_ops.py65
-rw-r--r--tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py98
2 files changed, 118 insertions, 45 deletions
diff --git a/cns-libs/cnslibs/common/openshift_ops.py b/cns-libs/cnslibs/common/openshift_ops.py
index 527efa1e..c5562daf 100644
--- a/cns-libs/cnslibs/common/openshift_ops.py
+++ b/cns-libs/cnslibs/common/openshift_ops.py
@@ -297,6 +297,71 @@ def oc_create_pvc(hostname, sc_name, pvc_name_prefix="autotests-pvc",
return pvc_name
+def oc_create_app_dc_with_io(
+ hostname, pvc_name, dc_name_prefix="autotests-dc-with-app-io",
+ replicas=1, space_to_use=92274688):
+ """Create DC with app PODs and attached PVC, constantly running I/O.
+
+ Args:
+ hostname (str): Node on which 'oc create' command will be executed.
+ pvc_name (str): name of the Persistent Volume Claim to attach to
+ the application PODs where constant I\O will run.
+ dc_name_prefix (str): DC name will consist of this prefix and
+ random str.
+ replicas (int): amount of application POD replicas.
+ space_to_use (int): value in bytes which will be used for I\O.
+ """
+ dc_name = "%s-%s" % (dc_name_prefix, utils.get_random_str())
+ container_data = {
+ "name": dc_name,
+ "image": "cirros",
+ "volumeMounts": [{"mountPath": "/mnt", "name": dc_name}],
+ "command": ["sh"],
+ "args": [
+ "-ec",
+ "while true; do "
+ " (mount | grep '/mnt') && "
+ " (head -c %s < /dev/urandom > /mnt/random-data.log) || "
+ " exit 1; "
+ " sleep 1 ; "
+ "done" % space_to_use,
+ ],
+ "livenessProbe": {
+ "initialDelaySeconds": 3,
+ "periodSeconds": 3,
+ "exec": {"command": [
+ "sh", "-ec",
+ "mount | grep '/mnt' && "
+ " head -c 1 < /dev/urandom >> /mnt/random-data.log"
+ ]},
+ },
+ }
+ dc_data = json.dumps({
+ "kind": "DeploymentConfig",
+ "apiVersion": "v1",
+ "metadata": {"name": dc_name},
+ "spec": {
+ "replicas": replicas,
+ "triggers": [{"type": "ConfigChange"}],
+ "paused": False,
+ "revisionHistoryLimit": 2,
+ "template": {
+ "metadata": {"labels": {"name": dc_name}},
+ "spec": {
+ "restartPolicy": "Always",
+ "volumes": [{
+ "name": dc_name,
+ "persistentVolumeClaim": {"claimName": pvc_name},
+ }],
+ "containers": [container_data],
+ }
+ }
+ }
+ })
+ oc_create(hostname, dc_data, 'stdin')
+ return dc_name
+
+
def oc_delete(ocp_node, rtype, name):
"""Delete an OCP resource by name.
diff --git a/tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py b/tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py
index 0038c18c..35764dc1 100644
--- a/tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py
+++ b/tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py
@@ -6,6 +6,7 @@ from cnslibs.common.dynamic_provisioning import (
create_storage_class_file,
get_pvc_status,
get_pod_name_from_dc,
+ verify_pvc_status_is_bound,
wait_for_pod_be_ready)
from cnslibs.cns.cns_baseclass import CnsBaseClass
from cnslibs.common.exceptions import ExecutionError
@@ -14,8 +15,11 @@ from cnslibs.common.heketi_ops import (
from cnslibs.common.openshift_ops import (
get_ocp_gluster_pod_names,
oc_create,
+ oc_create_pvc,
+ oc_create_app_dc_with_io,
oc_delete,
oc_rsh,
+ scale_dc_pod_amount_and_wait,
wait_for_resource_absence)
from cnslibs.common.waiter import Waiter
from glusto.core import Glusto as g
@@ -26,19 +30,20 @@ class TestDynamicProvisioningP0(CnsBaseClass):
Class that contain P0 dynamic provisioning test cases for
glusterfile volume
'''
- def dynamic_provisioning_glusterfile(self, pvc_name, volname_prefix=False):
+ def dynamic_provisioning_glusterfile(self, heketi_volname_prefix=False):
storage_class = self.cns_storage_class['storage_class1']
secret = self.cns_secret['secret1']
+ node = self.ocp_master_node[0]
sc_name = storage_class['name']
cmd = ("oc get svc %s "
"-o=custom-columns=:.spec.clusterIP" % self.heketi_service_name)
- ret, out, err = g.run(self.ocp_master_node[0], cmd, "root")
- self.assertEqual(ret, 0, "failed to execute command %s on %s" % (
- cmd, self.ocp_master_node[0]))
+ ret, out, err = g.run(node, cmd, "root")
+ self.assertEqual(
+ ret, 0, "failed to execute command %s on %s" % (cmd, node))
heketi_cluster_ip = out.lstrip().strip()
resturl = "http://%s:8080" % heketi_cluster_ip
ret = create_storage_class_file(
- self.ocp_master_node[0],
+ node,
sc_name,
resturl,
storage_class['provisioner'],
@@ -46,65 +51,68 @@ class TestDynamicProvisioningP0(CnsBaseClass):
secretnamespace=storage_class['secretnamespace'],
secretname=secret['secret_name'],
**({"volumenameprefix": storage_class['volumenameprefix']}
- if volname_prefix else {}))
+ if heketi_volname_prefix else {}))
self.assertTrue(ret, "creation of storage-class file failed")
provisioner_name = storage_class['provisioner'].split("/")
file_path = "/%s-%s-storage-class.yaml" % (
sc_name, provisioner_name[1])
- oc_create(self.ocp_master_node[0], file_path)
- self.addCleanup(oc_delete, self.ocp_master_node[0],
- 'sc', sc_name)
- ret = create_secret_file(self.ocp_master_node[0],
+ oc_create(node, file_path)
+ self.addCleanup(oc_delete, node, 'sc', sc_name)
+ ret = create_secret_file(node,
secret['secret_name'],
secret['namespace'],
self.secret_data_key,
secret['type'])
self.assertTrue(ret, "creation of heketi-secret file failed")
- oc_create(self.ocp_master_node[0],
- "/%s.yaml" % secret['secret_name'])
- self.addCleanup(oc_delete, self.ocp_master_node[0], 'secret',
- secret['secret_name'])
- ret = create_mongodb_pod(self.ocp_master_node[0],
- pvc_name, 10, sc_name)
- self.assertTrue(ret, "creation of mongodb pod failed")
- self.addCleanup(oc_delete, self.ocp_master_node[0], 'service',
- pvc_name)
- self.addCleanup(oc_delete, self.ocp_master_node[0], 'pvc',
- pvc_name)
- self.addCleanup(oc_delete, self.ocp_master_node[0], 'dc',
- pvc_name)
- pod_name = get_pod_name_from_dc(self.ocp_master_node[0], pvc_name)
- ret = wait_for_pod_be_ready(self.ocp_master_node[0], pod_name)
- self.assertTrue(ret, "verify mongodb pod status as running failed")
- if volname_prefix:
+ oc_create(node, "/%s.yaml" % secret['secret_name'])
+ self.addCleanup(oc_delete, node, 'secret', secret['secret_name'])
+
+ # Create PVC
+ pvc_name = oc_create_pvc(node, sc_name)
+ 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(self.ocp_master_node[0], 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)
+
+ # Verify Heketi volume name for prefix presence if provided
+ if heketi_volname_prefix:
ret = verify_volume_name_prefix(self.ocp_master_node[0],
storage_class['volumenameprefix'],
storage_class['secretnamespace'],
pvc_name, resturl)
self.assertTrue(ret, "verify volnameprefix failed")
- cmd = ("dd if=/dev/urandom of=/var/lib/mongodb/data/file "
- "bs=1K count=100")
- ret, out, err = oc_rsh(self.ocp_master_node[0], pod_name, cmd)
- self.assertEqual(ret, 0, "failed to execute command %s on %s" % (
- cmd, self.ocp_master_node[0]))
- cmd = "ls -lrt /var/lib/mongodb/data/file"
- ret, out, err = oc_rsh(self.ocp_master_node[0], pod_name, cmd)
- self.assertEqual(ret, 0, "failed to execute command %s on %s" % (
- cmd, self.ocp_master_node[0]))
- cmd = "rm -rf /var/lib/mongodb/data/file"
- ret, out, err = oc_rsh(self.ocp_master_node[0], pod_name, cmd)
- self.assertEqual(ret, 0, "failed to execute command %s on %s" % (
- cmd, self.ocp_master_node[0]))
+
+ # Make sure we are able to work with files on the mounted volume
+ filepath = "/mnt/file_for_testing_io.log"
+ cmd = "dd if=/dev/urandom of=%s bs=1K count=100" % filepath
+ ret, out, err = oc_rsh(node, pod_name, cmd)
+ self.assertEqual(
+ ret, 0, "Failed to execute command %s on %s" % (cmd, node))
+
+ cmd = "ls -lrt %s" % filepath
+ ret, out, err = oc_rsh(node, pod_name, cmd)
+ self.assertEqual(
+ ret, 0, "Failed to execute command %s on %s" % (cmd, node))
+
+ cmd = "rm -rf %s" % filepath
+ ret, out, err = oc_rsh(node, pod_name, cmd)
+ self.assertEqual(
+ ret, 0, "Failed to execute command %s on %s" % (cmd, node))
def test_dynamic_provisioning_glusterfile(self):
g.log.info("test_dynamic_provisioning_glusterfile")
- self.dynamic_provisioning_glusterfile(pvc_name="mongodb1")
+ self.dynamic_provisioning_glusterfile(False)
def test_dynamic_provisioning_glusterfile_volname_prefix(self):
- g.log.info("test_dynamic_provisioning_glusterfile volname"
- " prefix")
- self.dynamic_provisioning_glusterfile(pvc_name="mongodb5",
- volname_prefix=True)
+ g.log.info("test_dynamic_provisioning_glusterfile volname prefix")
+ self.dynamic_provisioning_glusterfile(True)
def test_dynamic_provisioning_glusterfile_heketipod_failure(self):
g.log.info("test_dynamic_provisioning_glusterfile_Heketipod_Failure")