diff options
Diffstat (limited to 'functest/opnfv_tests/vnf')
-rw-r--r-- | functest/opnfv_tests/vnf/aaa/__init__.py | 0 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/aaa/aaa.py | 70 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/__init__.py | 0 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/cloudify_ims.py | 278 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/opera_ims.py | 155 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/orchestra_ims.py | 157 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py (renamed from functest/opnfv_tests/vnf/ims/orchestrator.py) | 0 | ||||
-rwxr-xr-x | functest/opnfv_tests/vnf/ims/vims.py | 521 |
8 files changed, 660 insertions, 521 deletions
diff --git a/functest/opnfv_tests/vnf/aaa/__init__.py b/functest/opnfv_tests/vnf/aaa/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/functest/opnfv_tests/vnf/aaa/__init__.py diff --git a/functest/opnfv_tests/vnf/aaa/aaa.py b/functest/opnfv_tests/vnf/aaa/aaa.py new file mode 100644 index 00000000..f1c265f4 --- /dev/null +++ b/functest/opnfv_tests/vnf/aaa/aaa.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# 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 argparse + +import functest.core.testcase_base as testcase_base +import functest.core.vnf_base as vnf_base +import functest.utils.functest_logger as ft_logger + + +class AaaVnf(vnf_base.VnfOnBoardingBase): + + logger = ft_logger.Logger("VNF AAA").getLogger() + + def __init__(self): + super(AaaVnf, self).__init__(case="aaa") + + def deploy_orchestrator(self): + self.logger.info("No VNFM needed to deploy a free radius here") + return None + +# TODO see how to use build in exception form releng module + def deploy_vnf(self): + self.logger.info("Freeradius VNF deployment") + # TODO apt-get update + config tuning + deploy_vnf = {} + deploy_vnf['status'] = "PASS" + deploy_vnf['result'] = {} + return deploy_vnf + + def test_vnf(self): + self.logger.info("Run test towards freeradius") + # TODO: once the freeradius is deployed..make some tests + test_vnf = {} + test_vnf['status'] = "PASS" + test_vnf['result'] = {} + return test_vnf + + def main(self, **kwargs): + self.logger.info("AAA VNF onboarding") + self.execute() + if self.criteria is "PASS": + return self.EX_OK + else: + return self.EX_RUN_ERROR + + def run(self): + kwargs = {} + return self.main(**kwargs) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + args = vars(parser.parse_args()) + aaa_vnf = AaaVnf() + try: + result = aaa_vnf.main(**args) + if result != testcase_base.TestcaseBase.EX_OK: + sys.exit(result) + if args['pushtodb']: + sys.exit(aaa_vnf.push_to_db()) + except Exception: + sys.exit(testcase_base.TestcaseBase.EX_RUN_ERROR) diff --git a/functest/opnfv_tests/vnf/ims/__init__.py b/functest/opnfv_tests/vnf/ims/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/__init__.py diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py new file mode 100644 index 00000000..13a5af4f --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# 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 json +import os +import requests +import subprocess +import time + +import functest.core.vnf_base as vnf_base +import functest.utils.functest_logger as ft_logger +import functest.utils.functest_utils as ft_utils +import functest.utils.openstack_utils as os_utils + +from clearwater import Clearwater +from functest.utils.constants import CONST +from orchestrator_cloudify import Orchestrator + + +class ImsVnf(vnf_base.VnfOnBoardingBase): + + def __init__(self, project='functest', case='cloudify_ims', + repo='', cmd=''): + super(ImsVnf, self).__init__(project, case, repo, cmd) + self.logger = ft_logger.Logger("vIMS").getLogger() + self.case_dir = os.path.join(CONST.functest_test, 'vnf/ims/') + self.data_dir = CONST.dir_vIMS_data + self.test_dir = CONST.dir_repo_vims_test + + self.orchestrator = dict( + requirements=CONST.cloudify_requirements, + blueprint=CONST.cloudify_blueprint, + inputs=CONST.cloudify_inputs + ) + + self.vnf = dict( + blueprint=CONST.clearwater_blueprint, + deployment_name=CONST.clearwater_deployment_name, + inputs=CONST.clearwater_inputs, + requirements=CONST.clearwater_requirements + ) + + # vIMS Data directory creation + if not os.path.exists(self.data_dir): + os.makedirs(self.data_dir) + + def deploy_orchestrator(self, **kwargs): + public_auth_url = os_utils.get_endpoint('identity') + + cfy = Orchestrator(self.data_dir, self.orchestrator.inputs) + self.orchestrator.object = cfy + + if 'tenant_name' in self.creds.keys(): + tenant_name = self.creds['tenant_name'] + elif 'project_name' in self.creds.keys(): + tenant_name = self.creds['project_name'] + + cfy.set_credentials(username=self.creds['username'], + password=self.creds['password'], + tenant_name=tenant_name, + auth_url=public_auth_url) + + # orchestrator VM flavor + flavor_id = self.get_flavor("m1.large", self.orchestrator.requirements) + if not flavor_id: + self.logger.info("Available flavors are: ") + self.pMsg(self.nova_client.flavor.list()) + self.step_failure("Failed to find required flavor" + "for this deployment") + cfy.set_flavor_id(flavor_id) + + # orchestrator VM image + if 'os_image' in self.orchestrator.requirements.keys(): + image_id = os_utils.get_image_id( + self.glance_client, self.orchestrator.requirements['os_image']) + if image_id == '': + self.step_failure("Failed to find required OS image" + " for cloudify manager") + else: + self.step_failure("Failed to find required OS image" + " for cloudify manager") + + cfy.set_image_id(image_id) + + ext_net = os_utils.get_external_net(self.neutron_client) + if not ext_net: + self.step_failure("Failed to get external network") + + cfy.set_external_network_name(ext_net) + + ns = ft_utils.get_resolvconf_ns() + if ns: + cfy.set_nameservers(ns) + + if 'compute' in self.nova_client.client.services_url: + cfy.set_nova_url(self.nova_client.client.services_url['compute']) + if self.neutron_client.httpclient.endpoint_url is not None: + cfy.set_neutron_url(self.neutron_client.httpclient.endpoint_url) + + self.logger.info("Prepare virtualenv for cloudify-cli") + cmd = "chmod +x " + self.case_dir + "create_venv.sh" + ft_utils.execute_command(cmd) + time.sleep(3) + cmd = self.case_dir + "create_venv.sh " + self.data_dir + ft_utils.execute_command(cmd) + + cfy.download_manager_blueprint(self.orchestrator.blueprint['url'], + self.orchestrator.blueprint['branch']) + + cfy.deploy_manager() + return {'status': 'PASS', 'result': ''} + + def deploy_vnf(self): + cw = Clearwater(self.vnf.inputs, self.orchestrator.object, self.logger) + self.vnf.object = cw + + self.logger.info("Collect flavor id for all clearwater vm") + flavor_id = self.get_flavor("m1.small", self.vnf.requirements) + if not flavor_id: + self.logger.info("Available flavors are: ") + self.pMsg(self.nova_client.flavor.list()) + self.step_failure("Failed to find required flavor" + " for this deployment") + + cw.set_flavor_id(flavor_id) + + # VMs image + if 'os_image' in self.vnf.requirements.keys(): + image_id = os_utils.get_image_id( + self.glance_client, self.vnf.requirements['os_image']) + if image_id == '': + self.step_failure("Failed to find required OS image" + " for clearwater VMs") + else: + self.step_failure("Failed to find required OS image" + " for clearwater VMs") + + cw.set_image_id(image_id) + + ext_net = os_utils.get_external_net(self.neutron_client) + if not ext_net: + self.step_failure("Failed to get external network") + + cw.set_external_network_name(ext_net) + + cw.deploy_vnf() + return {'status': 'PASS', 'result': ''} + + def test_vnf(self): + script = "source {0}venv_cloudify/bin/activate; " + script += "cd {0}; " + script += "cfy status | grep -Eo \"([0-9]{{1,3}}\.){{3}}[0-9]{{1,3}}\"" + cmd = "/bin/bash -c '" + script.format(self.data_dir) + "'" + + try: + self.logger.debug("Trying to get clearwater manager IP ... ") + mgr_ip = os.popen(cmd).read() + mgr_ip = mgr_ip.splitlines()[0] + except: + self.step_failure("Unable to retrieve the IP of the " + "cloudify manager server !") + + api_url = "http://" + mgr_ip + "/api/v2" + dep_outputs = requests.get(api_url + "/deployments/" + + self.vnf.deployment_name + "/outputs") + dns_ip = dep_outputs.json()['outputs']['dns_ip'] + ellis_ip = dep_outputs.json()['outputs']['ellis_ip'] + + ellis_url = "http://" + ellis_ip + "/" + url = ellis_url + "accounts" + + params = {"password": "functest", + "full_name": "opnfv functest user", + "email": "functest@opnfv.fr", + "signup_code": "secret"} + + rq = requests.post(url, data=params) + i = 20 + while rq.status_code != 201 and i > 0: + rq = requests.post(url, data=params) + i = i - 1 + time.sleep(10) + + if rq.status_code == 201: + url = ellis_url + "session" + rq = requests.post(url, data=params) + cookies = rq.cookies + + url = ellis_url + "accounts/" + params['email'] + "/numbers" + if cookies != "": + rq = requests.post(url, cookies=cookies) + i = 24 + while rq.status_code != 200 and i > 0: + rq = requests.post(url, cookies=cookies) + i = i - 1 + time.sleep(25) + + if rq.status_code != 200: + self.step_failure("Unable to create a number: %s" + % rq.json()['reason']) + + nameservers = ft_utils.get_resolvconf_ns() + resolvconf = "" + for ns in nameservers: + resolvconf += "\nnameserver " + ns + + if dns_ip != "": + script = ('echo -e "nameserver ' + dns_ip + resolvconf + + '" > /etc/resolv.conf; ') + script += 'source /etc/profile.d/rvm.sh; ' + script += 'cd {0}; ' + script += ('rake test[{1}] SIGNUP_CODE="secret"') + + cmd = ("/bin/bash -c '" + + script.format(self.data_dir, self.inputs["public_domain"]) + + "'") + output_file = "output.txt" + f = open(output_file, 'w+') + subprocess.call(cmd, shell=True, stdout=f, + stderr=subprocess.STDOUT) + f.close() + + f = open(output_file, 'r') + result = f.read() + if result != "": + self.logger.debug(result) + + vims_test_result = "" + tempFile = os.path.join(self.test_dir, "temp.json") + try: + self.logger.debug("Trying to load test results") + with open(tempFile) as f: + vims_test_result = json.load(f) + f.close() + except: + self.logger.error("Unable to retrieve test results") + + try: + os.remove(tempFile) + except: + self.logger.error("Deleting file failed") + + if vims_test_result != '': + return {'status': 'PASS', 'result': vims_test_result} + else: + return {'status': 'FAIL', 'result': ''} + + def clean(self): + self.vnf.object.undeploy_vnf() + self.orchestrator.object.undeploy_manager() + super(ImsVnf, self).clean() + + def get_flavor(self, flavor_name, requirements): + try: + flavor_id = os_utils.get_flavor_id(self.nova_client, flavor_name) + if 'ram_min' in requirements.keys(): + flavor_id = os_utils.get_flavor_id_by_ram_range( + self.nova_client, requirements['ram_min'], 7500) + + if flavor_id == '': + self.logger.error( + "Failed to find %s flavor. " + "Try with ram range default requirement !" % flavor_name) + flavor_id = os_utils.get_flavor_id_by_ram_range( + self.nova_client, + 4000, 10000) + return flavor_id + except: + self.logger.error("Flavor '%s' not found." % self.flavor_name) + self.logger.info("Available flavors are: ") + self.pMsg(self.nova_client.flavor.list()) + return None diff --git a/functest/opnfv_tests/vnf/ims/opera_ims.py b/functest/opnfv_tests/vnf/ims/opera_ims.py new file mode 100644 index 00000000..073a56c3 --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/opera_ims.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# 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 json +import os +import requests +import subprocess +import time + +import functest.core.vnf_base as vnf_base +import functest.utils.functest_logger as ft_logger +import functest.utils.functest_utils as ft_utils +from functest.utils.constants import CONST + + +class ImsVnf(vnf_base.VnfOnBoardingBase): + + def __init__(self, project='functest', case='opera_ims', + repo='', cmd=''): + super(ImsVnf, self).__init__(project, case, repo, cmd) + self.logger = ft_logger.Logger("vIMS").getLogger() + self.case_dir = os.path.join(CONST.functest_test, 'vnf/ims/') + self.data_dir = CONST.dir_vIMS_data + self.test_dir = CONST.dir_repo_vims_test + + # vIMS Data directory creation + if not os.path.exists(self.data_dir): + os.makedirs(self.data_dir) + + def deploy_orchestrator(self, **kwargs): + # TODO + # deploy open-O from Functest docker located on the Jumphost + # you have admin rights on OpenStack SUT + # you can cretae a VM, spawn docker on the jumphost + # spawn docker on a VM in the SUT, ..up to you + # + # note: this step can be ignored + # if Open-O is part of the installer + self.logger.info("Deploy orchestrator: OK") + + def deploy_vnf(self): + # TODO + self.logger.info("Deploy VNF: OK") + + def test_vnf(self): + # Adaptations probably needed + # code used for cloudify_ims + # ruby client on jumphost calling the vIMS on the SUT + script = "source {0}venv_cloudify/bin/activate; " + script += "cd {0}; " + script += "cfy status | grep -Eo \"([0-9]{{1,3}}\.){{3}}[0-9]{{1,3}}\"" + cmd = "/bin/bash -c '" + script.format(self.data_dir) + "'" + + try: + self.logger.debug("Trying to get clearwater manager IP ... ") + mgr_ip = os.popen(cmd).read() + mgr_ip = mgr_ip.splitlines()[0] + except: + self.step_failure("Unable to retrieve the IP of the " + "cloudify manager server !") + + api_url = "http://" + mgr_ip + "/api/v2" + dep_outputs = requests.get(api_url + "/deployments/" + + self.vnf.deployment_name + "/outputs") + dns_ip = dep_outputs.json()['outputs']['dns_ip'] + ellis_ip = dep_outputs.json()['outputs']['ellis_ip'] + + ellis_url = "http://" + ellis_ip + "/" + url = ellis_url + "accounts" + + params = {"password": "functest", + "full_name": "opnfv functest user", + "email": "functest@opnfv.fr", + "signup_code": "secret"} + + rq = requests.post(url, data=params) + i = 20 + while rq.status_code != 201 and i > 0: + rq = requests.post(url, data=params) + i = i - 1 + time.sleep(10) + + if rq.status_code == 201: + url = ellis_url + "session" + rq = requests.post(url, data=params) + cookies = rq.cookies + + url = ellis_url + "accounts/" + params['email'] + "/numbers" + if cookies != "": + rq = requests.post(url, cookies=cookies) + i = 24 + while rq.status_code != 200 and i > 0: + rq = requests.post(url, cookies=cookies) + i = i - 1 + time.sleep(25) + + if rq.status_code != 200: + self.step_failure("Unable to create a number: %s" + % rq.json()['reason']) + + nameservers = ft_utils.get_resolvconf_ns() + resolvconf = "" + for ns in nameservers: + resolvconf += "\nnameserver " + ns + + if dns_ip != "": + script = ('echo -e "nameserver ' + dns_ip + resolvconf + + '" > /etc/resolv.conf; ') + script += 'source /etc/profile.d/rvm.sh; ' + script += 'cd {0}; ' + script += ('rake test[{1}] SIGNUP_CODE="secret"') + + cmd = ("/bin/bash -c '" + + script.format(self.data_dir, self.inputs["public_domain"]) + + "'") + output_file = "output.txt" + f = open(output_file, 'w+') + subprocess.call(cmd, shell=True, stdout=f, + stderr=subprocess.STDOUT) + f.close() + + f = open(output_file, 'r') + result = f.read() + if result != "": + self.logger.debug(result) + + vims_test_result = "" + tempFile = os.path.join(self.test_dir, "temp.json") + try: + self.logger.debug("Trying to load test results") + with open(tempFile) as f: + vims_test_result = json.load(f) + f.close() + except: + self.logger.error("Unable to retrieve test results") + + try: + os.remove(tempFile) + except: + self.logger.error("Deleting file failed") + + if vims_test_result != '': + return {'status': 'PASS', 'result': vims_test_result} + else: + return {'status': 'FAIL', 'result': ''} + + def clean(self): + # TODO + super(ImsVnf, self).clean() diff --git a/functest/opnfv_tests/vnf/ims/orchestra_ims.py b/functest/opnfv_tests/vnf/ims/orchestra_ims.py new file mode 100644 index 00000000..28f37f05 --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/orchestra_ims.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# 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 json +import os +import requests +import subprocess +import time + +import functest.core.vnf_base as vnf_base +import functest.utils.functest_logger as ft_logger +import functest.utils.functest_utils as ft_utils +from functest.utils.constants import CONST + + +class ImsVnf(vnf_base.VnfOnBoardingBase): + + def __init__(self, project='functest', case='orchestra_ims', + repo='', cmd=''): + super(ImsVnf, self).__init__(project, case, repo, cmd) + self.logger = ft_logger.Logger("vIMS").getLogger() + self.case_dir = os.path.join(CONST.functest_test, 'vnf/ims/') + self.data_dir = CONST.dir_vIMS_data + self.test_dir = CONST.dir_repo_vims_test + + # vIMS Data directory creation + if not os.path.exists(self.data_dir): + os.makedirs(self.data_dir) + + def deploy_orchestrator(self, **kwargs): + # TODO + # put your code here to deploy openbaton + # from the functest docker located on the jumphost + # you have admin rights on OpenStack SUT + # you can cretae a VM, spawn docker on the jumphost + # spawn docker on a VM in the SUT, ..up to you + # + # note: this step can be ignored + # if OpenBaton is part of the installer + self.logger.info("Deploy orchestrator: OK") + + def deploy_vnf(self): + # deploy the VNF + # call openbaton to deploy the vIMS + self.logger.info("Deploy VNF: OK") + + def test_vnf(self): + # Adaptations probably needed + # code used for cloudify_ims + # ruby client on jumphost calling the vIMS on the SUT + script = "source {0}venv_cloudify/bin/activate; " + script += "cd {0}; " + script += "cfy status | grep -Eo \"([0-9]{{1,3}}\.){{3}}[0-9]{{1,3}}\"" + cmd = "/bin/bash -c '" + script.format(self.data_dir) + "'" + + try: + self.logger.debug("Trying to get clearwater manager IP ... ") + mgr_ip = os.popen(cmd).read() + mgr_ip = mgr_ip.splitlines()[0] + except: + self.step_failure("Unable to retrieve the IP of the " + "cloudify manager server !") + + api_url = "http://" + mgr_ip + "/api/v2" + dep_outputs = requests.get(api_url + "/deployments/" + + self.vnf.deployment_name + "/outputs") + dns_ip = dep_outputs.json()['outputs']['dns_ip'] + ellis_ip = dep_outputs.json()['outputs']['ellis_ip'] + + ellis_url = "http://" + ellis_ip + "/" + url = ellis_url + "accounts" + + params = {"password": "functest", + "full_name": "opnfv functest user", + "email": "functest@opnfv.fr", + "signup_code": "secret"} + + rq = requests.post(url, data=params) + i = 20 + while rq.status_code != 201 and i > 0: + rq = requests.post(url, data=params) + i = i - 1 + time.sleep(10) + + if rq.status_code == 201: + url = ellis_url + "session" + rq = requests.post(url, data=params) + cookies = rq.cookies + + url = ellis_url + "accounts/" + params['email'] + "/numbers" + if cookies != "": + rq = requests.post(url, cookies=cookies) + i = 24 + while rq.status_code != 200 and i > 0: + rq = requests.post(url, cookies=cookies) + i = i - 1 + time.sleep(25) + + if rq.status_code != 200: + self.step_failure("Unable to create a number: %s" + % rq.json()['reason']) + + nameservers = ft_utils.get_resolvconf_ns() + resolvconf = "" + for ns in nameservers: + resolvconf += "\nnameserver " + ns + + if dns_ip != "": + script = ('echo -e "nameserver ' + dns_ip + resolvconf + + '" > /etc/resolv.conf; ') + script += 'source /etc/profile.d/rvm.sh; ' + script += 'cd {0}; ' + script += ('rake test[{1}] SIGNUP_CODE="secret"') + + cmd = ("/bin/bash -c '" + + script.format(self.data_dir, self.inputs["public_domain"]) + + "'") + output_file = "output.txt" + f = open(output_file, 'w+') + subprocess.call(cmd, shell=True, stdout=f, + stderr=subprocess.STDOUT) + f.close() + + f = open(output_file, 'r') + result = f.read() + if result != "": + self.logger.debug(result) + + vims_test_result = "" + tempFile = os.path.join(self.test_dir, "temp.json") + try: + self.logger.debug("Trying to load test results") + with open(tempFile) as f: + vims_test_result = json.load(f) + f.close() + except: + self.logger.error("Unable to retrieve test results") + + try: + os.remove(tempFile) + except: + self.logger.error("Deleting file failed") + + if vims_test_result != '': + return {'status': 'PASS', 'result': vims_test_result} + else: + return {'status': 'FAIL', 'result': ''} + + def clean(self): + # TODO + super(ImsVnf, self).clean() diff --git a/functest/opnfv_tests/vnf/ims/orchestrator.py b/functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py index f3838f87..f3838f87 100644 --- a/functest/opnfv_tests/vnf/ims/orchestrator.py +++ b/functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py diff --git a/functest/opnfv_tests/vnf/ims/vims.py b/functest/opnfv_tests/vnf/ims/vims.py deleted file mode 100755 index fe888b69..00000000 --- a/functest/opnfv_tests/vnf/ims/vims.py +++ /dev/null @@ -1,521 +0,0 @@ -#!/usr/bin/python -# coding: utf8 -####################################################################### -# -# Copyright (c) 2015 Orange -# valentin.boucher@orange.com -# -# 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 datetime -import json -import os -import pprint -import subprocess -import time - -import argparse -import keystoneclient.v2_0.client as ksclient -import novaclient.client as nvclient -import requests -from neutronclient.v2_0 import client as ntclient - -import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils -import functest.utils.openstack_utils as os_utils -from clearwater import Clearwater -from orchestrator import Orchestrator -import functest.utils.functest_constants as ft_constants - -pp = pprint.PrettyPrinter(indent=4) - - -parser = argparse.ArgumentParser() -parser.add_argument("-d", "--debug", help="Debug mode", action="store_true") -parser.add_argument("-r", "--report", - help="Create json result file", - action="store_true") -parser.add_argument("-n", "--noclean", - help="Don't clean the created resources for this test.", - action="store_true") -args = parser.parse_args() - -""" logging configuration """ -logger = ft_logger.Logger("vIMS").getLogger() - - -# Cloudify parameters -VIMS_DIR = os.path.join(ft_constants.FUNCTEST_TEST_DIR, 'vnf/ims/') -VIMS_DATA_DIR = ft_constants.VIMS_DATA_DIR -VIMS_TEST_DIR = ft_constants.VIMS_TEST_DIR -VIMS_TENANT_NAME = ft_constants.VIMS_TENANT_NAME -VIMS_TENANT_DESCRIPTION = ft_constants.VIMS_TENANT_DESCRIPTION -VIMS_IMAGES = ft_constants.VIMS_IMAGES - -CFY_MANAGER_BLUEPRINT = ft_constants.CFY_MANAGER_BLUEPRINT -CFY_MANAGER_REQUIERMENTS = ft_constants.CFY_MANAGER_REQUIERMENTS -CFY_INPUTS = ft_constants.CFY_INPUTS - -CW_BLUEPRINT = ft_constants.CW_BLUEPRINT -CW_DEPLOYMENT_NAME = ft_constants.CW_DEPLOYMENT_NAME -CW_INPUTS = ft_constants.CW_INPUTS -CW_REQUIERMENTS = ft_constants.CW_REQUIERMENTS - -CFY_DEPLOYMENT_DURATION = 0 -CW_DEPLOYMENT_DURATION = 0 - -TESTCASE_START_TIME = time.time() -RESULTS = {'orchestrator': {'duration': 0, 'result': ''}, - 'vIMS': {'duration': 0, 'result': ''}, - 'sig_test': {'duration': 0, 'result': ''}} - - -def download_and_add_image_on_glance(glance, image_name, image_url): - dest_path = os.path.join(VIMS_DATA_DIR, "tmp/") - if not os.path.exists(dest_path): - os.makedirs(dest_path) - file_name = image_url.rsplit('/')[-1] - if not ft_utils.download_url(image_url, dest_path): - logger.error("Failed to download image %s" % file_name) - return False - - image = os_utils.create_glance_image( - glance, image_name, dest_path + file_name) - if not image: - logger.error("Failed to upload image on glance") - return False - - return image - - -def step_failure(step_name, error_msg): - logger.error(error_msg) - set_result(step_name, 0, error_msg) - status = "FAIL" - # in case of failure starting and stoping time are not correct - stop_time = time.time() - if step_name == "sig_test": - status = "PASS" - ft_utils.push_results_to_db("functest", - "vims", - TESTCASE_START_TIME, - stop_time, - status, - RESULTS) - exit(-1) - - -def set_result(step_name, duration=0, result=""): - RESULTS[step_name] = {'duration': duration, 'result': result} - - -def test_clearwater(): - script = "source " + VIMS_DATA_DIR + "venv_cloudify/bin/activate; " - script += "cd " + VIMS_DATA_DIR + "; " - script += "cfy status | grep -Eo \"([0-9]{1,3}\.){3}[0-9]{1,3}\"" - cmd = "/bin/bash -c '" + script + "'" - - try: - logger.debug("Trying to get clearwater manager IP ... ") - mgr_ip = os.popen(cmd).read() - mgr_ip = mgr_ip.splitlines()[0] - except: - step_failure("sig_test", "Unable to retrieve the IP of the " - "cloudify manager server !") - - api_url = "http://" + mgr_ip + "/api/v2" - dep_outputs = requests.get(api_url + "/deployments/" + - CW_DEPLOYMENT_NAME + "/outputs") - dns_ip = dep_outputs.json()['outputs']['dns_ip'] - ellis_ip = dep_outputs.json()['outputs']['ellis_ip'] - - ellis_url = "http://" + ellis_ip + "/" - url = ellis_url + "accounts" - - params = {"password": "functest", - "full_name": "opnfv functest user", - "email": "functest@opnfv.fr", - "signup_code": "secret"} - - rq = requests.post(url, data=params) - i = 20 - while rq.status_code != 201 and i > 0: - rq = requests.post(url, data=params) - i = i - 1 - time.sleep(10) - - if rq.status_code == 201: - url = ellis_url + "session" - rq = requests.post(url, data=params) - cookies = rq.cookies - - url = ellis_url + "accounts/" + params['email'] + "/numbers" - if cookies != "": - rq = requests.post(url, cookies=cookies) - i = 24 - while rq.status_code != 200 and i > 0: - rq = requests.post(url, cookies=cookies) - i = i - 1 - time.sleep(25) - - if rq.status_code != 200: - step_failure("sig_test", "Unable to create a number: %s" - % rq.json()['reason']) - - start_time_ts = time.time() - end_time_ts = start_time_ts - logger.info("vIMS functional test Start Time:'%s'" % ( - datetime.datetime.fromtimestamp(start_time_ts).strftime( - '%Y-%m-%d %H:%M:%S'))) - nameservers = ft_utils.get_resolvconf_ns() - resolvconf = "" - for ns in nameservers: - resolvconf += "\nnameserver " + ns - - if dns_ip != "": - script = ('echo -e "nameserver ' + dns_ip + resolvconf + - '" > /etc/resolv.conf; ') - script += 'source /etc/profile.d/rvm.sh; ' - script += 'cd ' + VIMS_TEST_DIR + '; ' - script += ('rake test[' + CW_INPUTS["public_domain"] + - '] SIGNUP_CODE="secret"') - - cmd = "/bin/bash -c '" + script + "'" - output_file = "output.txt" - f = open(output_file, 'w+') - subprocess.call(cmd, shell=True, stdout=f, - stderr=subprocess.STDOUT) - f.close() - end_time_ts = time.time() - duration = round(end_time_ts - start_time_ts, 1) - logger.info("vIMS functional test duration:'%s'" % duration) - f = open(output_file, 'r') - result = f.read() - if result != "" and logger: - logger.debug(result) - - vims_test_result = "" - tempFile = os.path.join(VIMS_TEST_DIR, "temp.json") - try: - logger.debug("Trying to load test results") - with open(tempFile) as f: - vims_test_result = json.load(f) - f.close() - except: - logger.error("Unable to retrieve test results") - - set_result("sig_test", duration, vims_test_result) - - # success criteria for vIMS (for Brahmaputra) - # - orchestrator deployed - # - VNF deployed - # TODO use test criteria defined in config file - status = "FAIL" - try: - if (RESULTS['orchestrator']['duration'] > 0 and - RESULTS['vIMS']['duration'] > 0): - status = "PASS" - except: - logger.error("Unable to set test status") - - ft_utils.push_results_to_db("functest", - "vims", - TESTCASE_START_TIME, - end_time_ts, - status, - RESULTS) - - try: - os.remove(tempFile) - except: - logger.error("Deleting file failed") - - -def main(): - - # ############### GENERAL INITIALISATION ################ - - if not os.path.exists(VIMS_DATA_DIR): - os.makedirs(VIMS_DATA_DIR) - - ks_creds = os_utils.get_credentials("keystone") - nv_creds = os_utils.get_credentials("nova") - nt_creds = os_utils.get_credentials("neutron") - - logger.info("Prepare OpenStack plateform (create tenant and user)") - keystone = ksclient.Client(**ks_creds) - - user_id = os_utils.get_user_id(keystone, ks_creds['username']) - if user_id == '': - step_failure("init", "Error : Failed to get id of " + - ks_creds['username']) - - tenant_id = os_utils.create_tenant( - keystone, VIMS_TENANT_NAME, VIMS_TENANT_DESCRIPTION) - if not tenant_id: - step_failure("init", "Error : Failed to create " + - VIMS_TENANT_NAME + " tenant") - - roles_name = ["admin", "Admin"] - role_id = '' - for role_name in roles_name: - if role_id == '': - role_id = os_utils.get_role_id(keystone, role_name) - - if role_id == '': - logger.error("Error : Failed to get id for %s role" % role_name) - - if not os_utils.add_role_user(keystone, user_id, role_id, tenant_id): - logger.error("Error : Failed to add %s on tenant" % - ks_creds['username']) - - user_id = os_utils.create_user( - keystone, VIMS_TENANT_NAME, VIMS_TENANT_NAME, None, tenant_id) - if not user_id: - logger.error("Error : Failed to create %s user" % VIMS_TENANT_NAME) - - logger.info("Update OpenStack creds informations") - ks_creds.update({ - "username": VIMS_TENANT_NAME, - "password": VIMS_TENANT_NAME, - "tenant_name": VIMS_TENANT_NAME, - }) - - nt_creds.update({ - "tenant_name": VIMS_TENANT_NAME, - }) - - nv_creds.update({ - "project_id": VIMS_TENANT_NAME, - }) - - logger.info("Upload some OS images if it doesn't exist") - glance = os_utils.get_glance_client() - - for img in VIMS_IMAGES.keys(): - image_name = VIMS_IMAGES[img]['image_name'] - image_url = VIMS_IMAGES[img]['image_url'] - - image_id = os_utils.get_image_id(glance, image_name) - - if image_id == '': - logger.info("""%s image doesn't exist on glance repository. Try - downloading this image and upload on glance !""" % image_name) - image_id = download_and_add_image_on_glance( - glance, image_name, image_url) - - if image_id == '': - step_failure( - "init", - "Error : Failed to find or upload required OS " - "image for this deployment") - - nova = nvclient.Client("2", **nv_creds) - - logger.info("Update security group quota for this tenant") - neutron = ntclient.Client(**nt_creds) - if not os_utils.update_sg_quota(neutron, tenant_id, 50, 100): - step_failure( - "init", - "Failed to update security group quota for tenant " + - VIMS_TENANT_NAME) - - # ############### CLOUDIFY INITIALISATION ################ - public_auth_url = keystone.service_catalog.url_for( - service_type='identity', endpoint_type='publicURL') - - cfy = Orchestrator(VIMS_DATA_DIR, CFY_INPUTS) - - cfy.set_credentials(username=ks_creds['username'], password=ks_creds[ - 'password'], tenant_name=ks_creds['tenant_name'], - auth_url=public_auth_url) - - logger.info("Collect flavor id for cloudify manager server") - nova = nvclient.Client("2", **nv_creds) - - flavor_name = "m1.large" - flavor_id = os_utils.get_flavor_id(nova, flavor_name) - for requirement in CFY_MANAGER_REQUIERMENTS: - if requirement == 'ram_min': - flavor_id = os_utils.get_flavor_id_by_ram_range( - nova, CFY_MANAGER_REQUIERMENTS['ram_min'], 10000) - - if flavor_id == '': - logger.error( - "Failed to find %s flavor. " - "Try with ram range default requirement !" % flavor_name) - flavor_id = os_utils.get_flavor_id_by_ram_range(nova, 4000, 8196) - - if flavor_id == '': - step_failure("orchestrator", - "Failed to find required flavor for this deployment") - - cfy.set_flavor_id(flavor_id) - - image_name = "centos_7" - image_id = os_utils.get_image_id(glance, image_name) - for requirement in CFY_MANAGER_REQUIERMENTS: - if requirement == 'os_image': - image_id = os_utils.get_image_id( - glance, CFY_MANAGER_REQUIERMENTS['os_image']) - - if image_id == '': - step_failure( - "orchestrator", - "Error : Failed to find required OS image for cloudify manager") - - cfy.set_image_id(image_id) - - ext_net = os_utils.get_external_net(neutron) - if not ext_net: - step_failure("orchestrator", "Failed to get external network") - - cfy.set_external_network_name(ext_net) - - ns = ft_utils.get_resolvconf_ns() - if ns: - cfy.set_nameservers(ns) - - if 'compute' in nova.client.services_url: - cfy.set_nova_url(nova.client.services_url['compute']) - if neutron.httpclient.endpoint_url is not None: - cfy.set_neutron_url(neutron.httpclient.endpoint_url) - - logger.info("Prepare virtualenv for cloudify-cli") - cmd = "chmod +x " + VIMS_DIR + "create_venv.sh" - ft_utils.execute_command(cmd) - time.sleep(3) - cmd = VIMS_DIR + "create_venv.sh " + VIMS_DATA_DIR - ft_utils.execute_command(cmd) - - cfy.download_manager_blueprint( - CFY_MANAGER_BLUEPRINT['url'], CFY_MANAGER_BLUEPRINT['branch']) - - # ############### CLOUDIFY DEPLOYMENT ################ - start_time_ts = time.time() - end_time_ts = start_time_ts - logger.info("Cloudify deployment Start Time:'%s'" % ( - datetime.datetime.fromtimestamp(start_time_ts).strftime( - '%Y-%m-%d %H:%M:%S'))) - - error = cfy.deploy_manager() - if error: - step_failure("orchestrator", error) - - end_time_ts = time.time() - duration = round(end_time_ts - start_time_ts, 1) - logger.info("Cloudify deployment duration:'%s'" % duration) - set_result("orchestrator", duration, "") - - # ############### CLEARWATER INITIALISATION ################ - - cw = Clearwater(CW_INPUTS, cfy, logger) - - logger.info("Collect flavor id for all clearwater vm") - nova = nvclient.Client("2", **nv_creds) - - flavor_name = "m1.small" - flavor_id = os_utils.get_flavor_id(nova, flavor_name) - for requirement in CW_REQUIERMENTS: - if requirement == 'ram_min' and flavor_id == '': - flavor_id = os_utils.get_flavor_id_by_ram_range( - nova, CW_REQUIERMENTS['ram_min'], 4500) - - if flavor_id == '': - logger.error( - "Failed to find %s flavor. Try with ram range " - "default requirement !" % flavor_name) - flavor_id = os_utils.get_flavor_id_by_ram_range(nova, 4000, 8196) - - if flavor_id == '': - step_failure( - "vIMS", "Failed to find required flavor for this deployment") - - cw.set_flavor_id(flavor_id) - - image_name = "ubuntu_14.04" - image_id = os_utils.get_image_id(glance, image_name) - for requirement in CW_REQUIERMENTS: - if requirement == 'os_image': - image_id = os_utils.get_image_id( - glance, CW_REQUIERMENTS['os_image']) - - if image_id == '': - step_failure( - "vIMS", - "Error : Failed to find required OS image for cloudify manager") - - cw.set_image_id(image_id) - - ext_net = os_utils.get_external_net(neutron) - if not ext_net: - step_failure("vIMS", "Failed to get external network") - - cw.set_external_network_name(ext_net) - - # ############### CLEARWATER DEPLOYMENT ################ - - start_time_ts = time.time() - end_time_ts = start_time_ts - logger.info("vIMS VNF deployment Start Time:'%s'" % ( - datetime.datetime.fromtimestamp(start_time_ts).strftime( - '%Y-%m-%d %H:%M:%S'))) - - error = cw.deploy_vnf(CW_BLUEPRINT) - if error: - step_failure("vIMS", error) - - end_time_ts = time.time() - duration = round(end_time_ts - start_time_ts, 1) - logger.info("vIMS VNF deployment duration:'%s'" % duration) - set_result("vIMS", duration, "") - - # ############### CLEARWATER TEST ################ - - test_clearwater() - - # ########## CLEARWATER UNDEPLOYMENT ############ - - cw.undeploy_vnf() - - # ########### CLOUDIFY UNDEPLOYMENT ############# - - cfy.undeploy_manager() - - # ############## GENERAL CLEANUP ################ - if args.noclean: - exit(0) - - ks_creds = os_utils.get_credentials("keystone") - - keystone = ksclient.Client(**ks_creds) - - logger.info("Removing %s tenant .." % CFY_INPUTS['keystone_tenant_name']) - tenant_id = os_utils.get_tenant_id( - keystone, CFY_INPUTS['keystone_tenant_name']) - if tenant_id == '': - logger.error("Error : Failed to get id of %s tenant" % - CFY_INPUTS['keystone_tenant_name']) - else: - if not os_utils.delete_tenant(keystone, tenant_id): - logger.error("Error : Failed to remove %s tenant" % - CFY_INPUTS['keystone_tenant_name']) - - logger.info("Removing %s user .." % CFY_INPUTS['keystone_username']) - user_id = os_utils.get_user_id( - keystone, CFY_INPUTS['keystone_username']) - if user_id == '': - logger.error("Error : Failed to get id of %s user" % - CFY_INPUTS['keystone_username']) - else: - if not os_utils.delete_user(keystone, user_id): - logger.error("Error : Failed to remove %s user" % - CFY_INPUTS['keystone_username']) - - -if __name__ == '__main__': - main() |