diff options
-rw-r--r-- | .gitignore | 21 | ||||
-rw-r--r-- | cns-libs/cnslibs/cns/cns_baseclass.py | 8 | ||||
-rw-r--r-- | cns-libs/cnslibs/common/cns_libs.py | 9 | ||||
-rw-r--r-- | cns-libs/cnslibs/common/dynamic_provisioning.py | 27 | ||||
-rw-r--r-- | tests/cns_tests_sample_config.yml | 1 | ||||
-rw-r--r-- | tests/functional/common/heketi/test_volume_multi_req.py | 2 | ||||
-rw-r--r-- | tests/functional/common/provisioning/test_dynamic_provisioning_block_p0_cases.py | 36 | ||||
-rw-r--r-- | tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py | 36 | ||||
-rw-r--r-- | tox.ini | 15 |
9 files changed, 99 insertions, 56 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..68398d68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Virtual environment related stuff +.tox/* + +# Log files +*.log + +# Linux swap files range from .saa to .swp +*.s[a-w][a-p] + +# Python bytecode and other related temp files +*.pyc +*.pyo +*egg-info + +# Development environment files +.project +.pydevproject + +# Cache files +.cache +.pytest_cache diff --git a/cns-libs/cnslibs/cns/cns_baseclass.py b/cns-libs/cnslibs/cns/cns_baseclass.py index a6edfdd0..6f8cb4b9 100644 --- a/cns-libs/cnslibs/cns/cns_baseclass.py +++ b/cns-libs/cnslibs/cns/cns_baseclass.py @@ -65,6 +65,7 @@ class CnsBaseClass(unittest.TestCase): # Initializes heketi config variables heketi_config = g.config['cns']['heketi_config'] + cls.heketi_service_name = heketi_config['heketi_service_name'] cls.heketi_client_node = heketi_config['heketi_client_node'] cls.heketi_server_url = heketi_config['heketi_server_url'] cls.heketi_cli_user = heketi_config['heketi_cli_user'] @@ -113,6 +114,13 @@ class CnsBaseClass(unittest.TestCase): cmd, cls.ocp_master_node[0], out, err)) cls.secret_data_key = out.strip() + cmd = 'oc project %s' % cls.cns_project_name + ret, out, err = g.run(cls.ocp_client[0], cmd, "root") + if ret != 0: + raise ExecutionError("failed to execute cmd %s on %s out: " + "%s err: %s" % ( + cmd, cls.ocp_client[0], out, err)) + if 'glustotest_run_id' not in g.config: g.config['glustotest_run_id'] = ( datetime.datetime.now().strftime('%H_%M_%d_%m_%Y')) diff --git a/cns-libs/cnslibs/common/cns_libs.py b/cns-libs/cnslibs/common/cns_libs.py index d949ddfe..5973c8b8 100644 --- a/cns-libs/cnslibs/common/cns_libs.py +++ b/cns-libs/cnslibs/common/cns_libs.py @@ -1,16 +1,10 @@ -from collections import OrderedDict from cnslibs.common.exceptions import ( - ConfigError, ExecutionError) from cnslibs.common.openshift_ops import ( get_ocp_gluster_pod_names, oc_rsh) from cnslibs.common.waiter import Waiter -import fileinput from glusto.core import Glusto as g -import json -import rtyaml -import time import yaml @@ -273,7 +267,6 @@ def edit_iptables_cns(hostname): return False edit_flag = False - commit_count = 0 with conn.builtin.open("/etc/sysconfig/iptables", "r+") as f: for line in f.readlines(): if "--dport 3260" in line: @@ -431,7 +424,7 @@ def validate_multipath_pod(hostname, podname, hacount): g.log.error("failed to exectute cmd %s on %s, err %s" % (cmd, pod_nodename, out)) return False - active_count = int(output.strip()) + active_count = int(out.strip()) if active_node_count != active_count: g.log.error("active node count on %s for %s is %s and not 1" % (pod_nodename, podname, active_count)) diff --git a/cns-libs/cnslibs/common/dynamic_provisioning.py b/cns-libs/cnslibs/common/dynamic_provisioning.py index 9d6a062f..fea44b4b 100644 --- a/cns-libs/cnslibs/common/dynamic_provisioning.py +++ b/cns-libs/cnslibs/common/dynamic_provisioning.py @@ -1,10 +1,15 @@ from collections import OrderedDict -from cnslibs.common.waiter import Waiter +import json +import os + from glusto.core import Glusto as g from glustolibs.misc.misc_libs import upload_scripts -import json import rtyaml -import time + +from cnslibs.common.waiter import Waiter + + +TEMPLATE_DIR = os.path.abspath(os.path.dirname(__file__)) def create_pvc_file(hostname, claim_name, storage_class, size): @@ -22,7 +27,8 @@ def create_pvc_file(hostname, claim_name, storage_class, size): bool: True if successful, otherwise False ''' - with open("cnslibs/common/sample-glusterfs-pvc-claim.json") as data_file: + with open(os.path.join(TEMPLATE_DIR, + "sample-glusterfs-pvc-claim.json")) as data_file: data = json.load(data_file, object_pairs_hook=OrderedDict) data['metadata']['annotations'][ 'volume.beta.kubernetes.io/storage-class'] = storage_class @@ -63,8 +69,8 @@ def create_app_pod_file(hostname, claim_name, app_name, sample_app_name): bool: True if successful, otherwise False ''' - data = rtyaml.load(open("cnslibs/common/sample-%s-pod." - "yaml" % sample_app_name)) + data = rtyaml.load(open( + os.path.join(TEMPLATE_DIR, "sample-%s-pod.yaml" % sample_app_name))) data['spec']['volumes'][0]['persistentVolumeClaim'][ 'claimName'] = claim_name data['metadata']['name'] = app_name @@ -101,7 +107,8 @@ def create_secret_file(hostname, secret_name, namespace, bool: True if successful, otherwise False ''' - data = rtyaml.load(open("cnslibs/common/sample-glusterfs-secret.yaml")) + data = rtyaml.load(open( + os.path.join(TEMPLATE_DIR, "sample-glusterfs-secret.yaml"))) data['metadata']['name'] = secret_name data['data']['key'] = data_key @@ -156,8 +163,8 @@ def create_storage_class_file(hostname, sc_name, resturl, bool: True if successful, otherwise False ''' - data = rtyaml.load(open("cnslibs/common/sample-glusterfs" - "-storageclass.yaml")) + data = rtyaml.load(open( + os.path.join(TEMPLATE_DIR, "sample-glusterfs-storageclass.yaml"))) data['metadata']['name'] = sc_name data['parameters']['resturl'] = resturl @@ -260,7 +267,7 @@ def create_mongodb_pod(hostname, pvc_name, pvc_size, sc_name): False otherwise ''' ret = upload_scripts(hostname, - "cnslibs/common/mongodb-template.json", + os.path.join(TEMPLATE_DIR, "mongodb-template.json"), "/tmp/app-templates", "root") if not ret: g.log.error("Failed to upload mongodp template to %s" % hostname) diff --git a/tests/cns_tests_sample_config.yml b/tests/cns_tests_sample_config.yml index b77be3fa..0f031df6 100644 --- a/tests/cns_tests_sample_config.yml +++ b/tests/cns_tests_sample_config.yml @@ -72,6 +72,7 @@ cns: trusted_storage_pool_list: - [gluster_server1, gluster_server2] heketi_config: + heketi_service_name: "fake-name-of-heketi-service" heketi_client_node: heketi_server_url: "http://heketi-storage-project.cloudapps.mystorage.com" heketi_cli_user: "admin" diff --git a/tests/functional/common/heketi/test_volume_multi_req.py b/tests/functional/common/heketi/test_volume_multi_req.py index 825fd9dc..0a33f2a7 100644 --- a/tests/functional/common/heketi/test_volume_multi_req.py +++ b/tests/functional/common/heketi/test_volume_multi_req.py @@ -5,7 +5,7 @@ import contextlib import random import threading import time -import unitest +import unittest import ddt import yaml diff --git a/tests/functional/common/provisioning/test_dynamic_provisioning_block_p0_cases.py b/tests/functional/common/provisioning/test_dynamic_provisioning_block_p0_cases.py index 933033ae..8db0b01d 100644 --- a/tests/functional/common/provisioning/test_dynamic_provisioning_block_p0_cases.py +++ b/tests/functional/common/provisioning/test_dynamic_provisioning_block_p0_cases.py @@ -28,12 +28,13 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): def test_dynamic_provisioning_glusterblock(self): g.log.info("test_dynamic_provisioning_glusterblock") storage_class = self.cns_storage_class['storage_class2'] - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + secret = self.cns_secret['secret2'] + 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])) - heketi_cluster_ip = out.strip().split("\n")[0] + heketi_cluster_ip = out.lstrip().strip() resturl_block = "http://%s:8080" % heketi_cluster_ip if not export_heketi_cli_server( self.heketi_client_node, @@ -57,7 +58,7 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): storage_class['provisioner'], restuser=storage_class['restuser'], restsecretnamespace=storage_class['restsecretnamespace'], - restsecretname=storage_class['restsecretname'], + restsecretname=secret['secret_name'], hacount=storage_class['hacount'], clusterids=cluster_id) self.assertTrue(ret, "creation of storage-class file failed") @@ -67,7 +68,6 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): oc_create(self.ocp_master_node[0], file_path) self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', sc_name) - secret = self.cns_secret['secret2'] ret = create_secret_file(self.ocp_master_node[0], secret['secret_name'], secret['namespace'], @@ -139,12 +139,13 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): def test_dynamic_provisioning_glusterblock_heketipod_failure(self): g.log.info("test_dynamic_provisioning_glusterblock_Heketipod_Failure") storage_class = self.cns_storage_class['storage_class2'] - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + secret = self.cns_secret['secret2'] + 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])) - heketi_cluster_ip = out.strip().split("\n")[0] + heketi_cluster_ip = out.lstrip().strip() resturl_block = "http://%s:8080" % heketi_cluster_ip if not export_heketi_cli_server( self.heketi_client_node, @@ -168,7 +169,7 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): storage_class['provisioner'], restuser=storage_class['restuser'], restsecretnamespace=storage_class['restsecretnamespace'], - restsecretname=storage_class['restsecretname'], + restsecretname=secret['secret_name'], hacount=storage_class['hacount'], clusterids=cluster_id) self.assertTrue(ret, "creation of storage-class file failed") @@ -178,7 +179,6 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): oc_create(self.ocp_master_node[0], file_path) self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', sc_name) - secret = self.cns_secret['secret2'] ret = create_secret_file(self.ocp_master_node[0], secret['secret_name'], secret['namespace'], @@ -236,12 +236,12 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): cmd, self.ocp_master_node[0])) ret = verify_pod_status_running(self.ocp_master_node[0], "heketi") self.assertTrue(ret, "verify heketi pod status as running failed") - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + 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])) - heketi_cluster_new_ip = out.strip().split("\n")[0] + heketi_cluster_new_ip = out.lstrip().strip() if heketi_cluster_new_ip != heketi_cluster_ip: oc_delete(self.ocp_master_node[0], 'sc', sc_name) resturl_block = "http://%s:8080" % heketi_cluster_new_ip @@ -296,12 +296,13 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): def test_dynamic_provisioning_glusterblock_glusterpod_failure(self): g.log.info("test_dynamic_provisioning_glusterblock_Glusterpod_Failure") storage_class = self.cns_storage_class['storage_class2'] - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + secret = self.cns_secret['secret2'] + 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])) - heketi_cluster_ip = out.strip().split("\n")[0] + heketi_cluster_ip = out.lstrip().strip() resturl_block = "http://%s:8080" % heketi_cluster_ip if not export_heketi_cli_server( self.heketi_client_node, @@ -325,7 +326,7 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): storage_class['provisioner'], restuser=storage_class['restuser'], restsecretnamespace=storage_class['restsecretnamespace'], - restsecretname=storage_class['restsecretname'], + restsecretname=secret['secret_name'], hacount=storage_class['hacount'], clusterids=cluster_id) self.assertTrue(ret, "creation of storage-class file failed") @@ -335,7 +336,6 @@ class TestDynamicProvisioningBlockP0(CnsGlusterBlockBaseClass): oc_create(self.ocp_master_node[0], file_path) self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', sc_name) - secret = self.cns_secret['secret2'] ret = create_secret_file(self.ocp_master_node[0], secret['secret_name'], secret['namespace'], 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 0167573f..734cc8a5 100644 --- a/tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py +++ b/tests/functional/common/provisioning/test_dynamic_provisioning_p0_cases.py @@ -28,14 +28,15 @@ class TestDynamicProvisioningP0(CnsBaseClass): def test_dynamic_provisioning_glusterfile(self): g.log.info("test_dynamic_provisioning_glusterfile") storage_class = self.cns_storage_class['storage_class1'] + secret = self.cns_secret['secret1'] sc_name = storage_class['name'] pvc_name1 = "mongodb1" - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + 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])) - heketi_cluster_ip = out.strip().split("\n")[0] + heketi_cluster_ip = out.lstrip().strip() resturl = "http://%s:8080" % heketi_cluster_ip ret = create_storage_class_file( self.ocp_master_node[0], @@ -44,7 +45,7 @@ class TestDynamicProvisioningP0(CnsBaseClass): storage_class['provisioner'], restuser=storage_class['restuser'], secretnamespace=storage_class['secretnamespace'], - secretname=storage_class['secretname']) + secretname=secret['secret_name']) self.assertTrue(ret, "creation of storage-class file failed") provisioner_name = storage_class['provisioner'].split("/") file_path = "/%s-%s-storage-class.yaml" % ( @@ -52,7 +53,6 @@ class TestDynamicProvisioningP0(CnsBaseClass): oc_create(self.ocp_master_node[0], file_path) self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', sc_name) - secret = self.cns_secret['secret1'] ret = create_secret_file(self.ocp_master_node[0], secret['secret_name'], secret['namespace'], @@ -109,14 +109,15 @@ class TestDynamicProvisioningP0(CnsBaseClass): def test_dynamic_provisioning_glusterfile_heketipod_failure(self): g.log.info("test_dynamic_provisioning_glusterfile_Heketipod_Failure") storage_class = self.cns_storage_class['storage_class1'] + secret = self.cns_secret['secret1'] sc_name = storage_class['name'] pvc_name2 = "mongodb2" - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + 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])) - heketi_cluster_ip = out.strip().split("\n")[0] + heketi_cluster_ip = out.lstrip().strip() resturl = "http://%s:8080" % heketi_cluster_ip ret = create_storage_class_file( self.ocp_master_node[0], @@ -125,7 +126,7 @@ class TestDynamicProvisioningP0(CnsBaseClass): storage_class['provisioner'], restuser=storage_class['restuser'], secretnamespace=storage_class['secretnamespace'], - secretname=storage_class['secretname']) + secretname=secret['secret_name']) self.assertTrue(ret, "creation of storage-class file failed") provisioner_name = storage_class['provisioner'].split("/") file_path = "/%s-%s-storage-class.yaml" % ( @@ -133,7 +134,6 @@ class TestDynamicProvisioningP0(CnsBaseClass): oc_create(self.ocp_master_node[0], file_path) self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', sc_name) - secret = self.cns_secret['secret1'] ret = create_secret_file(self.ocp_master_node[0], secret['secret_name'], secret['namespace'], @@ -191,12 +191,12 @@ class TestDynamicProvisioningP0(CnsBaseClass): cmd, self.ocp_master_node[0])) ret = verify_pod_status_running(self.ocp_master_node[0], "heketi") self.assertTrue(ret, "verify heketi pod status as running failed") - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + 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])) - heketi_cluster_new_ip = out.strip().split("\n")[0] + heketi_cluster_new_ip = out.lstrip().strip() if heketi_cluster_new_ip != heketi_cluster_ip: oc_delete(self.ocp_master_node[0], 'sc', sc_name) resturl = "http://%s:8080" % heketi_cluster_ip @@ -251,14 +251,15 @@ class TestDynamicProvisioningP0(CnsBaseClass): def test_dynamic_provisioning_glusterfile_glusterpod_failure(self): g.log.info("test_dynamic_provisioning_glusterfile_Glusterpod_Failure") storage_class = self.cns_storage_class['storage_class1'] + secret = self.cns_secret['secret1'] sc_name = storage_class['name'] pvc_name4 = "mongodb4" - cmd = ("oc get svc | grep heketi | grep -v endpoints " - "| awk '{print $2}'") + 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])) - heketi_cluster_ip = out.strip().split("\n")[0] + heketi_cluster_ip = out.lstrip().strip() resturl = "http://%s:8080" % heketi_cluster_ip ret = create_storage_class_file( self.ocp_master_node[0], @@ -267,7 +268,7 @@ class TestDynamicProvisioningP0(CnsBaseClass): storage_class['provisioner'], restuser=storage_class['restuser'], secretnamespace=storage_class['secretnamespace'], - secretname=storage_class['secretname']) + secretname=secret['secret_name']) self.assertTrue(ret, "creation of storage-class file failed") provisioner_name = storage_class['provisioner'].split("/") file_path = "/%s-%s-storage-class.yaml" % ( @@ -275,7 +276,6 @@ class TestDynamicProvisioningP0(CnsBaseClass): oc_create(self.ocp_master_node[0], file_path) self.addCleanup(oc_delete, self.ocp_master_node[0], 'sc', sc_name) - secret = self.cns_secret['secret1'] ret = create_secret_file(self.ocp_master_node[0], secret['secret_name'], secret['namespace'], @@ -6,13 +6,26 @@ envlist = pep8 [testenv] basepython = python2.7 setenv = VIRTUAL_ENV={envdir} -whitelist_externals = find +whitelist_externals = * commands = find . -type f -name "*.py[c|o]" -delete [testenv:pep8] deps = -r{toxinidir}/test-requirements.txt commands = flake8 {posargs} +[testenv:functional] +deps = + rtyaml + ddt + git+git://github.com/loadtheaccumulator/glusto.git + git+git://github.com/gluster/glusto-tests.git#egg=glustolibs-gluster&subdirectory=glustolibs-gluster + git+git://github.com/gluster/glusto-tests.git#egg=glustolibs-io&subdirectory=glustolibs-io + git+git://github.com/gluster/glusto-tests.git#egg=glustolibs-misc&subdirectory=glustolibs-misc + --editable=file:///{toxinidir}/cns-libs +commands = + find . -type f -name "*.py[c|o]" -delete + {posargs:bash -c "echo 'No commands have been specified. Exiting.'; exit 1"} + [testenv:venv] commands = {posargs} |