summaryrefslogtreecommitdiffstats
path: root/cns-libs
diff options
context:
space:
mode:
authorValerii Ponomarov <vponomar@redhat.com>2018-11-28 01:47:06 +0530
committerValerii Ponomarov <vponomar@redhat.com>2018-12-05 18:42:56 +0530
commit1f952c96eba1f920a85d00b310028a5f854e2c3d (patch)
tree6a7a2115e8a5f711210ef98f88b332e952f2cdc2 /cns-libs
parent25e084d6c9406a9bd3b05e1498825f201121ed6b (diff)
Move functions with creation of SC, PVC and POD objects to common place
Removing duplication of code. Also, reuse it in places where it is already duplicated. Change-Id: I2f88b4921cb7bec01d17e1ddeaeda16e0d198493
Diffstat (limited to 'cns-libs')
-rw-r--r--cns-libs/cnslibs/cns/cns_baseclass.py152
1 files changed, 151 insertions, 1 deletions
diff --git a/cns-libs/cnslibs/cns/cns_baseclass.py b/cns-libs/cnslibs/cns/cns_baseclass.py
index 4f84061c..5dfe430c 100644
--- a/cns-libs/cnslibs/cns/cns_baseclass.py
+++ b/cns-libs/cnslibs/cns/cns_baseclass.py
@@ -4,7 +4,9 @@ from cnslibs.common.exceptions import (
ConfigError,
ExecutionError)
from cnslibs.common.heketi_ops import (
+ heketi_blockvolume_delete,
heketi_create_topology,
+ heketi_volume_delete,
hello_heketi)
from cnslibs.common.cns_libs import (
edit_iptables_cns,
@@ -21,7 +23,20 @@ from cnslibs.common.docker_libs import (
from cnslibs.common.openshift_ops import (
create_namespace,
get_ocp_gluster_pod_names,
- oc_rsh)
+ get_pod_name_from_dc,
+ get_pv_name_from_pvc,
+ oc_create_app_dc_with_io,
+ oc_create_pvc,
+ oc_create_sc,
+ oc_create_secret,
+ oc_delete,
+ oc_get_custom_resource,
+ oc_rsh,
+ scale_dc_pod_amount_and_wait,
+ verify_pvc_status_is_bound,
+ wait_for_pod_be_ready,
+ wait_for_resource_absence,
+)
import datetime
from glusto.core import Glusto as g
import unittest
@@ -98,6 +113,8 @@ class CnsBaseClass(unittest.TestCase):
cls.cns_storage_class = (g.config['cns']['dynamic_provisioning']
['storage_classes'])
+ cls.sc = cls.cns_storage_class.get(
+ 'storage_class1', cls.cns_storage_class.get('file_storage_class'))
cmd = "echo -n %s | base64" % cls.heketi_cli_key
ret, out, err = g.run(cls.ocp_master_node[0], cmd, "root")
if ret != 0:
@@ -142,6 +159,136 @@ class CnsBaseClass(unittest.TestCase):
return command.cmd_run(
cmd=cmd, hostname=hostname, raise_on_error=raise_on_error)
+ def create_secret(self, secret_name_prefix="autotests-secret-"):
+ secret_name = oc_create_secret(
+ self.ocp_client[0],
+ secret_name_prefix=secret_name_prefix,
+ namespace=(self.sc.get(
+ 'secretnamespace',
+ self.sc.get('restsecretnamespace', 'default'))),
+ data_key=self.heketi_cli_key,
+ secret_type=self.sc.get('provisioner', 'kubernetes.io/glusterfs'))
+ self.addCleanup(
+ oc_delete, self.ocp_client[0], 'secret', secret_name)
+ return secret_name
+
+ def create_storage_class(self, secret_name=None,
+ sc_name_prefix="autotests-sc",
+ create_vol_name_prefix=False,
+ allow_volume_expansion=False,
+ reclaim_policy="Delete",
+ set_hacount=None,
+ is_arbiter_vol=False, arbiter_avg_file_size=None):
+
+ # Create secret if one is not specified
+ if not secret_name:
+ secret_name = self.create_secret()
+
+ # Create storage class
+ secret_name_option = "secretname"
+ secret_namespace_option = "secretnamespace"
+ provisioner = self.sc.get("provisioner", "kubernetes.io/glusterfs")
+ if provisioner != "kubernetes.io/glusterfs":
+ secret_name_option = "rest%s" % secret_name_option
+ secret_namespace_option = "rest%s" % secret_namespace_option
+ parameters = {
+ "resturl": self.sc["resturl"],
+ "restuser": self.sc["restuser"],
+ secret_name_option: secret_name,
+ secret_namespace_option: self.sc.get(
+ "secretnamespace", self.sc.get("restsecretnamespace")),
+ }
+ if set_hacount:
+ parameters["hacount"] = self.sc.get("hacount", "3")
+ if is_arbiter_vol:
+ parameters["volumeoptions"] = "user.heketi.arbiter true"
+ if arbiter_avg_file_size:
+ parameters["volumeoptions"] += (
+ ",user.heketi.average-file-size %s" % (
+ arbiter_avg_file_size))
+ if create_vol_name_prefix:
+ parameters["volumenameprefix"] = self.sc.get(
+ "volumenameprefix", "autotest")
+ self.sc_name = oc_create_sc(
+ self.ocp_client[0],
+ sc_name_prefix=sc_name_prefix,
+ provisioner=provisioner,
+ allow_volume_expansion=allow_volume_expansion,
+ reclaim_policy=reclaim_policy,
+ **parameters)
+ self.addCleanup(oc_delete, self.ocp_client[0], "sc", self.sc_name)
+ return self.sc_name
+
+ def create_and_wait_for_pvcs(self, pvc_size=1,
+ pvc_name_prefix="autotests-pvc",
+ pvc_amount=1, sc_name=None):
+ node = self.ocp_client[0]
+
+ # Create storage class if not specified
+ if not sc_name:
+ if getattr(self, "sc_name", ""):
+ sc_name = self.sc_name
+ else:
+ sc_name = self.create_storage_class()
+
+ # Create PVCs
+ pvc_names = []
+ for i in range(pvc_amount):
+ pvc_name = oc_create_pvc(
+ node, sc_name, pvc_name_prefix=pvc_name_prefix,
+ pvc_size=pvc_size)
+ pvc_names.append(pvc_name)
+ self.addCleanup(
+ wait_for_resource_absence, node, 'pvc', pvc_name)
+
+ # Wait for PVCs to be in bound state
+ try:
+ for pvc_name in pvc_names:
+ verify_pvc_status_is_bound(node, pvc_name)
+ finally:
+ reclaim_policy = oc_get_custom_resource(
+ node, 'sc', ':.reclaimPolicy', sc_name)[0]
+
+ for pvc_name in pvc_names:
+ if reclaim_policy == 'Retain':
+ pv_name = get_pv_name_from_pvc(node, pvc_name)
+ self.addCleanup(oc_delete, node, 'pv', pv_name,
+ raise_on_absence=False)
+ custom = (r':.metadata.annotations."gluster\.kubernetes'
+ r'\.io\/heketi\-volume\-id"')
+ vol_id = oc_get_custom_resource(
+ node, 'pv', custom, pv_name)[0]
+ if self.sc.get('provisioner') == "kubernetes.io/glusterfs":
+ self.addCleanup(heketi_volume_delete,
+ self.heketi_client_node,
+ self.heketi_server_url, vol_id,
+ raise_on_error=False)
+ else:
+ self.addCleanup(heketi_blockvolume_delete,
+ self.heketi_client_node,
+ self.heketi_server_url, vol_id)
+ self.addCleanup(oc_delete, node, 'pvc', pvc_name,
+ raise_on_absence=False)
+
+ return pvc_names
+
+ def create_and_wait_for_pvc(self, pvc_size=1,
+ pvc_name_prefix='autotests-pvc', sc_name=None):
+ self.pvc_name = self.create_and_wait_for_pvcs(
+ pvc_size=pvc_size, pvc_name_prefix=pvc_name_prefix, sc_name=sc_name
+ )[0]
+ return self.pvc_name
+
+ def create_dc_with_pvc(self, pvc_name, timeout=300, wait_step=10):
+ dc_name = oc_create_app_dc_with_io(self.ocp_client[0], pvc_name)
+ self.addCleanup(oc_delete, self.ocp_client[0], 'dc', dc_name)
+ self.addCleanup(
+ scale_dc_pod_amount_and_wait, self.ocp_client[0], dc_name, 0)
+ pod_name = get_pod_name_from_dc(self.ocp_client[0], dc_name)
+ wait_for_pod_be_ready(self.ocp_client[0], pod_name,
+ timeout=timeout, wait_step=wait_step)
+ return dc_name, pod_name
+
class CnsSetupBaseClass(CnsBaseClass):
'''
@@ -315,6 +462,9 @@ class CnsGlusterBlockBaseClass(CnsBaseClass):
Glusterblock setup on CNS
'''
super(CnsGlusterBlockBaseClass, cls).setUpClass()
+ cls.sc = cls.cns_storage_class.get(
+ 'storage_class2',
+ cls.cns_storage_class.get('block_storage_class'))
for node in cls.ocp_all_nodes:
if not edit_iptables_cns(node):
raise ExecutionError("failed to edit iptables")