diff options
-rw-r--r-- | ci/config_functest.yaml | 1 | ||||
-rw-r--r-- | ci/config_patch.yaml | 10 | ||||
-rwxr-xr-x | ci/exec_test.sh | 7 | ||||
-rwxr-xr-x | ci/prepare_env.py | 24 | ||||
-rw-r--r-- | ci/testcases.yaml | 2 | ||||
-rw-r--r-- | docker/Dockerfile | 3 | ||||
-rwxr-xr-x | testcases/OpenStack/healthcheck/healthcheck.sh | 5 | ||||
-rwxr-xr-x | testcases/OpenStack/rally/run_rally-cert.py | 3 | ||||
-rwxr-xr-x | testcases/OpenStack/tempest/gen_tempest_conf.py | 124 | ||||
-rwxr-xr-x | testcases/OpenStack/tempest/run_tempest.py | 100 | ||||
-rwxr-xr-x | testcases/OpenStack/vPing/vPing_ssh.py | 3 | ||||
-rwxr-xr-x | testcases/OpenStack/vPing/vPing_userdata.py | 3 | ||||
-rwxr-xr-x | testcases/features/sfc/correct_classifier.bash | 4 | ||||
-rwxr-xr-x | testcases/features/sfc/set-up-tacker.sh | 6 | ||||
-rwxr-xr-x | testcases/features/sfc/sfc.py | 17 | ||||
-rw-r--r-- | testcases/security_scan/scripts/internet_check.py | 25 | ||||
-rwxr-xr-x | testcases/security_scan/security_scan.py | 52 | ||||
-rw-r--r-- | testcases/vnf/vRNC/parser.py | 23 | ||||
-rw-r--r-- | utils/functest_utils.py | 21 |
19 files changed, 302 insertions, 131 deletions
diff --git a/ci/config_functest.yaml b/ci/config_functest.yaml index 8e45b1d27..afa6ff1f6 100644 --- a/ci/config_functest.yaml +++ b/ci/config_functest.yaml @@ -50,6 +50,7 @@ general: healthcheck: disk_image: /home/opnfv/functest/data/cirros-0.3.4-x86_64-disk.img + disk_format: qcow2 vping: ping_timeout: 200 diff --git a/ci/config_patch.yaml b/ci/config_patch.yaml new file mode 100644 index 000000000..4994d49d1 --- /dev/null +++ b/ci/config_patch.yaml @@ -0,0 +1,10 @@ +lxd: + general: + openstack: + image_name: Cirros-0.3.4 + image_file_name: cirros-0.3.4-x86_64-lxc.tar.gz + image_disk_format: raw + + healthcheck: + disk_image: /home/opnfv/functest/data/cirros-0.3.4-x86_64-lxc.tar.gz + disk_format: raw
\ No newline at end of file diff --git a/ci/exec_test.sh b/ci/exec_test.sh index ddbe486f1..a0c41872d 100755 --- a/ci/exec_test.sh +++ b/ci/exec_test.sh @@ -150,9 +150,10 @@ function run_test(){ ${repos_dir}/moon/tests/run_tests.sh ;; "multisite") - python ${FUNCTEST_REPO_DIR}/testcases/features/multisite.py + python ${FUNCTEST_REPO_DIR}/testcases/OpenStack/tempest/gen_tempest_conf.py python ${FUNCTEST_REPO_DIR}/testcases/OpenStack/tempest/run_tempest.py \ - $clean_flag -s -m feature_multisite $report + $clean_flag -s -m feature_multisite $report \ + -c ${FUNCTEST_REPO_DIR}/testcases/OpenStack/tempest/tempest_multisite.conf ;; "domino") python ${FUNCTEST_REPO_DIR}/testcases/features/domino.py @@ -172,7 +173,7 @@ function run_test(){ python ${FUNCTEST_REPO_DIR}/testcases/features/sfc/sfc.py ;; "parser") - python ${FUNCTEST_REPO_DIR}/testcases/vnf/RNC/parser.py + python ${FUNCTEST_REPO_DIR}/testcases/vnf/vRNC/parser.py $report ;; *) echo "The test case '${test_name}' does not exist." diff --git a/ci/prepare_env.py b/ci/prepare_env.py index e31afd495..116b1a6e2 100755 --- a/ci/prepare_env.py +++ b/ci/prepare_env.py @@ -46,10 +46,16 @@ CI_SCENARIO = "" CI_DEBUG = False REPOS_DIR = os.getenv('repos_dir') FUNCTEST_REPO = REPOS_DIR + '/functest/' +CONFIG_FUNCTEST_PATH = os.environ["CONFIG_FUNCTEST_YAML"] +CONFIG_PATCH_PATH = os.path.join(os.path.dirname( + CONFIG_FUNCTEST_PATH), "config_patch.yaml") -with open(os.environ["CONFIG_FUNCTEST_YAML"]) as f: +with open(CONFIG_FUNCTEST_PATH) as f: functest_yaml = yaml.safe_load(f) +with open(CONFIG_PATCH_PATH) as f: + functest_patch_yaml = yaml.safe_load(f) + FUNCTEST_CONF_DIR = functest_yaml.get("general").get( "directories").get("dir_functest_conf") @@ -183,6 +189,21 @@ def source_rc_file(): logger.debug("Used credentials: %s" % str) +def patch_config_file(): + updated = False + for key in functest_patch_yaml: + if key in CI_SCENARIO: + new_functest_yaml = dict(ft_utils.merge_dicts( + functest_yaml, functest_patch_yaml[key])) + updated = True + + if updated: + os.remove(CONFIG_FUNCTEST_PATH) + with open(CONFIG_FUNCTEST_PATH, "w") as f: + f.write(yaml.dump(new_functest_yaml, default_style='"')) + f.close() + + def verify_deployment(): print_separator() logger.info("Verifying OpenStack services...") @@ -262,6 +283,7 @@ def main(): check_env_variables() create_directories() source_rc_file() + patch_config_file() verify_deployment() install_rally() diff --git a/ci/testcases.yaml b/ci/testcases.yaml index 9109cd1d2..ca0273c27 100644 --- a/ci/testcases.yaml +++ b/ci/testcases.yaml @@ -47,7 +47,7 @@ tiers: 2) Connectivity between 2 instances over a private network. dependencies: installer: '' - scenario: '' + scenario: '^((?!lxd).)*$' - name: tempest_smoke_serial diff --git a/docker/Dockerfile b/docker/Dockerfile index 9e4697897..04ebf2c6d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -60,9 +60,11 @@ crudini \ ruby1.9.1-dev \ --no-install-recommends +RUN pip install --upgrade pip RUN mkdir -p ${repos_dir} RUN mkdir -p /home/opnfv/functest/results +RUN mkdir -p /home/opnfv/functest/conf RUN mkdir -p /root/.ssh RUN chmod 700 /root/.ssh @@ -93,6 +95,7 @@ RUN /bin/bash ${repos_dir}/parser/tests/parser_install.sh ${repos_dir} RUN ${repos_dir}/rally/install_rally.sh --yes ADD http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img /home/opnfv/functest/data/ +ADD http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-lxc.tar.gz /home/opnfv/functest/data/ ADD http://205.177.226.237:9999/onosfw/firewall_block_image.img /home/opnfv/functest/data/ RUN gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 diff --git a/testcases/OpenStack/healthcheck/healthcheck.sh b/testcases/OpenStack/healthcheck/healthcheck.sh index 2449ac93b..996aadcf7 100755 --- a/testcases/OpenStack/healthcheck/healthcheck.sh +++ b/testcases/OpenStack/healthcheck/healthcheck.sh @@ -120,6 +120,7 @@ info "...Keystone OK!" info "Testing Glance API..." ################################# disk_img=$(cat ${YAML_FILE} | shyaml get-value healthcheck.disk_image 2> /dev/null || true) +disk_format=$(cat ${YAML_FILE} | shyaml get-value healthcheck.disk_format 2> /dev/null || true) kernel_img=$(cat ${YAML_FILE} | shyaml get-value healthcheck.kernel_image 2> /dev/null || true) ramdisk_img=$(cat ${YAML_FILE} | shyaml get-value healthcheck.ramdisk_image 2> /dev/null || true) extra_properties=$(cat ${YAML_FILE} | shyaml get-value healthcheck.extra_properties 2> /dev/null || true) @@ -151,10 +152,10 @@ fi debug "image extra_properties=${extra_properties}" -eval glance image-create --name ${image_1} --disk-format qcow2 --container-format bare \ +eval glance image-create --name ${image_1} --disk-format ${disk_format} --container-format bare \ ${extra_opts} < ${disk_img} debug "image '${image_1}' created." -eval glance image-create --name ${image_2} --disk-format qcow2 --container-format bare \ +eval glance image-create --name ${image_2} --disk-format ${disk_format} --container-format bare \ ${extra_opts} < ${disk_img} debug "image '${image_2}' created." info "... Glance OK!" diff --git a/testcases/OpenStack/rally/run_rally-cert.py b/testcases/OpenStack/rally/run_rally-cert.py index 1f1214e03..92dbddff6 100755 --- a/testcases/OpenStack/rally/run_rally-cert.py +++ b/testcases/OpenStack/rally/run_rally-cert.py @@ -410,7 +410,8 @@ def main(): GLANCE_IMAGE_PATH)) image_id = os_utils.create_glance_image(glance_client, GLANCE_IMAGE_NAME, - GLANCE_IMAGE_PATH) + GLANCE_IMAGE_PATH, + GLANCE_IMAGE_FORMAT) if not image_id: logger.error("Failed to create the Glance image...") exit(-1) diff --git a/testcases/OpenStack/tempest/gen_tempest_conf.py b/testcases/OpenStack/tempest/gen_tempest_conf.py new file mode 100755 index 000000000..4aa814a51 --- /dev/null +++ b/testcases/OpenStack/tempest/gen_tempest_conf.py @@ -0,0 +1,124 @@ +#!/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 +# +# Execute Multisite Tempest test cases +## + +import ConfigParser +import os +import re +import shutil +import functest.utils.functest_utils as ft_utils +import functest.utils.functest_logger as ft_logger +from run_tempest import configure_tempest +from run_tempest import TEMPEST_RESULTS_DIR + +logger = ft_logger.Logger("multisite").getLogger() + + +def configure_tempest_multisite(deployment_dir): + """ + Add/update needed parameters into tempest.conf file generated by Rally + """ + logger.debug("configure the tempest") + configure_tempest(deployment_dir) + + logger.debug("Finding tempest.conf file...") + tempest_conf_file = deployment_dir + "/tempest.conf" + if not os.path.isfile(tempest_conf_file): + logger.error("Tempest configuration file %s NOT found." + % tempest_conf_file) + exit(-1) + + # Copy tempest.conf to /home/opnfv/functest/results/tempest/ + cur_path = os.path.split(os.path.realpath(__file__))[0] + shutil.copyfile(tempest_conf_file, cur_path + '/tempest_multisite.conf') + tempest_conf_file = cur_path + "/tempest_multisite.conf" + + logger.debug("Updating selected tempest.conf parameters...") + config = ConfigParser.RawConfigParser() + config.read(tempest_conf_file) + + config.set('service_available', 'kingbird', 'true') + cmd = "openstack endpoint show kingbird | grep publicurl |\ + awk '{print $4}' | awk -F '/' '{print $4}'" + kingbird_api_version = os.popen(cmd).read() + if os.environ.get("INSTALLER_TYPE") == 'fuel': + # For MOS based setup, the service is accessible + # via bind host + kingbird_conf_path = "/etc/kingbird/kingbird.conf" + installer_type = os.getenv('INSTALLER_TYPE', 'Unknown') + installer_ip = os.getenv('INSTALLER_IP', 'Unknown') + installer_username = ft_utils.get_parameter_from_yaml( + "multisite." + installer_type + + "_environment.installer_username") + installer_password = ft_utils.get_parameter_from_yaml( + "multisite." + installer_type + + "_environment.installer_password") + + ssh_options = "-o UserKnownHostsFile=/dev/null -o \ + StrictHostKeyChecking=no" + + # Get the controller IP from the fuel node + cmd = 'sshpass -p %s ssh 2>/dev/null %s %s@%s \ + \'fuel node --env 1| grep controller | grep "True\| 1" \ + | awk -F\| "{print \$5}"\'' % (installer_password, + ssh_options, + installer_username, + installer_ip) + multisite_controller_ip = \ + "".join(os.popen(cmd).read().split()) + + # Login to controller and get bind host details + cmd = 'sshpass -p %s ssh 2>/dev/null %s %s@%s "ssh %s \\" \ + grep -e "^bind_" %s \\""' % (installer_password, + ssh_options, + installer_username, + installer_ip, + multisite_controller_ip, + kingbird_conf_path) + bind_details = os.popen(cmd).read() + bind_details = "".join(bind_details.split()) + # Extract port number from the bind details + bind_port = re.findall(r"\D(\d{4})", bind_details)[0] + # Extract ip address from the bind details + bind_host = re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", + bind_details)[0] + kingbird_endpoint_url = "http://" + bind_host + ":" + bind_port + \ + "/" + else: + cmd = "openstack endpoint show kingbird | grep publicurl |\ + awk '{print $4}' | awk -F '/' '{print $3}'" + kingbird_endpoint_url = os.popen(cmd).read() + + try: + config.add_section("kingbird") + except Exception: + logger.info('kingbird section exist') + config.set('kingbird', 'endpoint_type', 'publicURL') + config.set('kingbird', 'TIME_TO_SYNC', '20') + config.set('kingbird', 'endpoint_url', kingbird_endpoint_url) + config.set('kingbird', 'api_version', kingbird_api_version) + with open(tempest_conf_file, 'wb') as config_file: + config.write(config_file) + + return True + + +def main(): + + if not os.path.exists(TEMPEST_RESULTS_DIR): + os.makedirs(TEMPEST_RESULTS_DIR) + + deployment_dir = ft_utils.get_deployment_dir(logger) + configure_tempest_multisite(deployment_dir) + + +if __name__ == '__main__': + main() diff --git a/testcases/OpenStack/tempest/run_tempest.py b/testcases/OpenStack/tempest/run_tempest.py index 845c5883b..5925b5845 100755 --- a/testcases/OpenStack/tempest/run_tempest.py +++ b/testcases/OpenStack/tempest/run_tempest.py @@ -49,6 +49,9 @@ parser.add_argument("-r", "--report", parser.add_argument("-n", "--noclean", help="Don't clean the created resources for this test.", action="store_true") +parser.add_argument("-c", "--conf", + help="User-specified Tempest config file location", + default="") args = parser.parse_args() @@ -165,7 +168,8 @@ def create_tempest_resources(): GLANCE_IMAGE_PATH)) image_id = os_utils.create_glance_image(glance_client, GLANCE_IMAGE_NAME, - GLANCE_IMAGE_PATH) + GLANCE_IMAGE_PATH, + GLANCE_IMAGE_FORMAT) if not image_id: logger.error("Failed to create a Glance image...") exit(-1) @@ -220,89 +224,6 @@ def configure_tempest(deployment_dir): return True -def configure_tempest_feature(deployment_dir, mode): - """Add/update needed parameters into tempest.conf file generated by Rally - - """ - - logger.debug("Finding tempest.conf file...") - tempest_conf_file = deployment_dir + "/tempest.conf" - if not os.path.isfile(tempest_conf_file): - logger.error("Tempest configuration file %s NOT found." - % tempest_conf_file) - exit(-1) - - logger.debug("Updating selected tempest.conf parameters...") - config = ConfigParser.RawConfigParser() - config.read(tempest_conf_file) - if mode == 'feature_multisite': - config.set('service_available', 'kingbird', 'true') - cmd = "openstack endpoint show kingbird | grep publicurl |\ - awk '{print $4}' | awk -F '/' '{print $4}'" - kingbird_api_version = os.popen(cmd).read() - if os.environ.get("INSTALLER_TYPE") == 'fuel': - # For MOS based setup, the service is accessible - # via bind host - kingbird_conf_path = "/etc/kingbird/kingbird.conf" - installer_type = os.getenv('INSTALLER_TYPE', 'Unknown') - installer_ip = os.getenv('INSTALLER_IP', 'Unknown') - installer_username = ft_utils.get_parameter_from_yaml( - "multisite." + installer_type + - "_environment.installer_username") - installer_password = ft_utils.get_parameter_from_yaml( - "multisite." + installer_type + - "_environment.installer_password") - - ssh_options = "-o UserKnownHostsFile=/dev/null -o \ - StrictHostKeyChecking=no" - - # Get the controller IP from the fuel node - cmd = 'sshpass -p %s ssh 2>/dev/null %s %s@%s \ - \'fuel node --env 1| grep controller | grep "True\| 1" \ - | awk -F\| "{print \$5}"\'' % (installer_password, - ssh_options, - installer_username, - installer_ip) - multisite_controller_ip = \ - "".join(os.popen(cmd).read().split()) - - # Login to controller and get bind host details - cmd = 'sshpass -p %s ssh 2>/dev/null %s %s@%s "ssh %s \\" \ - grep -e "^bind_" %s \\""' % (installer_password, - ssh_options, - installer_username, - installer_ip, - multisite_controller_ip, - kingbird_conf_path) - bind_details = os.popen(cmd).read() - bind_details = "".join(bind_details.split()) - # Extract port number from the bind details - bind_port = re.findall(r"\D(\d{4})", bind_details)[0] - # Extract ip address from the bind details - bind_host = re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", - bind_details)[0] - kingbird_endpoint_url = "http://" + bind_host + ":" + bind_port + \ - "/" - else: - cmd = "openstack endpoint show kingbird | grep publicurl |\ - awk '{print $4}' | awk -F '/' '{print $3}'" - kingbird_endpoint_url = os.popen(cmd).read() - try: - config.add_section("kingbird") - except Exception: - logger.info('kingbird section exist') - config.set('kingbird', 'endpoint_type', 'publicURL') - config.set('kingbird', 'TIME_TO_SYNC', '20') - config.set('kingbird', 'endpoint_url', kingbird_endpoint_url) - config.set('kingbird', 'api_version', kingbird_api_version) - with open(tempest_conf_file, 'wb') as config_file: - config.write(config_file) - - # Copy tempest.conf to /home/opnfv/functest/results/tempest/ - shutil.copyfile(tempest_conf_file, TEMPEST_RESULTS_DIR + '/tempest.conf') - return True - - def read_file(filename): with open(filename) as src: return [line.strip() for line in src.readlines()] @@ -500,13 +421,18 @@ def main(): os.makedirs(TEMPEST_RESULTS_DIR) deployment_dir = ft_utils.get_deployment_dir(logger) - configure_tempest(deployment_dir) - configure_tempest_feature(deployment_dir, args.mode) + + if "" == args.conf: + MODE = "" + configure_tempest(deployment_dir) + else: + MODE = " --tempest-config " + args.conf + create_tempest_resources() generate_test_list(deployment_dir, args.mode) apply_tempest_blacklist() - MODE = "--tests-file " + TEMPEST_LIST + MODE += " --tests-file " + TEMPEST_LIST if args.serial: MODE += " --concur 1" diff --git a/testcases/OpenStack/vPing/vPing_ssh.py b/testcases/OpenStack/vPing/vPing_ssh.py index 4aab6195a..810f286f1 100755 --- a/testcases/OpenStack/vPing/vPing_ssh.py +++ b/testcases/OpenStack/vPing/vPing_ssh.py @@ -192,7 +192,8 @@ def main(): GLANCE_IMAGE_PATH)) image_id = os_utils.create_glance_image(glance_client, GLANCE_IMAGE_NAME, - GLANCE_IMAGE_PATH) + GLANCE_IMAGE_PATH, + GLANCE_IMAGE_FORMAT) if not image_id: logger.error("Failed to create a Glance image...") exit(EXIT_CODE) diff --git a/testcases/OpenStack/vPing/vPing_userdata.py b/testcases/OpenStack/vPing/vPing_userdata.py index b6e3fe11a..dd707bc8f 100755 --- a/testcases/OpenStack/vPing/vPing_userdata.py +++ b/testcases/OpenStack/vPing/vPing_userdata.py @@ -192,7 +192,8 @@ def main(): GLANCE_IMAGE_PATH)) image_id = os_utils.create_glance_image(glance_client, GLANCE_IMAGE_NAME, - GLANCE_IMAGE_PATH) + GLANCE_IMAGE_PATH, + GLANCE_IMAGE_FORMAT) if not image_id: logger.error("Failed to create a Glance image...") exit(EXIT_CODE) diff --git a/testcases/features/sfc/correct_classifier.bash b/testcases/features/sfc/correct_classifier.bash index ba34d7fe9..fb08af5c1 100755 --- a/testcases/features/sfc/correct_classifier.bash +++ b/testcases/features/sfc/correct_classifier.bash @@ -4,8 +4,8 @@ #when SFF and classifier are in the same swtich nsp=`ovs-ofctl -O Openflow13 dump-flows br-int table=11 | \ -grep "nsp=" | awk '{print $6}' | awk -F ',' '{print $2}' | \ -awk -F '=' '{print $2}'` +grep "NXM_NX_NSP" | head -1 | cut -d',' -f13 | cut -d':' -f2 \ +| cut -d'-' -f1` ip=`ovs-ofctl -O Openflow13 dump-flows br-int table=11 | \ grep NXM_NX_NSH_C1 | head -1 | cut -d':' -f5 | cut -d'-' -f1` diff --git a/testcases/features/sfc/set-up-tacker.sh b/testcases/features/sfc/set-up-tacker.sh index 577b7d94e..da2cb922e 100755 --- a/testcases/features/sfc/set-up-tacker.sh +++ b/testcases/features/sfc/set-up-tacker.sh @@ -1,8 +1,8 @@ -curl "https://gerrit.opnfv.org/gerrit/gitweb?p=fuel.git;a=blob_plain;f=prototypes/sfc_tacker/poc.tacker-up.sh;hb=ddd4e11bb8bc62b7e8b06d4b44a308293c2c3362" > poc.tacker-up.sh +git_commit=ee3046f24df0bfca7ee15501f6c06ad86dd462c2 +curl "https://gerrit.opnfv.org/gerrit/gitweb?p=fuel.git;a=blob_plain;\ +f=prototypes/sfc_tacker/poc.tacker-up.sh;hb=${git_commit}" > poc.tacker-up.sh bash poc.tacker-up.sh -touch delete.sh - cat <<EOF > delete.sh tacker sfc-classifier-delete red_http tacker sfc-classifier-delete blue_ssh diff --git a/testcases/features/sfc/sfc.py b/testcases/features/sfc/sfc.py index 0073cc92c..bdd279051 100755 --- a/testcases/features/sfc/sfc.py +++ b/testcases/features/sfc/sfc.py @@ -8,7 +8,6 @@ import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils import paramiko - parser = argparse.ArgumentParser() parser.add_argument("-r", "--report", @@ -247,7 +246,7 @@ def main(): ssh.connect(ips[0], username="root", password="opnfv", timeout=2) command = ("nohup python vxlan_tool.py -i eth0 " - "-d forward -v off -f -b 80 &") + "-d forward -v off -b 80 > /dev/null 2>&1 &") (stdin, stdout, stderr) = ssh.exec_command(command) except: logger.debug("Waiting for %s..." % ips[0]) @@ -271,7 +270,7 @@ def main(): ssh.connect(ips[1], username="root", password="opnfv", timeout=2) command = ("nohup python vxlan_tool.py -i eth0 " - "-d forward -v off -f -b 22 &") + "-d forward -v off -b 22 > /dev/null 2>&1 &") (stdin, stdout, stderr) = ssh.exec_command(command) except: logger.debug("Waiting for %s..." % ips[1]) @@ -350,6 +349,18 @@ def main(): TACKER_CHANGECLASSI subprocess.call(tacker_classi, shell=True) + logger.info("Wait for ODL to update the classification rules in OVS") + time.sleep(10) + + # SSH to modify the classification flows in compute + + contr_cmd4 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" + " 'ssh " + ip_compute + " 'bash correct_classifier.bash''") + logger.info("Executing script to modify the classi: '%s'" % contr_cmd4) + process = subprocess.Popen(contr_cmd4, + shell=True, + stdout=subprocess.PIPE) + # SSH TO EXECUTE cmd_client try: diff --git a/testcases/security_scan/scripts/internet_check.py b/testcases/security_scan/scripts/internet_check.py new file mode 100644 index 000000000..1bed50a70 --- /dev/null +++ b/testcases/security_scan/scripts/internet_check.py @@ -0,0 +1,25 @@ +#!/usr/bin/python +# +# Copyright (c) 2016 Red Hat +# Luke Hinds (lhinds@redhat.com) +# 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 +# +# Performs simple connection check, falls to default timeout of 10 seconds + +import socket + +TEST_HOST = "google.com" + + +def is_connected(): + try: + host = socket.gethostbyname(TEST_HOST) + socket.create_connection((host, 80), 2) + return True + except: + return False +print is_connected() diff --git a/testcases/security_scan/security_scan.py b/testcases/security_scan/security_scan.py index d39c29052..36b795431 100755 --- a/testcases/security_scan/security_scan.py +++ b/testcases/security_scan/security_scan.py @@ -73,21 +73,27 @@ def run_tests(host, nodetype): port = cfgparse.get(nodetype, 'port') connect.logger.info("Host: {0} Selected Profile: {1}".format(host, nodetype)) - connect.logger.info("Creating temp file structure..") - createfiles(host, port, user, localkey) - connect.logger.info("Installing OpenSCAP...") - install_pkg(host, port, user, localkey) - connect.logger.info("Running scan...") - run_scanner(host, port, user, localkey, nodetype) - clean = cfgparse.get(nodetype, 'clean') - connect.logger.info("Post installation tasks....") - post_tasks(host, port, user, localkey, nodetype) - if clean: - connect.logger.info("Cleaning down environment....") - connect.logger.info("Removing OpenSCAP....") - removepkg(host, port, user, localkey, nodetype) - connect.logger.info("Deleting tmp file and reports (remote)...") - cleandir(host, port, user, localkey, nodetype) + connect.logger.info("Checking internet for package installation...") + if internet_check(host, nodetype): + connect.logger.info("Internet Connection OK.") + connect.logger.info("Creating temp file structure..") + createfiles(host, port, user, localkey) + connect.logger.info("Installing OpenSCAP...") + install_pkg(host, port, user, localkey) + connect.logger.info("Running scan...") + run_scanner(host, port, user, localkey, nodetype) + clean = cfgparse.get(nodetype, 'clean') + connect.logger.info("Post installation tasks....") + post_tasks(host, port, user, localkey, nodetype) + if clean: + connect.logger.info("Cleaning down environment....") + connect.logger.info("Removing OpenSCAP....") + removepkg(host, port, user, localkey, nodetype) + connect.logger.info("Deleting tmp file and reports (remote)...") + cleandir(host, port, user, localkey, nodetype) + else: + connect.logger.error("Internet timeout. Moving on to next node..") + pass def nova_iterate(): @@ -106,6 +112,22 @@ def nova_iterate(): run_tests(host, nodetype) +def internet_check(host, nodetype): + import connect + user = cfgparse.get(nodetype, 'user') + port = cfgparse.get(nodetype, 'port') + localpath = functest_dir + 'scripts/internet_check.py' + remotepath = '/tmp/internet_check.py' + com = 'python /tmp/internet_check.py' + testconnect = connect.ConnectionManager(host, port, user, localkey, + localpath, remotepath, com) + connectionresult = testconnect.remotescript() + if connectionresult.rstrip() == 'True': + return True + else: + return False + + def createfiles(host, port, user, localkey): import connect global tmpdir diff --git a/testcases/vnf/vRNC/parser.py b/testcases/vnf/vRNC/parser.py index d5d3f78a1..9678591f6 100644 --- a/testcases/vnf/vRNC/parser.py +++ b/testcases/vnf/vRNC/parser.py @@ -17,10 +17,17 @@ import os import time import yaml +import argparse import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as functest_utils +parser = argparse.ArgumentParser() +parser.add_argument("-r", "--report", + help="Create json result file", + action="store_true") +args = parser.parse_args() + with open(os.environ["CONFIG_FUNCTEST_YAML"]) as f: functest_yaml = yaml.safe_load(f) @@ -51,13 +58,15 @@ def main(): status, details) - functest_utils.push_results_to_db(project, - case_name, - logger, - start_time, - stop_time, - status, - details) + if args.report: + logger.debug("Report Parser Results to DB......") + functest_utils.push_results_to_db(project, + case_name, + logger, + start_time, + stop_time, + status, + details) exit(ret) if __name__ == '__main__': diff --git a/utils/functest_utils.py b/utils/functest_utils.py index cb2333d42..d020ebac8 100644 --- a/utils/functest_utils.py +++ b/utils/functest_utils.py @@ -212,10 +212,10 @@ def push_results_to_db(project, case_name, logger, logger.debug(r) return True except Exception, e: - print ("Error [push_results_to_db('%s', '%s', '%s', " + - "'%s', '%s', '%s', '%s', '%s', '%s')]:" % - (url, project, case_name, pod_name, version, - scenario, criteria, build_tag, details)), e + print("Error [push_results_to_db('%s', '%s', '%s', " + + "'%s', '%s', '%s', '%s', '%s', '%s')]:" % + (url, project, case_name, pod_name, version, + scenario, criteria, build_tag, details)), e return False @@ -372,6 +372,19 @@ def check_success_rate(case_name, success_rate): return status +def merge_dicts(dict1, dict2): + for k in set(dict1.keys()).union(dict2.keys()): + if k in dict1 and k in dict2: + if isinstance(dict1[k], dict) and isinstance(dict2[k], dict): + yield (k, dict(merge_dicts(dict1[k], dict2[k]))) + else: + yield (k, dict2[k]) + elif k in dict1: + yield (k, dict1[k]) + else: + yield (k, dict2[k]) + + def check_test_result(test_name, ret, start_time, stop_time): def get_criteria_value(): return get_criteria_by_test(test_name).split('==')[1].strip() |