aboutsummaryrefslogtreecommitdiffstats
path: root/functest/opnfv_tests/vnf/ims/heat_ims.py
diff options
context:
space:
mode:
Diffstat (limited to 'functest/opnfv_tests/vnf/ims/heat_ims.py')
-rw-r--r--functest/opnfv_tests/vnf/ims/heat_ims.py139
1 files changed, 70 insertions, 69 deletions
diff --git a/functest/opnfv_tests/vnf/ims/heat_ims.py b/functest/opnfv_tests/vnf/ims/heat_ims.py
index 3d32b889d..0d4e345a0 100644
--- a/functest/opnfv_tests/vnf/ims/heat_ims.py
+++ b/functest/opnfv_tests/vnf/ims/heat_ims.py
@@ -15,8 +15,9 @@ import logging
import os
import re
import time
-import yaml
+import tempfile
+import paramiko
import pkg_resources
from xtesting.core import testcase
@@ -24,6 +25,7 @@ from functest.core import singlevm
from functest.opnfv_tests.vnf.ims import clearwater
from functest.utils import config
from functest.utils import env
+from functest.utils import functest_utils
__author__ = "Valentin Boucher <valentin.boucher@kontron.com>"
@@ -37,45 +39,59 @@ class HeatIms(singlevm.VmReady2):
filename = ('/home/opnfv/functest/images/'
'ubuntu-14.04-server-cloudimg-amd64-disk1.img')
- flavor_ram = 2048
- flavor_vcpus = 2
- flavor_disk = 25
+ flavor_ram = 1024
+ flavor_vcpus = 1
+ flavor_disk = 3
quota_security_group = 20
quota_security_group_rule = 100
quota_port = 50
+ parameters = {
+ 'private_mgmt_net_cidr': '192.168.100.0/24',
+ 'private_mgmt_net_gateway': '192.168.100.254',
+ 'private_mgmt_net_pool_start': '192.168.100.1',
+ 'private_mgmt_net_pool_end': '192.168.100.253'}
+
def __init__(self, **kwargs):
"""Initialize HeatIms testcase object."""
if "case_name" not in kwargs:
kwargs["case_name"] = "heat_ims"
- super(HeatIms, self).__init__(**kwargs)
+ super().__init__(**kwargs)
# Retrieve the configuration
try:
self.config = getattr(
- config.CONF, 'vnf_{}_config'.format(self.case_name))
- except Exception:
- raise Exception("VNF config file not found")
+ config.CONF, f'vnf_{self.case_name}_config')
+ except Exception as exc:
+ raise Exception("VNF config file not found") from exc
self.case_dir = pkg_resources.resource_filename(
'functest', 'opnfv_tests/vnf/ims')
config_file = os.path.join(self.case_dir, self.config)
self.vnf = dict(
- descriptor=get_config("vnf.descriptor", config_file),
- parameters=get_config("vnf.inputs", config_file)
+ descriptor=functest_utils.get_parameter_from_yaml(
+ "vnf.descriptor", config_file),
+ parameters=functest_utils.get_parameter_from_yaml(
+ "vnf.inputs", config_file)
)
self.details['vnf'] = dict(
descriptor_version=self.vnf['descriptor']['version'],
- name=get_config("vnf.name", config_file),
- version=get_config("vnf.version", config_file),
+ name=functest_utils.get_parameter_from_yaml(
+ "vnf.name", config_file),
+ version=functest_utils.get_parameter_from_yaml(
+ "vnf.version", config_file),
)
self.__logger.debug("VNF configuration: %s", self.vnf)
self.keypair = None
self.stack = None
self.clearwater = None
self.role = None
+ (_, self.key_filename) = tempfile.mkstemp()
+
+ def create_network_resources(self):
+ pass
def execute(self):
# pylint: disable=too-many-locals,too-many-statements
@@ -96,10 +112,13 @@ class HeatIms(singlevm.VmReady2):
project=self.project.project.id,
domain=self.project.domain.id)
self.keypair = self.cloud.create_keypair(
- '{}-kp_{}'.format(self.case_name, self.guid))
- self.__logger.debug("keypair: %s", self.keypair)
+ f'{self.case_name}-kp_{self.guid}')
+ self.__logger.info("keypair:\n%s", self.keypair.private_key)
+ with open(
+ self.key_filename, 'w', encoding='utf-8') as private_key_file:
+ private_key_file.write(self.keypair.private_key)
- if (self.deploy_vnf() and self.test_vnf()):
+ if self.deploy_vnf() and self.test_vnf():
self.result = 100
return 0
self.result = 1/3 * 100
@@ -119,7 +138,7 @@ class HeatIms(singlevm.VmReady2):
status = testcase.TestCase.EX_RUN_ERROR
try:
assert self.cloud
- assert super(HeatIms, self).run(
+ assert super().run(
**kwargs) == testcase.TestCase.EX_OK
self.result = 0
if not self.execute():
@@ -131,6 +150,22 @@ class HeatIms(singlevm.VmReady2):
self.stop_time = time.time()
return status
+ def _monit(self, username="ubuntu", timeout=60):
+ servers = self.cloud.list_servers(detailed=True)
+ self.__logger.debug("servers: %s", servers)
+ for server in servers:
+ if 'ns' in server.name:
+ break
+ self.__logger.info("server:\n%s", server.name)
+ ssh = paramiko.SSHClient()
+ ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
+ ssh.connect(
+ server.public_v4, username=username,
+ key_filename=self.key_filename, timeout=timeout)
+ (_, stdout, _) = ssh.exec_command('sudo monit summary')
+ self.__logger.info("output:\n%s", stdout.read().decode("utf-8"))
+ ssh.close()
+
def deploy_vnf(self):
"""Deploy Clearwater IMS."""
start_time = time.time()
@@ -138,12 +173,11 @@ class HeatIms(singlevm.VmReady2):
parameters = self.vnf['parameters']
parameters['public_mgmt_net_id'] = self.ext_net.id
- parameters['public_sig_net_id'] = self.ext_net.id
parameters['flavor'] = self.flavor.name
parameters['image'] = self.image.name
parameters['key_name'] = self.keypair.name
parameters['external_mgmt_dns_ip'] = env.get('NAMESERVER')
- parameters['external_sig_dns_ip'] = env.get('NAMESERVER')
+ parameters.update(self.parameters)
self.__logger.info("Create Heat Stack")
self.stack = self.cloud.create_stack(
@@ -152,24 +186,30 @@ class HeatIms(singlevm.VmReady2):
wait=True, **parameters)
self.__logger.debug("stack: %s", self.stack)
+ self._monit()
+
servers = self.cloud.list_servers(detailed=True)
self.__logger.debug("servers: %s", servers)
for server in servers:
if not self.check_regex_in_console(
- server.name, regex='Cloud-init .* finished at ', loop=60):
+ server.name, regex='Cloud-init .* finished at ', loop=1):
return False
if 'ellis' in server.name:
- self.__logger.debug("server: %s", server)
+ self.__logger.debug("ellis: %s", server)
ellis_ip = server.public_v4
+ elif 'bono' in server.name:
+ self.__logger.debug("bono: %s", server)
+ bono_ip = server.public_v4
assert ellis_ip
- self.clearwater = clearwater.ClearwaterTesting(self.case_name,
- ellis_ip)
+ assert bono_ip
+ self.clearwater = clearwater.ClearwaterTesting(
+ self.case_name, bono_ip, ellis_ip)
# This call can take time and many retry because Heat is
# an infrastructure orchestrator so when Heat say "stack created"
# it means that all OpenStack ressources are created but not that
# Clearwater are up and ready (Cloud-Init script still running)
- self.clearwater.availability_check_by_creating_numbers()
+ self.clearwater.availability_check()
duration = time.time() - start_time
@@ -181,35 +221,21 @@ class HeatIms(singlevm.VmReady2):
def test_vnf(self):
"""Run test on clearwater ims instance."""
start_time = time.time()
-
outputs = self.cloud.get_stack(self.stack.id).outputs
self.__logger.debug("stack outputs: %s", outputs)
dns_ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', str(outputs))[0]
-
if not dns_ip:
return False
-
- short_result = self.clearwater.run_clearwater_live_test(
- dns_ip=dns_ip,
+ short_result, vnf_test_rate = self.clearwater.run_clearwater_live_test(
public_domain=self.vnf['parameters']["zone"])
duration = time.time() - start_time
self.__logger.info(short_result)
- self.details['test_vnf'] = dict(result=short_result,
- duration=duration)
- try:
- vnf_test_rate = short_result['passed'] / (
- short_result['total'] - short_result['skipped'])
- # orchestrator + vnf + test_vnf
- self.result += vnf_test_rate / 3 * 100
- except ZeroDivisionError:
- self.__logger.error("No test has been executed")
+ self.details['test_vnf'] = dict(result=short_result, duration=duration)
+ self.result += vnf_test_rate / 3 * 100
+ if vnf_test_rate == 0:
self.details['test_vnf'].update(status='FAIL')
- return False
- except Exception: # pylint: disable=broad-except
- self.__logger.exception("Cannot calculate results")
- self.details['test_vnf'].update(status='FAIL')
- return False
- return True if vnf_test_rate > 0 else False
+ self._monit()
+ return bool(vnf_test_rate > 0)
def clean(self):
"""Clean created objects/functions."""
@@ -222,31 +248,6 @@ class HeatIms(singlevm.VmReady2):
pass
except Exception: # pylint: disable=broad-except
self.__logger.exception("Cannot clean stack ressources")
- super(HeatIms, self).clean()
+ super().clean()
if self.role:
self.orig_cloud.delete_role(self.role.id)
-
-
-# ----------------------------------------------------------
-#
-# YAML UTILS
-#
-# -----------------------------------------------------------
-def get_config(parameter, file_path):
- """
- Get config parameter.
-
- Returns the value of a given parameter in file.yaml
- parameter must be given in string format with dots
- Example: general.openstack.image_name
- """
- with open(file_path) as config_file:
- file_yaml = yaml.safe_load(config_file)
- config_file.close()
- value = file_yaml
- for element in parameter.split("."):
- value = value.get(element)
- if value is None:
- raise ValueError("The parameter %s is not defined in"
- " reporting.yaml" % parameter)
- return value