aboutsummaryrefslogtreecommitdiffstats
path: root/functest/opnfv_tests/vnf/ims
diff options
context:
space:
mode:
authorMorgan Richomme <morgan.richomme@orange.com>2017-01-06 16:16:20 +0100
committerMorgan Richomme <morgan.richomme@orange.com>2017-01-18 10:30:09 +0100
commit3e921f50fb71ef93b441054c0444da5a4fa64b44 (patch)
treebfb42bc08c61fc65048c60a038354160aae74fc6 /functest/opnfv_tests/vnf/ims
parentfec5f179377a891117c4f3f3665df47063a1e1bd (diff)
Add VnfOnBoarding Abstraction
JIRA: FUNCTEST-535 Change-Id: Idfa3dfd64554472aaac3f26a504e1f74d2f42926 Signed-off-by: Morgan Richomme <morgan.richomme@orange.com>
Diffstat (limited to 'functest/opnfv_tests/vnf/ims')
-rw-r--r--functest/opnfv_tests/vnf/ims/__init__.py0
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.py277
-rw-r--r--functest/opnfv_tests/vnf/ims/opera_ims.py154
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_ims.py156
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestrator_cloudify.py (renamed from functest/opnfv_tests/vnf/ims/orchestrator.py)0
-rwxr-xr-xfunctest/opnfv_tests/vnf/ims/vims.py506
6 files changed, 587 insertions, 506 deletions
diff --git a/functest/opnfv_tests/vnf/ims/__init__.py b/functest/opnfv_tests/vnf/ims/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /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 000000000..e584519b7
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py
@@ -0,0 +1,277 @@
+#!/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='', 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 000000000..fa8f9ec98
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/opera_ims.py
@@ -0,0 +1,154 @@
+#!/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='', 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 000000000..ebd6c9baf
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/orchestra_ims.py
@@ -0,0 +1,156 @@
+#!/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='', 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 f3838f871..f3838f871 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 15981f512..000000000
--- a/functest/opnfv_tests/vnf/ims/vims.py
+++ /dev/null
@@ -1,506 +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 requests
-
-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)
-
- creds = os_utils.get_credentials()
-
- logger.info("Prepare OpenStack plateform (create tenant and user)")
- keystone = os_utils.get_keystone_client()
-
- user_id = os_utils.get_user_id(keystone, creds['username'])
- if user_id == '':
- step_failure("init", "Error : Failed to get id of " +
- 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" %
- 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")
- creds.update({
- "username": VIMS_TENANT_NAME,
- "password": VIMS_TENANT_NAME,
- "tenant": 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")
-
- logger.info("Update security group quota for this tenant")
- neutron = os_utils.get_neutron_client(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 = os_utils.get_endpoint('identity')
-
- cfy = Orchestrator(VIMS_DATA_DIR, CFY_INPUTS)
-
- if 'tenant_name' in creds.keys():
- tenant_name = creds['tenant_name']
- elif 'project_name' in creds.keys():
- tenant_name = creds['project_name']
-
- cfy.set_credentials(username=creds['username'],
- password=creds['password'],
- tenant_name=tenant_name,
- auth_url=public_auth_url)
-
- logger.info("Collect flavor id for cloudify manager server")
- nova = os_utils.get_nova_client(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")
-
- 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)
-
- 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()