diff options
-rw-r--r-- | test/functest/config.py | 53 | ||||
-rw-r--r-- | test/functest/config.yaml | 32 | ||||
-rw-r--r-- | test/functest/results.py | 19 | ||||
-rw-r--r-- | test/functest/run_tests.py | 22 | ||||
-rw-r--r-- | test/functest/tempest.py | 12 | ||||
-rw-r--r-- | test/functest/testcase_1.py | 237 | ||||
-rw-r--r-- | test/functest/testcase_2.py | 326 | ||||
-rw-r--r-- | test/functest/testcase_4.py | 239 | ||||
-rw-r--r-- | test/functest/utils.py | 37 |
9 files changed, 420 insertions, 557 deletions
diff --git a/test/functest/config.py b/test/functest/config.py new file mode 100644 index 0000000..45611c7 --- /dev/null +++ b/test/functest/config.py @@ -0,0 +1,53 @@ +import yaml +import os + +import functest.utils.functest_constants as ft_constants +import functest.utils.functest_logger as ft_logger +import functest.utils.functest_utils as ft_utils + +logger = ft_logger.Logger("sndvpn_test_config").getLogger() + + +class CommonConfig(object): + """ + Common configuration parameters across testcases + """ + + def __init__(self): + self.repo_path = ft_constants.SDNVPN_REPO_DIR + self.config_file = os.path.join(self.repo_path, + 'test/functest/config.yaml') + self.keyfile_path = os.path.join(self.repo_path, + 'test/functest/id_rsa') + self.test_db = ft_utils.get_functest_config("results.test_db_url") + self.line_length = 90 # length for the summary table + self.vm_boot_timeout = 180 + self.default_flavor = ft_utils.get_parameter_from_yaml( + "defaults.flavor", self.config_file) + self.image_filename = ft_utils.get_functest_config( + "general.openstack.image_file_name") + self.image_format = ft_utils.get_functest_config( + "general.openstack.image_disk_format") + self.image_path = '{0}/{1}'.format( + ft_utils.get_functest_config( + "general.directories.dir_functest_data"), + self.image_filename) + + +class TestcaseConfig(object): + """ + Configuration for a testcase. + Parse config.yaml into a dict and create an object out of it. + """ + + def __init__(self, testcase): + common_config = CommonConfig() + test_config = None + with open(common_config.config_file) as f: + testcases_yaml = yaml.safe_load(f) + test_config = testcases_yaml['testcases'].get(testcase, None) + if test_config is None: + logger.error('Test {0} configuration is not present in {1}' + .format(testcase, common_config.config_file)) + # Update class fields with configuration variables dynamically + self.__dict__.update(**test_config) diff --git a/test/functest/config.yaml b/test/functest/config.yaml index 63d5843..d075c77 100644 --- a/test/functest/config.yaml +++ b/test/functest/config.yaml @@ -5,14 +5,14 @@ testcases: tempest: enabled: true description: Neutron BGPVPN tests in tempest - succes_criteria: 100 # all the subtests must pass + success_criteria: 100 # all the subtests must pass testname_db: functest_tempest # declared name in the test api # http://testresults.opnfv.org/test/api/v1/projects/sdnvpn/cases testcase_1: enabled: true description: VPN provides connectivity between subnets - succes_criteria: 75 # we let fail 25% of the subtests + success_criteria: 75 # we let fail 25% of the subtests testname_db: functest_testcase_1 instance_1_name: sdnvpn-1-1 instance_2_name: sdnvpn-1-2 @@ -28,8 +28,8 @@ testcases: subnet_2_name: sdnvpn-1-2-subnet subnet_2_cidr: 10.10.11.0/24 router_2_name: sdnvpn-1-2-router - sdnvpn_sg_name: sdnvpn-sg - sdnvpn_sg_descr: Security group for SDNVPN test cases + secgroup_name: sdnvpn-sg + secgroup_descr: Security group for SDNVPN test cases targets1: '88:88' targets2: '55:55' route_distinguishers: '11:11' @@ -37,13 +37,18 @@ testcases: testcase_2: enabled: true description: Tenant separation - succes_criteria: 100 # all the subtests must pass + success_criteria: 100 # all the subtests must pass testname_db: functest_testcase_2 instance_1_name: sdnvpn-2-1 instance_2_name: sdnvpn-2-2 instance_3_name: sdnvpn-2-3 instance_4_name: sdnvpn-2-4 instance_5_name: sdnvpn-2-5 + instance_1_ip: 10.10.10.11 + instance_2_ip: 10.10.10.12 + instance_3_ip: 10.10.11.13 + instance_4_ip: 10.10.10.12 + instance_5_ip: 10.10.11.13 image_name: sdnvpn-image net_1_name: sdnvpn-2-1-net subnet_1a_name: sdnvpn-2-1a-subnet @@ -57,21 +62,23 @@ testcases: subnet_2b_name: sdnvpn-2-2b-subnet subnet_2b_cidr: 10.10.10.0/24 router_2_name: sdnvpn-2-2-router - sdnvpn_sg_name: sdnvpn-sg - sdnvpn_sg_descr: Security group for SDNVPN test cases + secgroup_name: sdnvpn-sg + secgroup_descr: Security group for SDNVPN test cases targets1: '88:88' targets2: '55:55' + route_distinguishers1: '111:111' + route_distinguishers2: '222:222' testcase_3: enabled: false description: Data center gateway integration - succes_criteria: 100 # all the subtests must pass + success_criteria: 100 # all the subtests must pass testname_db: functest_testcase_3 testcase_4: - enabled: false + enabled: true description: VPN provides connectivity between subnets using router association - succes_criteria: 75 # we let fail 25% of the subtests + success_criteria: 75 # we let fail 25% of the subtests testname_db: functest_testcase_4 instance_1_name: sdnvpn-4-1 instance_2_name: sdnvpn-4-2 @@ -87,7 +94,8 @@ testcases: subnet_2_name: sdnvpn-4-2-subnet subnet_2_cidr: 10.10.11.0/24 router_2_name: sdnvpn-4-2-router - sdnvpn_sg_name: sdnvpn-sg - sdnvpn_sg_descr: Security group for SDNVPN test cases + secgroup_name: sdnvpn-sg + secgroup_descr: Security group for SDNVPN test cases targets1: '88:88' targets2: '55:55' + route_distinguishers: '12:12' diff --git a/test/functest/results.py b/test/functest/results.py index baa6af7..7c73556 100644 --- a/test/functest/results.py +++ b/test/functest/results.py @@ -145,3 +145,22 @@ class Results(object): % vm_source.name) self.add_to_summary(2, "FAIL", test_case_name) break + + def compile_summary(self, SUCCESS_CRITERIA): + success_message = "All the subtests have passed." + failure_message = "One or more subtests have failed." + + self.add_to_summary(0, "=") + logger.info("\n%s" % self.summary) + if self.test_result == "PASS": + logger.info(success_message) + else: + logger.info(failure_message) + + status = "PASS" + success = 100 - \ + (100 * int(self.num_tests_failed) / int(self.num_tests)) + if success < int(SUCCESS_CRITERIA): + status = "FAILED" + + return {"status": status, "details": self.details} diff --git a/test/functest/run_tests.py b/test/functest/run_tests.py index be2bcb2..e05cd7f 100644 --- a/test/functest/run_tests.py +++ b/test/functest/run_tests.py @@ -10,12 +10,13 @@ import argparse import importlib -import os import sys import time +import yaml + import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils -import yaml +import config as sdnvpn_config parser = argparse.ArgumentParser() @@ -26,7 +27,8 @@ args = parser.parse_args() TEST_DB_URL = ft_utils.get_functest_config('results.test_db_url') logger = ft_logger.Logger("sdnvpn-run-tests").getLogger() -REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' + +COMMON_CONFIG = sdnvpn_config.CommonConfig() def push_results(testname, start_time, end_time, criteria, details): @@ -41,13 +43,11 @@ def push_results(testname, start_time, end_time, criteria, details): def main(): - with open(REPO_PATH + 'test/functest/config.yaml') as f: + with open(COMMON_CONFIG.config_file) as f: config_yaml = yaml.safe_load(f) testcases = config_yaml.get("testcases") - overall_details = {} overall_status = "PASS" - overall_start_time = time.time() for testcase in testcases: if testcases[testcase]['enabled']: test_name = testcase @@ -61,11 +61,9 @@ def main(): start_time = time.time() result = t.main() end_time = time.time() - duration = end_time - start_time if result < 0: status = "FAIL" overall_status = "FAIL" - overall_details.update({test_name_db: "execution error."}) else: status = result.get("status") details = result.get("details") @@ -75,18 +73,10 @@ def main(): if status == "FAIL": overall_status = "FAIL" - dic = {"duration": duration, "status": status} - overall_details.update({test_name_db: dic}) if args.report: push_results( test_name_db, start_time, end_time, status, details) - overall_end_time = time.time() - if args.report: - push_results( - "bgpvpn", overall_start_time, overall_end_time, - overall_status, overall_details) - if overall_status == "FAIL": sys.exit(-1) diff --git a/test/functest/tempest.py b/test/functest/tempest.py index 61616de..9797ced 100644 --- a/test/functest/tempest.py +++ b/test/functest/tempest.py @@ -12,17 +12,17 @@ import ConfigParser import os import re import shutil + import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils - +import config as sdnvpn_config logger = ft_logger.Logger("sdnvpn-tempest").getLogger() -REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' -config_file = REPO_PATH + 'test/functest/config.yaml' +COMMON_CONFIG = sdnvpn_config.CommonConfig() SUCCESS_CRITERIA = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.succes_criteria", config_file) + "testcases.testcase_1.succes_criteria", COMMON_CONFIG.config_file) def main(): @@ -44,8 +44,8 @@ def main(): config.read(bgpvpn_tempest_conf) config.set('service_available', 'bgpvpn', 'True') logger.debug("Updating %s with bgpvpn=True" % bgpvpn_tempest_conf) - with open(bgpvpn_tempest_conf, 'wb') as config_file: - config.write(config_file) + with open(bgpvpn_tempest_conf, 'wb') as tempest_conf: + config.write(tempest_conf) cmd_line = (src_tempest_dir + "/run_tempest.sh -C %s -t -N -- " diff --git a/test/functest/testcase_1.py b/test/functest/testcase_1.py index 4ad29b6..eba39bb 100644 --- a/test/functest/testcase_1.py +++ b/test/functest/testcase_1.py @@ -9,16 +9,13 @@ # import argparse -import os from random import randint -import sys -import time import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import utils as test_utils +import config as sdnvpn_config from results import Results parser = argparse.ArgumentParser() @@ -31,70 +28,12 @@ args = parser.parse_args() logger = ft_logger.Logger("sdnvpn-testcase-1").getLogger() -REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' - -VM_BOOT_TIMEOUT = 180 - -config_file = REPO_PATH + 'test/functest/config.yaml' - -INSTANCE_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.instance_1_name", config_file) -INSTANCE_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.instance_2_name", config_file) -INSTANCE_3_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.instance_3_name", config_file) -INSTANCE_4_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.instance_4_name", config_file) -INSTANCE_5_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.instance_5_name", config_file) -IMAGE_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.image_name", config_file) -ROUTE_DISTINGUISHERS = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.route_distinguishers", config_file) - -IMAGE_FILENAME = ft_utils.get_functest_config( - "general.openstack.image_file_name") -IMAGE_FORMAT = ft_utils.get_functest_config( - "general.openstack.image_disk_format") -IMAGE_PATH = ft_utils.get_functest_config( - "general.directories.dir_functest_data") + "/" + IMAGE_FILENAME - -# NEUTRON Private Network parameters - -NET_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.net_1_name", config_file) -SUBNET_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.subnet_1_name", config_file) -SUBNET_1_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.subnet_1_cidr", config_file) -ROUTER_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.router_1_name", config_file) -NET_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.net_2_name", config_file) -SUBNET_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.subnet_2_name", config_file) -SUBNET_2_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.subnet_2_cidr", config_file) -ROUTER_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.router_2_name", config_file) -SECGROUP_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.sdnvpn_sg_name", config_file) -SECGROUP_DESCR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.sdnvpn_sg_descr", config_file) -TARGETS_1 = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.targets1", config_file) -TARGETS_2 = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.targets2", config_file) -SUCCESS_CRITERIA = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.succes_criteria", config_file) -TEST_DB = ft_utils.get_functest_config("results.test_db_url") - -LINE_LENGTH = 60 +COMMON_CONFIG = sdnvpn_config.CommonConfig() +TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_1') def main(): - global LINE_LENGTH - results = Results(LINE_LENGTH) + results = Results(COMMON_CONFIG.line_length) results.add_to_summary(0, "=") results.add_to_summary(2, "STATUS", "SUBTEST") @@ -105,89 +44,78 @@ def main(): glance_client = os_utils.get_glance_client() image_id = os_utils.create_glance_image(glance_client, - IMAGE_NAME, - IMAGE_PATH, - disk=IMAGE_FORMAT, + TESTCASE_CONFIG.image_name, + COMMON_CONFIG.image_path, + disk=COMMON_CONFIG.image_format, container="bare", public=True) network_1_id = test_utils.create_net(neutron_client, - NET_1_NAME) + TESTCASE_CONFIG.net_1_name) test_utils.create_subnet(neutron_client, - SUBNET_1_NAME, - SUBNET_1_CIDR, + TESTCASE_CONFIG.subnet_1_name, + TESTCASE_CONFIG.subnet_1_cidr, network_1_id) network_2_id = test_utils.create_net(neutron_client, - NET_2_NAME) + TESTCASE_CONFIG.net_2_name) test_utils.create_subnet(neutron_client, - SUBNET_2_NAME, - SUBNET_2_CIDR, + TESTCASE_CONFIG.subnet_2_name, + TESTCASE_CONFIG.subnet_2_cidr, network_2_id) sg_id = os_utils.create_security_group_full(neutron_client, - SECGROUP_NAME, SECGROUP_DESCR) - - # Get hypervisors zones - compute_nodes = os_utils.get_hypervisors(nova_client) - num_compute_nodes = len(compute_nodes) - if num_compute_nodes < 2: - logger.error("There are %s compute nodes in the deployment. " - "Minimum number of nodes to complete the test is 2." - % num_compute_nodes) - sys.exit(-1) - - logger.debug("Compute nodes: %s" % compute_nodes) + TESTCASE_CONFIG.secgroup_name, + TESTCASE_CONFIG.secgroup_descr) + + compute_nodes = test_utils.assert_and_get_compute_nodes(nova_client) + av_zone_1 = "nova:" + compute_nodes[0] av_zone_2 = "nova:" + compute_nodes[1] # boot INTANCES - vm_2 = test_utils.create_instance(nova_client, - INSTANCE_2_NAME, - image_id, - network_1_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1) + vm_2 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_2_name, + image_id, + network_1_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1) vm_2_ip = vm_2.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_2_NAME, vm_2_ip)) - - vm_3 = test_utils.create_instance(nova_client, - INSTANCE_3_NAME, - image_id, - network_1_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_2) + + vm_3 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_3_name, + image_id, + network_1_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_2) vm_3_ip = vm_3.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_3_NAME, vm_3_ip)) - - vm_5 = test_utils.create_instance(nova_client, - INSTANCE_5_NAME, - image_id, - network_2_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_2) + + vm_5 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_5_name, + image_id, + network_2_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_2) vm_5_ip = vm_5.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_5_NAME, vm_5_ip)) # We boot vm5 first because we need vm5_ip for vm4 userdata u4 = test_utils.generate_ping_userdata([vm_5_ip]) - vm_4 = test_utils.create_instance(nova_client, - INSTANCE_4_NAME, - image_id, - network_2_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=u4) + vm_4 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_4_name, + image_id, + network_2_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=u4) vm_4_ip = vm_4.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_4_NAME, vm_4_ip)) # We boot VM1 at the end because we need to get the IPs first to generate # the userdata @@ -195,30 +123,32 @@ def main(): vm_3_ip, vm_4_ip, vm_5_ip]) - vm_1 = test_utils.create_instance(nova_client, - INSTANCE_1_NAME, - image_id, - network_1_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=u1) + vm_1 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_1_name, + image_id, + network_1_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=u1) vm_1_ip = vm_1.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_1_NAME, vm_1_ip)) + msg = ("Create VPN with eRT<>iRT") logger.info(msg) results.add_to_summary(1, msg) vpn_name = "sdnvpn-" + str(randint(100000, 999999)) - kwargs = {"import_targets": TARGETS_1, - "export_targets": TARGETS_2, - "route_distinguishers": ROUTE_DISTINGUISHERS, - "name": vpn_name} + kwargs = { + "import_targets": TESTCASE_CONFIG.targets1, + "export_targets": TESTCASE_CONFIG.targets2, + "route_distinguishers": TESTCASE_CONFIG.route_distinguishers, + "name": vpn_name + } bgpvpn = os_utils.create_bgpvpn(neutron_client, **kwargs) bgpvpn_id = bgpvpn['bgpvpn']['id'] logger.debug("VPN created details: %s" % bgpvpn) - msg = ("Associate network '%s' to the VPN." % NET_1_NAME) + msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_1_name) logger.info(msg) results.add_to_summary(1, msg) results.add_to_summary(0, "-") @@ -245,7 +175,7 @@ def main(): results.get_ping_status(vm_1, vm_1_ip, vm_4, vm_4_ip, expected="FAIL", timeout=30) - msg = ("Associate network '%s' to the VPN." % NET_2_NAME) + msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_2_name) logger.info(msg) results.add_to_summary(0, "-") results.add_to_summary(1, msg) @@ -260,7 +190,7 @@ def main(): logger.info("Waiting for the VMs to connect to each other using the" " updated network configuration") - time.sleep(30) + test_utils.wait_before_subtest() # Ping from VM4 to VM5 should work results.get_ping_status(vm_4, vm_4_ip, vm_5, vm_5_ip, @@ -277,13 +207,14 @@ def main(): results.add_to_summary(0, "-") results.add_to_summary(1, msg) results.add_to_summary(0, "-") - kwargs = {"import_targets": TARGETS_1, - "export_targets": TARGETS_1, + kwargs = {"import_targets": TESTCASE_CONFIG.targets1, + "export_targets": TESTCASE_CONFIG.targets1, "name": vpn_name} bgpvpn = os_utils.update_bgpvpn(neutron_client, bgpvpn_id, **kwargs) + logger.info("Waiting for the VMs to connect to each other using the" " updated network configuration") - time.sleep(30) + test_utils.wait_before_subtest() # Ping from VM1 to VM4 should work results.get_ping_status(vm_1, vm_1_ip, vm_4, vm_4_ip, @@ -292,21 +223,7 @@ def main(): results.get_ping_status(vm_1, vm_1_ip, vm_5, vm_5_ip, expected="PASS", timeout=30) - results.add_to_summary(0, "=") - logger.info("\n%s" % results.summary) - - if results.test_result == "PASS": - logger.info("All the ping tests have passed as expected.") - else: - logger.info("One or more ping tests have failed.") - - status = "PASS" - success = 100 - \ - (100 * int(results.num_tests_failed) / int(results.num_tests)) - if success < int(SUCCESS_CRITERIA): - status = "FAILED" - - return {"status": status, "details": results.details} + return results.compile_summary(TESTCASE_CONFIG.success_criteria) if __name__ == '__main__': diff --git a/test/functest/testcase_2.py b/test/functest/testcase_2.py index ed86b02..e8b8048 100644 --- a/test/functest/testcase_2.py +++ b/test/functest/testcase_2.py @@ -9,17 +9,15 @@ # import argparse -import os from random import randint import sys -import time import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import utils as test_utils from results import Results +import config as sdnvpn_config parser = argparse.ArgumentParser() @@ -31,85 +29,12 @@ args = parser.parse_args() logger = ft_logger.Logger("sdnvpn-testcase-2").getLogger() -REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' - -VM_BOOT_TIMEOUT = 180 - -config_file = REPO_PATH + 'test/functest/config.yaml' - -INSTANCE_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.instance_1_name", config_file) -INSTANCE_1_IP = "10.10.10.11" -INSTANCE_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.instance_2_name", config_file) -INSTANCE_2_IP = "10.10.10.12" -INSTANCE_3_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.instance_3_name", config_file) -INSTANCE_3_IP = "10.10.11.13" -INSTANCE_4_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.instance_4_name", config_file) -INSTANCE_4_IP = "10.10.10.12" -INSTANCE_5_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.instance_5_name", config_file) -INSTANCE_5_IP = "10.10.11.13" -IMAGE_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.image_name", config_file) -IMAGE_FILENAME = ft_utils.get_functest_config( - "general.openstack.image_file_name") -IMAGE_FORMAT = ft_utils.get_functest_config( - "general.openstack.image_disk_format") -IMAGE_PATH = ft_utils.get_functest_config( - "general.directories.dir_functest_data") + "/" + IMAGE_FILENAME - -KEYFILE_PATH = REPO_PATH + 'test/functest/id_rsa' - -# NEUTRON Private Network parameters - -NET_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.net_1_name", config_file) -SUBNET_1a_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_1a_name", config_file) -SUBNET_1a_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_1a_cidr", config_file) -SUBNET_1b_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_1b_name", config_file) -SUBNET_1b_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_1b_cidr", config_file) -ROUTER_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.router_1_name", config_file) -NET_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.net_2_name", config_file) -SUBNET_2a_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_2a_name", config_file) -SUBNET_2a_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_2a_cidr", config_file) -SUBNET_2b_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_2b_name", config_file) -SUBNET_2b_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.subnet_2b_cidr", config_file) -ROUTER_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.router_1_name", config_file) -ROUTER_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.router_2_name", config_file) -SECGROUP_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.sdnvpn_sg_name", config_file) -SECGROUP_DESCR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.sdnvpn_sg_descr", config_file) -TARGETS_1 = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.targets1", config_file) -TARGETS_2 = ft_utils.get_parameter_from_yaml( - "testcases.testcase_2.targets2", config_file) -SUCCESS_CRITERIA = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.succes_criteria", config_file) -TEST_DB = ft_utils.get_functest_config("results.test_db_url") - -LINE_LENGTH = 90 # length for the summary table +COMMON_CONFIG = sdnvpn_config.CommonConfig() +TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_2') def main(): - global LINE_LENGTH - - results = Results(LINE_LENGTH) + results = Results(COMMON_CONFIG.line_length) results.add_to_summary(0, "=") results.add_to_summary(2, "STATUS", "SUBTEST") @@ -119,137 +44,146 @@ def main(): neutron_client = os_utils.get_neutron_client() glance_client = os_utils.get_glance_client() - logger.debug("Using private key %s injected to the VMs." % KEYFILE_PATH) - keyfile = open(KEYFILE_PATH, 'r') + logger.debug("Using private key %s injected to the VMs." + % COMMON_CONFIG.keyfile_path) + keyfile = open(COMMON_CONFIG.keyfile_path, 'r') key = keyfile.read() keyfile.close() files = {"/home/cirros/id_rsa": key} image_id = os_utils.create_glance_image(glance_client, - IMAGE_NAME, - IMAGE_PATH, - disk=IMAGE_FORMAT, + TESTCASE_CONFIG.image_name, + COMMON_CONFIG.image_path, + disk=COMMON_CONFIG.image_format, container="bare", public=True) - network_1_id, _, _ = test_utils.create_network(neutron_client, - NET_1_NAME, - SUBNET_1a_NAME, - SUBNET_1a_CIDR, - ROUTER_1_NAME, - SUBNET_1b_NAME, - SUBNET_1b_CIDR) - network_2_id, _, _ = test_utils.create_network(neutron_client, - NET_2_NAME, - SUBNET_2a_NAME, - SUBNET_2a_CIDR, - ROUTER_2_NAME, - SUBNET_2b_NAME, - SUBNET_2b_CIDR) + network_1_id = test_utils.create_net( + neutron_client, + TESTCASE_CONFIG.net_1_name) + test_utils.create_subnet( + neutron_client, + TESTCASE_CONFIG.subnet_1a_name, + TESTCASE_CONFIG.subnet_1a_cidr, + network_1_id) + test_utils.create_subnet( + neutron_client, + TESTCASE_CONFIG.subnet_1b_name, + TESTCASE_CONFIG.subnet_1b_cidr, + network_1_id) + + network_2_id = test_utils.create_net( + neutron_client, + TESTCASE_CONFIG.net_2_name) + test_utils.create_subnet( + neutron_client, + TESTCASE_CONFIG.subnet_2a_name, + TESTCASE_CONFIG.subnet_2a_cidr, + network_2_id) + test_utils.create_subnet( + neutron_client, + TESTCASE_CONFIG.subnet_2b_name, + TESTCASE_CONFIG.subnet_2b_cidr, + network_2_id) + sg_id = os_utils.create_security_group_full(neutron_client, - SECGROUP_NAME, SECGROUP_DESCR) - - # Get hypervisors zones - compute_nodes = os_utils.get_hypervisors(nova_client) - num_compute_nodes = len(compute_nodes) - if num_compute_nodes < 2: - logger.error("There are %s compute nodes in the deployment. " - "Minimum number of nodes to complete the test is 2." - % num_compute_nodes) - sys.exit(-1) + TESTCASE_CONFIG.secgroup_name, + TESTCASE_CONFIG.secgroup_descr) + + compute_nodes = test_utils.assert_and_get_compute_nodes(nova_client) - logger.debug("Compute nodes: %s" % compute_nodes) av_zone_1 = "nova:" + compute_nodes[0] av_zone_2 = "nova:" + compute_nodes[1] # boot INTANCES userdata_common = test_utils.generate_userdata_common() - vm_2 = test_utils.create_instance(nova_client, - INSTANCE_2_NAME, - image_id, - network_1_id, - sg_id, - fixed_ip=INSTANCE_2_IP, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=userdata_common) + vm_2 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_2_name, + image_id, + network_1_id, + sg_id, + fixed_ip=TESTCASE_CONFIG.instance_2_ip, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=userdata_common) vm_2_ip = vm_2.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_2_NAME, vm_2_ip)) - - vm_3 = test_utils.create_instance(nova_client, - INSTANCE_3_NAME, - image_id, - network_1_id, - sg_id, - fixed_ip=INSTANCE_3_IP, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_2, - userdata=userdata_common) + + vm_3 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_3_name, + image_id, + network_1_id, + sg_id, + fixed_ip=TESTCASE_CONFIG.instance_3_ip, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_2, + userdata=userdata_common) vm_3_ip = vm_3.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_3_NAME, vm_3_ip)) - - vm_5 = test_utils.create_instance(nova_client, - INSTANCE_5_NAME, - image_id, - network_2_id, - sg_id, - fixed_ip=INSTANCE_5_IP, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_2, - userdata=userdata_common) + + vm_5 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_5_name, + image_id, + network_2_id, + sg_id, + fixed_ip=TESTCASE_CONFIG.instance_5_ip, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_2, + userdata=userdata_common) vm_5_ip = vm_5.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_5_NAME, vm_5_ip)) # We boot vm5 first because we need vm5_ip for vm4 userdata u4 = test_utils.generate_userdata_with_ssh( - [INSTANCE_1_IP, INSTANCE_3_IP, INSTANCE_5_IP]) - vm_4 = test_utils.create_instance(nova_client, - INSTANCE_4_NAME, - image_id, - network_2_id, - sg_id, - fixed_ip=INSTANCE_4_IP, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=u4, - files=files) + [TESTCASE_CONFIG.instance_1_ip, + TESTCASE_CONFIG.instance_3_ip, + TESTCASE_CONFIG.instance_5_ip]) + vm_4 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_4_name, + image_id, + network_2_id, + sg_id, + fixed_ip=TESTCASE_CONFIG.instance_4_ip, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=u4, + files=files) vm_4_ip = vm_4.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_4_NAME, vm_4_ip)) # We boot VM1 at the end because we need to get the IPs first to generate # the userdata u1 = test_utils.generate_userdata_with_ssh( - [INSTANCE_2_IP, INSTANCE_3_IP, INSTANCE_4_IP, INSTANCE_5_IP]) - vm_1 = test_utils.create_instance(nova_client, - INSTANCE_1_NAME, - image_id, - network_1_id, - sg_id, - fixed_ip=INSTANCE_1_IP, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=u1, - files=files) + [TESTCASE_CONFIG.instance_2_ip, + TESTCASE_CONFIG.instance_3_ip, + TESTCASE_CONFIG.instance_4_ip, + TESTCASE_CONFIG.instance_5_ip]) + vm_1 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_1_name, + image_id, + network_1_id, + sg_id, + fixed_ip=TESTCASE_CONFIG.instance_1_ip, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=u1, + files=files) vm_1_ip = vm_1.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_1_NAME, vm_1_ip)) msg = ("Create VPN1 with eRT=iRT") logger.info(msg) results.add_to_summary(1, msg) vpn1_name = "sdnvpn-1-" + str(randint(100000, 999999)) - kwargs = {"import_targets": TARGETS_2, - "export_targets": TARGETS_2, - "route_targets": TARGETS_2, + kwargs = {"import_targets": TESTCASE_CONFIG.targets2, + "export_targets": TESTCASE_CONFIG.targets2, + "route_targets": TESTCASE_CONFIG.targets2, + "route_distinguishers": TESTCASE_CONFIG.route_distinguishers1, "name": vpn1_name} bgpvpn1 = os_utils.create_bgpvpn(neutron_client, **kwargs) bgpvpn1_id = bgpvpn1['bgpvpn']['id'] logger.debug("VPN1 created details: %s" % bgpvpn1) - msg = ("Associate network '%s' to the VPN." % NET_1_NAME) + msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_1_name) logger.info(msg) results.add_to_summary(1, msg) results.add_to_summary(0, "-") @@ -268,29 +202,36 @@ def main(): logger.info("Waiting for the VMs to connect to each other using the" " updated network configuration") - time.sleep(30) + test_utils.wait_before_subtest() # 10.10.10.12 should return sdnvpn-2 to sdnvpn-1 results.check_ssh_output( - vm_1, vm_1_ip, vm_2, vm_2_ip, expected=INSTANCE_2_NAME, timeout=200) + vm_1, vm_1_ip, + vm_2, vm_2_ip, + expected=TESTCASE_CONFIG.instance_2_name, + timeout=200) # 10.10.11.13 should return sdnvpn-3 to sdnvpn-1 results.check_ssh_output( - vm_1, vm_1_ip, vm_3, vm_3_ip, expected=INSTANCE_3_NAME, timeout=30) + vm_1, vm_1_ip, + vm_3, vm_3_ip, + expected=TESTCASE_CONFIG.instance_3_name, + timeout=30) results.add_to_summary(0, "-") msg = ("Create VPN2 with eRT=iRT") logger.info(msg) results.add_to_summary(1, msg) vpn2_name = "sdnvpn-2-" + str(randint(100000, 999999)) - kwargs = {"import_targets": TARGETS_1, - "export_targets": TARGETS_1, - "route_targets": TARGETS_1, + kwargs = {"import_targets": TESTCASE_CONFIG.targets1, + "export_targets": TESTCASE_CONFIG.targets1, + "route_targets": TESTCASE_CONFIG.targets1, + "route_distinguishers": TESTCASE_CONFIG.route_distinguishers2, "name": vpn2_name} bgpvpn2 = os_utils.create_bgpvpn(neutron_client, **kwargs) bgpvpn2_id = bgpvpn2['bgpvpn']['id'] logger.debug("VPN created details: %s" % bgpvpn2) - msg = ("Associate network '%s' to the VPN2." % NET_2_NAME) + msg = ("Associate network '%s' to the VPN2." % TESTCASE_CONFIG.net_2_name) logger.info(msg) results.add_to_summary(1, msg) results.add_to_summary(0, "-") @@ -303,31 +244,20 @@ def main(): logger.info("Waiting for the VMs to connect to each other using the" " updated network configuration") - time.sleep(30) + test_utils.wait_before_subtest() # 10.10.11.13 should return sdnvpn-5 to sdnvpn-4 results.check_ssh_output( - vm_4, vm_4_ip, vm_5, vm_5_ip, expected=INSTANCE_5_NAME, timeout=30) + vm_4, vm_4_ip, + vm_5, vm_5_ip, + expected=TESTCASE_CONFIG.instance_5_name, + timeout=30) # 10.10.10.11 should return "not reachable" to sdnvpn-4 results.check_ssh_output( vm_4, vm_4_ip, vm_1, vm_1_ip, expected="not reachable", timeout=30) - results.add_to_summary(0, "=") - logger.info("\n%s" % results.summary) - - if results.test_result == "PASS": - logger.info("All the sub tests have passed as expected.") - else: - logger.info("One or more sub tests have failed.") - - status = "PASS" - success = 100 - \ - (100 * int(results.num_tests_failed) / int(results.num_tests)) - if success < int(SUCCESS_CRITERIA): - status = "FAILED" - - return {"status": status, "details": results.details} + return results.compile_summary(TESTCASE_CONFIG.success_criteria) if __name__ == '__main__': diff --git a/test/functest/testcase_4.py b/test/functest/testcase_4.py index 13f531f..bb25cce 100644 --- a/test/functest/testcase_4.py +++ b/test/functest/testcase_4.py @@ -9,17 +9,14 @@ # import argparse -import os from random import randint -import sys -import time import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import utils as test_utils from results import Results +import config as sdnvpn_config parser = argparse.ArgumentParser() @@ -31,68 +28,12 @@ args = parser.parse_args() logger = ft_logger.Logger("sdnvpn-testcase-4").getLogger() -REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' - -VM_BOOT_TIMEOUT = 180 - -config_file = REPO_PATH + 'test/functest/config.yaml' - -INSTANCE_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.instance_1_name", config_file) -INSTANCE_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.instance_2_name", config_file) -INSTANCE_3_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.instance_3_name", config_file) -INSTANCE_4_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.instance_4_name", config_file) -INSTANCE_5_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.instance_5_name", config_file) -IMAGE_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.image_name", config_file) -IMAGE_FILENAME = ft_utils.get_functest_config( - "general.openstack.image_file_name") -IMAGE_FORMAT = ft_utils.get_functest_config( - "general.openstack.image_disk_format") -IMAGE_PATH = ft_utils.get_functest_config( - "general.directories.dir_functest_data") + "/" + IMAGE_FILENAME - -# NEUTRON Private Network parameters - -NET_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.net_1_name", config_file) -SUBNET_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.subnet_1_name", config_file) -SUBNET_1_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.subnet_1_cidr", config_file) -ROUTER_1_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.router_1_name", config_file) -NET_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.net_2_name", config_file) -SUBNET_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.subnet_2_name", config_file) -SUBNET_2_CIDR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.subnet_2_cidr", config_file) -ROUTER_2_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.router_2_name", config_file) -SECGROUP_NAME = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.sdnvpn_sg_name", config_file) -SECGROUP_DESCR = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.sdnvpn_sg_descr", config_file) -TARGETS_1 = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.targets1", config_file) -TARGETS_2 = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.targets2", config_file) -SUCCESS_CRITERIA = ft_utils.get_parameter_from_yaml( - "testcases.testcase_4.succes_criteria", config_file) -TEST_DB = ft_utils.get_functest_config("results.test_db_url") - -LINE_LENGTH = 60 # length for the summary table +COMMON_CONFIG = sdnvpn_config.CommonConfig() +TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_4') def main(): - global LINE_LENGTH - - results = Results(LINE_LENGTH) + results = Results(COMMON_CONFIG.line_length) results.add_to_summary(0, "=") results.add_to_summary(2, "STATUS", "SUBTEST") @@ -103,84 +44,78 @@ def main(): glance_client = os_utils.get_glance_client() image_id = os_utils.create_glance_image(glance_client, - IMAGE_NAME, - IMAGE_PATH, - disk=IMAGE_FORMAT, + TESTCASE_CONFIG.image_name, + COMMON_CONFIG.image_path, + disk=COMMON_CONFIG.image_format, container="bare", public=True) - network_1_id, _, router_1_id = test_utils.create_network(neutron_client, - NET_1_NAME, - SUBNET_1_NAME, - SUBNET_1_CIDR, - ROUTER_1_NAME) - network_2_id, _, router_2_id = test_utils.create_network(neutron_client, - NET_2_NAME, - SUBNET_2_NAME, - SUBNET_2_CIDR, - ROUTER_2_NAME) + network_1_id, _, router_1_id = test_utils.create_network( + neutron_client, + TESTCASE_CONFIG.net_1_name, + TESTCASE_CONFIG.subnet_1_name, + TESTCASE_CONFIG.subnet_1_cidr, + TESTCASE_CONFIG.router_1_name) + + network_2_id = test_utils.create_net( + neutron_client, + TESTCASE_CONFIG.net_2_name) + test_utils.create_subnet(neutron_client, + TESTCASE_CONFIG.subnet_2_name, + TESTCASE_CONFIG.subnet_2_cidr, + network_2_id) + sg_id = os_utils.create_security_group_full(neutron_client, - SECGROUP_NAME, SECGROUP_DESCR) - - # Get hypervisors zones - compute_nodes = os_utils.get_hypervisors(nova_client) - num_compute_nodes = len(compute_nodes) - if num_compute_nodes < 2: - logger.error("There are %s compute nodes in the deployment. " - "Minimum number of nodes to complete the test is 2." - % num_compute_nodes) - sys.exit(-1) - - logger.debug("Compute nodes: %s" % compute_nodes) + TESTCASE_CONFIG.secgroup_name, + TESTCASE_CONFIG.secgroup_descr) + + compute_nodes = test_utils.assert_and_get_compute_nodes(nova_client) + av_zone_1 = "nova:" + compute_nodes[0] av_zone_2 = "nova:" + compute_nodes[1] # boot INTANCES - vm_2 = test_utils.create_instance(nova_client, - INSTANCE_2_NAME, - image_id, - network_1_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1) + vm_2 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_2_name, + image_id, + network_1_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1) vm_2_ip = vm_2.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_2_NAME, vm_2_ip)) - - vm_3 = test_utils.create_instance(nova_client, - INSTANCE_3_NAME, - image_id, - network_1_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_2) + + vm_3 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_3_name, + image_id, + network_1_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_2) vm_3_ip = vm_3.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_3_NAME, vm_3_ip)) - - vm_5 = test_utils.create_instance(nova_client, - INSTANCE_5_NAME, - image_id, - network_2_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_2) + + vm_5 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_5_name, + image_id, + network_2_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_2) vm_5_ip = vm_5.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_5_NAME, vm_5_ip)) # We boot vm5 first because we need vm5_ip for vm4 userdata u4 = test_utils.generate_ping_userdata([vm_5_ip]) - vm_4 = test_utils.create_instance(nova_client, - INSTANCE_4_NAME, - image_id, - network_2_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=u4) + vm_4 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_4_name, + image_id, + network_2_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=u4) vm_4_ip = vm_4.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_4_NAME, vm_4_ip)) # We boot VM1 at the end because we need to get the IPs first to generate # the userdata @@ -188,29 +123,30 @@ def main(): vm_3_ip, vm_4_ip, vm_5_ip]) - vm_1 = test_utils.create_instance(nova_client, - INSTANCE_1_NAME, - image_id, - network_1_id, - sg_id, - secgroup_name=SECGROUP_NAME, - compute_node=av_zone_1, - userdata=u1) + vm_1 = test_utils.create_instance( + nova_client, + TESTCASE_CONFIG.instance_1_name, + image_id, + network_1_id, + sg_id, + secgroup_name=TESTCASE_CONFIG.secgroup_name, + compute_node=av_zone_1, + userdata=u1) vm_1_ip = vm_1.networks.itervalues().next()[0] - logger.debug("Instance '%s' booted successfully. IP='%s'." % - (INSTANCE_1_NAME, vm_1_ip)) + msg = ("Create VPN with eRT<>iRT") logger.info(msg) results.add_to_summary(1, msg) vpn_name = "sdnvpn-" + str(randint(100000, 999999)) - kwargs = {"import_targets": TARGETS_1, - "export_targets": TARGETS_2, + kwargs = {"import_targets": TESTCASE_CONFIG.targets1, + "export_targets": TESTCASE_CONFIG.targets2, + "route_distinguishers": TESTCASE_CONFIG.route_distinguishers, "name": vpn_name} bgpvpn = os_utils.create_bgpvpn(neutron_client, **kwargs) bgpvpn_id = bgpvpn['bgpvpn']['id'] logger.debug("VPN created details: %s" % bgpvpn) - msg = ("Associate router '%s' to the VPN." % ROUTER_1_NAME) + msg = ("Associate router '%s' to the VPN." % TESTCASE_CONFIG.router_1_name) logger.info(msg) results.add_to_summary(1, msg) results.add_to_summary(0, "-") @@ -237,7 +173,7 @@ def main(): results.get_ping_status(vm_1, vm_1_ip, vm_4, vm_4_ip, expected="FAIL", timeout=30) - msg = ("Associate network '%s' to the VPN." % NET_2_NAME) + msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_2_name) logger.info(msg) results.add_to_summary(0, "-") results.add_to_summary(1, msg) @@ -252,7 +188,7 @@ def main(): logger.info("Waiting for the VMs to connect to each other using the" " updated network configuration") - time.sleep(30) + test_utils.wait_before_subtest() # Ping from VM4 to VM5 should work results.get_ping_status(vm_4, vm_4_ip, vm_5, vm_5_ip, @@ -269,14 +205,14 @@ def main(): results.add_to_summary(0, "-") results.add_to_summary(1, msg) results.add_to_summary(0, "-") - kwargs = {"import_targets": TARGETS_1, - "export_targets": TARGETS_1, + kwargs = {"import_targets": TESTCASE_CONFIG.targets1, + "export_targets": TESTCASE_CONFIG.targets1, "name": vpn_name} bgpvpn = os_utils.update_bgpvpn(neutron_client, bgpvpn_id, **kwargs) logger.info("Waiting for the VMs to connect to each other using the" " updated network configuration") - time.sleep(30) + test_utils.wait_before_subtest() # Ping from VM1 to VM4 should work results.get_ping_status(vm_1, vm_1_ip, vm_4, vm_4_ip, @@ -288,18 +224,7 @@ def main(): results.add_to_summary(0, "=") logger.info("\n%s" % results.summary) - if results.test_result == "PASS": - logger.info("All the ping tests have passed as expected.") - else: - logger.info("One or more ping tests have failed.") - - status = "PASS" - success = 100 - \ - (100 * int(results.num_tests_failed) / int(results.num_tests_failed)) - if success < int(SUCCESS_CRITERIA): - status = "FAILED" - - return {"status": status, "details": results.details} + return results.compile_summary(TESTCASE_CONFIG.success_criteria) if __name__ == '__main__': diff --git a/test/functest/utils.py b/test/functest/utils.py index be08572..90dfe93 100644 --- a/test/functest/utils.py +++ b/test/functest/utils.py @@ -9,21 +9,16 @@ # import sys import time -import os import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import re +import config as sdnvpn_config logger = ft_logger.Logger("sndvpn_test_utils").getLogger() -REPO_PATH = os.environ['repos_dir'] + '/sdnvpn/' -config_file = REPO_PATH + 'test/functest/config.yaml' - -DEFAULT_FLAVOR = ft_utils.get_parameter_from_yaml( - "defaults.flavor", config_file) +common_config = sdnvpn_config.CommonConfig() def create_net(neutron_client, name): @@ -94,7 +89,7 @@ def create_instance(nova_client, **kwargs ): if 'flavor' not in kwargs: - kwargs['flavor'] = DEFAULT_FLAVOR + kwargs['flavor'] = common_config.default_flavor logger.info("Creating instance '%s'..." % name) logger.debug( @@ -117,6 +112,9 @@ def create_instance(nova_client, if instance is None: logger.error("Error while booting instance.") sys.exit(-1) + else: + logger.debug("Instance '%s' booted successfully. IP='%s'." % + (name, instance.networks.itervalues().next()[0])) # Retrieve IP of INSTANCE # instance_ip = instance.networks.get(network_id)[0] @@ -269,3 +267,26 @@ def wait_for_bgp_router_assocs(neutron_client, bgpvpn_id, *args): for id in args] # Return True if all associations succeeded return all(check) + + +def wait_before_subtest(*args, **kwargs): + ''' This is a placeholder. + TODO: Replace delay with polling logic. ''' + time.sleep(30) + + +def assert_and_get_compute_nodes(nova_client, required_node_number=2): + """Get the compute nodes in the deployment + + Exit if the deployment doesn't have enough compute nodes""" + compute_nodes = os_utils.get_hypervisors(nova_client) + + num_compute_nodes = len(compute_nodes) + if num_compute_nodes < 2: + logger.error("There are %s compute nodes in the deployment. " + "Minimum number of nodes to complete the test is 2." + % num_compute_nodes) + sys.exit(-1) + + logger.debug("Compute nodes: %s" % compute_nodes) + return compute_nodes |