diff options
Diffstat (limited to 'test/functest')
-rw-r--r-- | test/functest/README.md | 5 | ||||
-rw-r--r-- | test/functest/__init__.py | 0 | ||||
-rw-r--r-- | test/functest/config.py | 53 | ||||
-rw-r--r-- | test/functest/config.yaml | 122 | ||||
-rw-r--r-- | test/functest/id_rsa | bin | 426 -> 0 bytes | |||
-rw-r--r-- | test/functest/results.py | 192 | ||||
-rw-r--r-- | test/functest/run_tests.py | 87 | ||||
-rw-r--r-- | test/functest/tempest.py | 90 | ||||
-rw-r--r-- | test/functest/tempest_blacklist.txt | 9 | ||||
-rw-r--r-- | test/functest/testcase_1.py | 209 | ||||
-rw-r--r-- | test/functest/testcase_2.py | 250 | ||||
-rw-r--r-- | test/functest/testcase_3.py | 17 | ||||
-rw-r--r-- | test/functest/testcase_4.py | 210 | ||||
-rw-r--r-- | test/functest/testcase_7.py | 153 | ||||
-rw-r--r-- | test/functest/utils.py | 303 |
15 files changed, 0 insertions, 1700 deletions
diff --git a/test/functest/README.md b/test/functest/README.md deleted file mode 100644 index 62e55d2..0000000 --- a/test/functest/README.md +++ /dev/null @@ -1,5 +0,0 @@ -The functest directory contains the test cases implementation to be run inside the -Functest framework. - -The definition of the test cases is explained in the project Wiki page: -https://wiki.opnfv.org/display/sdnvpn/main diff --git a/test/functest/__init__.py b/test/functest/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/test/functest/__init__.py +++ /dev/null diff --git a/test/functest/config.py b/test/functest/config.py deleted file mode 100644 index 45611c7..0000000 --- a/test/functest/config.py +++ /dev/null @@ -1,53 +0,0 @@ -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 deleted file mode 100644 index ccd5db7..0000000 --- a/test/functest/config.yaml +++ /dev/null @@ -1,122 +0,0 @@ -defaults: - flavor: m1.tiny # adapt to your environment - -testcases: - tempest: - enabled: true - description: Neutron BGPVPN tests in tempest - 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 - 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 - instance_3_name: sdnvpn-1-3 - instance_4_name: sdnvpn-1-4 - instance_5_name: sdnvpn-1-5 - image_name: sdnvpn-image - net_1_name: sdnvpn-1-1-net - subnet_1_name: sdnvpn-1-1-subnet - subnet_1_cidr: 10.10.10.0/24 - router_1_name: sdnvpn-1-1-router - net_2_name: sdnvpn-1-2-net - subnet_2_name: sdnvpn-1-2-subnet - subnet_2_cidr: 10.10.11.0/24 - router_2_name: sdnvpn-1-2-router - secgroup_name: sdnvpn-sg - secgroup_descr: Security group for SDNVPN test cases - targets1: '88:88' - targets2: '55:55' - route_distinguishers: '11:11' - - testcase_2: - enabled: true - description: Tenant separation - 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 - subnet_1a_cidr: 10.10.10.0/24 - subnet_1b_name: sdnvpn-2-1b-subnet - subnet_1b_cidr: 10.10.11.0/24 - router_1_name: sdnvpn-2-1-router - net_2_name: sdnvpn-2-2-net - subnet_2a_name: sdnvpn-2-2a-subnet - subnet_2a_cidr: 10.10.11.0/24 - subnet_2b_name: sdnvpn-2-2b-subnet - subnet_2b_cidr: 10.10.10.0/24 - router_2_name: sdnvpn-2-2-router - 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 - success_criteria: 100 # all the subtests must pass - testname_db: functest_testcase_3 - - testcase_4: - enabled: true - description: VPN provides connectivity between subnets using router association - 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 - instance_3_name: sdnvpn-4-3 - instance_4_name: sdnvpn-4-4 - instance_5_name: sdnvpn-4-5 - image_name: sdnvpn-image - net_1_name: sdnvpn-4-1-net - subnet_1_name: sdnvpn-4-1-subnet - subnet_1_cidr: 10.10.10.0/24 - router_1_name: sdnvpn-4-1-router - net_2_name: sdnvpn-4-2-net - subnet_2_name: sdnvpn-4-2-subnet - subnet_2_cidr: 10.10.11.0/24 - router_2_name: sdnvpn-4-2-router - secgroup_name: sdnvpn-sg - secgroup_descr: Security group for SDNVPN test cases - targets1: '88:88' - targets2: '55:55' - route_distinguishers: '12:12' - - testcase_7: - enabled: false - description: Network associate VPNs with routers attached (ODL Bug 6962) - success_criteria: 100 - testname_db: functest_testcase_7 - image_name: sdnvpn-image - instance_1_name: sdnvpn-7-1 - instance_2_name: sdnvpn-7-2 - net_1_name: sdnvpn-7-1 - subnet_1_name: sdnvpn-7-1-subnet - subnet_1_cidr: 10.10.10.0/24 - router_1_name: sdnvpn-7-1-router - net_2_name: sdnvpn-7-2 - subnet_2_name: sdnvpn-7-2-subnet - subnet_2_cidr: 10.10.20.0/24 - router_2_name: sdnvpn-7-2-router - secgroup_name: sdnvpn-sg - secgroup_descr: Security group for SDNVPN test cases - targets: '77:77' - route_distinguishers: '11:11' diff --git a/test/functest/id_rsa b/test/functest/id_rsa Binary files differdeleted file mode 100644 index d590406..0000000 --- a/test/functest/id_rsa +++ /dev/null diff --git a/test/functest/results.py b/test/functest/results.py deleted file mode 100644 index 66e399e..0000000 --- a/test/functest/results.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2016 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -import time - -import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils - -logger = ft_logger.Logger("sdnvpn-results").getLogger() - - -class Results(object): - - def __init__(self, line_length): - self.line_length = line_length - self.test_result = "PASS" - self.summary = "" - self.details = [] - self.num_tests = 0 - self.num_tests_failed = 0 - - def get_ping_status(self, - vm_source, - vm_target, - expected="PASS", timeout=30): - console_log = vm_source.get_console_output() - - ip_source = vm_source.networks.itervalues().next()[0] - ip_target = vm_target.networks.itervalues().next()[0] - - if "request failed" in console_log: - # Normally, cirros displays this message when userdata fails - logger.debug("It seems userdata is not supported in " - "nova boot...") - return False - else: - tab = ("%s" % (" " * 53)) - expected_result = 'can ping' if expected == 'PASS' \ - else 'cannot ping' - test_case_name = ("'%s' %s '%s'" % - (vm_source.name, - expected_result, - vm_target.name)) - logger.debug("%sPing\n%sfrom '%s' (%s)\n%sto '%s' (%s).\n" - "%s-->Expected result: %s.\n" - % (tab, tab, vm_source.name, ip_source, - tab, vm_target.name, ip_target, - tab, expected_result)) - while True: - console_log = vm_source.get_console_output() - # the console_log is a long string, we want to take - # the last 4 lines (for example) - lines = console_log.split('\n') - last_n_lines = lines[-5:] - if ("ping %s OK" % ip_target) in last_n_lines: - msg = ("'%s' can ping '%s'" - % (vm_source.name, vm_target.name)) - if expected == "PASS": - logger.debug("[PASS] %s" % msg) - self.add_success(test_case_name) - else: - logger.debug("[FAIL] %s" % msg) - self.test_result = "FAIL" - self.add_failure(test_case_name) - logger.debug("\n%s" % last_n_lines) - break - elif ("ping %s KO" % ip_target) in last_n_lines: - msg = ("'%s' cannot ping '%s'" % - (vm_source.name, vm_target.name)) - if expected == "FAIL": - logger.debug("[PASS] %s" % msg) - self.add_success(test_case_name) - else: - logger.debug("[FAIL] %s" % msg) - self.test_result = "FAIL" - self.add_failure(test_case_name) - break - time.sleep(1) - timeout -= 1 - if timeout == 0: - self.test_result = "FAIL" - logger.debug("[FAIL] Timeout reached for '%s'. " - "No ping output captured in the console log" - % vm_source.name) - self.add_failure(test_case_name) - break - - def add_to_summary(self, num_cols, col1, col2=""): - if num_cols == 0: - self.summary += ("+%s+\n" % (col1 * (self.line_length - 2))) - elif num_cols == 1: - self.summary += ("| " + col1.ljust(self.line_length - 3) + "|\n") - elif num_cols == 2: - self.summary += ("| %s" % col1.ljust(7) + "| ") - self.summary += (col2.ljust(self.line_length - 12) + "|\n") - if col1 in ("FAIL", "PASS"): - self.details.append({col2: col1}) - self.num_tests += 1 - if col1 == "FAIL": - self.num_tests_failed += 1 - - def record_action(self, msg): - """Record and log an action and display it in the summary.""" - logger.info(msg) - self.add_to_summary(1, msg) - - def add_failure(self, test): - self.add_to_summary(2, "FAIL", test) - - def add_success(self, test): - self.add_to_summary(2, "PASS", test) - - def check_ssh_output(self, vm_source, vm_target, - expected, timeout=30): - console_log = vm_source.get_console_output() - ip_source = vm_source.networks.itervalues().next()[0] - ip_target = vm_target.networks.itervalues().next()[0] - - if "request failed" in console_log: - # Normally, cirros displays this message when userdata fails - logger.debug("It seems userdata is not supported in " - "nova boot...") - return False - else: - tab = ("%s" % (" " * 53)) - test_case_name = ("[%s] returns 'I am %s' to '%s'[%s]" % - (ip_target, expected, - vm_source.name, ip_source)) - logger.debug("%sSSH\n%sfrom '%s' (%s)\n%sto '%s' (%s).\n" - "%s-->Expected result: %s.\n" - % (tab, tab, vm_source.name, ip_source, - tab, vm_target.name, ip_target, - tab, expected)) - while True: - console_log = vm_source.get_console_output() - # the console_log is a long string, we want to take - # the last 4 lines (for example) - lines = console_log.split('\n') - last_n_lines = lines[-5:] - if ("%s %s" % (ip_target, expected)) in last_n_lines: - logger.debug("[PASS] %s" % test_case_name) - self.add_success(test_case_name) - break - elif ("%s not reachable" % ip_target) in last_n_lines: - logger.debug("[FAIL] %s" % test_case_name) - self.add_failure(test_case_name) - self.test_result = "FAIL" - break - time.sleep(1) - timeout -= 1 - if timeout == 0: - self.test_result = "FAIL" - logger.debug("[FAIL] Timeout reached for '%s'." - " No ping output captured in the console log" - % vm_source.name) - self.add_failure(test_case_name) - break - - def ping_ip_test(self, address): - ping = "ping %s -c 3" % address - testcase_name = "Ping IP %s" % address - exit_code = ft_utils.execute_command(ping) - - if exit_code != 0: - self.add_failure(testcase_name) - else: - self.add_success(testcase_name) - - 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 deleted file mode 100644 index e05cd7f..0000000 --- a/test/functest/run_tests.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# - -import argparse -import importlib -import sys -import time -import yaml - -import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils -import config as sdnvpn_config - - -parser = argparse.ArgumentParser() -parser.add_argument("-r", "--report", - help="Create json result file", - action="store_true") -args = parser.parse_args() - -TEST_DB_URL = ft_utils.get_functest_config('results.test_db_url') -logger = ft_logger.Logger("sdnvpn-run-tests").getLogger() - -COMMON_CONFIG = sdnvpn_config.CommonConfig() - - -def push_results(testname, start_time, end_time, criteria, details): - logger.info("Push testcase '%s' results into the DB...\n" % testname) - ft_utils.push_results_to_db("sdnvpn", - testname, - start_time, - end_time, - criteria, - details) - - -def main(): - - with open(COMMON_CONFIG.config_file) as f: - config_yaml = yaml.safe_load(f) - - testcases = config_yaml.get("testcases") - overall_status = "PASS" - for testcase in testcases: - if testcases[testcase]['enabled']: - test_name = testcase - test_descr = testcases[testcase]['description'] - test_name_db = testcases[testcase]['testname_db'] - title = ("Running '%s - %s'" % - (test_name, test_descr)) - logger.info(title) - logger.info("%s\n" % ("=" * len(title))) - t = importlib.import_module(testcase, package=None) - start_time = time.time() - result = t.main() - end_time = time.time() - if result < 0: - status = "FAIL" - overall_status = "FAIL" - else: - status = result.get("status") - details = result.get("details") - logger.info("Results of test case '%s - %s':\n%s\n" % - (test_name, test_descr, result)) - - if status == "FAIL": - overall_status = "FAIL" - - if args.report: - push_results( - test_name_db, start_time, end_time, status, details) - - if overall_status == "FAIL": - sys.exit(-1) - - sys.exit(0) - - -if __name__ == '__main__': - main() diff --git a/test/functest/tempest.py b/test/functest/tempest.py deleted file mode 100644 index 9797ced..0000000 --- a/test/functest/tempest.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# -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() - -COMMON_CONFIG = sdnvpn_config.CommonConfig() - -SUCCESS_CRITERIA = ft_utils.get_parameter_from_yaml( - "testcases.testcase_1.succes_criteria", COMMON_CONFIG.config_file) - - -def main(): - src_tempest_dir = ft_utils.get_deployment_dir() - if not src_tempest_dir: - logger.error("Rally deployment not found.") - exit(-1) - - src_tempest_conf = src_tempest_dir + '/tempest.conf' - bgpvpn_tempest_conf = src_tempest_dir + '/bgpvpn_tempest.conf' - - if not os.path.isfile(src_tempest_conf): - logger.error("tempest.conf not found in %s." % src_tempest_conf) - exit(-1) - shutil.copy(src_tempest_conf, bgpvpn_tempest_conf) - - logger.info("Copying tempest.conf to %s." % bgpvpn_tempest_conf) - config = ConfigParser.RawConfigParser() - 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 tempest_conf: - config.write(tempest_conf) - - cmd_line = (src_tempest_dir + - "/run_tempest.sh -C %s -t -N -- " - "networking_bgpvpn_tempest" % bgpvpn_tempest_conf) - logger.info("Executing: %s" % cmd_line) - cmd = os.popen(cmd_line) - output = cmd.read() - logger.debug(output) - # Results parsing - error_logs = "" - duration = 0 - failed = 0 - try: - # Look For errors - error_logs = "" - for match in re.findall('(.*?)[. ]*FAILED', output): - error_logs += match - # look for duration - m = re.search('tests in(.*)sec', output) - duration = m.group(1) - # Look for num tests run - m = re.search('Ran:(.*)tests', output) - num_tests = m.group(1) - # Look for tests failed - m = re.search('Failed:(.*)', output) - failed = m.group(1) - # Look for name of the tests - testcases = re.findall("\{0\} (.*)", output) - - results = {"duration": duration, - "num_tests": num_tests, "failed": failed, - "tests": testcases} - status = "PASS" - if 100 - (100 * int(failed) / int(num_tests)) < int(SUCCESS_CRITERIA): - status = "FAILED" - return {"status": status, "details": results} - except: - logger.error("Problem when parsing the results.") - - -if __name__ == '__main__': - main() diff --git a/test/functest/tempest_blacklist.txt b/test/functest/tempest_blacklist.txt deleted file mode 100644 index 2e7ac55..0000000 --- a/test/functest/tempest_blacklist.txt +++ /dev/null @@ -1,9 +0,0 @@ -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f,smoke] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f,smoke] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f,smoke] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f,smoke] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard[id-2cb1baf6-ac8d-4429-bf0d-ba8a0ba53e32,smoke] -tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops[compute,id-f323b3ba-82f8-4db7-8ea6-6a895869ec49,network,smoke] -tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops[compute,id-7fff3fb3-91d8-4fd0-bd7d-0204f1f180ba,network,smoke] -tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern[compute,id-557cd2c2-4eb8-4dce-98be-f86765ff311b,image,smoke,volume] -tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern[compute,id-557cd2c2-4eb8-4dce-98be-f86765ff311b,image,smoke,volume]
\ No newline at end of file diff --git a/test/functest/testcase_1.py b/test/functest/testcase_1.py deleted file mode 100644 index 143945d..0000000 --- a/test/functest/testcase_1.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# - -import argparse -from random import randint - -import functest.utils.functest_logger as ft_logger -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() - -parser.add_argument("-r", "--report", - help="Create json result file", - action="store_true") - -args = parser.parse_args() - -logger = ft_logger.Logger("sdnvpn-testcase-1").getLogger() - -COMMON_CONFIG = sdnvpn_config.CommonConfig() -TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_1') - - -def main(): - results = Results(COMMON_CONFIG.line_length) - - results.add_to_summary(0, "=") - results.add_to_summary(2, "STATUS", "SUBTEST") - results.add_to_summary(0, "=") - - nova_client = os_utils.get_nova_client() - neutron_client = os_utils.get_neutron_client() - glance_client = os_utils.get_glance_client() - - image_id = os_utils.create_glance_image(glance_client, - 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, - TESTCASE_CONFIG.net_1_name) - test_utils.create_subnet(neutron_client, - TESTCASE_CONFIG.subnet_1_name, - TESTCASE_CONFIG.subnet_1_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_2_name, - TESTCASE_CONFIG.subnet_2_cidr, - network_2_id) - - sg_id = os_utils.create_security_group_full(neutron_client, - 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, - 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] - - 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] - - 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] - - # 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, - 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] - - # We boot VM1 at the end because we need to get the IPs first to generate - # the userdata - u1 = test_utils.generate_ping_userdata([vm_2_ip, - vm_3_ip, - vm_4_ip, - vm_5_ip]) - 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) - - msg = ("Create VPN with eRT<>iRT") - results.record_action(msg) - vpn_name = "sdnvpn-" + str(randint(100000, 999999)) - 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." % TESTCASE_CONFIG.net_1_name) - results.record_action(msg) - results.add_to_summary(0, "-") - - os_utils.create_network_association( - neutron_client, bgpvpn_id, network_1_id) - - # Wait for VMs to get ips. - instances_up = test_utils.wait_for_instances_up(vm_1, vm_2, - vm_3, vm_4, - vm_5) - - if not instances_up: - logger.error("One or more instances is down") - # TODO: Handle this appropriately - - results.get_ping_status(vm_1, vm_2, expected="PASS", timeout=200) - results.get_ping_status(vm_1, vm_3, expected="PASS", timeout=30) - results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30) - - msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_2_name) - results.add_to_summary(0, "-") - results.record_action(msg) - results.add_to_summary(0, "-") - os_utils.create_network_association( - neutron_client, bgpvpn_id, network_2_id) - - test_utils.wait_for_bgp_net_assocs(neutron_client, - bgpvpn_id, - network_1_id, - network_2_id) - - logger.info("Waiting for the VMs to connect to each other using the" - " updated network configuration") - test_utils.wait_before_subtest() - - results.get_ping_status(vm_4, vm_5, expected="PASS", timeout=30) - results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30) - results.get_ping_status(vm_1, vm_5, expected="FAIL", timeout=30) - - msg = ("Update VPN with eRT=iRT ...") - results.add_to_summary(0, "-") - results.record_action(msg) - results.add_to_summary(0, "-") - 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") - test_utils.wait_before_subtest() - - results.get_ping_status(vm_1, vm_4, expected="PASS", timeout=30) - results.get_ping_status(vm_1, vm_5, expected="PASS", timeout=30) - - return results.compile_summary(TESTCASE_CONFIG.success_criteria) - - -if __name__ == '__main__': - main() diff --git a/test/functest/testcase_2.py b/test/functest/testcase_2.py deleted file mode 100644 index 2875c5f..0000000 --- a/test/functest/testcase_2.py +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# - -import argparse -from random import randint -import sys - -import functest.utils.functest_logger as ft_logger -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() - -parser.add_argument("-r", "--report", - help="Create json result file", - action="store_true") - -args = parser.parse_args() - -logger = ft_logger.Logger("sdnvpn-testcase-2").getLogger() - -COMMON_CONFIG = sdnvpn_config.CommonConfig() -TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_2') - - -def main(): - results = Results(COMMON_CONFIG.line_length) - - results.add_to_summary(0, "=") - results.add_to_summary(2, "STATUS", "SUBTEST") - results.add_to_summary(0, "=") - - nova_client = os_utils.get_nova_client() - neutron_client = os_utils.get_neutron_client() - glance_client = os_utils.get_glance_client() - - 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, - 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, - 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, - 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 - userdata_common = test_utils.generate_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_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_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) - - # We boot vm5 first because we need vm5_ip for vm4 userdata - u4 = test_utils.generate_userdata_with_ssh( - [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) - - # 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( - [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) - - msg = ("Create VPN1 with eRT=iRT") - results.record_action(msg) - vpn1_name = "sdnvpn-1-" + str(randint(100000, 999999)) - 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." % TESTCASE_CONFIG.net_1_name) - results.record_action(msg) - results.add_to_summary(0, "-") - - os_utils.create_network_association( - neutron_client, bgpvpn1_id, network_1_id) - - # Wait for VMs to get ips. - instances_up = test_utils.wait_for_instances_up(vm_1, vm_2, - vm_3, vm_4, - vm_5) - - if not instances_up: - logger.error("One or more instances is down") - sys.exit(-1) - - logger.info("Waiting for the VMs to connect to each other using the" - " updated network configuration") - test_utils.wait_before_subtest() - - # 10.10.10.12 should return sdnvpn-2 to sdnvpn-1 - results.check_ssh_output(vm_1, vm_2, - 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_3, - expected=TESTCASE_CONFIG.instance_3_name, - timeout=30) - - results.add_to_summary(0, "-") - msg = ("Create VPN2 with eRT=iRT") - results.record_action(msg) - vpn2_name = "sdnvpn-2-" + str(randint(100000, 999999)) - 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." % TESTCASE_CONFIG.net_2_name) - results.record_action(msg) - results.add_to_summary(0, "-") - - os_utils.create_network_association( - neutron_client, bgpvpn2_id, network_2_id) - - test_utils.wait_for_bgp_net_assoc(neutron_client, bgpvpn1_id, network_1_id) - test_utils.wait_for_bgp_net_assoc(neutron_client, bgpvpn2_id, network_2_id) - - logger.info("Waiting for the VMs to connect to each other using the" - " updated network configuration") - test_utils.wait_before_subtest() - - # 10.10.11.13 should return sdnvpn-5 to sdnvpn-4 - results.check_ssh_output(vm_4, vm_5, - 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_1, - expected="not reachable", - timeout=30) - - return results.compile_summary(TESTCASE_CONFIG.success_criteria) - - -if __name__ == '__main__': - main() diff --git a/test/functest/testcase_3.py b/test/functest/testcase_3.py deleted file mode 100644 index 5a8e9b0..0000000 --- a/test/functest/testcase_3.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# - - -def main(): - pass - - -if __name__ == '__main__': - main() diff --git a/test/functest/testcase_4.py b/test/functest/testcase_4.py deleted file mode 100644 index 61d8c97..0000000 --- a/test/functest/testcase_4.py +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# - -import argparse -from random import randint - -import functest.utils.functest_logger as ft_logger -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() - -parser.add_argument("-r", "--report", - help="Create json result file", - action="store_true") - -args = parser.parse_args() - -logger = ft_logger.Logger("sdnvpn-testcase-4").getLogger() - -COMMON_CONFIG = sdnvpn_config.CommonConfig() -TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_4') - - -def main(): - results = Results(COMMON_CONFIG.line_length) - - results.add_to_summary(0, "=") - results.add_to_summary(2, "STATUS", "SUBTEST") - results.add_to_summary(0, "=") - - nova_client = os_utils.get_nova_client() - neutron_client = os_utils.get_neutron_client() - glance_client = os_utils.get_glance_client() - - image_id = os_utils.create_glance_image(glance_client, - 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, - 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, - 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, - 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] - - 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] - - 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] - - # 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, - 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] - - # We boot VM1 at the end because we need to get the IPs first to generate - # the userdata - u1 = test_utils.generate_ping_userdata([vm_2_ip, - vm_3_ip, - vm_4_ip, - vm_5_ip]) - 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) - - msg = ("Create VPN with eRT<>iRT") - results.record_action(msg) - vpn_name = "sdnvpn-" + str(randint(100000, 999999)) - 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." % TESTCASE_CONFIG.router_1_name) - results.record_action(msg) - results.add_to_summary(0, "-") - - os_utils.create_router_association( - neutron_client, bgpvpn_id, router_1_id) - - # Wait for VMs to get ips. - instances_up = test_utils.wait_for_instances_up(vm_1, vm_2, - vm_3, vm_4, - vm_5) - - if not instances_up: - logger.error("One or more instances is down") - # TODO Handle appropriately - - results.get_ping_status(vm_1, vm_2, expected="PASS", timeout=200) - results.get_ping_status(vm_1, vm_3, expected="PASS", timeout=30) - results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30) - - msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_2_name) - results.add_to_summary(0, "-") - results.record_action(msg) - results.add_to_summary(0, "-") - os_utils.create_network_association( - neutron_client, bgpvpn_id, network_2_id) - - test_utils.wait_for_bgp_router_assoc( - neutron_client, bgpvpn_id, router_1_id) - test_utils.wait_for_bgp_net_assoc( - neutron_client, bgpvpn_id, network_2_id) - - logger.info("Waiting for the VMs to connect to each other using the" - " updated network configuration") - test_utils.wait_before_subtest() - - results.get_ping_status(vm_4, vm_5, expected="PASS", timeout=30) - results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30) - results.get_ping_status(vm_1, vm_5, expected="FAIL", timeout=30) - - msg = ("Update VPN with eRT=iRT ...") - results.add_to_summary(0, "-") - results.record_action(msg) - results.add_to_summary(0, "-") - 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") - test_utils.wait_before_subtest() - - results.get_ping_status(vm_1, vm_4, expected="PASS", timeout=30) - results.get_ping_status(vm_1, vm_5, expected="PASS", timeout=30) - - results.add_to_summary(0, "=") - logger.info("\n%s" % results.summary) - - return results.compile_summary(TESTCASE_CONFIG.success_criteria) - - -if __name__ == '__main__': - main() diff --git a/test/functest/testcase_7.py b/test/functest/testcase_7.py deleted file mode 100644 index 0e4a913..0000000 --- a/test/functest/testcase_7.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -""" -Testcase for router/FloatingIP & net assoc mutual exclusivity - -A testcase for ODL Bug 6962, testing whether a subnet with a router can be -network associated: -- Create two VMs, each in a subnet with a router -- Network assoc the two networks in a VPN iRT=eRT -- Try to ping from one VM to the other -- Assign a floating IP to a VM -- Ping it -""" -import argparse - -import functest.utils.functest_logger as ft_logger -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() - -parser.add_argument("-r", "--report", - help="Create json result file", - action="store_true") - -args = parser.parse_args() - -logger = ft_logger.Logger("sdnvpn-testcase-7").getLogger() - -COMMON_CONFIG = sdnvpn_config.CommonConfig() -TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig('testcase_7') - - -def main(): - results = Results(COMMON_CONFIG.line_length) - - results.add_to_summary(0, "=") - results.add_to_summary(2, "STATUS", "SUBTEST") - results.add_to_summary(0, "=") - - nova_client = os_utils.get_nova_client() - neutron_client = os_utils.get_neutron_client() - glance_client = os_utils.get_glance_client() - - image_id = os_utils.create_glance_image(glance_client, - 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, - 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_network( - neutron_client, - TESTCASE_CONFIG.net_2_name, - TESTCASE_CONFIG.subnet_2_name, - TESTCASE_CONFIG.subnet_2_cidr, - TESTCASE_CONFIG.router_2_name) - - sg_id = os_utils.create_security_group_full(neutron_client, - TESTCASE_CONFIG.secgroup_name, - TESTCASE_CONFIG.secgroup_descr) - test_utils.open_icmp_ssh(neutron_client, sg_id) - vm_2 = test_utils.create_instance( - nova_client, - TESTCASE_CONFIG.instance_2_name, - image_id, - network_2_id, - sg_id, - secgroup_name=TESTCASE_CONFIG.secgroup_name) - vm_2_ip = vm_2.networks.itervalues().next()[0] - - u1 = test_utils.generate_ping_userdata([vm_2_ip]) - 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, - userdata=u1) - - msg = ("Create VPN with eRT==iRT") - results.record_action(msg) - vpn_name = "sdnvpn-7" - kwargs = {"import_targets": TESTCASE_CONFIG.targets, - "export_targets": TESTCASE_CONFIG.targets, - "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 networks '%s', '%s' to the VPN." - % (TESTCASE_CONFIG.net_1_name, - TESTCASE_CONFIG.net_2_name)) - results.record_action(msg) - results.add_to_summary(0, "-") - - os_utils.create_network_association( - neutron_client, bgpvpn_id, network_1_id) - os_utils.create_network_association( - neutron_client, bgpvpn_id, network_2_id) - - test_utils.wait_for_bgp_net_assoc( - neutron_client, bgpvpn_id, network_1_id) - test_utils.wait_for_bgp_net_assoc( - neutron_client, bgpvpn_id, network_2_id) - - instances_up = test_utils.wait_for_instances_up(vm_1, vm_2) - if not instances_up: - logger.error("One or more instances is down") - - logger.info("Waiting for the VMs to connect to each other using the" - " updated network configuration") - test_utils.wait_before_subtest() - - results.get_ping_status(vm_1, vm_2, expected="PASS", timeout=200) - results.add_to_summary(0, "=") - - msg = "Assign a Floating IP to %s" % vm_2.name - results.record_action(msg) - - fip = os_utils.create_floating_ip(neutron_client) - fip_added = os_utils.add_floating_ip(nova_client, vm_2.id, fip['fip_addr']) - if fip_added: - results.add_success(msg) - else: - results.add_failure(msg) - - msg = "Ping %s via Floating IP" % vm_2.name - results.record_action(msg) - results.add_to_summary(0, "-") - results.ping_ip_test(fip['fip_addr']) - - return results.compile_summary(TESTCASE_CONFIG.success_criteria) - -if __name__ == '__main__': - main() diff --git a/test/functest/utils.py b/test/functest/utils.py deleted file mode 100644 index cbfc88d..0000000 --- a/test/functest/utils.py +++ /dev/null @@ -1,303 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -import sys -import time - -import functest.utils.functest_logger as ft_logger -import functest.utils.openstack_utils as os_utils -import re - -import config as sdnvpn_config - -logger = ft_logger.Logger("sndvpn_test_utils").getLogger() - -common_config = sdnvpn_config.CommonConfig() - - -def create_net(neutron_client, name): - logger.debug("Creating network %s", name) - net_id = os_utils.create_neutron_net(neutron_client, name) - if not net_id: - logger.error( - "There has been a problem when creating the neutron network") - sys.exit(-1) - return net_id - - -def create_subnet(neutron_client, name, cidr, net_id): - logger.debug("Creating subnet %s in network %s with cidr %s", - name, net_id, cidr) - subnet_id = os_utils.create_neutron_subnet(neutron_client, - name, - cidr, - net_id) - if not subnet_id: - logger.error( - "There has been a problem when creating the neutron subnet") - sys.exit(-1) - return subnet_id - - -def create_network(neutron_client, net, subnet1, cidr1, - router, subnet2=None, cidr2=None): - """Network assoc will not work for networks/subnets created by this function. - - It is an ODL limitation due to it handling routers as vpns. - See https://bugs.opendaylight.org/show_bug.cgi?id=6962""" - network_dic = os_utils.create_network_full(neutron_client, - net, - subnet1, - router, - cidr1) - if not network_dic: - logger.error( - "There has been a problem when creating the neutron network") - sys.exit(-1) - net_id = network_dic["net_id"] - subnet_id = network_dic["subnet_id"] - router_id = network_dic["router_id"] - - if subnet2 is not None: - logger.debug("Creating and attaching a second subnet...") - subnet_id = os_utils.create_neutron_subnet( - neutron_client, subnet2, cidr2, net_id) - if not subnet_id: - logger.error( - "There has been a problem when creating the second subnet") - sys.exit(-1) - logger.debug("Subnet '%s' created successfully" % subnet_id) - return net_id, subnet_id, router_id - - -def create_instance(nova_client, - name, - image_id, - network_id, - sg_id, - secgroup_name=None, - fixed_ip=None, - compute_node='', - userdata=None, - files=None, - **kwargs - ): - if 'flavor' not in kwargs: - kwargs['flavor'] = common_config.default_flavor - - logger.info("Creating instance '%s'..." % name) - logger.debug( - "Configuration:\n name=%s \n flavor=%s \n image=%s \n" - " network=%s\n secgroup=%s \n hypervisor=%s \n" - " fixed_ip=%s\n files=%s\n userdata=\n%s\n" - % (name, kwargs['flavor'], image_id, network_id, sg_id, - compute_node, fixed_ip, files, userdata)) - instance = os_utils.create_instance_and_wait_for_active( - kwargs['flavor'], - image_id, - network_id, - name, - config_drive=True, - userdata=userdata, - av_zone=compute_node, - fixed_ip=fixed_ip, - files=files) - - 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] - - if secgroup_name: - logger.debug("Adding '%s' to security group '%s'..." - % (name, secgroup_name)) - else: - logger.debug("Adding '%s' to security group '%s'..." - % (name, sg_id)) - os_utils.add_secgroup_to_instance(nova_client, instance.id, sg_id) - - return instance - - -def generate_ping_userdata(ips_array): - ips = "" - for ip in ips_array: - ips = ("%s %s" % (ips, ip)) - - ips = ips.replace(' ', ' ') - return ("#!/bin/sh\n" - "set%s\n" - "while true; do\n" - " for i do\n" - " ip=$i\n" - " ping -c 1 $ip 2>&1 >/dev/null\n" - " RES=$?\n" - " if [ \"Z$RES\" = \"Z0\" ] ; then\n" - " echo ping $ip OK\n" - " else echo ping $ip KO\n" - " fi\n" - " done\n" - " sleep 1\n" - "done\n" - % ips) - - -def generate_userdata_common(): - return ("#!/bin/sh\n" - "sudo mkdir -p /home/cirros/.ssh/\n" - "sudo chown cirros:cirros /home/cirros/.ssh/\n" - "sudo chown cirros:cirros /home/cirros/id_rsa\n" - "mv /home/cirros/id_rsa /home/cirros/.ssh/\n" - "sudo echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgnWtSS98Am516e" - "stBsq0jbyOB4eLMUYDdgzsUHsnxFQCtACwwAg9/2uq3FoGUBUWeHZNsT6jcK9" - "sCMEYiS479CUCzbrxcd8XaIlK38HECcDVglgBNwNzX/WDfMejXpKzZG61s98rU" - "ElNvZ0YDqhaqZGqxIV4ejalqLjYrQkoly3R+2k= " - "cirros@test1>/home/cirros/.ssh/authorized_keys\n" - "sudo chown cirros:cirros /home/cirros/.ssh/authorized_keys\n" - "chmod 700 /home/cirros/.ssh\n" - "chmod 644 /home/cirros/.ssh/authorized_keys\n" - "chmod 600 /home/cirros/.ssh/id_rsa\n" - ) - - -def generate_userdata_with_ssh(ips_array): - u1 = generate_userdata_common() - - ips = "" - for ip in ips_array: - ips = ("%s %s" % (ips, ip)) - - ips = ips.replace(' ', ' ') - u2 = ("#!/bin/sh\n" - "set%s\n" - "while true; do\n" - " for i do\n" - " ip=$i\n" - " hostname=$(ssh -y -i /home/cirros/.ssh/id_rsa " - "cirros@$ip 'hostname' </dev/zero 2>/dev/null)\n" - " RES=$?\n" - " if [ \"Z$RES\" = \"Z0\" ]; then echo $ip $hostname;\n" - " else echo $ip 'not reachable';fi;\n" - " done\n" - " sleep 1\n" - "done\n" - % ips) - return (u1 + u2) - - -def wait_for_instance(instance): - logger.info("Waiting for instance %s to get a DHCP lease..." % instance.id) - # The sleep this function replaced waited for 80s - tries = 40 - sleep_time = 2 - pattern = "Lease of .* obtained, lease time" - expected_regex = re.compile(pattern) - console_log = "" - while tries > 0 and not expected_regex.search(console_log): - console_log = instance.get_console_output() - time.sleep(sleep_time) - tries -= 1 - - if not expected_regex.search(console_log): - logger.error("Instance %s seems to have failed leasing an IP." - % instance.id) - return False - return True - - -def wait_for_instances_up(*args): - check = [wait_for_instance(instance) for instance in args] - return all(check) - - -def wait_for_bgp_net_assoc(neutron_client, bgpvpn_id, net_id): - tries = 30 - sleep_time = 1 - nets = [] - logger.debug("Waiting for network %s to associate with BGPVPN %s " - % (bgpvpn_id, net_id)) - - while tries > 0 and net_id not in nets: - nets = os_utils.get_bgpvpn_networks(neutron_client, bgpvpn_id) - time.sleep(sleep_time) - tries -= 1 - if net_id not in nets: - logger.error("Association of network %s with BGPVPN %s failed" % - (net_id, bgpvpn_id)) - return False - return True - - -def wait_for_bgp_net_assocs(neutron_client, bgpvpn_id, *args): - check = [wait_for_bgp_net_assoc(neutron_client, bgpvpn_id, id) - for id in args] - # Return True if all associations succeeded - return all(check) - - -def wait_for_bgp_router_assoc(neutron_client, bgpvpn_id, router_id): - tries = 30 - sleep_time = 1 - routers = [] - logger.debug("Waiting for router %s to associate with BGPVPN %s " - % (bgpvpn_id, router_id)) - while tries > 0 and router_id not in routers: - routers = os_utils.get_bgpvpn_routers(neutron_client, bgpvpn_id) - time.sleep(sleep_time) - tries -= 1 - if router_id not in routers: - logger.error("Association of router %s with BGPVPN %s failed" % - (router_id, bgpvpn_id)) - return False - return True - - -def wait_for_bgp_router_assocs(neutron_client, bgpvpn_id, *args): - check = [wait_for_bgp_router_assoc(neutron_client, bgpvpn_id, id) - 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 - - -def open_icmp_ssh(neutron_client, security_group_id): - os_utils.create_secgroup_rule(neutron_client, - security_group_id, - 'ingress', - 'icmp') - os_utils.create_secgroup_rule(neutron_client, - security_group_id, - 'tcp', - 80, 80) |