diff options
Diffstat (limited to 'functest')
204 files changed, 9227 insertions, 37910 deletions
diff --git a/functest/api/base.py b/functest/api/base.py deleted file mode 100644 index 75f059b74..000000000 --- a/functest/api/base.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -The base class to dispatch request - -""" - -import logging - -from flask import request -from flask_restful import Resource - -from functest.api.common import api_utils - - -LOGGER = logging.getLogger(__name__) - - -class ApiResource(Resource): - """ API Resource class""" - - def __init__(self): - super(ApiResource, self).__init__() - - def _post_args(self): # pylint: disable=no-self-use - # pylint: disable=maybe-no-member - """ Return action and args after parsing request """ - - data = request.json if request.json else {} - params = api_utils.change_to_str_in_dict(data) - action = params.get('action', request.form.get('action', '')) - args = params.get('args', {}) - try: - args['file'] = request.files['file'] - except KeyError: - pass - LOGGER.debug('Input args are: action: %s, args: %s', action, args) - - return action, args - - def _get_args(self): # pylint: disable=no-self-use - """ Convert the unicode to string for request.args """ - args = api_utils.change_to_str_in_dict(request.args) - return args - - def _dispatch_post(self): - """ Dispatch request """ - action, args = self._post_args() - return self._dispatch(args, action) - - def _dispatch(self, args, action): - """ - Dynamically load the classes with reflection and - obtain corresponding methods - """ - try: - return getattr(self, action)(args) - except AttributeError: - api_utils.result_handler(status=1, data='No such action') - - -# Import modules from package "functest.api.resources" -# and append them into sys.modules -api_utils.import_modules_from_package("functest.api.resources") diff --git a/functest/api/common/api_utils.py b/functest/api/common/api_utils.py deleted file mode 100644 index d85acf927..000000000 --- a/functest/api/common/api_utils.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Utils for functest restapi - -""" - -import collections -import logging -import os -import sys -from oslo_utils import importutils - -from flask import jsonify -import six - -import functest - -LOGGER = logging.getLogger(__name__) - - -def change_to_str_in_dict(obj): - """ - Return a dict with key and value both in string if they are in Unicode - """ - if isinstance(obj, collections.Mapping): - return {str(k): change_to_str_in_dict(v) for k, v in obj.items()} - elif isinstance(obj, list): - return [change_to_str_in_dict(ele) for ele in obj] - elif isinstance(obj, six.text_type): - return str(obj) - return obj - - -def itersubclasses(cls, _seen=None): - """ Generator over all subclasses of a given class in depth first order """ - - if not isinstance(cls, type): - raise TypeError("itersubclasses must be called with " - "new-style classes, not %.100r" % cls) - _seen = _seen or set() - try: - subs = cls.__subclasses__() - except TypeError: # fails only when cls is type - subs = cls.__subclasses__(cls) - for sub in subs: - if sub not in _seen: - _seen.add(sub) - yield sub - for itersub in itersubclasses(sub, _seen): - yield itersub - - -def import_modules_from_package(package): - """ - Import modules from package and append into sys.modules - :param: package - Full package name. For example: functest.api.resources - """ - path = [os.path.dirname(functest.__file__), ".."] + package.split(".") - path = os.path.join(*path) - for root, _, files in os.walk(path): - for filename in files: - if filename.startswith("__") or not filename.endswith(".py"): - continue - new_package = ".".join(root.split(os.sep)).split("....")[1] - module_name = "%s.%s" % (new_package, filename[:-3]) - try: - try_append_module(module_name, sys.modules) - except ImportError: - LOGGER.exception("unable to import %s", module_name) - - -def try_append_module(name, modules): - """ Append the module into specified module system """ - - if name not in modules: - modules[name] = importutils.import_module(name) - - -def change_obj_to_dict(obj): - """ Transfer the object into dict """ - dic = {} - for key, value in vars(obj).items(): - dic.update({key: value}) - return dic - - -def result_handler(status, data): - """ Return the json format of result in dict """ - result = { - 'status': status, - 'result': data - } - return jsonify(result) diff --git a/functest/api/common/thread.py b/functest/api/common/thread.py deleted file mode 100644 index fb60aaac7..000000000 --- a/functest/api/common/thread.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Used to handle multi-thread tasks -""" - -import logging -import threading - -from oslo_serialization import jsonutils - - -LOGGER = logging.getLogger(__name__) - - -class TaskThread(threading.Thread): - """ Task Thread Class """ - - def __init__(self, target, args, handler): - super(TaskThread, self).__init__(target=target, args=args) - self.target = target - self.args = args - self.handler = handler - - def run(self): - """ Override the function run: run testcase and update database """ - update_data = {'task_id': self.args.get('task_id'), - 'status': 'IN PROGRESS'} - self.handler.insert(update_data) - - LOGGER.info('Starting running test case') - - try: - data = self.target(self.args) - except Exception as err: # pylint: disable=broad-except - LOGGER.exception('Task Failed') - update_data = {'status': 'FAIL', 'error': str(err)} - self.handler.update_attr(self.args.get('task_id'), update_data) - else: - LOGGER.info('Task Finished') - LOGGER.debug('Result: %s', data) - new_data = {'status': 'FINISHED', - 'result': jsonutils.dumps(data.get('result', {}))} - - self.handler.update_attr(self.args.get('task_id'), new_data) diff --git a/functest/api/database/db.py b/functest/api/database/db.py deleted file mode 100644 index ea861ddbd..000000000 --- a/functest/api/database/db.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Create database to store task results using sqlalchemy -""" - -from sqlalchemy import create_engine -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import scoped_session, sessionmaker - - -SQLITE = 'sqlite:////tmp/functest.db' - -ENGINE = create_engine(SQLITE, convert_unicode=True) -DB_SESSION = scoped_session(sessionmaker(autocommit=False, - autoflush=False, - bind=ENGINE)) -BASE = declarative_base() -BASE.query = DB_SESSION.query_property() diff --git a/functest/api/database/v1/handlers.py b/functest/api/database/v1/handlers.py deleted file mode 100644 index 7bd286ded..000000000 --- a/functest/api/database/v1/handlers.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Used to handle tasks: insert the task info into database and update it -""" - -from functest.api.database.db import DB_SESSION -from functest.api.database.v1.models import Tasks - - -class TasksHandler(object): - """ Tasks Handler Class """ - - def insert(self, kwargs): # pylint: disable=no-self-use - """ To insert the task info into database """ - task = Tasks(**kwargs) - DB_SESSION.add(task) # pylint: disable=maybe-no-member - DB_SESSION.commit() # pylint: disable=maybe-no-member - return task - - def get_task_by_taskid(self, task_id): # pylint: disable=no-self-use - """ Obtain the task by task id """ - # pylint: disable=maybe-no-member - task = Tasks.query.filter_by(task_id=task_id).first() - if not task: - raise ValueError - - return task - - def update_attr(self, task_id, attr): - """ Update the required attributes of the task """ - task = self.get_task_by_taskid(task_id) - - for key, value in attr.items(): - setattr(task, key, value) - DB_SESSION.commit() # pylint: disable=maybe-no-member diff --git a/functest/api/database/v1/models.py b/functest/api/database/v1/models.py deleted file mode 100644 index c5de91bca..000000000 --- a/functest/api/database/v1/models.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Define tables for tasks -""" - -from sqlalchemy import Column -from sqlalchemy import Integer -from sqlalchemy import String -from sqlalchemy import Text - -from functest.api.database.db import BASE - - -class Tasks(BASE): # pylint: disable=too-few-public-methods, no-init - """ Create a table for tasks""" - - __tablename__ = 'tasks' - id = Column(Integer, primary_key=True) # pylint: disable=invalid-name - task_id = Column(String(50)) - status = Column(Integer) - error = Column(String(120)) - result = Column(Text) - - def __repr__(self): - return '<Task %r>' % Tasks.task_id diff --git a/functest/api/resources/v1/creds.py b/functest/api/resources/v1/creds.py deleted file mode 100644 index f445017dc..000000000 --- a/functest/api/resources/v1/creds.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Resources to handle openstack related requests -""" - -import collections -import logging -import pkg_resources -import socket - -from flask import jsonify -from flasgger.utils import swag_from - -from functest.api.base import ApiResource -from functest.api.common import api_utils -from functest.cli.commands.cli_os import OpenStack -from functest.utils import openstack_utils as os_utils -from functest.utils.constants import CONST - -LOGGER = logging.getLogger(__name__) - -ADDRESS = socket.gethostbyname(socket.gethostname()) -ENDPOINT_CREDS = ('http://{}:5000/api/v1/functest/openstack'.format(ADDRESS)) - - -class V1Creds(ApiResource): - """ V1Creds Resource class""" - - @swag_from( - pkg_resources.resource_filename('functest', 'api/swagger/creds.yaml'), - endpoint='{0}/credentials'.format(ENDPOINT_CREDS)) - def get(self): # pylint: disable=no-self-use - """ Get credentials """ - os_utils.source_credentials(CONST.__getattribute__('openstack_creds')) - credentials_show = OpenStack.show_credentials() - return jsonify(credentials_show) - - @swag_from( - pkg_resources.resource_filename('functest', - 'api/swagger/creds_action.yaml'), - endpoint='{0}/action'.format(ENDPOINT_CREDS)) - def post(self): - """ Used to handle post request """ - return self._dispatch_post() - - def update_openrc(self, args): # pylint: disable=no-self-use - """ Used to update the OpenStack RC file """ - try: - openrc_vars = args['openrc'] - except KeyError: - return api_utils.result_handler( - status=0, data='openrc must be provided') - else: - if not isinstance(openrc_vars, collections.Mapping): - return api_utils.result_handler( - status=0, data='args should be a dict') - - lines = ['export {}={}\n'.format(k, v) for k, v in openrc_vars.items()] - - rc_file = CONST.__getattribute__('openstack_creds') - with open(rc_file, 'w') as creds_file: - creds_file.writelines(lines) - - LOGGER.info("Sourcing the OpenStack RC file...") - try: - os_utils.source_credentials(rc_file) - except Exception as err: # pylint: disable=broad-except - LOGGER.exception('Failed to source the OpenStack RC file') - return api_utils.result_handler(status=0, data=str(err)) - - return api_utils.result_handler( - status=0, data='Update openrc successfully') diff --git a/functest/api/resources/v1/envs.py b/functest/api/resources/v1/envs.py deleted file mode 100644 index 3e6f05ac9..000000000 --- a/functest/api/resources/v1/envs.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Resources to handle environment related requests -""" - -import pkg_resources -import socket - -import IPy -from flask import jsonify -from flasgger.utils import swag_from - -from functest.api.base import ApiResource -from functest.api.common import api_utils -from functest.cli.commands.cli_env import Env - -ADDRESS = socket.gethostbyname(socket.gethostname()) -ENDPOINT_ENVS = ('http://{}:5000/api/v1/functest/envs'.format(ADDRESS)) - - -class V1Envs(ApiResource): - """ V1Envs Resource class""" - - @swag_from( - pkg_resources.resource_filename('functest', 'api/swagger/envs.yaml'), - endpoint=ENDPOINT_ENVS) - def get(self): # pylint: disable=no-self-use - """ Get environment """ - environment_show = Env().show() - return jsonify(environment_show) - - @swag_from( - pkg_resources.resource_filename('functest', - 'api/swagger/envs_action.yaml'), - endpoint='{0}/action'.format(ENDPOINT_ENVS)) - def post(self): - """ Used to handle post request """ - return self._dispatch_post() - - def update_hosts(self, hosts_info): # pylint: disable=no-self-use - """ Update hosts info """ - - if not isinstance(hosts_info, dict): - return api_utils.result_handler( - status=1, data='Error, args should be a dict') - - for key, value in hosts_info.items(): - if key: - try: - IPy.IP(value) - except Exception: # pylint: disable=broad-except - return api_utils.result_handler( - status=1, data='The IP %s is invalid' % value) - else: - return api_utils.result_handler( - status=1, data='Domain name is absent') - - try: - functest_flag = "# SUT hosts info for Functest" - hosts_list = ('\n{} {} {}'.format(ip, host_name, functest_flag) - for host_name, ip in hosts_info.items()) - - with open("/etc/hosts", 'r') as file_hosts: - origin_lines = [line for line in file_hosts - if functest_flag not in line] - - with open("/etc/hosts", 'w') as file_hosts: - file_hosts.writelines(origin_lines) - file_hosts.write(functest_flag) - file_hosts.writelines(hosts_list) - except Exception: # pylint: disable=broad-except - return api_utils.result_handler( - status=1, data='Error when updating hosts info') - else: - return api_utils.result_handler( - status=0, data='Update hosts info successfully') diff --git a/functest/api/resources/v1/tasks.py b/functest/api/resources/v1/tasks.py deleted file mode 100644 index 6bf625a88..000000000 --- a/functest/api/resources/v1/tasks.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Resources to retrieve the task results -""" - -import errno -import json -import logging -import os -import pkg_resources -import uuid - -from flask import jsonify -from flasgger.utils import swag_from - -from functest.api.base import ApiResource -from functest.api.common import api_utils -from functest.api.database.v1.handlers import TasksHandler -from functest.utils.constants import CONST - - -LOGGER = logging.getLogger(__name__) - - -class V1Task(ApiResource): - """ V1Task Resource class""" - - @swag_from(pkg_resources.resource_filename( - 'functest', 'api/swagger/task.yaml')) - def get(self, task_id): # pylint: disable=no-self-use - """ GET the result of the task id """ - try: - uuid.UUID(task_id) - except ValueError: - return api_utils.result_handler(status=1, data='Invalid task id') - - task_handler = TasksHandler() - try: - task = task_handler.get_task_by_taskid(task_id) - except ValueError: - return api_utils.result_handler(status=1, data='No such task id') - - status = task.status - LOGGER.debug('Task status is: %s', status) - - if status not in ['IN PROGRESS', 'FAIL', 'FINISHED']: - return api_utils.result_handler(status=1, - data='internal server error') - - switcher = {'IN PROGRESS': 0, 'FAIL': 1, 'FINISHED': 2} - if status == 'IN PROGRESS': - result = {'status': switcher.get(status), 'result': ''} - elif status == 'FAIL': - result = {'status': switcher.get(status), 'error': task.error} - else: - result = {'status': switcher.get(status), - 'result': json.loads(task.result)} - - return jsonify(result) - - -class V1TaskLog(ApiResource): - """ V1TaskLog Resource class""" - - @swag_from(pkg_resources.resource_filename( - 'functest', 'api/swagger/task_log.yaml')) - def get(self, task_id): # pylint: disable=no-self-use - """ GET the log of the task id """ - try: - uuid.UUID(task_id) - except ValueError: - return api_utils.result_handler(status=1, data='Invalid task id') - - task_handler = TasksHandler() - try: - task = task_handler.get_task_by_taskid(task_id) - except ValueError: - return api_utils.result_handler(status=1, data='No such task id') - - task_log_dir = CONST.__getattribute__('dir_results') - # pylint: disable=maybe-no-member - index = int(self._get_args().get('index', 0)) - - try: - with open(os.path.join(task_log_dir, - '{}.log'.format(task_id)), 'r') as log_file: - log_file.seek(index) - data = log_file.readlines() - index = log_file.tell() - except OSError as err: - if err.errno == errno.ENOENT: - return api_utils.result_handler( - status=1, data='Log file does not exist') - - return api_utils.result_handler( - status=1, data='Error with log file') - - return_data = {'data': data, 'index': index} - - switcher = {'IN PROGRESS': 0, 'FAIL': 1, 'FINISHED': 2} - - return api_utils.result_handler(status=switcher.get(task.status), - data=return_data) diff --git a/functest/api/resources/v1/testcases.py b/functest/api/resources/v1/testcases.py deleted file mode 100644 index 01571548d..000000000 --- a/functest/api/resources/v1/testcases.py +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Resources to handle testcase related requests -""" - -import logging -import os -import re -import pkg_resources -import socket -import uuid - -import ConfigParser -from flask import jsonify -from flasgger.utils import swag_from - -from functest.api.base import ApiResource -from functest.api.common import api_utils, thread -from functest.cli.commands.cli_testcase import Testcase -from functest.api.database.v1.handlers import TasksHandler -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - -LOGGER = logging.getLogger(__name__) - -ADDRESS = socket.gethostbyname(socket.gethostname()) -ENDPOINT_TESTCASES = ('http://{}:5000/api/v1/functest/testcases' - .format(ADDRESS)) - - -class V1Testcases(ApiResource): - """ V1Testcases Resource class""" - - @swag_from(pkg_resources.resource_filename( - 'functest', 'api/swagger/testcases.yaml')) - def get(self): # pylint: disable=no-self-use - """ GET all testcases """ - testcases_list = Testcase().list() - result = {'testcases': re.split(' |\n ', testcases_list)[1:]} - return jsonify(result) - - -class V1Testcase(ApiResource): - """ V1Testcase Resource class""" - - @swag_from( - pkg_resources.resource_filename('functest', - 'api/swagger/testcase.yaml'), - endpoint='{0}/<testcase_name>'.format(ENDPOINT_TESTCASES)) - def get(self, testcase_name): # pylint: disable=no-self-use - """ GET the info of one testcase""" - testcase = Testcase().show(testcase_name) - if not testcase: - return api_utils.result_handler( - status=1, - data="The test case '%s' does not exist or is not supported" - % testcase_name) - - testcase_info = api_utils.change_obj_to_dict(testcase) - dependency_dict = api_utils.change_obj_to_dict( - testcase_info.get('dependency')) - testcase_info.pop('name') - testcase_info.pop('dependency') - result = {'testcase': testcase_name} - result.update(testcase_info) - result.update({'dependency': dependency_dict}) - return jsonify(result) - - @swag_from( - pkg_resources.resource_filename('functest', - 'api/swagger/testcase_run.yaml'), - endpoint='{0}/action'.format(ENDPOINT_TESTCASES)) - def post(self): - """ Used to handle post request """ - return self._dispatch_post() - - def run_test_case(self, args): - """ Run a testcase """ - try: - case_name = args['testcase'] - except KeyError: - return api_utils.result_handler( - status=1, data='testcase name must be provided') - - testcase = Testcase().show(case_name) - if not testcase: - return api_utils.result_handler( - status=1, - data="The test case '%s' does not exist or is not supported" - % case_name) - - task_id = str(uuid.uuid4()) - - task_args = {'testcase': case_name, 'task_id': task_id} - - task_args.update(args.get('opts', {})) - - task_thread = thread.TaskThread(self._run, task_args, TasksHandler()) - task_thread.start() - - result = {'testcase': case_name, 'task_id': task_id} - return jsonify({'result': result}) - - def _run(self, args): # pylint: disable=no-self-use - """ The built_in function to run a test case """ - - case_name = args.get('testcase') - self._update_logging_ini(args.get('task_id')) - - try: - cmd = "run_tests -t {}".format(case_name) - runner = ft_utils.execute_command(cmd) - except Exception: # pylint: disable=broad-except - result = 'FAIL' - LOGGER.exception("Running test case %s failed!", case_name) - if runner == os.EX_OK: - result = 'PASS' - else: - result = 'FAIL' - - env_info = { - 'installer': CONST.__getattribute__('INSTALLER_TYPE'), - 'scenario': CONST.__getattribute__('DEPLOY_SCENARIO'), - 'build_tag': CONST.__getattribute__('BUILD_TAG'), - 'ci_loop': CONST.__getattribute__('CI_LOOP') - } - result = { - 'task_id': args.get('task_id'), - 'testcase': case_name, - 'env_info': env_info, - 'result': result - } - - return {'result': result} - - def _update_logging_ini(self, task_id): # pylint: disable=no-self-use - """ Update the log file for each task""" - config = ConfigParser.RawConfigParser() - config.read( - pkg_resources.resource_filename('functest', 'ci/logging.ini')) - log_path = os.path.join(CONST.__getattribute__('dir_results'), - '{}.log'.format(task_id)) - config.set('handler_file', 'args', '("{}",)'.format(log_path)) - - with open( - pkg_resources.resource_filename( - 'functest', 'ci/logging.ini'), 'wb') as configfile: - config.write(configfile) diff --git a/functest/api/resources/v1/tiers.py b/functest/api/resources/v1/tiers.py deleted file mode 100644 index 523df130e..000000000 --- a/functest/api/resources/v1/tiers.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Resources to handle tier related requests -""" - -import pkg_resources -import re - -from flask import jsonify -from flasgger.utils import swag_from - -from functest.api.base import ApiResource -from functest.api.common import api_utils -from functest.cli.commands.cli_tier import Tier - - -class V1Tiers(ApiResource): - """ V1Tiers Resource class """ - - @swag_from(pkg_resources.resource_filename( - 'functest', 'api/swagger/tiers.yaml')) - def get(self): - # pylint: disable=no-self-use - """ GET all tiers """ - tiers_list = Tier().list() - data = re.split("[\n\t]", tiers_list) - data = [i.strip() for i in data if i != ''] - data_dict = dict() - for i in range(len(data) / 2): - one_data = {data[i * 2].lstrip('- ').rstrip(':'): data[i * 2 + 1]} - if i == 0: - data_dict = one_data - else: - data_dict.update(one_data) - result = {'tiers': data_dict} - return jsonify(result) - - -class V1Tier(ApiResource): - """ V1Tier Resource class """ - - @swag_from(pkg_resources.resource_filename( - 'functest', 'api/swagger/tier.yaml')) - def get(self, tier_name): # pylint: disable=no-self-use - """ GET the info of one tier """ - tier_info = Tier().show(tier_name) - if not tier_info: - return api_utils.result_handler( - status=1, - data="The tier with name '%s' does not exist." % tier_name) - tier_info.__dict__.pop('name') - tier_info.__dict__.pop('tests_array') - tier_info.__dict__.pop('skipped_tests_array') - testcases = Tier().gettests(tier_name) - result = {'tier': tier_name, 'testcases': testcases} - result.update(tier_info.__dict__) - return jsonify(result) - - -class V1TestcasesinTier(ApiResource): - """ V1TestcasesinTier Resource class """ - - @swag_from(pkg_resources.resource_filename( - 'functest', 'api/swagger/testcases_in_tier.yaml')) - def get(self, tier_name): # pylint: disable=no-self-use - """ GET all testcases within given tier """ - tier_info = Tier().show(tier_name) - if not tier_info: - return api_utils.result_handler( - status=1, - data="The tier with name '%s' does not exist." % tier_name) - testcases = Tier().gettests(tier_name) - result = {'tier': tier_name, 'testcases': testcases} - return jsonify(result) diff --git a/functest/api/server.py b/functest/api/server.py deleted file mode 100644 index 3200c1a2f..000000000 --- a/functest/api/server.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Used to launch Functest RestApi - -""" - -import inspect -import logging -import socket -from urlparse import urljoin -import pkg_resources - -from flask import Flask -from flask_restful import Api -from flasgger import Swagger - -from functest.api.base import ApiResource -from functest.api.common import api_utils -from functest.api.database.db import BASE -from functest.api.database.db import DB_SESSION -from functest.api.database.db import ENGINE -from functest.api.database.v1 import models -from functest.api.urls import URLPATTERNS - - -LOGGER = logging.getLogger(__name__) - -APP = Flask(__name__) -API = Api(APP) -Swagger(APP) - - -@APP.teardown_request -def shutdown_session(exception=None): # pylint: disable=unused-argument - """ - To be called at the end of each request whether it is successful - or an exception is raised - """ - DB_SESSION.remove() - - -def get_resource(resource_name): - """ Obtain the required resource according to resource name """ - name = ''.join(resource_name.split('_')) - return next((r for r in api_utils.itersubclasses(ApiResource) - if r.__name__.lower() == name)) - - -def get_endpoint(url): - """ Obtain the endpoint of url """ - address = socket.gethostbyname(socket.gethostname()) - return urljoin('http://{}:5000'.format(address), url) - - -def api_add_resource(): - """ - The resource has multiple URLs and you can pass multiple URLs to the - add_resource() method on the Api object. Each one will be routed to - your Resource - """ - for url_pattern in URLPATTERNS: - try: - API.add_resource( - get_resource(url_pattern.target), url_pattern.url, - endpoint=get_endpoint(url_pattern.url)) - except StopIteration: - LOGGER.error('url resource not found: %s', url_pattern.url) - - -def init_db(): - """ - Import all modules here that might define models so that - they will be registered properly on the metadata, and then - create a database - """ - def func(subcls): - """ To check the subclasses of BASE""" - try: - if issubclass(subcls[1], BASE): - return True - except TypeError: - pass - return False - # pylint: disable=bad-builtin - subclses = filter(func, inspect.getmembers(models, inspect.isclass)) - LOGGER.debug('Import models: %s', [subcls[1] for subcls in subclses]) - BASE.metadata.create_all(bind=ENGINE) - - -def main(): - """Entry point""" - logging.config.fileConfig(pkg_resources.resource_filename( - 'functest', 'ci/logging.ini')) - logging.captureWarnings(True) - LOGGER.info('Starting Functest server') - api_add_resource() - init_db() - APP.run(host='0.0.0.0') diff --git a/functest/api/swagger/creds.yaml b/functest/api/swagger/creds.yaml deleted file mode 100644 index eec7cb345..000000000 --- a/functest/api/swagger/creds.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -Show credentials - -This api offers the interface to show credentials. -The credentials dict will be returned. ---- -tags: - - Creds -definitions: - Credentials: - type: object - properties: - creds_name: - $ref: '#/definitions/Name' - Name: - type: dict -responses: - 200: - description: Show credentials - schema: - $ref: '#/definitions/Credentials' - examples: - "OS_AUTH_URL": "https://192.16.1.222:5000/v3" - "OS_AUTH_VERSION": "3" - "OS_CACERT": "/home/opnfv/functest/conf/os_cacert" - "OS_ENDPOINT_TYPE": "publicURL" - "OS_IDENTITY_API_VERSION": "3" - "OS_INTERFACE": "publicURL" - "OS_NO_CACHE": "1" - "OS_PASSWORD": "990232e0885da343ac805528522d" - "OS_PROJECT_DOMAIN_NAME": "Default" - "OS_PROJECT_NAME": "admin" - "OS_REGION_NAME": "RegionOne" - "OS_TENANT_NAME": "admin" - "OS_USERNAME": "admin" - "OS_USER_DOMAIN_NAME": "Default" diff --git a/functest/api/swagger/creds_action.yaml b/functest/api/swagger/creds_action.yaml deleted file mode 100644 index 7e7653bb5..000000000 --- a/functest/api/swagger/creds_action.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -Update openrc - -This api offers the interface to Update openstack.creds. ---- -tags: - - Creds -parameters: - - in: body - name: body - description: this is the input json dict - schema: - required: - - action - - args - properties: - action: - type: string - description: this is action for creds - default: update_openrc - args: - schema: - required: - - openrc - properties: - openrc: - type: string - description: this is the test case name - default: - "OS_AUTH_URL": "http://192.16.1.222:5000/v3" - "OS_ENDPOINT_TYPE": "publicURL" - "OS_IDENTITY_API_VERSION": "3" - "OS_INTERFACE": "publicURL" - "OS_PASSWORD": "admn" - "OS_PROJECT_DOMAIN_NAME": "Default" - "OS_PROJECT_NAME": "admin" - "OS_REGION_NAME": "RegionOne" - "OS_TENANT_NAME": "admin" - "OS_USERNAME": "admin" - "OS_USER_DOMAIN_NAME": "Default" -definitions: - Credentials: - type: object - properties: - creds_name: - $ref: '#/definitions/Name' - Name: - type: dict -responses: - 200: - description: Update openrc - schema: - $ref: '#/definitions/Credentials' - examples: - 'status': 0 - 'result': 'Update openrc successfully' diff --git a/functest/api/swagger/envs.yaml b/functest/api/swagger/envs.yaml deleted file mode 100644 index 4ff50c86c..000000000 --- a/functest/api/swagger/envs.yaml +++ /dev/null @@ -1,27 +0,0 @@ ---- -Show environment - -This api offers the interface to show environment. -The environment dict will be returned. ---- -tags: - - Envs -definitions: - Environment: - type: object - properties: - creds_name: - $ref: '#/definitions/Name' - Name: - type: dict -responses: - 200: - description: Show environment - schema: - $ref: '#/definitions/Environment' - examples: - "DEBUG FLAG": "false" - "INSTALLER": "compass, 192.168.200.2" - "POD": "unknown_pod" - "SCENARIO": "os-nosdn-nofeature-noha" - "STATUS": "ready" diff --git a/functest/api/swagger/envs_action.yaml b/functest/api/swagger/envs_action.yaml deleted file mode 100644 index 3ad6c880d..000000000 --- a/functest/api/swagger/envs_action.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -Update hosts info - -This api offers the interface to update hosts info. ---- -tags: - - Envs -parameters: - - in: body - name: body - description: this is the input json dict - schema: - required: - - action - - args - properties: - action: - type: string - description: this is action for envs - default: update_hosts - args: - type: string - description: Hosts info to be updated - default: - "identity.ac.dz.com": "8.20.11.22" - "image.ac.dz.com": "8.20.11.22" -definitions: - Environment: - type: object - properties: - creds_name: - $ref: '#/definitions/Name' - Name: - type: dict -responses: - 200: - description: Update hosts info - schema: - $ref: '#/definitions/Environment' - examples: - 'status': 0 - 'result': 'Update hosts info successfully' diff --git a/functest/api/swagger/task.yaml b/functest/api/swagger/task.yaml deleted file mode 100644 index 3375b9065..000000000 --- a/functest/api/swagger/task.yaml +++ /dev/null @@ -1,37 +0,0 @@ ---- -Get the result of the specified task - -This api offers the interface to get the result of the specified task. ---- -tags: - - Tasks -parameters: - - name: task_id - description: task id - in: path - type: string - required: true -definitions: - Task: - type: object - properties: - creds_name: - $ref: '#/definitions/Result' - Result: - type: dict -responses: - 200: - description: Get the result of the specified task - schema: - $ref: '#/definitions/Task' - examples: - "result": { - "case_name": "vping_ssh", - "env_info": { - "build_tag": null, - "ci_loop": "weekly", - "installer": "compass", - "scenario": "os-nosdn-nofeature-noha"}, - "result": "PASS", - "task_id": "1a9f3c5d-ce0b-4354-862e-dd08b26fc484"} - "status": 2 diff --git a/functest/api/swagger/task_log.yaml b/functest/api/swagger/task_log.yaml deleted file mode 100644 index 120a8f6f7..000000000 --- a/functest/api/swagger/task_log.yaml +++ /dev/null @@ -1,37 +0,0 @@ ---- -Get the log of the specified task - -This api offers the interface to get the log of the specified task. ---- -tags: - - Tasks -parameters: - - name: task_id - description: task id - in: path - type: string - required: true -definitions: - Task: - type: object - properties: - creds_name: - $ref: '#/definitions/Result' - Result: - type: dict -responses: - 200: - description: Get the log of the specified task - schema: - $ref: '#/definitions/Task' - examples: - "result": { - "data": [ - "2017-09-14 06:46:26,106 - functest.ci.run_tests - DEBUG ", - "- Sourcing the OpenStack RC file... ", - "2017-09-14 06:46:26,107 - functest.ci.run_tests - DEBUG ", - "- Test args: connection_check ", - "2017-09-14 06:46:26,107 - functest.ci.run_tests - INFO ", - "- Running test case 'connection_check'... ", - "..."]} - "status": 2 diff --git a/functest/api/swagger/testcase.yaml b/functest/api/swagger/testcase.yaml deleted file mode 100644 index 34c13d217..000000000 --- a/functest/api/swagger/testcase.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -Show the info of one testcase - -This api offers the interface to show the detailed info of one testcase. -The info of one testcase will be returned. ---- -tags: - - Testcases -parameters: - - name: testcase_name - description: testcase name - in: path - type: string - required: true -definitions: - Testcases: - type: object - properties: - case_name: - $ref: '#/definitions/Tests' - Tests: - type: dict -responses: - 200: - description: Show the detailed info of one testcase - schema: - $ref: '#/definitions/Testcases' - examples: - "testcase": "" - "blocking": - "criteria": - "dependency": { - "installer": "", - "scenario": ""} - "description": "" - "enabled": diff --git a/functest/api/swagger/testcase_run.yaml b/functest/api/swagger/testcase_run.yaml deleted file mode 100644 index 7b254c86b..000000000 --- a/functest/api/swagger/testcase_run.yaml +++ /dev/null @@ -1,46 +0,0 @@ ---- -Run a test case - -This api offers the interface to run a test case ---- -tags: - - Testcases -parameters: - - in: body - name: body - description: this is the input json dict - schema: - required: - - action - - args - properties: - action: - type: string - description: this is action for creds - default: run_test_case - args: - schema: - required: - - testcase - properties: - testcase: - type: string - description: this is the test case name - default: - vping_ssh -definitions: - Testcases: - type: object - properties: - creds_name: - $ref: '#/definitions/Tests' - Tests: - type: dict -responses: - 200: - description: Run a test case - schema: - $ref: '#/definitions/Testcases' - examples: - 'task_id': '94c8ec94-d873-466f-a205-bf592f31ff5b' - 'testcase': 'vping_ssh' diff --git a/functest/api/swagger/testcases.yaml b/functest/api/swagger/testcases.yaml deleted file mode 100644 index 1dea21524..000000000 --- a/functest/api/swagger/testcases.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -List all test cases - -This api offers the interface to list all test cases -The testcases list will be returned ---- -tags: - - Testcases -definitions: - Testcases: - type: object - properties: - creds_name: - $ref: '#/definitions/Tests' - Tests: - type: dict -responses: - 200: - description: List all test cases - schema: - $ref: '#/definitions/Testcases' - examples: - "testcases": [] diff --git a/functest/api/swagger/testcases_in_tier.yaml b/functest/api/swagger/testcases_in_tier.yaml deleted file mode 100644 index af195ceb5..000000000 --- a/functest/api/swagger/testcases_in_tier.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -List all testcases within given tier - -This api offers the interface to list all testcases within given tier. -All testcases within given tier will be returned. ---- -tags: - - Tiers -parameters: - - name: tier_name - description: tier name - in: path - type: string - required: true -definitions: - Testcases: - type: object - properties: - creds_name: - $ref: '#/definitions/Tests' - Tests: - type: dict -responses: - 200: - description: List all testcases within given tier - schema: - $ref: '#/definitions/Testcases' - examples: - "tier": "" - "testcases": [] diff --git a/functest/api/swagger/tier.yaml b/functest/api/swagger/tier.yaml deleted file mode 100644 index 250cddf77..000000000 --- a/functest/api/swagger/tier.yaml +++ /dev/null @@ -1,33 +0,0 @@ ---- -Show the info of one tier - -This api offers the interface to show the detailed info of one tier. -The info of one tier will be returned. ---- -tags: - - Tiers -parameters: - - name: tier_name - description: tier name - in: path - type: string - required: true -definitions: - Tiers: - type: object - properties: - creds_name: - $ref: '#/definitions/Name' - Name: - type: string -responses: - 200: - description: Show the detailed info of one tier - schema: - $ref: '#/definitions/Tiers' - examples: - "tier": "" - "ci_loop": "" - "description": "" - "order": - "testcases": [] diff --git a/functest/api/swagger/tiers.yaml b/functest/api/swagger/tiers.yaml deleted file mode 100644 index d42b2cd98..000000000 --- a/functest/api/swagger/tiers.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -List all tiers - -This api offers the interface to list all tiers. -The tiers list will be returned. ---- -tags: - - Tiers -definitions: - Tiers: - type: object - properties: - creds_name: - $ref: '#/definitions/Tier' - Tier: - type: dict -responses: - 200: - description: List all tiers - schema: - $ref: '#/definitions/Tiers' - examples: - "tiers": "" diff --git a/functest/api/urls.py b/functest/api/urls.py deleted file mode 100644 index 10b7b2936..000000000 --- a/functest/api/urls.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -""" -Define multiple URLs -""" - - -class Url(object): # pylint: disable=too-few-public-methods - """ Url Class """ - - def __init__(self, url, target): - super(Url, self).__init__() - self.url = url - self.target = target - - -URLPATTERNS = [ - # GET /api/v1/functest/envs => GET environment - Url('/api/v1/functest/envs', 'v1_envs'), - - # POST /api/v1/functest/envs/action - # {"action":"update_hosts", "args": {}} => Update hosts info - Url('/api/v1/functest/envs/action', 'v1_envs'), - - # GET /api/v1/functest/openstack/credentials => GET credentials - Url('/api/v1/functest/openstack/credentials', 'v1_creds'), - - # POST /api/v1/functest/openstack/action - # {"action":"update_openrc", "args": {"openrc": {}}} => Update openrc - Url('/api/v1/functest/openstack/action', 'v1_creds'), - - # GET /api/v1/functest/testcases => GET all testcases - Url('/api/v1/functest/testcases', 'v1_test_cases'), - - # GET /api/v1/functest/testcases/<testcase_name> - # => GET the info of one testcase - Url('/api/v1/functest/testcases/<testcase_name>', 'v1_testcase'), - - # POST /api/v1/functest/testcases/action - # {"action":"run_test_case", "args": {"opts": {}, "testcase": "vping_ssh"}} - # => Run a testcase - Url('/api/v1/functest/testcases/action', 'v1_testcase'), - - # GET /api/v1/functest/testcases => GET all tiers - Url('/api/v1/functest/tiers', 'v1_tiers'), - - # GET /api/v1/functest/tiers/<tier_name> - # => GET the info of one tier - Url('/api/v1/functest/tiers/<tier_name>', 'v1_tier'), - - # GET /api/v1/functest/tiers/<tier_name>/testcases - # => GET all testcases within given tier - Url('/api/v1/functest/tiers/<tier_name>/testcases', - 'v1_testcases_in_tier'), - - # GET /api/v1/functest/tasks/<task_id> - # => GET the result of the task id - Url('/api/v1/functest/tasks/<task_id>', 'v1_task'), - - # GET /api/v1/functest/tasks/<task_id>/log - # => GET the log of the task - Url('/api/v1/functest/tasks/<task_id>/log', 'v1_task_log') -] diff --git a/functest/ci/add_proxy.sh b/functest/ci/add_proxy.sh new file mode 100644 index 000000000..9d7db22e4 --- /dev/null +++ b/functest/ci/add_proxy.sh @@ -0,0 +1,138 @@ +#!/bin/sh + +set -e + +initdir=$(pwd) +cd "${1:-/home/opnfv/functest/images}" + +http_proxy_host=${http_proxy_host:-proxy} +http_proxy_port=${http_proxy_port:-8080} + +http_proxy=http://${http_proxy_host}:${http_proxy_port} +https_proxy=${https_proxy:-${http_proxy:-http://proxy:8080}} +ftp_proxy=${ftp_proxy:-${http_proxy:-http://proxy:8080}} +no_proxy=${no_proxy:-"10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"} + +images=${images-"\ +ubuntu-14.04-server-cloudimg-amd64-disk1.img \ +ubuntu-16.04-server-cloudimg-amd64-disk1.img"} + +add_proxy () { + cat << EOF >> "$1" +http_proxy=${http_proxy} +HTTP_PROXY=${http_proxy} +https_proxy=${https_proxy} +HTTPS_PROXY=${https_proxy} +ftp_proxy=${ftp_proxy} +FTP_PROXY=${ftp_proxy} +no_proxy=${no_proxy} +NO_PROXY=${no_proxy} +EOF +} + +add_proxy_apt () { + cat << EOF >> "$1" +Acquire::http::Proxy "${http_proxy}"; +Acquire::https::Proxy "${https_proxy}"; +EOF +} + +add_proxy_juju_env () { + cat << EOF >> "$1" +export no_proxy="${no_proxy}"; +export NO_PROXY="${no_proxy}"; +EOF +} + +add_proxy_juju_systemd () { + cat << EOF >> "$1" +[Manager] +DefaultEnvironment="no_proxy='${no_proxy}'" "NO_PROXY='${no_proxy}'" +EOF +} + +add_proxy_maven () { + cat << EOF >> "$1" +<settings> + <proxies> + <proxy> + <id>example-proxy</id> + <active>true</active> + <protocol>http</protocol> + <host>"${http_proxy_host}"</host> + <port>"${http_proxy_port}"</port> + </proxy> + </proxies> +</settings> +EOF +} + +add_proxy_svn () { + cat << EOF >> "$1" +[global] +http-proxy-host = "${http_proxy_host}" +http-proxy-port = "${http_proxy_port}" +EOF +} + +add_proxy_pip () { + cat << EOF >> "$1" +[global] +proxy="${http_proxy}" +EOF +} + +tmpdir=$(mktemp -d) +for image in $images; do + if [ ! -f "$image" ]; then + echo "skip ${image} ($(pwd)/${image} not found)" + continue + fi + guestmount -a "${image}" -i --rw "${tmpdir}" + add_proxy "${tmpdir}/etc/environment" + if expr "$image" : 'ubuntu' ; then + add_proxy_apt "${tmpdir}/etc/apt/apt.conf" + add_proxy_juju_env "${tmpdir}/etc/juju-proxy.conf" + add_proxy_juju_systemd "${tmpdir}/etc/juju-proxy-systemd.conf" + mkdir -p ${tmpdir}/root/.m2 + mkdir -p ${tmpdir}/root/.subversion + add_proxy_maven "${tmpdir}/root/.m2/settings.xml" + add_proxy_svn "${tmpdir}/root/.subversion/servers" + add_proxy_pip "${tmpdir}/etc/pip.conf" + fi + guestunmount "${tmpdir}" +done + +if [ -f cloudify-docker-manager-community-19.01.24.tar ]; then + sudo docker load -i cloudify-docker-manager-community-19.01.24.tar + dockerfile=${tmpdir}/Dockerfile + cat << EOF > $dockerfile +FROM docker-cfy-manager:latest +ENV HTTP_PROXY "${http_proxy}" +ENV HTTPS_PROXY "${https_proxy}" +ENV NO_PROXY "${no_proxy}" +EOF + for f in /etc/sysconfig/cloudify-mgmtworker /etc/sysconfig/cloudify-restservice; do \ + cat << EOF >> $dockerfile +RUN echo >> $f +RUN echo "http_proxy=${http_proxy}" >> $f +RUN echo "https_proxy=${https_proxy}" >> $f +RUN echo "HTTP_PROXY=${http_proxy}" >> $f +RUN echo "HTTPS_PROXY=${https_proxy}" >> $f +RUN echo "no_proxy=${no_proxy}" >> $f +EOF + done + sudo docker build -t docker-cfy-manager -f $dockerfile ${tmpdir} + sudo docker save \ + docker-cfy-manager > cloudify-docker-manager-community-19.01.24.tar + sudo docker rmi docker-cfy-manager + + rm "${dockerfile}" +else + echo "skip cloudify-docker-manager-community-19.01.24.tar \ + ($(pwd)/cloudify-docker-manager-community-19.01.24.tar not found)" +fi + +rmdir "${tmpdir}" +cd initdir + diff --git a/functest/ci/check_deployment.py b/functest/ci/check_deployment.py deleted file mode 100644 index 9453c6d49..000000000 --- a/functest/ci/check_deployment.py +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Ericsson 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 - -""" -OpenStack deployment checker - -Verifies that: - - Credentials file is given and contains the right information - - OpenStack endpoints are reachable -""" - -import logging -import logging.config -import os -import pkg_resources -from six.moves import urllib -import socket - -from functest.opnfv_tests.openstack.snaps import snaps_utils - -from snaps.openstack.tests import openstack_tests -from snaps.openstack.utils import glance_utils -from snaps.openstack.utils import keystone_utils -from snaps.openstack.utils import neutron_utils -from snaps.openstack.utils import nova_utils - -__author__ = "Jose Lausuch <jose.lausuch@ericsson.com>" - -LOGGER = logging.getLogger(__name__) - - -def verify_connectivity(endpoint): - """ Returns true if an hostname/port is reachable""" - connection = socket.socket() - connection.settimeout(10) - hostname = urllib.parse.urlparse(endpoint).hostname - port = urllib.parse.urlparse(endpoint).port - if not port: - port = 443 if urllib.parse.urlparse(endpoint).scheme == "https" else 80 - try: - connection.connect((hostname, port)) - LOGGER.debug('%s:%s is reachable!', hostname, port) - return True - except socket.error: - LOGGER.exception('%s:%s is not reachable.', hostname, port) - return False - - -def get_auth_token(os_creds): - """ Get auth token """ - sess = keystone_utils.keystone_session(os_creds) - try: - return sess.get_token() - except Exception as error: - LOGGER.error("Got token ...FAILED") - raise error - - -class CheckDeployment(object): - """ Check deployment class.""" - - def __init__(self, rc_file='/home/opnfv/functest/conf/openstack.creds'): - self.rc_file = rc_file - self.services = ('compute', 'network', 'image') - self.os_creds = None - - def check_rc(self): - """ Check if RC file exists and contains OS_AUTH_URL """ - if not os.path.isfile(self.rc_file): - raise IOError('RC file {} does not exist!'.format(self.rc_file)) - if 'OS_AUTH_URL' not in open(self.rc_file).read(): - raise SyntaxError('OS_AUTH_URL not defined in {}.'. - format(self.rc_file)) - - def check_auth_endpoint(self): - """ Verifies connectivity to the OS_AUTH_URL given in the RC file - and get auth token""" - rc_endpoint = self.os_creds.auth_url - if not verify_connectivity(rc_endpoint): - raise Exception("OS_AUTH_URL {} is not reachable.". - format(rc_endpoint)) - LOGGER.info("Connectivity to OS_AUTH_URL %s ...OK", rc_endpoint) - if get_auth_token(self.os_creds): - LOGGER.info("Got token ...OK") - - def check_public_endpoint(self): - """ Gets the public endpoint and verifies connectivity to it """ - public_endpoint = keystone_utils.get_endpoint(self.os_creds, - 'identity', - interface='public') - if not verify_connectivity(public_endpoint): - raise Exception("Public endpoint {} is not reachable.". - format(public_endpoint)) - LOGGER.info("Connectivity to the public endpoint %s ...OK", - public_endpoint) - - def check_service_endpoint(self, service): - """ Verifies connectivity to a given openstack service """ - endpoint = keystone_utils.get_endpoint(self.os_creds, - service, - interface='public') - if not verify_connectivity(endpoint): - raise Exception("{} endpoint {} is not reachable.". - format(service, endpoint)) - LOGGER.info("Connectivity to endpoint '%s' %s ...OK", - service, endpoint) - - def check_nova(self): - """ checks that a simple nova operation works """ - try: - client = nova_utils.nova_client(self.os_creds) - client.servers.list() - LOGGER.info("Nova service ...OK") - except Exception as error: - LOGGER.error("Nova service ...FAILED") - raise error - - def check_neutron(self): - """ checks that a simple neutron operation works """ - try: - client = neutron_utils.neutron_client(self.os_creds) - client.list_networks() - LOGGER.info("Neutron service ...OK") - except Exception as error: - LOGGER.error("Neutron service ...FAILED") - raise error - - def check_glance(self): - """ checks that a simple glance operation works """ - try: - client = glance_utils.glance_client(self.os_creds) - client.images.list() - LOGGER.info("Glance service ...OK") - except Exception as error: - LOGGER.error("Glance service ...FAILED") - raise error - - def check_ext_net(self): - """ checks if external network exists """ - ext_net = snaps_utils.get_ext_net_name(self.os_creds) - if ext_net: - LOGGER.info("External network found: %s", ext_net) - else: - raise Exception("ERROR: No external networks in the deployment.") - - def check_all(self): - """ - Calls all the class functions and returns 0 if all of them succeed. - This is the method called by CLI - """ - self.check_rc() - try: - self.os_creds = openstack_tests.get_credentials( - os_env_file=self.rc_file, - proxy_settings_str=None, - ssh_proxy_cmd=None) - except: - raise Exception("Problem while getting credentials object.") - if self.os_creds is None: - raise Exception("Credentials is None.") - self.check_auth_endpoint() - self.check_public_endpoint() - for service in self.services: - self.check_service_endpoint(service) - self.check_nova() - self.check_neutron() - self.check_glance() - self.check_ext_net() - return 0 - - -def main(): - """Entry point""" - logging.config.fileConfig(pkg_resources.resource_filename( - 'functest', 'ci/logging.ini')) - logging.captureWarnings(True) - deployment = CheckDeployment() - return deployment.check_all() diff --git a/functest/ci/config_aarch64_patch.yaml b/functest/ci/config_aarch64_patch.yaml index a87fe25be..278265620 100644 --- a/functest/ci/config_aarch64_patch.yaml +++ b/functest/ci/config_aarch64_patch.yaml @@ -1,56 +1,99 @@ --- os: - general: - openstack: - image_name: TestVM - image_file_name: cirros-d161201-aarch64-disk.img - image_password: gocubsgo - extra_properties: - hw_firmware_type: 'uefi' - hw_video_model: 'vga' - short_id: 'ubuntu16.04' - snaps: - images: - glance_tests: - disk_file: - /home/opnfv/functest/images/cirros-d161201-aarch64-disk.img - extra_properties: - hw_firmware_type: 'uefi' - short_id: 'ubuntu16.04' - hw_video_model: 'vga' - cirros: - disk_file: - /home/opnfv/functest/images/cirros-d161201-aarch64-disk.img - extra_properties: - hw_firmware_type: 'uefi' - short_id: 'ubuntu16.04' - hw_video_model: 'vga' - ubuntu: - disk_file: - /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-arm64-uefi1.img - extra_properties: - hw_firmware_type: 'uefi' - hw_video_model: 'vga' - centos: - disk_file: - /home/opnfv/functest/images/CentOS-7-aarch64-GenericCloud.qcow2 - extra_properties: - hw_firmware_type: 'uefi' - hw_video_model: 'vga' - - vping: - image_name: TestVM - - tempest: - use_custom_flavors: 'True' - - odl_sfc: - image_base_url: "http://artifacts.opnfv.org/sfc/demo" - image_name: sfc_nsh_danube - image_file_name: sf_nsh_danube_arm64.img - image_initrd: sf_nsh_danube_arm64-initrd - image_kernel: sf_nsh_danube_arm64-kernel - image_format: ami - os_cmd_line: 'root=LABEL=cloudimg-rootfs ro' - doctor: - image_name: TestVM + vmready1: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + vmready2: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + singlevm1: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + singlevm2: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + vping_ssh: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + vping_userdata: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + cinder_test: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_smoke: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_horizon: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_neutron: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_cinder: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_keystone: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_heat: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: + /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2 + tempest_telemetry: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + rally_sanity: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + refstack_compute: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + refstack_object: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + refstack_platform: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_full: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_scenario: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_slow: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + patrole: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_barbican: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_octavia: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_neutron_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_cinder_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_keystone_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_heat_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: + /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2 + rally_sanity_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_full_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_scenario_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + tempest_slow_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + image_alt: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + rally_full: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + rally_jobs: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + rally_full_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img + rally_jobs_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-aarch64-disk.img diff --git a/functest/ci/config_functest.yaml b/functest/ci/config_functest.yaml index cf6b13287..647301ab4 100644 --- a/functest/ci/config_functest.yaml +++ b/functest/ci/config_functest.yaml @@ -11,18 +11,17 @@ general: functest_conf: /home/opnfv/functest/conf functest_data: /home/opnfv/functest/data ims_data: /home/opnfv/functest/data/ims/ - router_data: /home/opnfv/functest/data/router/ + rally_data: /home/opnfv/functest/data/rally + refstack_data: /home/opnfv/functest/data/refstack + router_data: /home/opnfv/functest/data/router/opnfv-vnf-data functest_images: /home/opnfv/functest/images rally_inst: /root/.rally openstack: - creds: /home/opnfv/functest/conf/openstack.creds - - image_name: Cirros-0.4.0 - image_name_alt: Cirros-0.4.0-1 - image_file_name: cirros-0.4.0-x86_64-disk.img - image_url: - http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img + image_name: Cirros-0.5.1 + image_name_alt: Cirros-0.5.1-1 + image_file_name: cirros-0.5.1-x86_64-disk.img + image_url: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.img image_user: cirros image_disk_format: qcow2 image_username: cirros @@ -43,45 +42,6 @@ general: neutron_private_subnet_gateway: 192.168.120.254 neutron_router_name: functest-router -snaps: - use_keystone: 'True' - use_floating_ips: 'True' - images: - glance_tests: - disk_file: /home/opnfv/functest/images/cirros-0.4.0-x86_64-disk.img - cirros: - disk_file: /home/opnfv/functest/images/cirros-0.4.0-x86_64-disk.img - ubuntu: - disk_file: - /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.img - centos: - disk_file: - /home/opnfv/functest/images/CentOS-7-x86_64-GenericCloud.qcow2 - # netconf_override: - # network_type: vlan - # physical_network: physnet2 - # segmentation_id: 2366 - -# All of these values are optional and will override the values retrieved -# by the RC file -# os_creds_override: -# username: {user} -# password: {password} -# auth_url: {auth_url} -# project_name: {project_name} -# identity_api_version: {2|3} -# network_api_version: {2} -# compute_api_version: {2} -# image_api_version: {1|2} -# user_domain_id: {user_domain_id} -# project_domain_id: {projects_domain_id} -# interface: {interface} -# cacert: {True|False} -# proxy_settings: -# host: {proxy_host} -# port: {proxy_port} -# ssh_proxy_cmd: {OpenSSH -o ProxyCommand value} - vping: ping_timeout: 200 vm_flavor: m1.tiny # adapt to your environment @@ -95,9 +55,9 @@ vping: private_subnet_name: vping-subnet private_subnet_cidr: 192.168.130.0/24 router_name: vping-router - sg_name: vPing-sg + sg_name: vping-sg sg_desc: Security group for vPing test case - keypair_name: vPing-keypair + keypair_name: vping-keypair keypair_priv_file: /tmp/vPing-keypair keypair_pub_file: /tmp/vPing-keypair.pub vm_boot_timeout: 180 @@ -105,6 +65,24 @@ vping: vm_ssh_connect_timeout: 60 cleanup_objects: 'True' +cinder: + vm_name_1: opnfv-cinder-1 + vm_name_2: opnfv-cinder-2 + image_name: functest-cinder + private_net_name: cinder-net + private_subnet_name: cinder-subnet + private_subnet_cidr: 192.168.130.0/24 + router_name: cinder-router + sg_name: cinder-sg + sg_desc: Security group for CinderCheck test case + keypair_name: cinder-keypair + keypair_priv_file: /tmp/CinderCheck-keypair + keypair_pub_file: /tmp/CinderCheck-keypair.pub + vm_boot_timeout: 180 + vm_delete_timeout: 100 + vm_ssh_connect_timeout: 60 + cleanup_objects: 'True' + odl_sfc: image_base_url: "http://artifacts.opnfv.org/sfc/images" image_name: sfc_nsh_danube @@ -113,36 +91,9 @@ odl_sfc: tempest: verifier_name: opnfv-tempest - identity: - tenant_name: tempest - tenant_description: Tenant for Tempest test suite - user_name: tempest - user_password: Tempest123! - validation: - ssh_timeout: 130 - object_storage: - operator_role: SwiftOperator - # network_type: vlan - # physical_network: physnet2 - # segmentation_id: 2366 - private_net_name: tempest-net - private_subnet_name: tempest-subnet - private_subnet_cidr: 192.168.150.0/24 - router_name: tempest-router - use_custom_flavors: 'False' - volume_device_name: vdc rally: deployment_name: opnfv-rally - network_name: rally-net - # network_type: vlan - # physical_network: physnet2 - # segmentation_id: 2366 - subnet_name: rally-subnet - subnet_cidr: 192.168.140.0/24 - router_name: rally-router - flavor_name: rally-tiny - flavor_alt_name: rally-mini vnf: juju_epc: @@ -153,17 +104,12 @@ vnf: private_subnet_cidr: 172.16.0.0/24 private_subnet_name: abot-subnet external_router: abot-router - external_network_name: ext-net - dns_nameserver: ['8.8.8.8'] - cloudify_ims: tenant_name: cloudify_ims tenant_description: vIMS config: cloudify_ims.yaml - cloudify_ims_perf: - tenant_name: cloudify_ims_perf - tenant_description: vIMS - config: cloudify_ims_perf.yaml + heat_ims: + config: heat_ims.yaml orchestra_openims: tenant_name: orchestra_openims tenant_description: OpenIMS deployed with Open Baton @@ -187,14 +133,3 @@ example: router_name: example-router sg_name: example-sg sg_desc: Example Security group - -results: - # you can also set a file (e.g. /home/opnfv/functest/results/dump.txt) - # to dump results - # test_db_url: file:///home/opnfv/functest/results/dump.txt - test_db_url: http://testresults.opnfv.org/test/api/v1/results - -energy_recorder: - api_url: http://energy.opnfv.fr/resources - api_user: "" - api_password: "" diff --git a/functest/ci/config_patch.yaml b/functest/ci/config_patch.yaml index 32b67057f..d5335c3ab 100644 --- a/functest/ci/config_patch.yaml +++ b/functest/ci/config_patch.yaml @@ -1,20 +1,504 @@ --- -lxd: - general: - openstack: - image_name: Cirros-0.4.0 - image_file_name: cirros-0.4.0-x86_64-lxc.tar.gz - image_disk_format: raw +gsma: + tempest_smoke: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_horizon: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_neutron: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_cinder: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_keystone: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_heat: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_telemetry: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + rally_sanity: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + refstack_compute: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + refstack_object: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + refstack_platform: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_full: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_scenario: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_slow: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + patrole: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_barbican: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_octavia: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_neutron_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_cinder_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_keystone_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_heat_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + rally_sanity_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_full_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_scenario_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + tempest_slow_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + rally_full: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + rally_jobs: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + vmtp: + flavor_ram: 2048 + flavor_vcpus: 1 + flavor_disk: 40 + shaker: + flavor_ram: 2048 + flavor_vcpus: 1 + flavor_disk: 40 + rally_full_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + rally_jobs_cntt: + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + cloudify: + flavor_ram: 4096 + flavor_vcpus: 2 + flavor_disk: 40 + cloudify_ims: + flavor_ram: 4096 + flavor_vcpus: 2 + flavor_disk: 40 + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + heat_ims: + flavor_ram: 2048 + flavor_vcpus: 1 + flavor_disk: 40 + vyos_vrouter: + flavor_ram: 4096 + flavor_vcpus: 2 + flavor_disk: 40 + flavor_alt_ram: 2048 + flavor_alt_vcpus: 1 + flavor_alt_disk: 40 + juju_epc: + flavor_ram: 2048 + flavor_vcpus: 1 + flavor_disk: 40 + flavor_alt_ram: 4096 + flavor_alt_vcpus: 2 + flavor_alt_disk: 40 fdio: - general: - flavor_extra_specs: {'hw:mem_page_size':'large'} - image_properties: {'hw_mem_page_size':'large'} - tempest: - use_custom_flavors: 'True' + vmready1: + flavor_ram: 1024 + vmready2: + flavor_ram: 1024 + singlevm1: + flavor_ram: 1024 + singlevm2: + flavor_ram: 1024 + vping_ssh: + flavor_ram: 1024 + vping_userdata: + flavor_ram: 1024 + cinder_test: + flavor_ram: 1024 + tempest_smoke: + flavor_ram: 1024 + tempest_horizon: + flavor_ram: 1024 + tempest_neutron: + flavor_ram: 1024 + tempest_cinder: + flavor_ram: 1024 + tempest_keystone: + flavor_ram: 1024 + tempest_heat: + flavor_ram: 1024 + tempest_telemetry: + flavor_ram: 1024 + rally_sanity: + flavor_ram: 1024 + refstack_compute: + flavor_ram: 1024 + refstack_object: + flavor_ram: 1024 + refstack_platform: + flavor_ram: 1024 + tempest_full: + flavor_ram: 1024 + tempest_scenario: + flavor_ram: 1024 + tempest_slow: + flavor_ram: 1024 + patrole: + flavor_ram: 1024 + tempest_barbican: + flavor_ram: 1024 + tempest_octavia: + flavor_ram: 1024 + tempest_neutron_cntt: + flavor_ram: 1024 + tempest_cinder_cntt: + flavor_ram: 1024 + tempest_keystone_cntt: + flavor_ram: 1024 + tempest_heat_cntt: + flavor_ram: 1024 + rally_sanity_cntt: + flavor_ram: 1024 + tempest_full_cntt: + flavor_ram: 1024 + tempest_scenario_cntt: + flavor_ram: 1024 + tempest_slow_cntt: + flavor_ram: 1024 + rally_full: + flavor_ram: 1024 + rally_jobs: + flavor_ram: 1024 + vmtp: + flavor_ram: 2048 + shaker: + flavor_ram: 1024 + rally_full_cntt: + flavor_ram: 1024 + rally_jobs_cntt: + flavor_ram: 1024 + ovs: - general: - flavor_extra_specs: {'hw:mem_page_size':'large'} - image_properties: {'hw_mem_page_size':'large'} - tempest: - use_custom_flavors: 'True' + vmready1: + flavor_ram: 1024 + vmready2: + flavor_ram: 1024 + singlevm1: + flavor_ram: 1024 + singlevm2: + flavor_ram: 1024 + vping_ssh: + flavor_ram: 1024 + vping_userdata: + flavor_ram: 1024 + cinder_test: + flavor_ram: 1024 + tempest_smoke: + flavor_ram: 1024 + tempest_horizon: + flavor_ram: 1024 + tempest_neutron: + flavor_ram: 1024 + tempest_cinder: + flavor_ram: 1024 + tempest_keystone: + flavor_ram: 1024 + tempest_heat: + flavor_ram: 1024 + tempest_telemetry: + flavor_ram: 1024 + rally_sanity: + flavor_ram: 1024 + refstack_compute: + flavor_ram: 1024 + refstack_object: + flavor_ram: 1024 + refstack_platform: + flavor_ram: 1024 + tempest_full: + flavor_ram: 1024 + tempest_scenario: + flavor_ram: 1024 + tempest_slow: + flavor_ram: 1024 + patrole: + flavor_ram: 1024 + tempest_barbican: + flavor_ram: 1024 + tempest_octavia: + flavor_ram: 1024 + tempest_neutron_cntt: + flavor_ram: 1024 + tempest_cinder_cntt: + flavor_ram: 1024 + tempest_keystone_cntt: + flavor_ram: 1024 + tempest_heat_cntt: + flavor_ram: 1024 + rally_sanity_cntt: + flavor_ram: 1024 + tempest_full_cntt: + flavor_ram: 1024 + tempest_scenario_cntt: + flavor_ram: 1024 + tempest_slow_cntt: + flavor_ram: 1024 + rally_full: + flavor_ram: 1024 + rally_jobs: + flavor_ram: 1024 + vmtp: + flavor_ram: 2048 + shaker: + flavor_ram: 1024 + rally_full_cntt: + flavor_ram: 1024 + rally_jobs_cntt: + flavor_ram: 1024 + +vio: + vmready1: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + vmready2: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + singlevm1: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + singlevm2: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + vping_ssh: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + vping_userdata: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + cinder_test: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + tempest_smoke: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_horizon: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_neutron: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_cinder: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_keystone: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_heat: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: + /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.x86_64.vmdk + image_alt_format: vmdk + tempest_telemetry: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + rally_sanity: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + refstack_compute: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + refstack_object: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + refstack_platform: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_full: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_scenario: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_slow: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + patrole: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_barbican: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_octavia: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_neutron_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_cinder_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_keystone_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_heat_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: + /home/opnfv/functest/images/Fedora-Cloud-Base-30-1.2.x86_64.vmdk + image_alt_format: vmdk + rally_sanity_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + tempest_full_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_scenario_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + tempest_slow_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_alt_format: vmdk + rally_full: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + rally_jobs: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + vmtp: + image: + /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk + image_format: vmdk + shaker: + image: /home/opnfv/functest/images/shaker-image.vmdk + image_format: vmdk + rally_full_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + rally_jobs_cntt: + image: /home/opnfv/functest/images/cirros-0.5.1-x86_64-disk.vmdk + image_format: vmdk + cloudify: + image: + /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk + image_format: vmdk + cloudify_ims: + image: + /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk + image_format: vmdk + image_alt: + /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk + image_alt_format: vmdk + heat_ims: + image: + /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk + image_format: vmdk + vyos_vrouter: + image: + /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk + image_format: vmdk + image_alt: /home/opnfv/functest/images/vyos-1.1.7.vmdk + image_alt_format: vmdk + juju_epc: + image: + /home/opnfv/functest/images/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdk + image_format: vmdk + image_alt: + /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.vmdk + image_alt_format: vmdk diff --git a/functest/ci/convert_images.sh b/functest/ci/convert_images.sh new file mode 100644 index 000000000..2159d2a60 --- /dev/null +++ b/functest/ci/convert_images.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +set -ex + +initdir=$(pwd) + +cd "${1:-/home/opnfv/functest/images}" + +for i in *.img *.qcow2; do + qemu-img convert -f qcow2 -O vmdk "$i" "${i%.*}.vmdk" +done + +cd $initdir diff --git a/functest/ci/download_images.sh b/functest/ci/download_images.sh index 14cda1470..a56c02b60 100644 --- a/functest/ci/download_images.sh +++ b/functest/ci/download_images.sh @@ -1,24 +1,19 @@ -#!/bin/bash +#!/bin/sh set -ex wget_opts="-N --tries=1 --connect-timeout=30" +[ -t 1 ] || wget_opts="${wget_opts} --progress=dot:giga" cat << EOF | wget ${wget_opts} -i - -P ${1:-/home/opnfv/functest/images} -http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img +http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img -https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2 https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img -http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2 -http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img -http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-lxc.tar.gz -http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img -http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-initramfs -http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-kernel -https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-arm64-uefi1.img -http://cloud.centos.org/altarch/7/images/aarch64/CentOS-7-aarch64-GenericCloud.qcow2.xz -https://sourceforge.net/projects/ool-opnfv/files/vyos-1.1.7.img -http://marketplace.openbaton.org:8080/api/v1/images/52e2ccc0-1dce-4663-894d-28aab49323aa/img +https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.img +http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-aarch64-disk.img +http://repository.cloudifysource.org/cloudify/19.01.24/community-release/cloudify-docker-manager-community-19.01.24.tar +http://testresults.opnfv.org/functest/vyos-1.1.8-amd64.qcow2 +http://testresults.opnfv.org/functest/shaker-image-1.3.4+stretch.qcow2 +https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/30/Cloud/x86_64/images/Fedora-Cloud-Base-30-1.2.x86_64.qcow2 +https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/30/Cloud/aarch64/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2 EOF - -xz --decompress --force --keep ${1:-/home/opnfv/functest/images}/CentOS-7-aarch64-GenericCloud.qcow2.xz diff --git a/functest/ci/logging.debug.ini b/functest/ci/logging.debug.ini new file mode 100644 index 000000000..c926a5055 --- /dev/null +++ b/functest/ci/logging.debug.ini @@ -0,0 +1,110 @@ +[loggers] +keys=root,functest,api,ci,core,cli,opnfv_tests,utils,xtesting,xci,xcore,xutils,sfc,baro,warnings + +[handlers] +keys=console,wconsole,file,dfile + +[formatters] +keys=standard + +[logger_root] +level=NOTSET +handlers=dfile + +[logger_functest] +level=NOTSET +handlers=file +qualname=functest + +[logger_api] +level=NOTSET +handlers=wconsole +qualname=functest.api + +[logger_ci] +level=NOTSET +handlers=console +qualname=functest.ci + +[logger_core] +level=NOTSET +handlers=console +qualname=functest.core + +[logger_cli] +level=NOTSET +handlers=wconsole +qualname=functest.cli + +[logger_opnfv_tests] +level=NOTSET +handlers=wconsole +qualname=functest.opnfv_tests + +[logger_utils] +level=NOTSET +handlers=wconsole +qualname=functest.utils + +[logger_xtesting] +level=NOTSET +handlers=file +qualname=xtesting + +[logger_xci] +level=NOTSET +handlers=console +qualname=xtesting.ci + +[logger_xcore] +level=NOTSET +handlers=console +qualname=xtesting.core + +[logger_xutils] +level=NOTSET +handlers=wconsole +qualname=xtesting.utils + +[logger_sfc] +level=NOTSET +handlers=file,wconsole +qualname=sfc + +[logger_baro] +level=NOTSET +handlers=file,wconsole +qualname=baro_tests + +[logger_warnings] +level=NOTSET +handlers=file,console +qualname=py.warnings + +[handler_console] +class=StreamHandler +level=INFO +formatter=standard +args=(sys.stdout,) + +[handler_wconsole] +class=StreamHandler +level=WARN +formatter=standard +args=(sys.stdout,) + +[handler_file] +class=FileHandler +level=INFO +formatter=standard +args=("/home/opnfv/functest/results/functest.log",) + +[handler_dfile] +class=FileHandler +level=DEBUG +formatter=standard +args=("/home/opnfv/functest/results/functest.debug.log",) + +[formatter_standard] +format=%(asctime)s - %(name)s - %(levelname)s - %(message)s +datefmt= diff --git a/functest/ci/logging.ini b/functest/ci/logging.ini index f1ab72414..dde079493 100644 --- a/functest/ci/logging.ini +++ b/functest/ci/logging.ini @@ -1,5 +1,5 @@ [loggers] -keys=root,functest,api,ci,cli,core,energy,opnfv_tests,utils +keys=root,functest,api,ci,core,cli,opnfv_tests,utils,xtesting,xci,xcore,xutils,sfc,baro,warnings [handlers] keys=console,wconsole,file,null @@ -26,20 +26,15 @@ level=NOTSET handlers=console qualname=functest.ci -[logger_cli] -level=NOTSET -handlers=wconsole -qualname=functest.cli - [logger_core] level=NOTSET handlers=console qualname=functest.core -[logger_energy] +[logger_cli] level=NOTSET handlers=wconsole -qualname=functest.energy +qualname=functest.cli [logger_opnfv_tests] level=NOTSET @@ -51,6 +46,41 @@ level=NOTSET handlers=wconsole qualname=functest.utils +[logger_xtesting] +level=NOTSET +handlers=file +qualname=xtesting + +[logger_xci] +level=NOTSET +handlers=console +qualname=xtesting.ci + +[logger_xcore] +level=NOTSET +handlers=console +qualname=xtesting.core + +[logger_xutils] +level=NOTSET +handlers=wconsole +qualname=xtesting.utils + +[logger_sfc] +level=NOTSET +handlers=file,wconsole +qualname=sfc + +[logger_baro] +level=NOTSET +handlers=file,wconsole +qualname=baro_tests + +[logger_warnings] +level=NOTSET +handlers=file,console +qualname=py.warnings + [handler_null] class=NullHandler level=NOTSET @@ -71,7 +101,7 @@ args=(sys.stdout,) [handler_file] class=FileHandler -level=DEBUG +level=INFO formatter=standard args=("/home/opnfv/functest/results/functest.log",) diff --git a/functest/ci/rally_aarch64_patch.conf b/functest/ci/rally_aarch64_patch.conf index e5cae8137..4ea0d7605 100644 --- a/functest/ci/rally_aarch64_patch.conf +++ b/functest/ci/rally_aarch64_patch.conf @@ -1,5 +1,5 @@ img_name_regex = ^TestVM$ -img_url = http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img +img_url = http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-aarch64-disk.img flavor_ref_ram = 256 flavor_ref_alt_ram = 256 heat_instance_type_ram = 256 diff --git a/functest/ci/run_tests.py b/functest/ci/run_tests.py deleted file mode 100644 index 6748484d7..000000000 --- a/functest/ci/run_tests.py +++ /dev/null @@ -1,289 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Ericsson AB 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 - -""" The entry of running tests: -1) Parses functest/ci/testcases.yaml to check which testcase(s) to be run -2) Execute the common operations on every testcase (run, push results to db...) -3) Return the right status code -""" - -import argparse -import enum -import importlib -import logging -import logging.config -import os -import re -import sys -import textwrap -import pkg_resources - -import prettytable - -import functest.ci.tier_builder as tb -import functest.core.testcase as testcase -import functest.utils.functest_utils as ft_utils -import functest.utils.openstack_utils as os_utils -from functest.utils.constants import CONST - -# __name__ cannot be used here -LOGGER = logging.getLogger('functest.ci.run_tests') - -CONFIG_FUNCTEST_PATH = pkg_resources.resource_filename( - 'functest', 'ci/config_functest.yaml') - - -class Result(enum.Enum): - """The overall result in enumerated type""" - # pylint: disable=too-few-public-methods - EX_OK = os.EX_OK - EX_ERROR = -1 - - -class BlockingTestFailed(Exception): - """Exception when the blocking test fails""" - pass - - -class TestNotEnabled(Exception): - """Exception when the test is not enabled""" - pass - - -class RunTestsParser(object): - """Parser to run tests""" - # pylint: disable=too-few-public-methods - - def __init__(self): - self.parser = argparse.ArgumentParser() - self.parser.add_argument("-t", "--test", dest="test", action='store', - help="Test case or tier (group of tests) " - "to be executed. It will run all the test " - "if not specified.") - self.parser.add_argument("-n", "--noclean", help="Do not clean " - "OpenStack resources after running each " - "test (default=false).", - action="store_true") - self.parser.add_argument("-r", "--report", help="Push results to " - "database (default=false).", - action="store_true") - - def parse_args(self, argv=None): - """Parse arguments. - - It can call sys.exit if arguments are incorrect. - - Returns: - the arguments from cmdline - """ - return vars(self.parser.parse_args(argv)) - - -class Runner(object): - """Runner class""" - - def __init__(self): - self.executed_test_cases = {} - self.overall_result = Result.EX_OK - self.clean_flag = True - self.report_flag = False - self._tiers = tb.TierBuilder( - CONST.__getattribute__('INSTALLER_TYPE'), - CONST.__getattribute__('DEPLOY_SCENARIO'), - pkg_resources.resource_filename('functest', 'ci/testcases.yaml')) - - @staticmethod - def source_rc_file(): - """Set the environmental vars from openstack.creds""" - - rc_file = CONST.__getattribute__('openstack_creds') - if not os.path.isfile(rc_file): - raise Exception("RC file %s does not exist..." % rc_file) - LOGGER.debug("Sourcing the OpenStack RC file...") - os_utils.source_credentials(rc_file) - - @staticmethod - def get_run_dict(testname): - """Obtain the the 'run' block of the testcase from testcases.yaml""" - try: - dic_testcase = ft_utils.get_dict_by_test(testname) - if not dic_testcase: - LOGGER.error("Cannot get %s's config options", testname) - elif 'run' in dic_testcase: - return dic_testcase['run'] - return None - except Exception: # pylint: disable=broad-except - LOGGER.exception("Cannot get %s's config options", testname) - return None - - def run_test(self, test): - """Run one test case""" - if not test.is_enabled(): - raise TestNotEnabled( - "The test case {} is not enabled".format(test.get_name())) - LOGGER.info("Running test case '%s'...", test.get_name()) - result = testcase.TestCase.EX_RUN_ERROR - run_dict = self.get_run_dict(test.get_name()) - if run_dict: - try: - module = importlib.import_module(run_dict['module']) - cls = getattr(module, run_dict['class']) - test_dict = ft_utils.get_dict_by_test(test.get_name()) - test_case = cls(**test_dict) - self.executed_test_cases[test.get_name()] = test_case - try: - kwargs = run_dict['args'] - test_case.run(**kwargs) - except KeyError: - test_case.run() - if self.report_flag: - test_case.push_to_db() - if test.get_project() == "functest": - result = test_case.is_successful() - else: - result = testcase.TestCase.EX_OK - LOGGER.info("Test result:\n\n%s\n", test_case) - if self.clean_flag: - test_case.clean() - except ImportError: - LOGGER.exception("Cannot import module %s", run_dict['module']) - except AttributeError: - LOGGER.exception("Cannot get class %s", run_dict['class']) - else: - raise Exception("Cannot import the class for the test case.") - return result - - def run_tier(self, tier): - """Run one tier""" - tier_name = tier.get_name() - tests = tier.get_tests() - if not tests: - LOGGER.info("There are no supported test cases in this tier " - "for the given scenario") - self.overall_result = Result.EX_ERROR - else: - LOGGER.info("Running tier '%s'", tier_name) - for test in tests: - self.run_test(test) - test_case = self.executed_test_cases[test.get_name()] - if test_case.is_successful() != testcase.TestCase.EX_OK: - LOGGER.error("The test case '%s' failed.", test.get_name()) - if test.get_project() == "functest": - self.overall_result = Result.EX_ERROR - if test.is_blocking(): - raise BlockingTestFailed( - "The test case {} failed and is blocking".format( - test.get_name())) - return self.overall_result - - def run_all(self): - """Run all available testcases""" - tiers_to_run = [] - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['tiers', 'order', 'CI Loop', 'description', - 'testcases']) - for tier in self._tiers.get_tiers(): - if (tier.get_tests() and - re.search(CONST.__getattribute__('CI_LOOP'), - tier.get_ci_loop()) is not None): - tiers_to_run.append(tier) - msg.add_row([tier.get_name(), tier.get_order(), - tier.get_ci_loop(), - textwrap.fill(tier.description, width=40), - textwrap.fill(' '.join([str(x.get_name( - )) for x in tier.get_tests()]), width=40)]) - LOGGER.info("TESTS TO BE EXECUTED:\n\n%s\n", msg) - for tier in tiers_to_run: - self.run_tier(tier) - - def main(self, **kwargs): - """Entry point of class Runner""" - if 'noclean' in kwargs: - self.clean_flag = not kwargs['noclean'] - if 'report' in kwargs: - self.report_flag = kwargs['report'] - try: - if 'test' in kwargs: - self.source_rc_file() - LOGGER.debug("Test args: %s", kwargs['test']) - if self._tiers.get_tier(kwargs['test']): - self.run_tier(self._tiers.get_tier(kwargs['test'])) - elif self._tiers.get_test(kwargs['test']): - result = self.run_test( - self._tiers.get_test(kwargs['test'])) - if result != testcase.TestCase.EX_OK: - LOGGER.error("The test case '%s' failed.", - kwargs['test']) - self.overall_result = Result.EX_ERROR - elif kwargs['test'] == "all": - self.run_all() - else: - LOGGER.error("Unknown test case or tier '%s', or not " - "supported by the given scenario '%s'.", - kwargs['test'], - CONST.__getattribute__('DEPLOY_SCENARIO')) - LOGGER.debug("Available tiers are:\n\n%s", - self._tiers) - return Result.EX_ERROR - else: - self.run_all() - except BlockingTestFailed: - pass - except Exception: # pylint: disable=broad-except - LOGGER.exception("Failures when running testcase(s)") - self.overall_result = Result.EX_ERROR - if not self._tiers.get_test(kwargs['test']): - self.summary(self._tiers.get_tier(kwargs['test'])) - LOGGER.info("Execution exit value: %s", self.overall_result) - return self.overall_result - - def summary(self, tier=None): - """To generate functest report showing the overall results""" - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['env var', 'value']) - for env_var in ['INSTALLER_TYPE', 'DEPLOY_SCENARIO', 'BUILD_TAG', - 'CI_LOOP']: - msg.add_row([env_var, CONST.__getattribute__(env_var)]) - LOGGER.info("Deployment description:\n\n%s\n", msg) - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['test case', 'project', 'tier', - 'duration', 'result']) - tiers = [tier] if tier else self._tiers.get_tiers() - for each_tier in tiers: - for test in each_tier.get_tests(): - try: - test_case = self.executed_test_cases[test.get_name()] - except KeyError: - msg.add_row([test.get_name(), test.get_project(), - each_tier.get_name(), "00:00", "SKIP"]) - else: - result = 'PASS' if(test_case.is_successful( - ) == test_case.EX_OK) else 'FAIL' - msg.add_row( - [test_case.case_name, test_case.project_name, - self._tiers.get_tier_name(test_case.case_name), - test_case.get_duration(), result]) - for test in each_tier.get_skipped_test(): - msg.add_row([test.get_name(), test.get_project(), - each_tier.get_name(), "00:00", "SKIP"]) - LOGGER.info("FUNCTEST REPORT:\n\n%s\n", msg) - - -def main(): - """Entry point""" - logging.config.fileConfig(pkg_resources.resource_filename( - 'functest', 'ci/logging.ini')) - logging.captureWarnings(True) - parser = RunTestsParser() - args = parser.parse_args(sys.argv[1:]) - runner = Runner() - return runner.main(**args).value diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml index 2e1a282cb..acf5a7199 100644 --- a/functest/ci/testcases.yaml +++ b/functest/ci/testcases.yaml @@ -2,8 +2,6 @@ tiers: - name: healthcheck - order: 0 - ci_loop: '(daily)|(weekly)' description: >- First tier to be executed to verify the basic operations in the VIM. @@ -16,59 +14,86 @@ tiers: description: >- This test case verifies the retrieval of OpenStack clients: Keystone, Glance, Neutron and Nova and may perform some - simple queries. When the config value of - snaps.use_keystone is True, functest must have access to - the cloud's private network. - dependencies: - installer: '^((?!netvirt).)*$' - scenario: '' + simple queries. run: - module: - 'functest.opnfv_tests.openstack.snaps.connection_check' - class: 'ConnectionCheck' + name: connection_check - - case_name: api_check + case_name: tenantnetwork1 project_name: functest criteria: 100 blocking: true description: >- - This test case verifies the retrieval of OpenStack clients: - Keystone, Glance, Neutron and Nova and may perform some - simple queries. When the config value of - snaps.use_keystone is True, functest must have access to - the cloud's private network. + It creates and configures all tenant network ressources + required by advanced testcases (subnet, network and + router). dependencies: - installer: '^((?!netvirt).)*$' - scenario: '^((?!lxd).)*$' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.openstack.snaps.api_check' - class: 'ApiCheck' + name: tenantnetwork1 - - case_name: snaps_health_check + case_name: tenantnetwork2 project_name: functest criteria: 100 blocking: true description: >- - This test case creates executes the SimpleHealthCheck - Python test class which creates an, image, flavor, network, - and Cirros VM instance and observes the console output to - validate the single port obtains the correct IP address. + It creates new user/project before creating and configuring + all tenant network ressources required by a testcase + (subnet, network and router). dependencies: - installer: '' - scenario: '^((?!lxd).)*$' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.openstack.snaps.health_check' - class: 'HealthCheck' + name: tenantnetwork2 + + - + case_name: vmready1 + project_name: functest + criteria: 100 + blocking: true + description: >- + It inherits from TenantNetwork1 which creates all network + resources and prepares a future VM attached to that + network. + run: + name: vmready1 + + - + case_name: vmready2 + project_name: functest + criteria: 100 + blocking: true + description: >- + It creates new user/project before creating and configuring + all tenant network ressources, flavors, images, etc. + required by advanced testcases. + run: + name: vmready2 + + - + case_name: singlevm1 + project_name: functest + criteria: 100 + blocking: true + description: >- + It inherits from TenantNetwork1 which creates all network + resources and completes it by booting a VM attached to that + network. + run: + name: singlevm1 + + - + case_name: singlevm2 + project_name: functest + criteria: 100 + blocking: true + description: >- + It creates new user/project before creating and configuring + all tenant network ressources and vms required by advanced + testcases. + run: + name: singlevm2 - - - name: smoke - order: 1 - ci_loop: '(daily)|(weekly)' - description: >- - Set of basic Functional tests to validate the OPNFV scenarios. - testcases: - case_name: vping_ssh project_name: functest @@ -78,12 +103,8 @@ tiers: This test case verifies: 1) SSH to an instance using floating IPs over the public network. 2) Connectivity between 2 instances over a private network. - dependencies: - installer: '' - scenario: '^((?!odl_l3|odl-bgpvpn|gluon).)*$' run: - module: 'functest.opnfv_tests.openstack.vping.vping_ssh' - class: 'VPingSSH' + name: vping_ssh - case_name: vping_userdata @@ -93,16 +114,42 @@ tiers: description: >- This test case verifies: 1) Boot a VM with given userdata. 2) Connectivity between 2 instances over a private network. + run: + name: vping_userdata + + - + case_name: cinder_test + project_name: functest + criteria: 100 + blocking: true + description: >- + This test case verifies: 1) Attach volume and to 1 + instance; 2) Write data on volume 3) Detach volume + from instance 1, attach it on instance 2 3) Read volume + data + run: + name: cinder_test + + - + case_name: odl + project_name: functest + criteria: 100 + blocking: true + description: >- + Test Suite for the OpenDaylight SDN Controller. It + integrates some test suites from upstream using + Robot as the test framework. dependencies: - installer: '' - scenario: '^((?!lxd).)*$' + - DEPLOY_SCENARIO: 'odl' run: - module: - 'functest.opnfv_tests.openstack.vping.vping_userdata' - class: 'VPingUserdata' + name: odl + args: + suites: + - /src/odl_test/csit/suites/integration/basic + - /src/odl_test/csit/suites/openstack/neutron - - case_name: tempest_smoke_serial + case_name: tempest_smoke project_name: functest criteria: 100 blocking: false @@ -111,12 +158,118 @@ tiers: Tempest suite. The list of test cases is generated by Tempest automatically and depends on the parameters of the OpenStack deplopyment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L114 + run: + name: tempest_common + args: + mode: '(?=.*\[.*\bsmoke\b.*\])(^tempest\.api)' + option: + - '--concurrency=4' + + - + case_name: tempest_horizon + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the Tempest suite proposed by the + Horizon project. dependencies: - installer: '^((?!netvirt).)*$' - scenario: '' + - DASHBOARD_URL: '^(?!\s*$).+' run: - module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestSmokeSerial' + name: tempest_common + args: + mode: '^tempest.scenario.test_dashboard_basic_ops.' + + - + name: smoke + description: >- + Set of basic Functional tests to validate the OPNFV scenarios. + testcases: + - + case_name: tempest_neutron + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the Tempest suite proposed by the + Neutron project. The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + run: + name: tempest_common + args: + mode: '^neutron_tempest_plugin\.api' + option: + - '--concurrency=4' + + - + case_name: tempest_cinder + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the Tempest suite proposed by the + Cinder project. + run: + name: tempest_common + args: + mode: "(?!.*test_incremental_backup)\ + (?!.*test_backup_crossproject_admin_negative)\ + (?!.*test_backup_crossproject_user_negative)\ + (^cinder_tempest_plugin.)" + option: + - '--concurrency=4' + + - + case_name: tempest_keystone + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the Tempest suite proposed by the + Keystone project. + run: + name: tempest_common + args: + mode: 'keystone_tempest_plugin.' + option: + - '--concurrency=4' + + - + case_name: tempest_heat + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the Tempest suite proposed by the + Heat project. + run: + name: tempest_heat + args: + mode: '^heat_tempest_plugin.tests' + option: + - '--concurrency=1' + + - + case_name: tempest_telemetry + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the Tempest suite proposed by the + Telemetry project. + run: + name: tempest_common + args: + mode: "(?!.*test_autoscaling)(?!.*test_live)\ + (^telemetry_tempest_plugin)" + services: + - aodh + - gnocchi + - panko + option: + - '--concurrency=4' - case_name: rally_sanity @@ -126,289 +279,790 @@ tiers: description: >- This test case runs a sub group of tests of the OpenStack Rally suite in smoke mode. - dependencies: - installer: '' - scenario: '' run: - module: 'functest.opnfv_tests.openstack.rally.rally' - class: 'RallySanity' + name: rally_sanity + args: + optional: + - 'gnocchi' + - 'barbican' - - case_name: refstack_defcore + case_name: refstack_compute project_name: functest criteria: 100 blocking: false description: >- This test case runs a sub group of tests of the OpenStack - Defcore testcases by using refstack client. + Compute testcases. dependencies: - installer: '' - scenario: '' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: - 'functest.opnfv_tests.openstack.refstack_client.refstack_client' - class: 'RefstackClient' + name: refstack + args: + target: compute + option: + - '--concurrency=4' - - case_name: odl + case_name: refstack_object project_name: functest criteria: 100 blocking: false description: >- - Test Suite for the OpenDaylight SDN Controller. It - integrates some test suites from upstream using - Robot as the test framework. - dependencies: - installer: '' - scenario: 'odl' + This test case runs a sub group of tests of the OpenStack + Object testcases. run: - module: 'functest.opnfv_tests.sdn.odl.odl' - class: 'ODLTests' + name: refstack args: - suites: - - /src/odl_test/csit/suites/integration/basic - - /src/odl_test/csit/suites/openstack/neutron + target: object + option: + - '--concurrency=4' - - case_name: odl_netvirt + case_name: refstack_platform project_name: functest criteria: 100 blocking: false description: >- - Test Suite for the OpenDaylight SDN Controller when - the NetVirt features are installed. It integrates - some test suites from upstream using Robot as the - test framework. + This test case runs a sub group of tests of the OpenStack + Platform testcases. dependencies: - installer: 'apex' - scenario: 'os-odl_l3-nofeature' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.sdn.odl.odl' - class: 'ODLTests' + name: refstack args: - suites: - - /src/odl_test/csit/suites/integration/basic - - /src/odl_test/csit/suites/openstack/neutron - - /src/odl_test/csit/suites/openstack/connectivity + target: platform + option: + - '--concurrency=4' - - case_name: snaps_smoke + case_name: tempest_full project_name: functest criteria: 100 blocking: false description: >- - This test case contains tests that setup and destroy - environments with VMs with and without Floating IPs - with a newly created user and project. Set the config - value snaps.use_floating_ips (True|False) to toggle - this functionality. When the config value of - snaps.use_keystone is True, functest must have access to - the cloud's private network. + The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L83 + run: + name: tempest_common + args: + mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.api)' + option: + - '--concurrency=4' - dependencies: - installer: '^((?!netvirt).)*$' - scenario: '^((?!lxd).)*$' + - + case_name: tempest_scenario + project_name: functest + criteria: 100 + blocking: false + description: >- + The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84 run: - module: 'functest.opnfv_tests.openstack.snaps.smoke' - class: 'SnapsSmoke' + name: tempest_common + args: + mode: '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)' + option: + - '--concurrency=1' - - - name: features - order: 2 - ci_loop: '(daily)|(weekly)' - description: >- - Test suites from feature projects - integrated in functest - testcases: - - case_name: doctor-notification - project_name: doctor + case_name: tempest_slow + project_name: functest criteria: 100 blocking: false description: >- - Test suite from Doctor project. - dependencies: - installer: 'apex' - scenario: '^((?!fdio).)*$' + The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84 run: - module: 'functest.core.feature' - class: 'BashFeature' + name: tempest_common args: - cmd: 'doctor-test' + mode: '(?=.*\[.*\bslow\b.*\])(^tempest\.)' + option: + - '--concurrency=1' - - case_name: bgpvpn - project_name: sdnvpn + case_name: patrole_admin + project_name: functest criteria: 100 blocking: false description: >- - Test suite from SDNVPN project. - dependencies: - installer: '(fuel)|(apex)|(netvirt)' - scenario: 'bgpvpn' + Test suite from Patrole project. run: - module: 'sdnvpn.test.functest.run_sdnvpn_tests' - class: 'SdnvpnFunctest' + name: patrole + args: + roles: 'admin' + mode: "(?!.*test_unmanage_snapshot_rbac)\ + (?!.*test_show_auto_allocated_topology)\ + (?!.*test_delete_auto_allocated_topology)\ + (?!.*test_create_network_provider_segmentation_id)\ + (?!.*compute.test_floating_ips_rbac)\ + (?!.*test_reset_network)\ + (?!.*test_create_image_from_volume_backed_server)\ + (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\ + (?!.*test_policy_bandwidth_limit_rule_rbac)\ + (?!.*test_policy_minimum_bandwidth_rule_rbac)\ + (?!.*test_group_type_specs)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\ + (?!.*test_group_snapshots_rbac)\ + (?!.*test_groups_rbac)\ + (?!.*test_quota_classes_rbac)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\ + (?!.*test_user_messages_rbac)\ + (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\ + (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\ + (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\ + (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\ + (?!.*test_volume_types_rbac)\ + (?=.*[.*\bslow\b.*])\ + (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))" + option: + - '--concurrency=4' - - case_name: functest-odl-sfc - project_name: sfc + case_name: patrole_member + project_name: functest criteria: 100 blocking: false description: >- - Test suite for odl-sfc to test two chains with one SF and - one chain with two SFs - dependencies: - installer: '' - scenario: 'odl.*sfc' + Test suite from Patrole project. run: - module: 'functest.core.feature' - class: 'BashFeature' + name: patrole args: - cmd: 'run_sfc_tests.py' + roles: 'member' + mode: "(?!.*test_unmanage_snapshot_rbac)\ + (?!.*test_show_auto_allocated_topology)\ + (?!.*test_delete_auto_allocated_topology)\ + (?!.*test_create_network_provider_segmentation_id)\ + (?!.*compute.test_floating_ips_rbac)\ + (?!.*test_reset_network)\ + (?!.*test_create_image_from_volume_backed_server)\ + (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\ + (?!.*test_policy_bandwidth_limit_rule_rbac)\ + (?!.*test_policy_minimum_bandwidth_rule_rbac)\ + (?!.*test_group_type_specs)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\ + (?!.*test_group_snapshots_rbac)\ + (?!.*test_groups_rbac)\ + (?!.*test_quota_classes_rbac)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\ + (?!.*test_user_messages_rbac)\ + (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\ + (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\ + (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\ + (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\ + (?!.*test_volume_types_rbac)\ + (?=.*[.*\bslow\b.*])\ + (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))" + option: + - '--concurrency=4' - - case_name: barometercollectd - project_name: barometer + case_name: patrole_reader + project_name: functest criteria: 100 blocking: false description: >- - Test suite for the Barometer project. Separate tests verify - the proper configuration and basic functionality of all the - collectd plugins as described in the Project Release Plan - dependencies: - installer: 'apex' - scenario: 'bar' + Test suite from Patrole project. run: - module: 'baro_tests.barometer' - class: 'BarometerCollectd' + name: patrole + args: + roles: 'reader' + mode: "(?!.*test_unmanage_snapshot_rbac)\ + (?!.*test_show_auto_allocated_topology)\ + (?!.*test_delete_auto_allocated_topology)\ + (?!.*test_create_network_provider_segmentation_id)\ + (?!.*compute.test_floating_ips_rbac)\ + (?!.*test_reset_network)\ + (?!.*test_create_image_from_volume_backed_server)\ + (?!.*test_network_ip_availability_rbac.NetworkIpAvailabilityExtRbacTest.test_get_network_ip_availabilities)\ + (?!.*test_policy_bandwidth_limit_rule_rbac)\ + (?!.*test_policy_minimum_bandwidth_rule_rbac)\ + (?!.*test_group_type_specs)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_create_group_type)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_delete_group_type)\ + (?!.*test_groups_rbac.GroupTypesV3RbacTest.test_update_group_type)\ + (?!.*test_group_snapshots_rbac)\ + (?!.*test_groups_rbac)\ + (?!.*test_quota_classes_rbac)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_create_interface)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_delete_interface)\ + (?!.*test_server_misc_policy_actions_rbac.MiscPolicyActionsNetworkRbacTest.test_show_interface)\ + (?!.*test_user_messages_rbac)\ + (?!.*test_volume_actions_rbac.VolumesActionsV310RbacTest)\ + (?!.*test_volume_actions_rbac.VolumesActionsV312RbacTest)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_delete_volume_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_list_volumes_details_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_show_volume_details_image_metadata)\ + (?!.*test_volume_metadata_rbac.VolumeMetadataV3RbacTest.test_update_volume_image_metadata)\ + (?!.*test_volumes_backup_rbac.VolumesBackupsV318RbacTest)\ + (?!.*test_volumes_backup_rbac.VolumesBackupsV39RbacTest)\ + (?!.*test_volume_types_rbac)\ + (?=.*[.*\bslow\b.*])\ + (^patrole_tempest_plugin.tests.api.(compute|image|network|volume))" + option: + - '--concurrency=4' - - case_name: fds - project_name: fastdatastacks + case_name: tempest_barbican + project_name: functest criteria: 100 blocking: false description: >- - Test Suite for the OpenDaylight SDN Controller when GBP - features are installed. It integrates some test suites from - upstream using Robot as the test framework. - dependencies: - installer: 'apex' - scenario: 'odl.*-fdio' + It leverages on the tempest plugin containing tests used to + verify the functionality of a barbican installation. run: - module: 'functest.opnfv_tests.sdn.odl.odl' - class: 'ODLTests' + name: barbican args: - suites: - - /src/fds/testing/robot + mode: + '^barbican_tempest_plugin.((?!test_signed_image_upload_boot_failure).)*$' + services: + - barbican + option: + - '--concurrency=4' + + - + case_name: tempest_octavia + project_name: functest + criteria: 100 + blocking: false + description: >- + It leverages on the tempest plugin containing tests used to + verify the functionality of an octavia installation. + run: + name: tempest_common + args: + mode: "(?!.*api.v2.test_availability_zone)\ + (?!.*api.v2.test_availability_zone_profile)\ + (?!.*api.v2.test_member.MemberAPITest.test_member_ipv4_create)\ + (?!.*api.v2.test_member.MemberAPITest.test_member_ipv6_create)\ + (^octavia_tempest_plugin.tests.(api|scenario))" + services: + - octavia + option: + - '--concurrency=2' + + - + case_name: tempest_cyborg + project_name: functest + criteria: 100 + blocking: false + description: >- + It leverages on the tempest plugin containing tests used to + verify the functionality of a cyborg installation. + run: + name: tempest_common + args: + mode: '^cyborg_tempest_plugin' + services: + - cyborg + option: + - '--concurrency=4' - - name: components - order: 3 - ci_loop: 'weekly' + name: smoke_cntt description: >- - Extensive testing of OpenStack API. + Set of basic Functional tests to validate the OPNFV scenarios. testcases: - - case_name: tempest_full_parallel + case_name: tempest_neutron_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 564 + description: >- + This test case runs the Tempest suite proposed by the + Neutron project. The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + run: + name: tempest_common + args: + mode: "(?!.*admin.test_agent_availability_zone)\ + (?!.*admin.test_dhcp_agent_scheduler)\ + (?!.*admin.test_l3_agent_scheduler)\ + (?!.*admin.test_logging)\ + (?!.*admin.test_logging_negative)\ + (?!.*admin.test_network_segment_range)\ + (?!.*admin.test_ports.PortTestCasesAdmin.test_regenerate_mac_address)\ + (?!.*admin.test_ports.PortTestCasesResourceRequest)\ + (?!.*admin.test_routers_dvr)\ + (?!.*admin.test_routers_flavors)\ + (?!.*admin.test_routers_ha)\ + (?!.*test_conntrack_helper)\ + (?!.*test_floating_ips.FloatingIPPoolTestJSON)\ + (?!.*test_floating_ips.FloatingIPTestJSON.test_create_update_floatingip_port_details)\ + (?!.*test_local_ip)\ + (?!.*test_metering_extensions)\ + (?!.*test_metering_negative)\ + (?!.*test_networks.NetworksSearchCriteriaTest.test_list_validation_filters)\ + (?!.*test_networks.NetworksTestAdmin.test_create_tenant_network_vxlan)\ + (?!.*test_networks.NetworksTestJSON.test_create_update_network_dns_domain)\ + (?!.*test_port_forwardings)\ + (?!.*test_ports.PortsTaggingOnCreation)\ + (?!.*test_ports.PortsTestJSON.test_create_port_with_propagate_uplink_status)\ + (?!.*test_ports.PortsTestJSON.test_create_port_without_propagate_uplink_status)\ + (?!.*test_ports.PortsTestJSON.test_create_update_port_with_dns_domain)\ + (?!.*test_ports.PortsTestJSON.test_create_update_port_with_dns_name)\ + (?!.*test_ports.PortsTestJSON.test_create_update_port_with_no_dns_name)\ + (?!.*test_qos.QosMinimumBandwidthRuleTestJSON)\ + (?!.*test_revisions.TestRevisions.test_update_dns_domain_bumps_revision)\ + (?!.*test_revisions.TestRevisions.test_update_router_extra_attributes_bumps_revision)\ + (?!.*test_router_interface_fip)\ + (?!.*test_routers.DvrRoutersTest)\ + (?!.*test_routers.HaRoutersTest)\ + (?!.*test_routers.RoutersIpV6Test.test_extra_routes_atomic)\ + (?!.*test_routers.RoutersTest.test_extra_routes_atomic)\ + (?!.*test_routers_negative.DvrRoutersNegativeTest)\ + (?!.*test_routers_negative.DvrRoutersNegativeTestExtended)\ + (?!.*test_routers_negative.HaRoutersNegativeTest)\ + (?!.*test_security_groups.RbacSharedSecurityGroupTest)\ + (?!.*test_subnetpool_prefix_ops)\ + (?!.*test_subnetpools.RbacSubnetPoolTest)\ + (?!.*test_subnetpools.SubnetPoolsSearchCriteriaTest.test_list_validation_filters)\ + (?!.*test_subnetpools_negative.SubnetPoolsNegativeTestJSON.test_tenant_create_subnetpool_associate_shared_address_scope)\ + (?!.*test_subnets.SubnetsSearchCriteriaTest.test_list_validation_filters)\ + (?!.*test_timestamp.TestTimeStamp.test_segment_with_timestamp)\ + (?!.*test_trunk.TrunkTestInheritJSONBase.test_add_subport)\ + (?!.*test_trunk.TrunkTestMtusJSON)\ + (?!.*test_trunk_negative.TrunkTestJSON.test_create_subport_invalid_inherit_network_segmentation_type)\ + (?!.*test_trunk_negative.TrunkTestMtusJSON)\ + (^neutron_tempest_plugin.api)" + option: + - '--concurrency=4' + + - + case_name: tempest_cinder_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 10 + description: >- + This test case runs the Tempest suite proposed by the + Cinder project. + run: + name: tempest_common + args: + mode: "(?!.*test_incremental_backup)\ + (?!.*test_consistencygroups)\ + (?!.*test_backup_crossproject_admin_negative)\ + (?!.*test_backup_crossproject_user_negative)\ + (?!.*test_volume_encrypted.TestEncryptedCinderVolumes)\ + (?!.*rbac)\ + (^cinder_tempest_plugin.)" + option: + - '--concurrency=4' + + - + case_name: tempest_keystone_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 27 + description: >- + This test case runs the Tempest suite proposed by the + Keystone project. + run: + name: tempest_common + args: + mode: "(?!.*api.identity.v3.test_oauth1_tokens)\ + (?!.*rbac)\ + (?!.*scenario.test_federated_authentication)\ + keystone_tempest_plugin." + option: + - '--concurrency=4' + + - + case_name: tempest_heat_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 124 + description: >- + This test case runs the Tempest suite proposed by the + Heat project. + run: + name: tempest_heat + args: + mode: "(?!.*functional.test_lbaasv2)\ + (?!.*functional.test_encryption_vol_type)\ + (?!.*functional.test_event_sinks)\ + (?!.*functional.test_software_config.ZaqarSignalTransportTest)\ + (?!.*functional.test_stack_events)\ + (?!.*functional.test_waitcondition)\ + (?!.*RemoteStackTest.test_stack_create_with_cloud_credential)\ + (?!.*scenario.test_aodh_alarm)\ + (?!.*tests.scenario.test_autoscaling_lb)\ + (?!.*scenario.test_autoscaling_lbv2)\ + (?!.*scenario.test_server_software_config)\ + (?!.*test_volumes.VolumeBackupRestoreIntegrationTest)\ + (?!.*scenario.test_octavia_lbaas)\ + (?!.*scenario.test_server_cfn_init)\ + ^heat_tempest_plugin.tests" + option: + - '--concurrency=1' + + - + case_name: rally_sanity_cntt project_name: functest - criteria: 80 + criteria: 100 blocking: false description: >- + This test case runs a sub group of tests of the OpenStack + Rally suite in smoke mode. + run: + name: rally_sanity + args: + tests: + - 'authenticate' + - 'glance' + - 'cinder' + - 'heat' + - 'keystone' + - 'neutron' + - 'nova' + - 'quotas' + - 'swift' + + - + case_name: tempest_full_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 1271 + description: >- The list of test cases is generated by Tempest automatically and depends on the parameters of - the OpenStack deplopyment. - dependencies: - installer: '^((?!netvirt).)*$' - scenario: '' + the OpenStack deployment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L83 + run: + name: tempest_common + args: + mode: "(?!.*admin.test_agents)(?!.*test_fixed_ips)\ + (?!.*test_fixed_ips_negative)\ + (?!.*test_auto_allocate_network)(?!.*test_floating_ips_bulk)\ + (?!.*test_flavors_microversions.FlavorsV255TestJSON)\ + (?!.*test_flavors_microversions.FlavorsV261TestJSON)\ + (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_iscsi_volume)\ + (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_live_block_migration)\ + (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_live_block_migration_paused)\ + (?!.*test_live_migration.LiveAutoBlockMigrationV225Test.test_volume_backed_live_migration)\ + (?!.*test_live_migration.LiveMigrationTest.test_iscsi_volume)\ + (?!.*test_live_migration.LiveMigrationTest.test_live_block_migration)\ + (?!.*test_live_migration.LiveMigrationTest.test_live_block_migration_paused)\ + (?!.*test_live_migration.LiveMigrationTest.test_volume_backed_live_migration)\ + (?!.*test_live_migration.LiveMigrationRemoteConsolesV26Test)\ + (?!.*test_quotas.QuotasAdminTestV257)\ + (?!.*test_servers.ServersAdminTestJSON.test_reset_network_inject_network_info)\ + (?!.*certificates.test_certificates)\ + (?!.*test_quotas_negative.QuotasSecurityGroupAdminNegativeTest)\ + (?!.*test_novnc)(?!.*test_server_personality)\ + (?!.*test_servers.ServerShowV263Test.test_show_update_rebuild_list_server)\ + (?!.*test_servers_microversions.ServerShowV254Test)\ + (?!.*test_servers_microversions.ServerShowV257Test)\ + (?!.*test_servers_negative.ServersNegativeTestJSON.test_personality_file_contents_not_encoded)\ + (?!.*servers.test_virtual_interfaces)\ + (?!.*test_server_actions.ServerActionsTestJSON.test_change_server_password)\ + (?!.*test_server_actions.ServerActionsTestJSON.test_get_vnc_console)\ + (?!.*test_server_actions.ServerActionsTestJSON.test_reboot_server_soft)\ + (?!.*test_server_rescue.ServerBootFromVolumeStableRescueTest)\ + (?!.*test_server_rescue.ServerStableDeviceRescueTest)\ + (?!.*test_security_group_default_rules)\ + (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_create_with_duplicate_name)\ + (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_create_with_invalid_group_description)\ + (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_security_group_create_with_invalid_group_name)\ + (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_security_group_with_invalid_sg_des)\ + (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_security_group_with_invalid_sg_id)\ + (?!.*test_security_groups_negative.SecurityGroupsNegativeTestJSON.test_update_security_group_with_invalid_sg_name)\ + (?!.*test_create_server.ServersTestFqdnHostnames.test_create_server_with_fqdn_name)\ + (?!.*test_server_metadata.ServerMetadataTestJSON)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_delete_metadata_non_existent_server)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_metadata_items_limit)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_metadata_invalid_key)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_metadata_non_existent_server)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_server_metadata_blank_key)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_set_server_metadata_missing_metadata)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_update_metadata_non_existent_server)\ + (?!.*test_server_metadata_negative.ServerMetadataNegativeTestJSON.test_update_metadata_with_blank_key)\ + (?!.*test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_ip_regex)\ + (?!.*compute.test_virtual_interfaces)(?!.*compute.test_virtual_interfaces_negative)\ + (?!.*compute.test_networks)\ + (?!.*test_attach_volume.AttachVolumeMultiAttach)\ + (?!.*identity.admin.v2)(?!.*identity.v2)\ + (?!.*identity.v3.test_access_rules)\ + (?!.*identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_access_rules)\ + (?!.*image.v1)\ + (?!.*image.v2.admin.test_images.ImportCopyImagesTest)\ + (?!.*image.v2.test_images_negative.ImagesNegativeTest.test_create_image_reserved_property)\ + (?!.*image.v2.test_images_negative.ImagesNegativeTest.test_update_image_reserved_property)\ + (?!.*image.v2.test_images_negative.ImportImagesNegativeTest.test_image_web_download_import_with_bad_url)\ + (?!.*image.v2.test_images.ImportImagesTest)\ + (?!.*image.v2.test_images.MultiStoresImportImages)\ + (?!.*admin.test_dhcp_agent_scheduler)\ + (?!.*admin.test_routers_dvr)\ + (?!.*test_metering_extensions)(?!.*network.test_tags)\ + (?!.*test_routers_negative.DvrRoutersNegativeTest)\ + (?!.*test_routers.RoutersIpV6Test.test_create_router_set_gateway_with_fixed_ip)\ + (?!.*test_routers.RoutersTest.test_create_router_set_gateway_with_fixed_ip)\ + (?!.*test_object_services.ObjectTest.test_create_object_with_transfer_encoding)\ + (?!.*test_encrypted_volumes_extend)\ + (?!.*test_group_snapshots.GroupSnapshotsV319Test.test_reset_group_snapshot_status)\ + (?!.*test_multi_backend)\ + (?!.*test_volume_retype.VolumeRetypeWithMigrationTest)\ + (?!.*test_volume_delete_cascade.VolumesDeleteCascade.test_volume_from_snapshot_cascade_delete)\ + (?!.*test_volumes_backup.VolumesBackupsTest.test_volume_backup_create_get_detailed_list_restore_delete)\ + (?!.*test_volumes_negative.UpdateMultiattachVolumeNegativeTest.test_multiattach_rw_volume_update_failure)\ + (?!.*test_volumes_extend.VolumesExtendAttachedTest.test_extend_attached_volume)\ + (?!.*\\[.*\\bslow\\b.*\\])(^tempest.api)" + option: + - '--concurrency=4' + + - + case_name: tempest_scenario_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 13 + description: >- + The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84 + run: + name: tempest_scenario + args: + mode: "\ + (?!.*test_compute_unified_limits)\ + (?!.*test_minbw_allocation_placement)\ + (?!.*test_network_qos_placement)\ + (?!.*test_unified_limits.ImageQuotaTest.test_image_count_uploading_quota)\ + (?!.*test_unified_limits.ImageQuotaTest.test_image_stage_quota)\ + (?!.*test_volume_boot_pattern.TestVolumeBootPattern.test_boot_server_from_encrypted_volume_luks)\ + (?!.*\\[.*\\bslow\\b.*\\])(^tempest.scenario)" + option: + - '--concurrency=1' + + - + case_name: tempest_slow_cntt + project_name: functest + criteria: 100 + blocking: false + deny_skipping: true + tests_count: 43 + description: >- + The list of test cases is generated by + Tempest automatically and depends on the parameters of + the OpenStack deployment. + https://github.com/openstack/tempest/blob/18.0.0/tox.ini#L84 run: - module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestFullParallel' + name: tempest_common + args: + mode: "(?!.*test_volume_swap)\ + (?!.*test_server_personality)\ + (?!.*test_server_rescue.ServerBootFromVolumeStableRescueTest)\ + (?!.*test_container_sync.ContainerSyncTest.test_container_synchronization)\ + (?!.*test_container_sync_middleware.ContainerSyncMiddlewareTest.test_container_synchronization)\ + (?!.*test_encrypted_cinder_volumes)\ + (?!.*test_minbw_allocation_placement)\ + (?!.*test_network_basic_ops.TestNetworkBasicOps.test_router_rescheduling)\ + (?!.*test_shelve_instance.TestShelveInstance.test_cold_migrate_unshelved_instance)\ + (?!.*test_volume_migrate_attached)\ + (?!.*test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_cold_migration_revert)\ + (?=.*\\[.*\\bslow\\b.*\\])(^tempest.)" + option: + - '--concurrency=1' + - + name: benchmarking + description: >- + Run several OpenStack performance tools + https://docs.openstack.org/performance-docs/latest/methodologies/tools.html + testcases: - case_name: rally_full project_name: functest - criteria: 90 + criteria: 100 blocking: false description: >- This test case runs the full suite of scenarios of the OpenStack Rally suite using several threads and iterations. + run: + name: rally_full + args: + optional: + - 'gnocchi' + - 'barbican' + + - + case_name: rally_jobs + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs a group of Rally jobs used in + OpenStack gating + dependencies: + - NO_TENANT_NETWORK: '^(?![tT]rue$)' + run: + name: rally_jobs + args: + optional: + - 'gnocchi' + + - + case_name: vmtp + project_name: functest + criteria: 100 + blocking: false + description: >- + VMTP is a small python application that will automatically + perform ping connectivity, round trip time measurement + (latency) and TCP/UDP throughput + dependencies: + - NO_TENANT_NETWORK: '^(?![tT]rue$)' + run: + name: vmtp + + - + case_name: shaker + project_name: functest + criteria: 100 + blocking: false + description: >- + Shaker wraps around popular system network testing tools + like iperf, iperf3 and netperf (with help of flent). Shaker + is able to deploy OpenStack instances and networks in + different topologies. dependencies: - installer: '^((?!netvirt).)*$' - scenario: '' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.openstack.rally.rally' - class: 'RallyFull' + name: shaker + + - + name: benchmarking_cntt + description: >- + Run several OpenStack performance tools + https://docs.openstack.org/performance-docs/latest/methodologies/tools.html + testcases: + - + case_name: rally_full_cntt + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs the full suite of scenarios of the + OpenStack Rally suite using several threads and iterations. + run: + name: rally_full + args: + tests: + - 'authenticate' + - 'glance' + - 'cinder' + - 'heat' + - 'keystone' + - 'neutron' + - 'nova' + - 'quotas' + - 'swift' + + - + case_name: rally_jobs_cntt + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case runs a group of Rally jobs used in + OpenStack gating + run: + name: rally_jobs + args: + tests: + - 'neutron' - name: vnf - order: 4 - ci_loop: '(daily)|(weekly)' description: >- Collection of VNF test cases. testcases: - - case_name: cloudify_ims + case_name: cloudify project_name: functest - criteria: 80 + criteria: 100 blocking: false description: >- - This test case deploys an OpenSource vIMS solution from - Clearwater using the Cloudify orchestrator. It also runs - some signaling traffic. - dependencies: - installer: '' - scenario: 'os-nosdn-nofeature-ha' + This test case deploys the Cloudify orchestrator. run: - module: 'functest.opnfv_tests.vnf.ims.cloudify_ims' - class: 'CloudifyIms' - + name: cloudify - - case_name: vyos_vrouter + case_name: cloudify_ims project_name: functest criteria: 100 blocking: false description: >- - This test case is vRouter testing. + This test case deploys an OpenSource vIMS solution from + Clearwater using the Cloudify orchestrator. It also runs + some signaling traffic. dependencies: - installer: '' - scenario: 'os-nosdn-nofeature-ha' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.vnf.router.cloudify_vrouter' - class: 'CloudifyVrouter' + name: cloudify_ims - - case_name: orchestra_openims - project_name: orchestra + case_name: heat_ims + project_name: functest criteria: 100 blocking: false description: >- - OpenIMS VNF deployment with Open Baton (Orchestra) + This test case deploys an OpenSource vIMS solution from + Clearwater using the OpenStack Heat orchestrator. + It also runs some signaling traffic. dependencies: - installer: 'daisy' - scenario: 'os-nosdn-nofeature-ha' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.vnf.ims.orchestra_openims' - class: 'OpenImsVnf' + name: heat_ims - - case_name: orchestra_clearwaterims - project_name: orchestra + case_name: vyos_vrouter + project_name: functest criteria: 100 blocking: false description: >- - ClearwaterIMS VNF deployment with Open Baton (Orchestra) + This test case is vRouter testing. dependencies: - installer: 'daisy' - scenario: 'os-nosdn-nofeature-ha' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: - 'functest.opnfv_tests.vnf.ims.orchestra_clearwaterims' - class: 'ClearwaterImsVnf' + name: vyos_vrouter - case_name: juju_epc - enabled: true project_name: functest criteria: 100 blocking: false @@ -416,8 +1070,6 @@ tiers: vEPC validation with Juju as VNF manager and ABoT as test executor. dependencies: - installer: '' - scenario: 'os-nosdn-nofeature-ha' + - NO_TENANT_NETWORK: '^(?![tT]rue$)' run: - module: 'functest.opnfv_tests.vnf.epc.juju_epc' - class: 'JujuEpc' + name: juju_epc diff --git a/functest/ci/tier_builder.py b/functest/ci/tier_builder.py deleted file mode 100644 index 9e92599d8..000000000 --- a/functest/ci/tier_builder.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Ericsson AB 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 - -"""TierBuilder class to parse testcases config file""" - -import yaml - -import functest.ci.tier_handler as th - - -class TierBuilder(object): - # pylint: disable=missing-docstring - - def __init__(self, ci_installer, ci_scenario, testcases_file): - self.ci_installer = ci_installer - self.ci_scenario = ci_scenario - self.testcases_file = testcases_file - self.dic_tier_array = None - self.tier_objects = [] - self.testcases_yaml = None - self.generate_tiers() - - def read_test_yaml(self): - with open(self.testcases_file) as tc_file: - self.testcases_yaml = yaml.safe_load(tc_file) - - self.dic_tier_array = [] - for tier in self.testcases_yaml.get("tiers"): - self.dic_tier_array.append(tier) - - def generate_tiers(self): - if self.dic_tier_array is None: - self.read_test_yaml() - - del self.tier_objects[:] - for dic_tier in self.dic_tier_array: - tier = th.Tier(name=dic_tier['name'], - order=dic_tier['order'], - ci_loop=dic_tier['ci_loop'], - description=dic_tier['description']) - - for dic_testcase in dic_tier['testcases']: - installer = dic_testcase['dependencies']['installer'] - scenario = dic_testcase['dependencies']['scenario'] - dep = th.Dependency(installer, scenario) - - testcase = th.TestCase(name=dic_testcase['case_name'], - enabled=dic_testcase.get( - 'enabled', True), - dependency=dep, - criteria=dic_testcase['criteria'], - blocking=dic_testcase['blocking'], - description=dic_testcase['description'], - project=dic_testcase['project_name']) - if (testcase.is_compatible(self.ci_installer, - self.ci_scenario) and - testcase.is_enabled()): - tier.add_test(testcase) - else: - tier.skip_test(testcase) - - self.tier_objects.append(tier) - - def get_tiers(self): - return self.tier_objects - - def get_tier_names(self): - tier_names = [] - for tier in self.tier_objects: - tier_names.append(tier.get_name()) - return tier_names - - def get_tier(self, tier_name): - for i in range(0, len(self.tier_objects)): - if self.tier_objects[i].get_name() == tier_name: - return self.tier_objects[i] - return None - - def get_tier_name(self, test_name): - for i in range(0, len(self.tier_objects)): - if self.tier_objects[i].is_test(test_name): - return self.tier_objects[i].name - return None - - def get_test(self, test_name): - for i in range(0, len(self.tier_objects)): - if self.tier_objects[i].is_test(test_name): - return self.tier_objects[i].get_test(test_name) - return None - - def get_tests(self, tier_name): - for i in range(0, len(self.tier_objects)): - if self.tier_objects[i].get_name() == tier_name: - return self.tier_objects[i].get_tests() - return None - - def __str__(self): - output = "" - for i in range(0, len(self.tier_objects)): - output += str(self.tier_objects[i]) + "\n" - return output diff --git a/functest/ci/tier_handler.py b/functest/ci/tier_handler.py deleted file mode 100644 index 9fc3f24d8..000000000 --- a/functest/ci/tier_handler.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Ericsson AB 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 - -"""Tier and TestCase classes to wrap the testcases config file""" -# pylint: disable=missing-docstring - -import re -import textwrap - -import prettytable - - -LINE_LENGTH = 72 - - -def split_text(text, max_len): - words = text.split() - lines = [] - line = "" - for word in words: - if len(line) + len(word) < max_len - 1: - line += word + " " - else: - lines.append(line) - line = word + " " - if line != "": - lines.append(line) - return lines - - -class Tier(object): - - def __init__(self, name, order, ci_loop, description=""): - self.tests_array = [] - self.skipped_tests_array = [] - self.name = name - self.order = order - self.ci_loop = ci_loop - self.description = description - - def add_test(self, testcase): - self.tests_array.append(testcase) - - def skip_test(self, testcase): - self.skipped_tests_array.append(testcase) - - def get_tests(self): - array_tests = [] - for test in self.tests_array: - array_tests.append(test) - return array_tests - - def get_skipped_test(self): - return self.skipped_tests_array - - def get_test_names(self): - array_tests = [] - for test in self.tests_array: - array_tests.append(test.get_name()) - return array_tests - - def get_test(self, test_name): - if self.is_test(test_name): - for test in self.tests_array: - if test.get_name() == test_name: - return test - return None - - def is_test(self, test_name): - for test in self.tests_array: - if test.get_name() == test_name: - return True - return False - - def get_name(self): - return self.name - - def get_order(self): - return self.order - - def get_ci_loop(self): - return self.ci_loop - - def __str__(self): - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['tiers', 'order', 'CI Loop', 'description', - 'testcases']) - msg.add_row( - [self.name, self.order, self.ci_loop, - textwrap.fill(self.description, width=40), - textwrap.fill(' '.join([str(x.get_name( - )) for x in self.get_tests()]), width=40)]) - return msg.get_string() - - -class TestCase(object): - - def __init__(self, name, enabled, dependency, criteria, blocking, - description="", project=""): - # pylint: disable=too-many-arguments - self.name = name - self.enabled = enabled - self.dependency = dependency - self.criteria = criteria - self.blocking = blocking - self.description = description - self.project = project - - @staticmethod - def is_none(item): - return item is None or item == "" - - def is_compatible(self, ci_installer, ci_scenario): - try: - if not self.is_none(ci_installer): - if re.search(self.dependency.get_installer(), - ci_installer) is None: - return False - if not self.is_none(ci_scenario): - if re.search(self.dependency.get_scenario(), - ci_scenario) is None: - return False - return True - except TypeError: - return False - - def get_name(self): - return self.name - - def is_enabled(self): - return self.enabled - - def get_criteria(self): - return self.criteria - - def is_blocking(self): - return self.blocking - - def get_project(self): - return self.project - - def __str__(self): - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['test case', 'description', 'criteria', 'dependency']) - msg.add_row([self.name, textwrap.fill(self.description, width=40), - self.criteria, self.dependency]) - return msg.get_string() - - -class Dependency(object): - - def __init__(self, installer, scenario): - self.installer = installer - self.scenario = scenario - - def get_installer(self): - return self.installer - - def get_scenario(self): - return self.scenario - - def __str__(self): - delimitator = "\n" if self.get_installer( - ) and self.get_scenario() else "" - return "{}{}{}".format(self.get_installer(), delimitator, - self.get_scenario()) diff --git a/functest/cli/cli_base.py b/functest/cli/cli_base.py deleted file mode 100644 index 5890e0a35..000000000 --- a/functest/cli/cli_base.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.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 click -import logging.config -import pkg_resources - -from functest.cli.commands.cli_env import CliEnv -from functest.cli.commands.cli_os import CliOpenStack -from functest.cli.commands.cli_testcase import CliTestcase -from functest.cli.commands.cli_tier import CliTier - - -CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) - - -@click.group(context_settings=CONTEXT_SETTINGS) -@click.version_option(version='opnfv colorado.0.1 ') -def cli(): - logging.config.fileConfig(pkg_resources.resource_filename( - 'functest', 'ci/logging.ini')) - logging.captureWarnings(True) - - -_env = CliEnv() -_openstack = CliOpenStack() -_testcase = CliTestcase() -_tier = CliTier() - - -@cli.group() -@click.pass_context -def env(ctx): - pass - - -@cli.group() -@click.pass_context -def openstack(ctx): - pass - - -@cli.group() -@click.pass_context -def testcase(ctx): - pass - - -@cli.group() -@click.pass_context -def tier(ctx): - pass - - -@openstack.command('check', help="Checks connectivity and status " - "to the OpenStack deployment.") -def os_check(): - _openstack.check() - - -@openstack.command('show-credentials', - help="Prints the OpenStack credentials.") -def os_show_credentials(): - _openstack.show_credentials() - - -@env.command('show', help="Shows information about the current environment.") -def env_show(): - _env.show() - - -@testcase.command('list', help="Lists the available testcases.") -def testcase_list(): - _testcase.list() - - -@testcase.command('show', help="Shows information about a test case.") -@click.argument('testname', type=click.STRING, required=True) -def testcase_show(testname): - _testcase.show(testname) - - -@testcase.command('run', help="Executes a test case.") -@click.argument('testname', type=click.STRING, required=True) -@click.option('-n', '--noclean', is_flag=True, default=False, - help='The created openstack resources by the test' - 'will not be cleaned after the execution.') -@click.option('-r', '--report', is_flag=True, default=False, - help='Push results to the results DataBase. Only CI Pods' - 'have rights to do that.') -def testcase_run(testname, noclean, report): - _testcase.run(testname, noclean, report) - - -@tier.command('list', help="Lists the available tiers.") -def tier_list(): - _tier.list() - - -@tier.command('show', help="Shows information about a tier.") -@click.argument('tiername', type=click.STRING, required=True) -def tier_show(tiername): - _tier.show(tiername) - - -@tier.command('get-tests', help="Prints the tests in a tier.") -@click.argument('tiername', type=click.STRING, required=True) -def tier_gettests(tiername): - _tier.gettests(tiername) - - -@tier.command('run', help="Executes all the tests within a tier.") -@click.argument('tiername', type=click.STRING, required=True) -@click.option('-n', '--noclean', is_flag=True, default=False, - help='The created openstack resources by the tests' - 'will not be cleaned after the execution.') -@click.option('-r', '--report', is_flag=True, default=False, - help='Push results to the results DataBase. Only CI Pods' - 'have rights to do that.') -def tier_run(tiername, noclean, report): - _tier.run(tiername, noclean, report) diff --git a/functest/cli/commands/cli_env.py b/functest/cli/commands/cli_env.py deleted file mode 100644 index c41f8f340..000000000 --- a/functest/cli/commands/cli_env.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.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 click -import prettytable - -from functest.utils.constants import CONST - -import six - - -class Env(object): - - def __init__(self): - pass - - def show(self): - def _get_value(attr, default='Unknown'): - return attr if attr else default - - install_type = _get_value(CONST.__getattribute__('INSTALLER_TYPE')) - installer_ip = _get_value(CONST.__getattribute__('INSTALLER_IP')) - installer_info = ("%s, %s" % (install_type, installer_ip)) - scenario = _get_value(CONST.__getattribute__('DEPLOY_SCENARIO')) - node = _get_value(CONST.__getattribute__('NODE_NAME')) - is_debug = _get_value(CONST.__getattribute__('CI_DEBUG'), 'false') - build_tag = CONST.__getattribute__('BUILD_TAG') - if build_tag is not None: - build_tag = build_tag.lstrip( - "jenkins-").lstrip("functest").lstrip("-") - - env_info = {'INSTALLER': installer_info, - 'SCENARIO': scenario, - 'POD': node, - 'DEBUG FLAG': is_debug, - 'BUILD_TAG': build_tag} - - return env_info - - -class CliEnv(Env): - - def __init__(self): - super(CliEnv, self).__init__() - - def show(self): - env_info = super(CliEnv, self).show() - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['Functest Environment', 'value']) - for key, value in six.iteritems(env_info): - if key is not None: - msg.add_row([key, value]) - click.echo(msg.get_string()) diff --git a/functest/cli/commands/cli_os.py b/functest/cli/commands/cli_os.py deleted file mode 100644 index 9057da84b..000000000 --- a/functest/cli/commands/cli_os.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.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 os - -import click -from six.moves.urllib.parse import urlparse - -from functest.ci import check_deployment -from functest.utils.constants import CONST - - -class OpenStack(object): - - def __init__(self): - self.os_auth_url = CONST.__getattribute__('OS_AUTH_URL') - self.endpoint_ip = None - self.endpoint_port = None - self.openstack_creds = CONST.__getattribute__('openstack_creds') - if self.os_auth_url: - self.endpoint_ip = urlparse(self.os_auth_url).hostname - self.endpoint_port = urlparse(self.os_auth_url).port - - def ping_endpoint(self): - if self.os_auth_url is None: - click.echo("Source the OpenStack credentials first '. $creds'") - exit(0) - response = os.system("ping -c 1 " + self.endpoint_ip + ">/dev/null") - if response == 0: - return 0 - else: - click.echo("Cannot talk to the endpoint %s\n" % self.endpoint_ip) - exit(0) - - @staticmethod - def show_credentials(): - dic_credentials = {} - for key, value in os.environ.items(): - if key.startswith('OS_'): - dic_credentials.update({key: value}) - return dic_credentials - - def check(self): - self.ping_endpoint() - deployment = check_deployment.CheckDeployment() - deployment.check_all() - - -class CliOpenStack(OpenStack): - - def __init__(self): - super(CliOpenStack, self).__init__() - - @staticmethod - def show_credentials(): - dic_credentials = OpenStack.show_credentials() - for key, value in dic_credentials.items(): - if key.startswith('OS_'): - click.echo("{}={}".format(key, value)) diff --git a/functest/cli/commands/cli_testcase.py b/functest/cli/commands/cli_testcase.py deleted file mode 100644 index ee7afa5a8..000000000 --- a/functest/cli/commands/cli_testcase.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.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 -# - -""" global variables """ - -import pkg_resources - -import click - -import functest.ci.tier_builder as tb -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils -import functest.utils.functest_vacation as vacation - - -class Testcase(object): - - def __init__(self): - self.tiers = tb.TierBuilder( - CONST.__getattribute__('INSTALLER_TYPE'), - CONST.__getattribute__('DEPLOY_SCENARIO'), - pkg_resources.resource_filename('functest', 'ci/testcases.yaml')) - - def list(self): - summary = "" - for tier in self.tiers.get_tiers(): - for test in tier.get_tests(): - summary += (" %s\n" % test.get_name()) - return summary - - def show(self, testname): - description = self.tiers.get_test(testname) - return description - - @staticmethod - def run(testname, noclean=False, report=False): - - flags = "" - if noclean: - flags += "-n " - if report: - flags += "-r " - - if testname == 'vacation': - vacation.main() - else: - tests = testname.split(",") - for test in tests: - cmd = "run_tests {}-t {}".format(flags, test) - ft_utils.execute_command(cmd) - - -class CliTestcase(Testcase): - - def __init__(self): - super(CliTestcase, self).__init__() - - def list(self): - click.echo(super(CliTestcase, self).list()) - - def show(self, testname): - testcase_show = super(CliTestcase, self).show(testname) - if testcase_show: - click.echo(testcase_show) - else: - click.echo("The test case '%s' does not exist or is not supported." - % testname) diff --git a/functest/cli/commands/cli_tier.py b/functest/cli/commands/cli_tier.py deleted file mode 100644 index 104cf10b5..000000000 --- a/functest/cli/commands/cli_tier.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.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 -# - -""" global variables """ - -import pkg_resources - -import click - -import functest.ci.tier_builder as tb -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - - -class Tier(object): - - def __init__(self): - self.tiers = tb.TierBuilder( - CONST.__getattribute__('INSTALLER_TYPE'), - CONST.__getattribute__('DEPLOY_SCENARIO'), - pkg_resources.resource_filename('functest', 'ci/testcases.yaml')) - - def list(self): - summary = "" - for tier in self.tiers.get_tiers(): - summary += (" - %s. %s:\n\t %s\n" - % (tier.get_order(), - tier.get_name(), - tier.get_test_names())) - return summary - - def show(self, tiername): - tier = self.tiers.get_tier(tiername) - if tier is None: - return None - else: - tier_info = self.tiers.get_tier(tiername) - return tier_info - - def gettests(self, tiername): - tier = self.tiers.get_tier(tiername) - if tier is None: - return None - else: - tests = tier.get_test_names() - return tests - - @staticmethod - def run(tiername, noclean=False, report=False): - flags = "" - if noclean: - flags += "-n " - if report: - flags += "-r " - - cmd = "run_tests {}-t {}".format(flags, tiername) - ft_utils.execute_command(cmd) - - -class CliTier(Tier): - - def __init__(self): - super(CliTier, self).__init__() - - def list(self): - click.echo(super(CliTier, self).list()) - - def show(self, tiername): - tier_info = super(CliTier, self).show(tiername) - if tier_info: - click.echo(tier_info) - else: - tier_names = self.tiers.get_tier_names() - click.echo("The tier with name '%s' does not exist. " - "Available tiers are:\n %s\n" % (tiername, tier_names)) - - def gettests(self, tiername): - tests = super(CliTier, self).gettests(tiername) - if tests: - click.echo("Test cases in tier '%s':\n %s\n" % (tiername, tests)) - else: - tier_names = self.tiers.get_tier_names() - click.echo("The tier with name '%s' does not exist. " - "Available tiers are:\n %s\n" % (tiername, tier_names)) diff --git a/functest/cli/functest-complete.sh b/functest/cli/functest-complete.sh deleted file mode 100644 index f01490713..000000000 --- a/functest/cli/functest-complete.sh +++ /dev/null @@ -1,8 +0,0 @@ -_functest_completion() { - COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \ - COMP_CWORD=$COMP_CWORD \ - _FUNCTEST_COMPLETE=complete $1 ) ) - return 0 -} - -complete -F _functest_completion -o default functest; diff --git a/functest/core/cloudify.py b/functest/core/cloudify.py new file mode 100644 index 000000000..966d33645 --- /dev/null +++ b/functest/core/cloudify.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +"""Cloudify testcase implementation.""" + +from __future__ import division + +import logging +import os +import time +import traceback + +from cloudify_rest_client import CloudifyClient +from cloudify_rest_client.executions import Execution +import scp + +from functest.core import singlevm + + +class Cloudify(singlevm.SingleVm2): + """Cloudify Orchestrator Case.""" + + __logger = logging.getLogger(__name__) + + filename = ('/home/opnfv/functest/images/' + 'ubuntu-18.04-server-cloudimg-amd64.img') + flavor_ram = 4096 + flavor_vcpus = 2 + flavor_disk = 40 + username = 'ubuntu' + ssh_connect_loops = 12 + create_server_timeout = 600 + ports = [80, 443, 5671, 53333] + + cloudify_archive = ('/home/opnfv/functest/images/' + 'cloudify-docker-manager-community-19.01.24.tar') + cloudify_container = "docker-cfy-manager:latest" + + def __init__(self, **kwargs): + """Initialize Cloudify testcase object.""" + if "case_name" not in kwargs: + kwargs["case_name"] = "cloudify" + super().__init__(**kwargs) + self.cfy_client = None + + def prepare(self): + super().prepare() + for port in self.ports: + self.cloud.create_security_group_rule( + self.sec.id, port_range_min=port, port_range_max=port, + protocol='tcp', direction='ingress') + + def execute(self): + """ + Deploy Cloudify Manager. + """ + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put(self.cloudify_archive, + remote_path=os.path.basename(self.cloudify_archive)) + (_, stdout, stderr) = self.ssh.exec_command( + "sudo apt-get update && " + "sudo apt-get install -y docker.io && " + "sudo docker load -i " + f"~/{os.path.basename(self.cloudify_archive)} && " + "sudo docker run --name cfy_manager_local -d " + "--restart unless-stopped -v /sys/fs/cgroup:/sys/fs/cgroup:ro " + "--tmpfs /run --tmpfs /run/lock --security-opt seccomp:unconfined " + f"--cap-add SYS_ADMIN --network=host {self.cloudify_container}") + self.__logger.debug("output:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("error:\n%s", stderr.read().decode("utf-8")) + self.cfy_client = CloudifyClient( + host=self.fip.floating_ip_address if self.fip else ( + self.sshvm.public_v4), + username='admin', password='admin', tenant='default_tenant') + self.__logger.info("Attemps running status of the Manager") + secret_key = "foo" + secret_value = "bar" + for loop in range(20): + try: + self.__logger.debug( + "status %s", self.cfy_client.manager.get_status()) + cfy_status = self.cfy_client.manager.get_status()['status'] + self.__logger.info( + "The current manager status is %s", cfy_status) + if str(cfy_status) != 'running': + raise Exception("Cloudify Manager isn't up and running") + for secret in iter(self.cfy_client.secrets.list()): + if secret_key == secret["key"]: + self.__logger.debug("Updating secrets: %s", secret_key) + self.cfy_client.secrets.update( + secret_key, secret_value) + break + else: + self.__logger.debug("Creating secrets: %s", secret_key) + self.cfy_client.secrets.create(secret_key, secret_value) + self.cfy_client.secrets.delete(secret_key) + self.__logger.info("Secrets API successfully reached") + break + except Exception: # pylint: disable=broad-except + self.__logger.debug( + "try %s: Cloudify Manager isn't up and running \n%s", + loop + 1, traceback.format_exc()) + time.sleep(30) + else: + self.__logger.error("Cloudify Manager isn't up and running") + return 1 + self.__logger.info("Cloudify Manager is up and running") + return 0 + + def put_private_key(self): + """Put private keypair in manager""" + self.__logger.info("Put private keypair in manager") + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put(self.key_filename, remote_path='~/cloudify_ims.pem') + (_, stdout, stderr) = self.ssh.exec_command( + "sudo docker cp ~/cloudify_ims.pem " + "cfy_manager_local:/etc/cloudify/ && " + "sudo docker exec cfy_manager_local " + "chmod 444 /etc/cloudify/cloudify_ims.pem") + self.__logger.debug("output:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("error:\n%s", stderr.read().decode("utf-8")) + + def upload_cfy_plugins(self, yaml, wgn): + """Upload Cloudify plugins""" + (_, stdout, stderr) = self.ssh.exec_command( + "sudo docker exec cfy_manager_local " + f"cfy plugins upload -y {yaml} {wgn} && " + "sudo docker exec cfy_manager_local cfy status") + self.__logger.debug("output:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("error:\n%s", stderr.read().decode("utf-8")) + + def kill_existing_execution(self, dep_name): + """kill existing execution""" + try: + self.__logger.info('Deleting the current deployment') + exec_list = self.cfy_client.executions.list() + for execution in exec_list: + if execution['status'] == "started": + try: + self.cfy_client.executions.cancel( + execution['id'], force=True) + except Exception: # pylint: disable=broad-except + self.__logger.warning("Can't cancel the current exec") + execution = self.cfy_client.executions.start( + dep_name, 'uninstall', parameters=dict(ignore_failure=True)) + wait_for_execution(self.cfy_client, execution, self.__logger) + self.cfy_client.deployments.delete(dep_name) + time.sleep(10) + self.cfy_client.blueprints.delete(dep_name) + except Exception: # pylint: disable=broad-except + self.__logger.exception("Some issue during the undeployment ..") + + +def wait_for_execution(client, execution, logger, timeout=3600, ): + """Wait for a workflow execution on Cloudify Manager.""" + # if execution already ended - return without waiting + if execution.status in Execution.END_STATES: + return execution + + if timeout is not None: + deadline = time.time() + timeout + + # Poll for execution status and execution logs, until execution ends + # and we receive an event of type in WORKFLOW_END_TYPES + offset = 0 + batch_size = 50 + event_list = [] + execution_ended = False + while True: + event_list = client.events.list( + execution_id=execution.id, + _offset=offset, + _size=batch_size, + include_logs=True, + sort='@timestamp').items + + offset = offset + len(event_list) + for event in event_list: + logger.debug(event.get('message')) + + if timeout is not None: + if time.time() > deadline: + raise RuntimeError( + 'execution of operation {execution.workflow_id} for ' + 'deployment {execution.deployment_id} timed out') + # update the remaining timeout + timeout = deadline - time.time() + + if not execution_ended: + execution = client.executions.get(execution.id) + execution_ended = execution.status in Execution.END_STATES + + if execution_ended: + break + + time.sleep(5) + + return execution + + +def get_execution_id(client, deployment_id): + """ + Get the execution id of a env preparation. + + network, security group, fip, VM creation + """ + executions = client.executions.list(deployment_id=deployment_id) + for execution in executions: + if execution.workflow_id == 'create_deployment_environment': + return execution + raise RuntimeError('Failed to get create_deployment_environment ' + 'workflow execution.' + f'Available executions: {executions}') diff --git a/functest/core/feature.py b/functest/core/feature.py deleted file mode 100644 index 3200dad85..000000000 --- a/functest/core/feature.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 ZTE Corp 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 - -"""Define the parent classes of all Functest Features. - -Feature is considered as TestCase offered by Third-party. It offers -helpers to run any python method or any bash command. -""" - -import logging -import subprocess -import time - -import functest.core.testcase as base -from functest.utils.constants import CONST - -__author__ = ("Serena Feng <feng.xiaowei@zte.com.cn>, " - "Cedric Ollivier <cedric.ollivier@orange.com>") - - -class Feature(base.TestCase): - """Base model for single feature.""" - - __logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - super(Feature, self).__init__(**kwargs) - self.result_file = "{}/{}.log".format( - CONST.__getattribute__('dir_results'), self.case_name) - try: - module = kwargs['run']['module'] - self.logger = logging.getLogger(module) - except KeyError: - self.__logger.warning( - "Cannot get module name %s. Using %s as fallback", - kwargs, self.case_name) - self.logger = logging.getLogger(self.case_name) - handler = logging.StreamHandler() - handler.setLevel(logging.WARN) - self.logger.addHandler(handler) - handler = logging.FileHandler(self.result_file) - handler.setLevel(logging.DEBUG) - self.logger.addHandler(handler) - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - handler.setFormatter(formatter) - self.logger.addHandler(handler) - - def execute(self, **kwargs): - """Execute the Python method. - - The subclasses must override the default implementation which - is false on purpose. - - The new implementation must return 0 if success or anything - else if failure. - - Args: - kwargs: Arbitrary keyword arguments. - - Returns: - -1. - """ - # pylint: disable=unused-argument,no-self-use - return -1 - - def run(self, **kwargs): - """Run the feature. - - It allows executing any Python method by calling execute(). - - It sets the following attributes required to push the results - to DB: - - * result, - * start_time, - * stop_time. - - It doesn't fulfill details when pushing the results to the DB. - - Args: - kwargs: Arbitrary keyword arguments. - - Returns: - TestCase.EX_OK if execute() returns 0, - TestCase.EX_RUN_ERROR otherwise. - """ - self.start_time = time.time() - exit_code = base.TestCase.EX_RUN_ERROR - self.result = 0 - try: - if self.execute(**kwargs) == 0: - exit_code = base.TestCase.EX_OK - self.result = 100 - except Exception: # pylint: disable=broad-except - self.__logger.exception("%s FAILED", self.project_name) - self.__logger.info("Test result is stored in '%s'", self.result_file) - self.stop_time = time.time() - return exit_code - - -class BashFeature(Feature): - """Class designed to run any bash command.""" - - __logger = logging.getLogger(__name__) - - def execute(self, **kwargs): - """Execute the cmd passed as arg - - Args: - kwargs: Arbitrary keyword arguments. - - Returns: - 0 if cmd returns 0, - -1 otherwise. - """ - ret = -1 - try: - cmd = kwargs["cmd"] - with open(self.result_file, 'w+') as f_stdout: - proc = subprocess.Popen(cmd.split(), stdout=f_stdout, - stderr=subprocess.STDOUT) - ret = proc.wait() - if ret != 0: - self.__logger.error("Execute command: %s failed", cmd) - except KeyError: - self.__logger.error("Please give cmd as arg. kwargs: %s", kwargs) - return ret diff --git a/functest/core/robotframework.py b/functest/core/robotframework.py deleted file mode 100644 index 689d9d946..000000000 --- a/functest/core/robotframework.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 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 - -"""Define classes required to run any Robot suites.""" - -from __future__ import division - -import errno -import logging -import os - -import robot.api -from robot.errors import RobotError -import robot.run -from robot.utils.robottime import timestamp_to_secs -from six import StringIO - -from functest.core import testcase -from functest.utils import constants - -__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" - - -class ResultVisitor(robot.api.ResultVisitor): - """Visitor to get result details.""" - - def __init__(self): - self._data = [] - - def visit_test(self, test): - output = {} - output['name'] = test.name - output['parent'] = test.parent.name - output['status'] = test.status - output['starttime'] = test.starttime - output['endtime'] = test.endtime - output['critical'] = test.critical - output['text'] = test.message - output['elapsedtime'] = test.elapsedtime - self._data.append(output) - - def get_data(self): - """Get the details of the result.""" - return self._data - - -class RobotFramework(testcase.TestCase): - """RobotFramework runner.""" - - __logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - self.res_dir = os.path.join( - constants.CONST.__getattribute__('dir_results'), 'robot') - self.xml_file = os.path.join(self.res_dir, 'output.xml') - super(RobotFramework, self).__init__(**kwargs) - - def parse_results(self): - """Parse output.xml and get the details in it.""" - result = robot.api.ExecutionResult(self.xml_file) - visitor = ResultVisitor() - result.visit(visitor) - try: - self.result = 100 * ( - result.suite.statistics.critical.passed / - result.suite.statistics.critical.total) - except ZeroDivisionError: - self.__logger.error("No test has been run") - self.start_time = timestamp_to_secs(result.suite.starttime) - self.stop_time = timestamp_to_secs(result.suite.endtime) - self.details = {} - self.details['description'] = result.suite.name - self.details['tests'] = visitor.get_data() - - def run(self, **kwargs): - """Run the RobotFramework suites - - Here are the steps: - * create the output directories if required, - * get the results in output.xml, - * delete temporary files. - - Args: - kwargs: Arbitrary keyword arguments. - - Returns: - EX_OK if all suites ran well. - EX_RUN_ERROR otherwise. - """ - try: - suites = kwargs["suites"] - variable = kwargs.get("variable", []) - except KeyError: - self.__logger.exception("Mandatory args were not passed") - return self.EX_RUN_ERROR - try: - os.makedirs(self.res_dir) - except OSError as ex: - if ex.errno != errno.EEXIST: - self.__logger.exception("Cannot create %s", self.res_dir) - return self.EX_RUN_ERROR - except Exception: # pylint: disable=broad-except - self.__logger.exception("Cannot create %s", self.res_dir) - return self.EX_RUN_ERROR - stream = StringIO() - robot.run(*suites, variable=variable, output=self.xml_file, - log='NONE', report='NONE', stdout=stream) - self.__logger.info("\n" + stream.getvalue()) - self.__logger.info("Results were successfully generated") - try: - self.parse_results() - self.__logger.info("Results were successfully parsed") - except RobotError as ex: - self.__logger.error("Run suites before publishing: %s", ex.message) - return self.EX_RUN_ERROR - except Exception: # pylint: disable=broad-except - self.__logger.exception("Cannot parse results") - return self.EX_RUN_ERROR - return self.EX_OK diff --git a/functest/core/singlevm.py b/functest/core/singlevm.py new file mode 100644 index 000000000..4bce516d3 --- /dev/null +++ b/functest/core/singlevm.py @@ -0,0 +1,549 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +"""Ease deploying a single VM reachable via ssh + +It offers a simple way to create all tenant network resources + a VM for +advanced testcases (e.g. deploying an orchestrator). +""" + +import logging +import re +import tempfile +import time + +import paramiko +from xtesting.core import testcase + +from functest.core import tenantnetwork +from functest.utils import config +from functest.utils import env +from functest.utils import functest_utils + + +class VmReady1(tenantnetwork.TenantNetwork1): + """Prepare a single VM (scenario1) + + It inherits from TenantNetwork1 which creates all network resources and + prepares a future VM attached to that network. + + It ensures that all testcases inheriting from SingleVm1 could work + without specific configurations (or at least read the same config data). + """ + # pylint: disable=too-many-instance-attributes + + __logger = logging.getLogger(__name__) + filename = '/home/opnfv/functest/images/cirros-0.6.1-x86_64-disk.img' + image_format = 'qcow2' + extra_properties = {} + filename_alt = filename + image_alt_format = image_format + extra_alt_properties = extra_properties + visibility = 'private' + flavor_ram = 512 + flavor_vcpus = 1 + flavor_disk = 1 + flavor_extra_specs = {} + flavor_alt_ram = 1024 + flavor_alt_vcpus = 1 + flavor_alt_disk = 1 + flavor_alt_extra_specs = flavor_extra_specs + create_server_timeout = 180 + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'vmready1' + super().__init__(**kwargs) + self.image = None + self.flavor = None + + def publish_image(self, name=None): + """Publish image + + It allows publishing multiple images for the child testcases. It forces + the same configuration for all subtestcases. + + Returns: image + + Raises: expection on error + """ + assert self.cloud + extra_properties = self.extra_properties.copy() + if env.get('IMAGE_PROPERTIES'): + extra_properties.update( + functest_utils.convert_ini_to_dict( + env.get('IMAGE_PROPERTIES'))) + extra_properties.update( + getattr(config.CONF, f'{self.case_name}_extra_properties', {})) + image = self.cloud.create_image( + name if name else f'{self.case_name}-img_{self.guid}', + filename=getattr( + config.CONF, f'{self.case_name}_image', + self.filename), + meta=extra_properties, + disk_format=getattr( + config.CONF, f'{self.case_name}_image_format', + self.image_format), + visibility=getattr( + config.CONF, f'{self.case_name}_visibility', + self.visibility), + wait=True) + self.__logger.debug("image: %s", image) + return image + + def publish_image_alt(self, name=None): + """Publish alternative image + + It allows publishing multiple images for the child testcases. It forces + the same configuration for all subtestcases. + + Returns: image + + Raises: expection on error + """ + assert self.cloud + extra_alt_properties = self.extra_alt_properties.copy() + if env.get('IMAGE_PROPERTIES'): + extra_alt_properties.update( + functest_utils.convert_ini_to_dict( + env.get('IMAGE_PROPERTIES'))) + extra_alt_properties.update( + getattr(config.CONF, f'{self.case_name}_extra_alt_properties', {})) + image = self.cloud.create_image( + name if name else f'{self.case_name}-img_alt_{self.guid}', + filename=getattr( + config.CONF, f'{self.case_name}_image_alt', + self.filename_alt), + meta=extra_alt_properties, + disk_format=getattr( + config.CONF, f'{self.case_name}_image_alt_format', + self.image_format), + visibility=getattr( + config.CONF, f'{self.case_name}_visibility', + self.visibility), + wait=True) + self.__logger.debug("image: %s", image) + return image + + def create_flavor(self, name=None): + """Create flavor + + It allows creating multiple flavors for the child testcases. It forces + the same configuration for all subtestcases. + + Returns: flavor + + Raises: expection on error + """ + assert self.orig_cloud + flavor = self.orig_cloud.create_flavor( + name if name else f'{self.case_name}-flavor_{self.guid}', + getattr(config.CONF, f'{self.case_name}_flavor_ram', + self.flavor_ram), + getattr(config.CONF, f'{self.case_name}_flavor_vcpus', + self.flavor_vcpus), + getattr(config.CONF, f'{self.case_name}_flavor_disk', + self.flavor_disk)) + self.__logger.debug("flavor: %s", flavor) + flavor_extra_specs = self.flavor_extra_specs.copy() + if env.get('FLAVOR_EXTRA_SPECS'): + flavor_extra_specs.update( + functest_utils.convert_ini_to_dict( + env.get('FLAVOR_EXTRA_SPECS'))) + flavor_extra_specs.update( + getattr(config.CONF, + f'{self.case_name}_flavor_extra_specs', {})) + self.orig_cloud.set_flavor_specs(flavor.id, flavor_extra_specs) + return flavor + + def create_flavor_alt(self, name=None): + """Create flavor + + It allows creating multiple alt flavors for the child testcases. It + forces the same configuration for all subtestcases. + + Returns: flavor + + Raises: expection on error + """ + assert self.orig_cloud + flavor = self.orig_cloud.create_flavor( + name if name else f'{self.case_name}-flavor_alt_{self.guid}', + getattr(config.CONF, f'{self.case_name}_flavor_alt_ram', + self.flavor_alt_ram), + getattr(config.CONF, f'{self.case_name}_flavor_alt_vcpus', + self.flavor_alt_vcpus), + getattr(config.CONF, f'{self.case_name}_flavor_alt_disk', + self.flavor_alt_disk)) + self.__logger.debug("flavor: %s", flavor) + flavor_alt_extra_specs = self.flavor_alt_extra_specs.copy() + if env.get('FLAVOR_EXTRA_SPECS'): + flavor_alt_extra_specs.update( + functest_utils.convert_ini_to_dict( + env.get('FLAVOR_EXTRA_SPECS'))) + flavor_alt_extra_specs.update( + getattr(config.CONF, + f'{self.case_name}_flavor_alt_extra_specs', {})) + self.orig_cloud.set_flavor_specs( + flavor.id, flavor_alt_extra_specs) + return flavor + + def boot_vm(self, name=None, **kwargs): + """Boot the virtual machine + + It allows booting multiple machines for the child testcases. It forces + the same configuration for all subtestcases. + + Returns: vm + + Raises: expection on error + """ + assert self.cloud + vm1 = self.cloud.create_server( + name if name else f'{self.case_name}-vm_{self.guid}', + image=self.image.id, flavor=self.flavor.id, + auto_ip=False, + network=self.network.id if self.network else env.get( + "EXTERNAL_NETWORK"), + timeout=self.create_server_timeout, wait=True, **kwargs) + self.__logger.debug("vm: %s", vm1) + return vm1 + + def check_regex_in_console(self, name, regex=' login: ', loop=6): + """Wait for specific message in console + + Returns: True or False on errors + """ + assert self.cloud + for iloop in range(loop): + console = self.cloud.get_server_console(name) + self.__logger.debug("console: \n%s", console) + if re.search(regex, console): + self.__logger.debug( + "regex found: '%s' in console\n%s", regex, console) + return True + self.__logger.debug( + "try %s: cannot find regex '%s' in console\n%s", + iloop + 1, regex, console) + time.sleep(10) + self.__logger.error("cannot find regex '%s' in console", regex) + return False + + def clean_orphan_security_groups(self): + """Clean all security groups which are not owned by an existing tenant + + It lists all orphan security groups in use as debug to avoid + misunderstanding the testcase results (it could happen if cloud admin + removes accounts without cleaning the virtual machines) + """ + sec_groups = self.orig_cloud.list_security_groups() + for sec_group in sec_groups: + if not sec_group.tenant_id: + continue + if not self.orig_cloud.get_project(sec_group.tenant_id): + self.__logger.debug("Cleaning security group %s", sec_group.id) + try: + self.orig_cloud.delete_security_group(sec_group.id) + except Exception: # pylint: disable=broad-except + self.__logger.debug( + "Orphan security group %s in use", sec_group.id) + + def count_hypervisors(self): + """Count hypervisors.""" + if env.get('SKIP_DOWN_HYPERVISORS').lower() == 'false': + return len(self.orig_cloud.list_hypervisors()) + return self.count_active_hypervisors() + + def count_active_hypervisors(self): + """Count all hypervisors which are up.""" + compute_cnt = 0 + for hypervisor in self.orig_cloud.list_hypervisors(): + if hypervisor['state'] == 'up': + compute_cnt += 1 + else: + self.__logger.warning( + "%s is down", hypervisor['hypervisor_hostname']) + return compute_cnt + + def run(self, **kwargs): + """Boot the new VM + + Here are the main actions: + - publish the image + - create the flavor + + Returns: + - TestCase.EX_OK + - TestCase.EX_RUN_ERROR on error + """ + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + assert super().run( + **kwargs) == testcase.TestCase.EX_OK + self.image = self.publish_image() + self.flavor = self.create_flavor() + self.result = 100 + status = testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.__logger.exception('Cannot run %s', self.case_name) + self.result = 0 + finally: + self.stop_time = time.time() + return status + + def clean(self): + try: + assert self.orig_cloud + assert self.cloud + super().clean() + if self.image: + self.cloud.delete_image(self.image.id) + if self.flavor: + self.orig_cloud.delete_flavor(self.flavor.id) + if env.get('CLEAN_ORPHAN_SECURITY_GROUPS').lower() == 'true': + self.clean_orphan_security_groups() + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean all resources") + + +class VmReady2(VmReady1): + """Deploy a single VM reachable via ssh (scenario2) + + It creates new user/project before creating and configuring all tenant + network resources, flavors, images, etc. required by advanced testcases. + + It ensures that all testcases inheriting from SingleVm2 could work + without specific configurations (or at least read the same config data). + """ + + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'vmready2' + super().__init__(**kwargs) + try: + assert self.orig_cloud + self.project = tenantnetwork.NewProject( + self.orig_cloud, self.case_name, self.guid) + self.project.create() + self.cloud = self.project.cloud + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot create user or project") + self.cloud = None + self.project = None + + def clean(self): + try: + super().clean() + assert self.project + self.project.clean() + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean all resources") + + +class SingleVm1(VmReady1): + """Deploy a single VM reachable via ssh (scenario1) + + It inherits from TenantNetwork1 which creates all network resources and + completes it by booting a VM attached to that network. + + It ensures that all testcases inheriting from SingleVm1 could work + without specific configurations (or at least read the same config data). + """ + # pylint: disable=too-many-instance-attributes + + __logger = logging.getLogger(__name__) + username = 'cirros' + ssh_connect_timeout = 1 + ssh_connect_loops = 6 + create_floating_ip_timeout = 120 + check_console_loop = 6 + check_console_regex = ' login: ' + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'singlevm1' + super().__init__(**kwargs) + self.sshvm = None + self.sec = None + self.fip = None + self.keypair = None + self.ssh = None + (_, self.key_filename) = tempfile.mkstemp() + + def prepare(self): + """Create the security group and the keypair + + It can be overriden to set other rules according to the services + running in the VM + + Raises: Exception on error + """ + assert self.cloud + self.keypair = self.cloud.create_keypair( + f'{self.case_name}-kp_{self.guid}') + self.__logger.debug("keypair: %s", self.keypair) + self.__logger.debug("private_key:\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) + self.sec = self.cloud.create_security_group( + f'{self.case_name}-sg_{self.guid}', + f'created by OPNFV Functest ({self.case_name})') + self.cloud.create_security_group_rule( + self.sec.id, port_range_min='22', port_range_max='22', + protocol='tcp', direction='ingress') + self.cloud.create_security_group_rule( + self.sec.id, protocol='icmp', direction='ingress') + + def connect(self, vm1): + """Connect to a virtual machine via ssh + + It first adds a floating ip to the virtual machine and then establishes + the ssh connection. + + Returns: + - (fip, ssh) + - None on error + """ + assert vm1 + fip = None + if env.get('NO_TENANT_NETWORK').lower() != 'true': + fip = self.cloud.create_floating_ip( + network=self.ext_net.id, server=vm1, wait=True, + timeout=self.create_floating_ip_timeout) + self.__logger.debug("floating_ip: %s", fip) + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) + for loop in range(self.ssh_connect_loops): + try: + p_console = self.cloud.get_server_console(vm1) + self.__logger.debug("vm console: \n%s", p_console) + ssh.connect( + fip.floating_ip_address if fip else vm1.public_v4, + username=getattr( + config.CONF, + f'{self.case_name}_image_user', self.username), + key_filename=self.key_filename, + timeout=getattr( + config.CONF, + f'{self.case_name}_vm_ssh_connect_timeout', + self.ssh_connect_timeout)) + break + except Exception as exc: # pylint: disable=broad-except + self.__logger.debug( + "try %s: cannot connect to %s: %s", loop + 1, + fip.floating_ip_address if fip else vm1.public_v4, exc) + time.sleep(9) + else: + self.__logger.error( + "cannot connect to %s", fip.floating_ip_address) + return None + return (fip, ssh) + + def execute(self): + """Say hello world via ssh + + It can be overriden to execute any command. + + Returns: echo exit codes + """ + (_, stdout, stderr) = self.ssh.exec_command('echo Hello World') + self.__logger.debug("output:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("error:\n%s", stderr.read().decode("utf-8")) + return stdout.channel.recv_exit_status() + + def run(self, **kwargs): + """Boot the new VM + + Here are the main actions: + - add a new ssh key + - boot the VM + - create the security group + - execute the right command over ssh + + Returns: + - TestCase.EX_OK + - TestCase.EX_RUN_ERROR on error + """ + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + assert super().run( + **kwargs) == testcase.TestCase.EX_OK + self.result = 0 + self.prepare() + self.sshvm = self.boot_vm( + key_name=self.keypair.id, security_groups=[self.sec.id]) + if self.check_regex_in_console( + self.sshvm.name, regex=self.check_console_regex, + loop=self.check_console_loop): + (self.fip, self.ssh) = self.connect(self.sshvm) + if not self.execute(): + self.result = 100 + status = testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.__logger.exception('Cannot run %s', self.case_name) + finally: + self.stop_time = time.time() + return status + + def clean(self): + try: + assert self.orig_cloud + assert self.cloud + if self.fip: + self.cloud.delete_floating_ip(self.fip.id) + if self.sshvm: + self.cloud.delete_server(self.sshvm, wait=True) + if self.sec: + self.cloud.delete_security_group(self.sec.id) + if self.keypair: + self.cloud.delete_keypair(self.keypair.name) + super().clean() + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean all resources") + + +class SingleVm2(SingleVm1): + """Deploy a single VM reachable via ssh (scenario2) + + It creates new user/project before creating and configuring all tenant + network resources and vms required by advanced testcases. + + It ensures that all testcases inheriting from SingleVm2 could work + without specific configurations (or at least read the same config data). + """ + + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'singlevm2' + super().__init__(**kwargs) + try: + assert self.orig_cloud + self.project = tenantnetwork.NewProject( + self.orig_cloud, self.case_name, self.guid) + self.project.create() + self.cloud = self.project.cloud + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot create user or project") + self.cloud = None + self.project = None + + def clean(self): + try: + super().clean() + assert self.project + self.project.clean() + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean all resources") diff --git a/functest/core/tenantnetwork.py b/functest/core/tenantnetwork.py new file mode 100644 index 000000000..3670dbe8a --- /dev/null +++ b/functest/core/tenantnetwork.py @@ -0,0 +1,326 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +"""Ease deploying tenant networks + +It offers a simple way to create all tenant network resources required by a +testcase (including all Functest ones): + + - TenantNetwork1 selects the user and the project set as env vars + - TenantNetwork2 creates a user and project to isolate the same resources + +This classes could be reused by more complexed scenarios (Single VM) +""" + +import logging +import os +import time +import uuid + +import os_client_config +import shade +from tempest.lib.common.utils import data_utils +from xtesting.core import testcase + +from functest.utils import config +from functest.utils import env +from functest.utils import functest_utils + + +class NewProject(): + """Ease creating new projects/users""" + # pylint: disable=too-many-instance-attributes + + __logger = logging.getLogger(__name__) + + def __init__(self, cloud, case_name, guid): + self.cloud = None + self.orig_cloud = cloud + self.case_name = case_name + self.guid = guid + self.project = None + self.user = None + self.password = None + self.domain = None + self.role_name = None + self.default_member = env.get('NEW_USER_ROLE') + + def create(self): + """Create projects/users""" + assert self.orig_cloud + assert self.case_name + self.password = data_utils.rand_password().replace('%', '!') + self.__logger.debug("password: %s", self.password) + self.domain = self.orig_cloud.get_domain( + name_or_id=self.orig_cloud.auth.get( + "project_domain_name", "Default")) + self.project = self.orig_cloud.create_project( + name=f'{self.case_name[:18]}-project_{self.guid}', + description=f"Created by OPNFV Functest: {self.case_name}", + domain_id=self.domain.id) + self.__logger.debug("project: %s", self.project) + self.user = self.orig_cloud.create_user( + name=f'{self.case_name}-user_{self.guid}', + password=self.password, + domain_id=self.domain.id) + self.__logger.debug("user: %s", self.user) + try: + if self.orig_cloud.get_role(self.default_member): + self.role_name = self.default_member + elif self.orig_cloud.get_role(self.default_member.lower()): + self.role_name = self.default_member.lower() + else: + raise Exception(f"Cannot detect {self.default_member}") + except Exception: # pylint: disable=broad-except + self.__logger.info("Creating default role %s", self.default_member) + role = self.orig_cloud.create_role(self.default_member) + self.role_name = role.name + self.__logger.debug("role: %s", role) + self.orig_cloud.grant_role( + self.role_name, user=self.user.id, project=self.project.id, + domain=self.domain.id) + osconfig = os_client_config.config.OpenStackConfig() + osconfig.cloud_config[ + 'clouds']['envvars']['project_name'] = self.project.name + osconfig.cloud_config[ + 'clouds']['envvars']['project_id'] = self.project.id + osconfig.cloud_config['clouds']['envvars']['username'] = self.user.name + osconfig.cloud_config['clouds']['envvars']['password'] = self.password + self.__logger.debug("cloud_config %s", osconfig.cloud_config) + self.cloud = shade.OpenStackCloud( + cloud_config=osconfig.get_one_cloud()) + self.__logger.debug("new cloud %s", self.cloud.auth) + + def get_environ(self): + "Get new environ" + environ = dict( + os.environ, + OS_USERNAME=self.user.name, + OS_PROJECT_NAME=self.project.name, + OS_PROJECT_ID=self.project.id, + OS_PASSWORD=self.password) + try: + del environ['OS_TENANT_NAME'] + del environ['OS_TENANT_ID'] + except Exception: # pylint: disable=broad-except + pass + return environ + + def clean(self): + """Remove projects/users""" + try: + assert self.orig_cloud + if self.user: + self.orig_cloud.delete_user(self.user.id) + if self.project: + self.orig_cloud.delete_project(self.project.id) + secgroups = self.orig_cloud.list_security_groups( + filters={'name': 'default', + 'project_id': self.project.id}) + if secgroups: + sec_id = secgroups[0].id + self.orig_cloud.delete_security_group(sec_id) + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean all resources") + + +class TenantNetwork1(testcase.TestCase): + # pylint: disable=too-many-instance-attributes + """Create a tenant network (scenario1) + + It creates and configures all tenant network resources required by + advanced testcases (subnet, network and router). + + It ensures that all testcases inheriting from TenantNetwork1 could work + without network specific configurations (or at least read the same config + data). + """ + + __logger = logging.getLogger(__name__) + cidr = '192.168.120.0/24' + shared_network = False + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'tenantnetwork1' + super().__init__(**kwargs) + self.dir_results = os.path.join(getattr(config.CONF, 'dir_results')) + self.res_dir = os.path.join(self.dir_results, self.case_name) + self.output_log_name = 'functest.log' + self.output_debug_log_name = 'functest.debug.log' + self.ext_net = None + try: + cloud_config = os_client_config.get_config() + self.cloud = self.orig_cloud = shade.OpenStackCloud( + cloud_config=cloud_config) + except Exception: # pylint: disable=broad-except + self.cloud = self.orig_cloud = None + self.__logger.exception("Cannot connect to Cloud") + if env.get('NO_TENANT_NETWORK').lower() != 'true': + try: + self.ext_net = self.get_external_network(self.cloud) + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot get the external network") + self.guid = str(uuid.uuid4()) + self.network = None + self.subnet = None + self.router = None + + @staticmethod + def get_external_network(cloud): + """ + Return the configured external network name or + the first retrieved external network name + """ + assert cloud + if env.get("EXTERNAL_NETWORK"): + network = cloud.get_network( + env.get("EXTERNAL_NETWORK"), {"router:external": True}) + if network: + return network + networks = cloud.list_networks({"router:external": True}) + if networks: + return networks[0] + return None + + @staticmethod + def get_default_role(cloud, member="Member"): + """Get the default role + + It also tests the role in lowercase to avoid possible conflicts. + """ + role = cloud.get_role(member) + if not role: + role = cloud.get_role(member.lower()) + return role + + @staticmethod + def get_public_auth_url(cloud): + """Get Keystone public endpoint""" + keystone_id = functest_utils.search_services(cloud, 'keystone')[0].id + endpoint = cloud.search_endpoints( + filters={'interface': 'public', + 'service_id': keystone_id})[0].url + return endpoint + + def create_network_resources(self): + """Create all tenant network resources + + It creates a router which gateway is the external network detected. + The new subnet is attached to that router. + + Raises: expection on error + """ + assert self.cloud + if env.get('NO_TENANT_NETWORK').lower() != 'true': + assert self.ext_net + provider = {} + if hasattr(config.CONF, f'{self.case_name}_network_type'): + provider["network_type"] = getattr( + config.CONF, f'{self.case_name}_network_type') + if hasattr(config.CONF, f'{self.case_name}_physical_network'): + provider["physical_network"] = getattr( + config.CONF, f'{self.case_name}_physical_network') + if hasattr(config.CONF, f'{self.case_name}_segmentation_id'): + provider["segmentation_id"] = getattr( + config.CONF, f'{self.case_name}_segmentation_id') + domain = self.orig_cloud.get_domain( + name_or_id=self.orig_cloud.auth.get( + "project_domain_name", "Default")) + project = self.orig_cloud.get_project( + self.cloud.auth['project_name'], + domain_id=domain.id) + self.network = self.orig_cloud.create_network( + f'{self.case_name}-net_{self.guid}', + provider=provider, project_id=project.id, + shared=self.shared_network) + self.__logger.debug("network: %s", self.network) + + self.subnet = self.cloud.create_subnet( + self.network.id, + subnet_name=f'{self.case_name}-subnet_{self.guid}', + cidr=getattr( + config.CONF, f'{self.case_name}_private_subnet_cidr', + self.cidr), + enable_dhcp=True, + dns_nameservers=[env.get('NAMESERVER')]) + self.__logger.debug("subnet: %s", self.subnet) + + self.router = self.cloud.create_router( + name=f'{self.case_name}-router_{self.guid}', + ext_gateway_net_id=self.ext_net.id if self.ext_net else None) + self.__logger.debug("router: %s", self.router) + self.cloud.add_router_interface(self.router, subnet_id=self.subnet.id) + + def run(self, **kwargs): + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + self.start_time = time.time() + if env.get('NO_TENANT_NETWORK').lower() != 'true': + self.create_network_resources() + self.result = 100 + status = testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.__logger.exception('Cannot run %s', self.case_name) + finally: + self.stop_time = time.time() + return status + + def clean(self): + try: + assert self.cloud + if self.router: + if self.subnet: + self.cloud.remove_router_interface( + self.router, self.subnet.id) + self.cloud.delete_router(self.router.id) + if self.subnet: + self.cloud.delete_subnet(self.subnet.id) + if self.network: + self.cloud.delete_network(self.network.id) + except Exception: # pylint: disable=broad-except + self.__logger.exception("cannot clean all resources") + + +class TenantNetwork2(TenantNetwork1): + """Create a tenant network (scenario2) + + It creates new user/project before creating and configuring all tenant + network resources required by a testcase (subnet, network and router). + + It ensures that all testcases inheriting from TenantNetwork2 could work + without network specific configurations (or at least read the same config + data). + """ + + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'tenantnetwork2' + super().__init__(**kwargs) + try: + assert self.cloud + self.project = NewProject( + self.cloud, self.case_name, self.guid) + self.project.create() + self.cloud = self.project.cloud + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot create user or project") + self.cloud = None + self.project = None + + def clean(self): + try: + super().clean() + assert self.project + self.project.clean() + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean all resources") diff --git a/functest/core/testcase.py b/functest/core/testcase.py deleted file mode 100644 index fa3802872..000000000 --- a/functest/core/testcase.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/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 - -"""Define the parent class of all Functest TestCases.""" - -import logging -import os - -import functest.utils.functest_utils as ft_utils - -import prettytable - - -__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" - - -class TestCase(object): - """Base model for single test case.""" - - EX_OK = os.EX_OK - """everything is OK""" - - EX_RUN_ERROR = os.EX_SOFTWARE - """run() failed""" - - EX_PUSH_TO_DB_ERROR = os.EX_SOFTWARE - 1 - """push_to_db() failed""" - - EX_TESTCASE_FAILED = os.EX_SOFTWARE - 2 - """results are false""" - - __logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - self.details = {} - self.project_name = kwargs.get('project_name', 'functest') - self.case_name = kwargs.get('case_name', '') - self.criteria = kwargs.get('criteria', 100) - self.result = 0 - self.start_time = 0 - self.stop_time = 0 - - def __str__(self): - try: - assert self.project_name - assert self.case_name - result = 'PASS' if(self.is_successful( - ) == TestCase.EX_OK) else 'FAIL' - msg = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['test case', 'project', 'duration', - 'result']) - msg.add_row([self.case_name, self.project_name, - self.get_duration(), result]) - return msg.get_string() - except AssertionError: - self.__logger.error("We cannot print invalid objects") - return super(TestCase, self).__str__() - - def get_duration(self): - """Return the duration of the test case. - - Returns: - duration if start_time and stop_time are set - "XX:XX" otherwise. - """ - try: - assert self.start_time - assert self.stop_time - if self.stop_time < self.start_time: - return "XX:XX" - return "{0[0]:02.0f}:{0[1]:02.0f}".format(divmod( - self.stop_time - self.start_time, 60)) - except Exception: # pylint: disable=broad-except - self.__logger.error("Please run test before getting the duration") - return "XX:XX" - - def is_successful(self): - """Interpret the result of the test case. - - It allows getting the result of TestCase. It completes run() - which only returns the execution status. - - It can be overriden if checking result is not suitable. - - Returns: - TestCase.EX_OK if result is 'PASS'. - TestCase.EX_TESTCASE_FAILED otherwise. - """ - try: - assert self.criteria - assert self.result is not None - if (not isinstance(self.result, str) and - not isinstance(self.criteria, str)): - if self.result >= self.criteria: - return TestCase.EX_OK - else: - # Backward compatibility - # It must be removed as soon as TestCase subclasses - # stop setting result = 'PASS' or 'FAIL'. - # In this case criteria is unread. - self.__logger.warning( - "Please update result which must be an int!") - if self.result == 'PASS': - return TestCase.EX_OK - except AssertionError: - self.__logger.error("Please run test before checking the results") - return TestCase.EX_TESTCASE_FAILED - - def run(self, **kwargs): - """Run the test case. - - It allows running TestCase and getting its execution - status. - - The subclasses must override the default implementation which - is false on purpose. - - The new implementation must set the following attributes to - push the results to DB: - - * result, - * start_time, - * stop_time. - - Args: - kwargs: Arbitrary keyword arguments. - - Returns: - TestCase.EX_RUN_ERROR. - """ - # pylint: disable=unused-argument - self.__logger.error("Run must be implemented") - return TestCase.EX_RUN_ERROR - - def push_to_db(self): - """Push the results of the test case to the DB. - - It allows publishing the results and to check the status. - - It could be overriden if the common implementation is not - suitable. The following attributes must be set before pushing - the results to DB: - - * project_name, - * case_name, - * result, - * start_time, - * stop_time. - - Returns: - TestCase.EX_OK if results were pushed to DB. - TestCase.EX_PUSH_TO_DB_ERROR otherwise. - """ - try: - assert self.project_name - assert self.case_name - assert self.start_time - assert self.stop_time - pub_result = 'PASS' if self.is_successful( - ) == TestCase.EX_OK else 'FAIL' - if ft_utils.push_results_to_db( - self.project_name, self.case_name, self.start_time, - self.stop_time, pub_result, self.details): - self.__logger.info( - "The results were successfully pushed to DB") - return TestCase.EX_OK - else: - self.__logger.error("The results cannot be pushed to DB") - return TestCase.EX_PUSH_TO_DB_ERROR - except Exception: # pylint: disable=broad-except - self.__logger.exception("The results cannot be pushed to DB") - return TestCase.EX_PUSH_TO_DB_ERROR - - def clean(self): - """Clean the resources. - - It can be overriden if resources must be deleted after - running the test case. - """ diff --git a/functest/core/unit.py b/functest/core/unit.py deleted file mode 100644 index 61b5a58d9..000000000 --- a/functest/core/unit.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2016 Cable Television Laboratories, Inc. 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 - -"""Define the parent class to run unittest.TestSuite as TestCase.""" - -from __future__ import division - -import logging -import time -import unittest - -import six - -from functest.core import testcase - -__author__ = ("Steven Pisarski <s.pisarski@cablelabs.com>, " - "Cedric Ollivier <cedric.ollivier@orange.com>") - - -class Suite(testcase.TestCase): - """Base model for running unittest.TestSuite.""" - - __logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - super(Suite, self).__init__(**kwargs) - self.suite = None - - def run(self, **kwargs): - """Run the test suite. - - It allows running any unittest.TestSuite and getting its - execution status. - - By default, it runs the suite defined as instance attribute. - It can be overriden by passing name as arg. It must - conform with TestLoader.loadTestsFromName(). - - It sets the following attributes required to push the results - to DB: - - * result, - * start_time, - * stop_time, - * details. - - Args: - kwargs: Arbitrary keyword arguments. - - Returns: - TestCase.EX_OK if any TestSuite has been run, - TestCase.EX_RUN_ERROR otherwise. - """ - try: - name = kwargs["name"] - try: - self.suite = unittest.TestLoader().loadTestsFromName(name) - except ImportError: - self.__logger.error("Can not import %s", name) - return testcase.TestCase.EX_RUN_ERROR - except KeyError: - pass - try: - assert self.suite - self.start_time = time.time() - stream = six.StringIO() - result = unittest.TextTestRunner( - stream=stream, verbosity=2).run(self.suite) - self.__logger.debug("\n\n%s", stream.getvalue()) - self.stop_time = time.time() - self.details = { - "testsRun": result.testsRun, - "failures": len(result.failures), - "errors": len(result.errors), - "stream": stream.getvalue()} - self.result = 100 * ( - (result.testsRun - (len(result.failures) + - len(result.errors))) / - result.testsRun) - return testcase.TestCase.EX_OK - except AssertionError: - self.__logger.error("No suite is defined") - return testcase.TestCase.EX_RUN_ERROR - except ZeroDivisionError: - self.__logger.error("No test has been run") - return testcase.TestCase.EX_RUN_ERROR diff --git a/functest/core/vnf.py b/functest/core/vnf.py deleted file mode 100644 index 73aaf446e..000000000 --- a/functest/core/vnf.py +++ /dev/null @@ -1,206 +0,0 @@ -#!/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 - -"""Define the parent class of all VNF TestCases.""" - -import logging -import time - -import functest.core.testcase as base -from functest.utils.constants import CONST -from snaps.config.user import UserConfig -from snaps.config.project import ProjectConfig -from snaps.openstack.create_user import OpenStackUser -from snaps.openstack.create_project import OpenStackProject -from snaps.openstack.tests import openstack_tests - -__author__ = ("Morgan Richomme <morgan.richomme@orange.com>, " - "Valentin Boucher <valentin.boucher@orange.com>") - - -class VnfPreparationException(Exception): - """Raise when VNF preparation cannot be executed.""" - - -class OrchestratorDeploymentException(Exception): - """Raise when orchestrator cannot be deployed.""" - - -class VnfDeploymentException(Exception): - """Raise when VNF cannot be deployed.""" - - -class VnfTestException(Exception): - """Raise when VNF cannot be tested.""" - - -class VnfOnBoarding(base.TestCase): - """Base model for VNF test cases.""" - - __logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - super(VnfOnBoarding, self).__init__(**kwargs) - self.tenant_name = CONST.__getattribute__( - 'vnf_{}_tenant_name'.format(self.case_name)) - self.snaps_creds = {} - self.created_object = [] - self.os_project = None - - def run(self, **kwargs): - """ - Run of the VNF test case: - - * Deploy an orchestrator if needed (e.g. heat, cloudify, ONAP,...), - * Deploy the VNF, - * Perform tests on the VNF - - A VNF test case is successfull when the 3 steps are PASS - If one of the step is FAIL, the test case is FAIL - - Returns: - TestCase.EX_OK if result is 'PASS'. - TestCase.EX_TESTCASE_FAILED otherwise. - """ - self.start_time = time.time() - - try: - self.prepare() - if (self.deploy_orchestrator() and - self.deploy_vnf() and - self.test_vnf()): - self.stop_time = time.time() - # Calculation with different weight depending on the steps TODO - self.result = 100 - return base.TestCase.EX_OK - else: - self.result = 0 - self.stop_time = time.time() - return base.TestCase.EX_TESTCASE_FAILED - except Exception: # pylint: disable=broad-except - self.stop_time = time.time() - self.__logger.exception("Exception on VNF testing") - return base.TestCase.EX_TESTCASE_FAILED - - def prepare(self): - """ - Prepare the environment for VNF testing: - - * Creation of a user, - * Creation of a tenant, - * Allocation admin role to the user on this tenant - - Returns base.TestCase.EX_OK if preparation is successfull - - Raise VnfPreparationException in case of problem - """ - try: - tenant_description = CONST.__getattribute__( - 'vnf_{}_tenant_description'.format(self.case_name)) - self.__logger.info("Prepare VNF: %s, description: %s", - self.tenant_name, tenant_description) - snaps_creds = openstack_tests.get_credentials( - os_env_file=CONST.__getattribute__('openstack_creds')) - - project_creator = OpenStackProject( - snaps_creds, - ProjectConfig( - name=self.tenant_name, - description=tenant_description - )) - project_creator.create() - self.created_object.append(project_creator) - self.os_project = project_creator - - user_creator = OpenStackUser( - snaps_creds, - UserConfig( - name=self.tenant_name, - password=self.tenant_name, - roles={'admin': self.tenant_name})) - - user_creator.create() - self.created_object.append(user_creator) - - self.snaps_creds = user_creator.get_os_creds(self.tenant_name) - - return base.TestCase.EX_OK - except Exception: # pylint: disable=broad-except - self.__logger.exception("Exception raised during VNF preparation") - raise VnfPreparationException - - def deploy_orchestrator(self): - """ - Deploy an orchestrator (optional). - - If this method is overriden then raise orchestratorDeploymentException - if error during orchestrator deployment - """ - self.__logger.info("Deploy orchestrator (if necessary)") - return True - - def deploy_vnf(self): - """ - Deploy the VNF - - This function MUST be implemented by vnf test cases. - The details section MAY be updated in the vnf test cases. - - The deployment can be executed via a specific orchestrator - or using build-in orchestrators such as heat, OpenBaton, cloudify, - juju, onap, ... - - Returns: - True if the VNF is properly deployed - False if the VNF is not deployed - - Raise VnfDeploymentException if error during VNF deployment - """ - self.__logger.error("VNF must be deployed") - raise VnfDeploymentException - - def test_vnf(self): - """ - Test the VNF - - This function MUST be implemented by vnf test cases. - The details section MAY be updated in the vnf test cases. - - Once a VNF is deployed, it is assumed that specific test suite can be - run to validate the VNF. - Please note that the same test suite can be used on several test case - (e.g. clearwater test suite can be used whatever the orchestrator used - for the deployment) - - Returns: - True if VNF tests are PASS - False if test suite is FAIL - - Raise VnfTestException if error during VNF test - """ - self.__logger.error("VNF must be tested") - raise VnfTestException - - def clean(self): - """ - Clean VNF test case. - - It is up to the test providers to delete resources used for the tests. - By default we clean: - - * the user, - * the tenant - """ - self.__logger.info("test cleaning") - self.__logger.info('Remove the cloudify manager OS object ..') - for creator in reversed(self.created_object): - try: - creator.clean() - except Exception as exc: # pylint: disable=broad-except - self.__logger.error('Unexpected error cleaning - %s', exc) diff --git a/functest/energy/energy.py b/functest/energy/energy.py deleted file mode 100644 index 2835e05c1..000000000 --- a/functest/energy/energy.py +++ /dev/null @@ -1,335 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -# Copyright (c) 2017 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 - -"""This module manages calls to Energy recording API.""" - -import json -import logging - -from functools import wraps -import requests -from six.moves import urllib - -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - - -def finish_session(current_scenario): - """Finish a recording session.""" - if current_scenario is None: - EnergyRecorder.stop() - else: - EnergyRecorder.logger.debug("Restoring previous scenario (%s/%s)", - current_scenario["scenario"], - current_scenario["step"]) - EnergyRecorder.submit_scenario( - current_scenario["scenario"], - current_scenario["step"] - ) - - -def enable_recording(method): - """ - Record energy during method execution. - - Decorator to record energy during "method" exection. - - param method: Method to suround with start and stop - :type method: function - - .. note:: "method" should belong to a class having a "case_name" - attribute - """ - @wraps(method) - def wrapper(*args): - """ - Record energy during method execution (implementation). - - Wrapper for decorator to handle method arguments. - """ - current_scenario = EnergyRecorder.get_current_scenario() - EnergyRecorder.start(args[0].case_name) - try: - return_value = method(*args) - finish_session(current_scenario) - except Exception as exc: # pylint: disable=broad-except - EnergyRecorder.logger.exception(exc) - finish_session(current_scenario) - raise exc - return return_value - return wrapper - - -# Class to manage energy recording sessions -class EnergyRecorder(object): - """Manage Energy recording session.""" - - logger = logging.getLogger(__name__) - # Energy recording API connectivity settings - # see load_config method - energy_recorder_api = None - - # Default initial step - INITIAL_STEP = "running" - - # Default connection timeout - CONNECTION_TIMEOUT = 4 - - @staticmethod - def load_config(): - """ - Load connectivity settings from yaml. - - Load connectivity settings to Energy recording API - Use functest global config yaml file - (see functest_utils.get_functest_config) - """ - # Singleton pattern for energy_recorder_api static member - # Load only if not previouly done - if EnergyRecorder.energy_recorder_api is None: - environment = CONST.__getattribute__('NODE_NAME') - - # API URL - energy_recorder_uri = ft_utils.get_functest_config( - "energy_recorder.api_url") - assert energy_recorder_uri - assert environment - - uri_comp = "/recorders/environment/" - uri_comp += urllib.parse.quote_plus(environment) - - # Creds - creds_usr = ft_utils.get_functest_config( - "energy_recorder.api_user") - creds_pass = ft_utils.get_functest_config( - "energy_recorder.api_password") - - if creds_usr != "" and creds_pass != "": - energy_recorder_api_auth = (creds_usr, creds_pass) - else: - energy_recorder_api_auth = None - - try: - resp = requests.get(energy_recorder_uri + "/monitoring/ping", - auth=energy_recorder_api_auth, - headers={ - 'content-type': 'application/json' - }, - timeout=EnergyRecorder.CONNECTION_TIMEOUT) - api_available = json.loads(resp.text)["status"] == "OK" - EnergyRecorder.logger.info( - "API recorder available at : %s", - energy_recorder_uri + uri_comp) - except Exception as exc: # pylint: disable=broad-except - EnergyRecorder.logger.info( - "Energy recorder API is not available, cause=%s", - str(exc)) - api_available = False - # Final config - EnergyRecorder.energy_recorder_api = { - "uri": energy_recorder_uri + uri_comp, - "auth": energy_recorder_api_auth, - "available": api_available - } - return EnergyRecorder.energy_recorder_api["available"] - - @staticmethod - def submit_scenario(scenario, step): - """ - Submit a complet scenario definition to Energy recorder API. - - param scenario: Scenario name - :type scenario: string - param step: Step name - :type step: string - """ - try: - return_status = True - # Ensure that connectyvity settings are loaded - if EnergyRecorder.load_config(): - EnergyRecorder.logger.debug("Submitting scenario (%s/%s)", - scenario, step) - - # Create API payload - payload = { - "step": step, - "scenario": scenario - } - # Call API to start energy recording - response = requests.post( - EnergyRecorder.energy_recorder_api["uri"], - data=json.dumps(payload), - auth=EnergyRecorder.energy_recorder_api["auth"], - headers={ - 'content-type': 'application/json' - }, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - if response.status_code != 200: - EnergyRecorder.logger.error( - "Error while submitting scenario\n%s", - response.text) - return_status = False - except requests.exceptions.ConnectionError: - EnergyRecorder.logger.warning( - "submit_scenario: Unable to connect energy recorder API") - return_status = False - except Exception: # pylint: disable=broad-except - # Default exception handler to ensure that method - # is safe for caller - EnergyRecorder.logger.exception( - "Error while submitting scenarion to energy recorder API" - ) - return_status = False - return return_status - - @staticmethod - def start(scenario): - """ - Start a recording session for scenario. - - param scenario: Starting scenario - :type scenario: string - """ - return_status = True - try: - if EnergyRecorder.load_config(): - EnergyRecorder.logger.debug("Starting recording") - return_status = EnergyRecorder.submit_scenario( - scenario, - EnergyRecorder.INITIAL_STEP - ) - - except Exception: # pylint: disable=broad-except - # Default exception handler to ensure that method - # is safe for caller - EnergyRecorder.logger.exception( - "Error while starting energy recorder API" - ) - return_status = False - return return_status - - @staticmethod - def stop(): - """Stop current recording session.""" - return_status = True - try: - # Ensure that connectyvity settings are loaded - if EnergyRecorder.load_config(): - EnergyRecorder.logger.debug("Stopping recording") - - # Call API to stop energy recording - response = requests.delete( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - headers={ - 'content-type': 'application/json' - }, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - if response.status_code != 200: - EnergyRecorder.logger.error( - "Error while stating energy recording session\n%s", - response.text) - return_status = False - except requests.exceptions.ConnectionError: - EnergyRecorder.logger.warning( - "stop: Unable to connect energy recorder API") - return_status = False - except Exception: # pylint: disable=broad-except - # Default exception handler to ensure that method - # is safe for caller - EnergyRecorder.logger.exception( - "Error while stoping energy recorder API" - ) - return_status = False - return return_status - - @staticmethod - def set_step(step): - """Notify energy recording service of current step of the testcase.""" - return_status = True - try: - # Ensure that connectyvity settings are loaded - if EnergyRecorder.load_config(): - EnergyRecorder.logger.debug("Setting step") - - # Create API payload - payload = { - "step": step, - } - - # Call API to define step - response = requests.post( - EnergyRecorder.energy_recorder_api["uri"] + "/step", - data=json.dumps(payload), - auth=EnergyRecorder.energy_recorder_api["auth"], - headers={ - 'content-type': 'application/json' - }, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - if response.status_code != 200: - EnergyRecorder.logger.error( - "Error while setting current step of testcase\n%s", - response.text) - return_status = False - except requests.exceptions.ConnectionError: - EnergyRecorder.logger.warning( - "set_step: Unable to connect energy recorder API") - return_status = False - except Exception: # pylint: disable=broad-except - # Default exception handler to ensure that method - # is safe for caller - EnergyRecorder.logger.exception( - "Error while setting step on energy recorder API" - ) - return_status = False - return return_status - - @staticmethod - def get_current_scenario(): - """Get current running scenario (if any, None else).""" - return_value = None - try: - # Ensure that connectyvity settings are loaded - if EnergyRecorder.load_config(): - EnergyRecorder.logger.debug("Getting current scenario") - - # Call API get running scenario - response = requests.get( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - if response.status_code == 200: - return_value = json.loads(response.text) - elif response.status_code == 404: - EnergyRecorder.logger.info( - "No current running scenario at %s", - EnergyRecorder.energy_recorder_api["uri"]) - return_value = None - else: - EnergyRecorder.logger.error( - "Error while getting current scenario\n%s", - response.text) - return_value = None - except requests.exceptions.ConnectionError: - EnergyRecorder.logger.warning( - "get_currernt_sceario: Unable to connect energy recorder API") - return_value = None - except Exception: # pylint: disable=broad-except - # Default exception handler to ensure that method - # is safe for caller - EnergyRecorder.logger.exception( - "Error while getting current scenario from energy recorder API" - ) - return_value = None - return return_value diff --git a/functest/api/__init__.py b/functest/opnfv_tests/openstack/api/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/api/__init__.py +++ b/functest/opnfv_tests/openstack/api/__init__.py diff --git a/functest/opnfv_tests/openstack/api/connection_check.py b/functest/opnfv_tests/openstack/api/connection_check.py new file mode 100644 index 000000000..eaf9767c0 --- /dev/null +++ b/functest/opnfv_tests/openstack/api/connection_check.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +"""Verify the connection to OpenStack Services""" + +import logging +import time + +import os_client_config +import shade +from xtesting.core import testcase + +from functest.utils import env +from functest.utils import functest_utils + + +class ConnectionCheck(testcase.TestCase): + """Perform simplest queries""" + __logger = logging.getLogger(__name__) + + func_list = [ + "get_network_extensions", "list_aggregates", "list_domains", + "list_endpoints", "list_floating_ip_pools", "list_floating_ips", + "list_hypervisors", "list_keypairs", "list_networks", "list_ports", + "list_role_assignments", "list_roles", "list_routers", "list_servers", + "list_subnets"] + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'connection_check' + super().__init__(**kwargs) + self.output_log_name = 'functest.log' + self.output_debug_log_name = 'functest.debug.log' + try: + cloud_config = os_client_config.get_config() + self.cloud = shade.OpenStackCloud(cloud_config=cloud_config) + except Exception: # pylint: disable=broad-except + self.cloud = None + + def run(self, **kwargs): + # pylint: disable=protected-access + """Run all read operations to check connections""" + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + self.start_time = time.time() + self.__logger.debug( + "list_services: %s", functest_utils.list_services(self.cloud)) + if env.get('NO_TENANT_NETWORK').lower() == 'true': + self.func_list.remove("list_floating_ip_pools") + self.func_list.remove("list_floating_ips") + self.func_list.remove("list_routers") + for func in self.func_list: + self.__logger.debug( + "%s: %s", func, getattr(self.cloud, func)()) + data = self.cloud._network_client.get("/service-providers.json") + self.__logger.debug( + "list_service_providers: %s", + self.cloud._get_and_munchify('service_providers', data)) + functest_utils.get_openstack_version(self.cloud) + self.result = 100 + status = testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.__logger.exception('Cannot run %s', self.case_name) + finally: + self.stop_time = time.time() + return status diff --git a/functest/api/common/__init__.py b/functest/opnfv_tests/openstack/barbican/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/api/common/__init__.py +++ b/functest/opnfv_tests/openstack/barbican/__init__.py diff --git a/functest/opnfv_tests/openstack/barbican/barbican.py b/functest/opnfv_tests/openstack/barbican/barbican.py new file mode 100644 index 000000000..706304bbf --- /dev/null +++ b/functest/opnfv_tests/openstack/barbican/barbican.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +from six.moves import configparser + +from functest.opnfv_tests.openstack.tempest import tempest + + +class Barbican(tempest.TempestCommon): + + def configure(self, **kwargs): + super().configure(**kwargs) + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if not rconfig.has_section('auth'): + rconfig.add_section('auth') + rconfig.set('auth', 'tempest_roles', 'creator') + if not rconfig.has_section('glance'): + rconfig.add_section('glance') + rconfig.set('glance', 'verify_glance_signatures', True) + if not rconfig.has_section('ephemeral_storage_encryption'): + rconfig.add_section('ephemeral_storage_encryption') + rconfig.set('ephemeral_storage_encryption', 'enabled', True) + if not rconfig.has_section('image-feature-enabled'): + rconfig.add_section('image-feature-enabled') + rconfig.set('image-feature-enabled', 'api_v1', False) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + self.backup_tempest_config(self.conf_file, self.res_dir) diff --git a/functest/api/database/__init__.py b/functest/opnfv_tests/openstack/cinder/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/api/database/__init__.py +++ b/functest/opnfv_tests/openstack/cinder/__init__.py diff --git a/functest/opnfv_tests/openstack/cinder/cinder_test.py b/functest/opnfv_tests/openstack/cinder/cinder_test.py new file mode 100644 index 000000000..7d8c0a0bd --- /dev/null +++ b/functest/opnfv_tests/openstack/cinder/cinder_test.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 Enea AB and others + +# 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 + +"""CinderCheck testcase.""" + +import logging + +import pkg_resources +from scp import SCPClient +from xtesting.core import testcase + +from functest.core import singlevm +from functest.utils import config +from functest.utils import env + + +class CinderCheck(singlevm.SingleVm2): + """ + CinderCheck testcase implementation. + + Class to execute the CinderCheck test using 2 Floating IPs + to connect to the VMs and one data volume + """ + # pylint: disable=too-many-instance-attributes + volume_timeout = 60 + + def __init__(self, **kwargs): + """Initialize testcase.""" + if "case_name" not in kwargs: + kwargs["case_name"] = "cinder_test" + super().__init__(**kwargs) + self.logger = logging.getLogger(__name__) + self.vm2 = None + self.fip2 = None + self.ssh2 = None + self.volume = None + + def execute(self): + """Execute CinderCheck testcase. + + Sets up the OpenStack keypair, router, security group, and VM instance + objects then validates cinder. + :return: the exit code from the super.execute() method + """ + return self._write_data() or self._read_data() + + def prepare(self): + super().prepare() + self.vm2 = self.boot_vm( + f'{self.case_name}-vm2_{self.guid}', + key_name=self.keypair.id, + security_groups=[self.sec.id]) + (self.fip2, self.ssh2) = self.connect(self.vm2) + self.volume = self.cloud.create_volume( + name=f'{self.case_name}-volume_{self.guid}', size='2', + timeout=self.volume_timeout, wait=True) + + def _write_data(self): + assert self.cloud + self.cloud.attach_volume(self.sshvm, self.volume, + timeout=self.volume_timeout) + write_data_script = pkg_resources.resource_filename( + 'functest.opnfv_tests.openstack.cinder', 'write_data.sh') + try: + scp = SCPClient(self.ssh.get_transport()) + scp.put(write_data_script, remote_path="~/") + except Exception: # pylint: disable=broad-except + self.logger.error("File not transfered!") + return testcase.TestCase.EX_RUN_ERROR + self.logger.debug("ssh: %s", self.ssh) + (_, stdout, stderr) = self.ssh.exec_command( + f"sh ~/write_data.sh {env.get('VOLUME_DEVICE_NAME')}") + self.logger.debug( + "volume_write stdout: %s", stdout.read().decode("utf-8")) + self.logger.debug( + "volume_write stderr: %s", stderr.read().decode("utf-8")) + # Detach volume from VM 1 + self.logger.info("Detach volume from VM 1") + self.cloud.detach_volume( + self.sshvm, self.volume, timeout=self.volume_timeout) + return stdout.channel.recv_exit_status() + + def _read_data(self): + assert self.cloud + # Attach volume to VM 2 + self.logger.info("Attach volume to VM 2") + self.cloud.attach_volume(self.vm2, self.volume, + timeout=self.volume_timeout) + # Check volume data + read_data_script = pkg_resources.resource_filename( + 'functest.opnfv_tests.openstack.cinder', 'read_data.sh') + try: + scp = SCPClient(self.ssh2.get_transport()) + scp.put(read_data_script, remote_path="~/") + except Exception: # pylint: disable=broad-except + self.logger.error("File not transfered!") + return testcase.TestCase.EX_RUN_ERROR + self.logger.debug("ssh: %s", self.ssh2) + (_, stdout, stderr) = self.ssh2.exec_command( + f"sh ~/read_data.sh {env.get('VOLUME_DEVICE_NAME')}") + self.logger.debug( + "read volume stdout: %s", stdout.read().decode("utf-8")) + self.logger.debug( + "read volume stderr: %s", stderr.read().decode("utf-8")) + self.logger.info("Detach volume from VM 2") + self.cloud.detach_volume( + self.vm2, self.volume, timeout=self.volume_timeout) + return stdout.channel.recv_exit_status() + + def clean(self): + assert self.cloud + if self.vm2: + self.cloud.delete_server( + self.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + if self.fip2: + self.cloud.delete_floating_ip(self.fip2.id) + if self.volume: + self.cloud.delete_volume(self.volume.id) + super().clean() diff --git a/functest/opnfv_tests/openstack/cinder/read_data.sh b/functest/opnfv_tests/openstack/cinder/read_data.sh new file mode 100644 index 000000000..2c5fdd4c0 --- /dev/null +++ b/functest/opnfv_tests/openstack/cinder/read_data.sh @@ -0,0 +1,26 @@ +#!/bin/sh -e + +# Copyright (c) 2018 Enea AB and others + +# 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 + +DEST=$(mktemp -d) +VOL_DEV_NAME=${1:-vdb} +echo "VOL_DEV_NAME: $VOL_DEV_NAME" + +echo "$(lsblk -l -o NAME)" +if [ ! -z $(lsblk -l -o NAME | grep $VOL_DEV_NAME) ]; then + sudo mount /dev/$VOL_DEV_NAME $DEST + if [ -f $DEST/new_data ]; then + echo "Found new data!" + else + echo "Failed to find data!" + exit 1 + fi +fi + +exit 0 diff --git a/functest/opnfv_tests/openstack/cinder/write_data.sh b/functest/opnfv_tests/openstack/cinder/write_data.sh new file mode 100644 index 000000000..16845ba31 --- /dev/null +++ b/functest/opnfv_tests/openstack/cinder/write_data.sh @@ -0,0 +1,30 @@ +#!/bin/sh -e + +# Copyright (c) 2018 Enea AB and others + +# 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 + +DEST=$(mktemp -d) +VOL_DEV_NAME=${1:-vdb} +echo "VOL_DEV_NAME: $VOL_DEV_NAME" + +echo "$(lsblk -l -o NAME)" + +if [ ! -z $(lsblk -l -o NAME | grep $VOL_DEV_NAME) ]; then + sudo mkfs.ext4 -F /dev/$VOL_DEV_NAME + sudo mount /dev/$VOL_DEV_NAME $DEST + sudo touch $DEST/new_data + if [ -f $DEST/new_data ]; then + echo "New data added to the volume!" + sudo umount $DEST + fi +else + echo "Failed to write data!" + exit 1 +fi + +exit 0 diff --git a/functest/api/database/v1/__init__.py b/functest/opnfv_tests/openstack/patrole/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/api/database/v1/__init__.py +++ b/functest/opnfv_tests/openstack/patrole/__init__.py diff --git a/functest/opnfv_tests/openstack/patrole/patrole.py b/functest/opnfv_tests/openstack/patrole/patrole.py new file mode 100644 index 000000000..88c42f269 --- /dev/null +++ b/functest/opnfv_tests/openstack/patrole/patrole.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +from six.moves import configparser + +from functest.opnfv_tests.openstack.tempest import tempest + + +class Patrole(tempest.TempestCommon): + + def configure(self, **kwargs): + super().configure(**kwargs) + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if not rconfig.has_section('rbac'): + rconfig.add_section('rbac') + rconfig.set('rbac', 'rbac_test_roles', kwargs.get('roles', 'admin')) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + self.backup_tempest_config(self.conf_file, self.res_dir) diff --git a/functest/opnfv_tests/openstack/rally/blacklist.txt b/functest/opnfv_tests/openstack/rally/blacklist.txt deleted file mode 100644 index 4b42c312a..000000000 --- a/functest/opnfv_tests/openstack/rally/blacklist.txt +++ /dev/null @@ -1,71 +0,0 @@ -scenario: - - - scenarios: - - '^os-nosdn-lxd-(no)?ha$' - installers: - - joid - tests: - - NovaServers.boot_server_from_volume_and_delete - - - scenarios: - - '^os-' # all scenarios - installers: - - '.+' # all installers - tests: - # Following tests currently fail due to required Gnocchi API: - # HTTP 410: "This telemetry installation is configured to use - # Gnocchi. Please use the Gnocchi API available on the - # metric endpoint to retrieve data." - # Issue: https://bugs.launchpad.net/rally/+bug/1704322 - - CeilometerMeters.list_matched_meters - - CeilometerMeters.list_meters - - CeilometerQueries.create_and_query_samples - - CeilometerResource.get_tenant_resources - - CeilometerResource.list_matched_resources - - CeilometerResource.list_resources - - CeilometerSamples.list_matched_samples - - CeilometerSamples.list_samples - - CeilometerStats.create_meter_and_get_stats - - CeilometerStats.get_stats - - - scenarios: - - '^os-' # all scenarios - installers: - - '.+' # all installers - tests: - # Following test currently fails due to but in - # python-ceilometerclient during fetching of event_types - # Bug: https://bugs.launchpad.net/ubuntu/+bug/1704138 - # Fix: https://review.openstack.org/#/c/483402/ - - CeilometerEvents.create_user_and_list_event_types - - - scenarios: - - '^os-' # all scenarios - installers: - - '.+' # all installers - tests: - # Starting from ocata, following tests require the presence of - # panko in the deployment. This is not currently fulfilled - # Ref: https://docs.openstack.org/releasenotes/ceilometer/ocata.html - - 'CeilometerEvents..*' - - 'CeilometerTraits..*' - - - scenarios: - - '^os-' # all scenarios - installers: - - '.+' # all installers - tests: - # Rally is still utilizing Ceilometer API which is deprecated - # in Pike. - # Ref: https://docs.openstack.org/releasenotes/ceilometer/pike.html - - 'Ceilometer..*' - -functionality: - - - functions: - - no_migration - tests: - - NovaServers.boot_and_live_migrate_server - - NovaServers.boot_server_attach_created_volume_and_live_migrate - - NovaServers.boot_server_from_volume_and_live_migrate - - NovaServers.boot_and_migrate_server diff --git a/functest/opnfv_tests/openstack/rally/blacklist.yaml b/functest/opnfv_tests/openstack/rally/blacklist.yaml new file mode 100644 index 000000000..e16b83ba6 --- /dev/null +++ b/functest/opnfv_tests/openstack/rally/blacklist.yaml @@ -0,0 +1,40 @@ +--- +scenario: + +functionality: + - + functions: + - block_migration + tests: + - NovaServers.boot_server_from_volume_and_live_migrate + - + functions: + - no_migration + tests: + - NovaServers.boot_and_live_migrate_server + - NovaServers.boot_server_attach_created_volume_and_live_migrate + - NovaServers.boot_server_from_volume_and_live_migrate + - NovaServers.boot_and_migrate_server + - + functions: + - no_net_trunk_service + tests: + - '^NeutronTrunk' + - + functions: + - no_floating_ip + tests: + - HeatStacks.create_and_delete_stack + - NovaServers.boot_and_associate_floating_ip + - NovaServers.boot_server_and_list_interfaces + - NovaServers.boot_server_associate_and_dissociate_floating_ip + - NeutronNetworks.create_and_delete_floating_ips + - NeutronNetworks.create_and_list_floating_ips + - NeutronNetworks.associate_and_dissociate_floating_ips + - VMTasks.dd_load_test + - NeutronNetworks.create_and_delete_routers + - NeutronNetworks.create_and_list_routers + - NeutronNetworks.create_and_show_routers + - NeutronNetworks.create_and_update_routers + - NeutronNetworks.set_and_clear_router_gateway + - Quotas.neutron_update diff --git a/functest/opnfv_tests/openstack/rally/macro/macro.yaml b/functest/opnfv_tests/openstack/rally/macro/macro.yaml index 48c0333e9..2536c92f0 100644 --- a/functest/opnfv_tests/openstack/rally/macro/macro.yaml +++ b/functest/opnfv_tests/openstack/rally/macro/macro.yaml @@ -95,3 +95,9 @@ disk_format: {{ type }} image_location: {{ location }} {%- endmacro %} + +{%- macro volume_service(version, service_type) %} + cinder: + version: {{ version }} + service_type: {{ service_type }} +{%- endmacro %} diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py index eefd3eb46..3d897e25d 100644 --- a/functest/opnfv_tests/openstack/rally/rally.py +++ b/functest/opnfv_tests/openstack/rally/rally.py @@ -11,149 +11,142 @@ """Rally testcases implementation.""" from __future__ import division +from __future__ import print_function +import fileinput import json import logging import os import re +import shutil import subprocess import time -import uuid import pkg_resources +import prettytable +from ruamel.yaml import YAML +import six +from six.moves import configparser +from xtesting.core import testcase import yaml -from functest.core import testcase -from functest.energy import energy -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.opnfv_tests.openstack.tempest import conf_utils -from functest.utils.constants import CONST - -from snaps.config.flavor import FlavorConfig -from snaps.config.image import ImageConfig -from snaps.config.network import NetworkConfig, SubnetConfig -from snaps.config.router import RouterConfig - -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.tests import openstack_tests -from snaps.openstack.utils import deploy_utils +from functest.core import singlevm +from functest.utils import config +from functest.utils import env +from functest.utils import functest_utils LOGGER = logging.getLogger(__name__) -class RallyBase(testcase.TestCase): +class RallyBase(singlevm.VmReady2): """Base class form Rally testcases implementation.""" - TESTS = ['authenticate', 'glance', 'ceilometer', 'cinder', 'heat', - 'keystone', 'neutron', 'nova', 'quotas', 'vm', 'all'] - GLANCE_IMAGE_NAME = CONST.__getattribute__('openstack_image_name') - GLANCE_IMAGE_FILENAME = CONST.__getattribute__('openstack_image_file_name') - GLANCE_IMAGE_PATH = os.path.join( - CONST.__getattribute__('dir_functest_images'), - GLANCE_IMAGE_FILENAME) - GLANCE_IMAGE_FORMAT = CONST.__getattribute__('openstack_image_disk_format') - GLANCE_IMAGE_USERNAME = CONST.__getattribute__('openstack_image_username') - GLANCE_IMAGE_EXTRA_PROPERTIES = {} - if hasattr(CONST, 'openstack_extra_properties'): - GLANCE_IMAGE_EXTRA_PROPERTIES = CONST.__getattribute__( - 'openstack_extra_properties') - FLAVOR_NAME = CONST.__getattribute__('rally_flavor_name') - FLAVOR_ALT_NAME = CONST.__getattribute__('rally_flavor_alt_name') - FLAVOR_EXTRA_SPECS = None - FLAVOR_RAM = 512 - FLAVOR_RAM_ALT = 1024 - if hasattr(CONST, 'flavor_extra_specs'): - FLAVOR_EXTRA_SPECS = CONST.__getattribute__('flavor_extra_specs') - FLAVOR_RAM = 1024 - FLAVOR_RAM_ALT = 2048 - - RALLY_DIR = pkg_resources.resource_filename( + # pylint: disable=too-many-instance-attributes, too-many-public-methods + stests = ['authenticate', 'glance', 'cinder', 'gnocchi', 'heat', + 'keystone', 'neutron', 'nova', 'quotas', 'swift', 'barbican', + 'vm'] + + rally_conf_path = "/etc/rally/rally.conf" + rally_aar4_patch_path = pkg_resources.resource_filename( + 'functest', 'ci/rally_aarch64_patch.conf') + rally_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally') - RALLY_SCENARIO_DIR = pkg_resources.resource_filename( + rally_scenario_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally/scenario') - TEMPLATE_DIR = pkg_resources.resource_filename( + template_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally/scenario/templates') - SUPPORT_DIR = pkg_resources.resource_filename( + support_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/rally/scenario/support') - USERS_AMOUNT = 2 - TENANTS_AMOUNT = 3 - ITERATIONS_AMOUNT = 10 - CONCURRENCY = 4 - RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'), 'rally') - BLACKLIST_FILE = os.path.join(RALLY_DIR, "blacklist.txt") - TEMP_DIR = os.path.join(RALLY_DIR, "var") - - RALLY_PRIVATE_NET_NAME = CONST.__getattribute__('rally_network_name') - RALLY_PRIVATE_SUBNET_NAME = CONST.__getattribute__('rally_subnet_name') - RALLY_PRIVATE_SUBNET_CIDR = CONST.__getattribute__('rally_subnet_cidr') - RALLY_ROUTER_NAME = CONST.__getattribute__('rally_router_name') + users_amount = 2 + tenants_amount = 3 + iterations_amount = 10 + concurrency = 4 + volume_version = 3 + volume_service_type = "volumev3" + blacklist_file = os.path.join(rally_dir, "blacklist.yaml") + task_dir = os.path.join(getattr(config.CONF, 'dir_rally_data'), 'task') + temp_dir = os.path.join(task_dir, 'var') + + visibility = 'public' + shared_network = True + task_timeout = 3600 + username = 'cirros' def __init__(self, **kwargs): """Initialize RallyBase object.""" - super(RallyBase, self).__init__(**kwargs) - if 'os_creds' in kwargs: - self.os_creds = kwargs['os_creds'] + super().__init__(**kwargs) + assert self.orig_cloud + assert self.project + if self.orig_cloud.get_role("admin"): + role_name = "admin" + elif self.orig_cloud.get_role("Admin"): + role_name = "Admin" else: - creds_override = None - if hasattr(CONST, 'snaps_os_creds_override'): - creds_override = CONST.__getattribute__( - 'snaps_os_creds_override') - - self.os_creds = openstack_tests.get_credentials( - os_env_file=CONST.__getattribute__('openstack_creds'), - overrides=creds_override) - - self.guid = '-' + str(uuid.uuid4()) - + raise Exception("Cannot detect neither admin nor Admin") + self.orig_cloud.grant_role( + role_name, user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + self.results_dir = os.path.join( + getattr(config.CONF, 'dir_results'), self.case_name) + self.task_file = '' self.creators = [] - self.mode = '' self.summary = [] self.scenario_dir = '' - self.image_name = None - self.ext_net_name = None - self.priv_net_id = None - self.flavor_name = None - self.flavor_alt_name = None self.smoke = None - self.test_name = None self.start_time = None self.result = None - self.details = None self.compute_cnt = 0 - - def _build_task_args(self, test_file_name): - task_args = {'service_list': [test_file_name]} - task_args['image_name'] = self.image_name - task_args['flavor_name'] = self.flavor_name - task_args['flavor_alt_name'] = self.flavor_alt_name - task_args['glance_image_location'] = self.GLANCE_IMAGE_PATH - task_args['glance_image_format'] = self.GLANCE_IMAGE_FORMAT - task_args['tmpl_dir'] = self.TEMPLATE_DIR - task_args['sup_dir'] = self.SUPPORT_DIR - task_args['users_amount'] = self.USERS_AMOUNT - task_args['tenants_amount'] = self.TENANTS_AMOUNT + self.flavor_alt = None + self.tests = [] + self.run_cmd = '' + self.network_extensions = [] + self.services = [] + + def build_task_args(self, test_name): + """Build arguments for the Rally task.""" + task_args = {'service_list': [test_name]} + task_args['image_name'] = str(self.image.name) + task_args['flavor_name'] = str(self.flavor.name) + task_args['flavor_alt_name'] = str(self.flavor_alt.name) + task_args['glance_image_location'] = str(self.filename) + task_args['glance_image_format'] = str(self.image_format) + task_args['tmpl_dir'] = str(self.template_dir) + task_args['sup_dir'] = str(self.support_dir) + task_args['users_amount'] = self.users_amount + task_args['tenants_amount'] = self.tenants_amount task_args['use_existing_users'] = False - task_args['iterations'] = self.ITERATIONS_AMOUNT - task_args['concurrency'] = self.CONCURRENCY + task_args['iterations'] = self.iterations_amount + task_args['concurrency'] = self.concurrency task_args['smoke'] = self.smoke + task_args['volume_version'] = self.volume_version + task_args['volume_service_type'] = self.volume_service_type + task_args['block_migration'] = env.get("BLOCK_MIGRATION").lower() + task_args['username'] = self.username - ext_net = self.ext_net_name - if ext_net: - task_args['floating_network'] = str(ext_net) + if self.ext_net: + task_args['floating_network'] = str(self.ext_net.name) else: task_args['floating_network'] = '' - net_id = self.priv_net_id - if net_id: - task_args['netid'] = str(net_id) + if self.network: + task_args['netid'] = str(self.network.id) else: - task_args['netid'] = '' + LOGGER.warning( + 'No tenant network created. ' + 'Trying EXTERNAL_NETWORK as a fallback') + if env.get("EXTERNAL_NETWORK"): + network = self.cloud.get_network(env.get("EXTERNAL_NETWORK")) + task_args['netid'] = str(network.id) if network else '' + else: + task_args['netid'] = '' return task_args def _prepare_test_list(self, test_name): - test_yaml_file_name = 'opnfv-{}.yaml'.format(test_name) - scenario_file_name = os.path.join(self.RALLY_SCENARIO_DIR, + """Build the list of test cases to be executed.""" + test_yaml_file_name = f'opnfv-{test_name}.yaml' + scenario_file_name = os.path.join(self.rally_scenario_dir, test_yaml_file_name) if not os.path.exists(scenario_file_name): @@ -161,33 +154,108 @@ class RallyBase(testcase.TestCase): test_yaml_file_name) if not os.path.exists(scenario_file_name): - raise Exception("The scenario '%s' does not exist." - % scenario_file_name) + raise Exception( + f"The scenario '{scenario_file_name}' does not exist.") LOGGER.debug('Scenario fetched from : %s', scenario_file_name) - test_file_name = os.path.join(self.TEMP_DIR, test_yaml_file_name) + test_file_name = os.path.join(self.temp_dir, test_yaml_file_name) - if not os.path.exists(self.TEMP_DIR): - os.makedirs(self.TEMP_DIR) + if not os.path.exists(self.temp_dir): + os.makedirs(self.temp_dir) - self._apply_blacklist(scenario_file_name, test_file_name) + self.apply_blacklist(scenario_file_name, test_file_name) return test_file_name @staticmethod - def get_task_id(cmd_raw): + def get_verifier_deployment_id(): + """ + Returns deployment id for active Rally deployment + """ + cmd = ("rally deployment list | awk '/" + + getattr(config.CONF, 'rally_deployment_name') + + "/ {print $2}'") + with subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) as proc: + deployment_uuid = proc.stdout.readline().rstrip() + return deployment_uuid.decode("utf-8") + + @staticmethod + def create_rally_deployment(environ=None): + # pylint: disable=unexpected-keyword-arg + """Create new rally deployment""" + # set the architecture to default + pod_arch = env.get("POD_ARCH") + arch_filter = ['aarch64'] + + if pod_arch and pod_arch in arch_filter: + LOGGER.info("Apply aarch64 specific to rally config...") + with open( + RallyBase.rally_aar4_patch_path, "r", + encoding='utf-8') as pfile: + rally_patch_conf = pfile.read() + + for line in fileinput.input(RallyBase.rally_conf_path): + print(line, end=' ') + if "cirros|testvm" in line: + print(rally_patch_conf) + + LOGGER.info("Creating Rally environment...") + try: + cmd = ['rally', 'deployment', 'destroy', + '--deployment', + str(getattr(config.CONF, 'rally_deployment_name'))] + output = subprocess.check_output(cmd) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + except subprocess.CalledProcessError: + pass + + cmd = ['rally', 'deployment', 'create', '--fromenv', + '--name', str(getattr(config.CONF, 'rally_deployment_name'))] + output = subprocess.check_output(cmd, env=environ) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + + cmd = ['rally', 'deployment', 'check'] + output = subprocess.check_output(cmd) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + return RallyBase.get_verifier_deployment_id() + + @staticmethod + def update_keystone_default_role(rally_conf='/etc/rally/rally.conf'): + """Set keystone_default_role in rally.conf""" + if env.get("NEW_USER_ROLE").lower() != "member": + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if not rconfig.has_section('openstack'): + rconfig.add_section('openstack') + rconfig.set( + 'openstack', 'keystone_default_role', env.get("NEW_USER_ROLE")) + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + @staticmethod + def clean_rally_conf(rally_conf='/etc/rally/rally.conf'): + """Clean Rally config""" + if env.get("NEW_USER_ROLE").lower() != "member": + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if rconfig.has_option('openstack', 'keystone_default_role'): + rconfig.remove_option('openstack', 'keystone_default_role') + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + @staticmethod + def get_task_id(tag): """ Get task id from command rally result. - :param cmd_raw: + :param tag: :return: task_id as string """ - taskid_re = re.compile('^Task +(.*): started$') - for line in cmd_raw.splitlines(True): - line = line.strip() - match = taskid_re.match(line) - if match: - return match.group(1) - return None + cmd = ["rally", "task", "list", "--tag", tag, "--uuids-only"] + output = subprocess.check_output(cmd).decode("utf-8").rstrip() + LOGGER.info("%s: %s", " ".join(cmd), output) + return output @staticmethod def task_succeed(json_raw): @@ -198,53 +266,48 @@ class RallyBase(testcase.TestCase): :return: Bool """ rally_report = json.loads(json_raw) - for report in rally_report: - if report is None or report.get('result') is None: - return False - - for result in report.get('result'): - if result is None or len(result.get('error')) > 0: + tasks = rally_report.get('tasks') + if tasks: + for task in tasks: + if task.get('status') != 'finished' or \ + task.get('pass_sla') is not True: return False - + else: + return False return True def _migration_supported(self): """Determine if migration is supported.""" if self.compute_cnt > 1: return True - return False - @staticmethod - def get_cmd_output(proc): - """Get command stdout.""" - result = "" - while proc.poll() is None: - line = proc.stdout.readline() - result += line - return result + def _network_trunk_supported(self): + """Determine if network trunk service is available""" + if 'trunk' in self.network_extensions: + return True + return False @staticmethod def excl_scenario(): """Exclude scenario.""" black_tests = [] try: - with open(RallyBase.BLACKLIST_FILE, 'r') as black_list_file: + with open( + RallyBase.blacklist_file, 'r', + encoding='utf-8') as black_list_file: black_list_yaml = yaml.safe_load(black_list_file) - installer_type = CONST.__getattribute__('INSTALLER_TYPE') - deploy_scenario = CONST.__getattribute__('DEPLOY_SCENARIO') - if (bool(installer_type) and bool(deploy_scenario) and + deploy_scenario = env.get('DEPLOY_SCENARIO') + if (bool(deploy_scenario) and 'scenario' in black_list_yaml.keys()): for item in black_list_yaml['scenario']: scenarios = item['scenarios'] - installers = item['installers'] in_it = RallyBase.in_iterable_re - if (in_it(deploy_scenario, scenarios) and - in_it(installer_type, installers)): + if in_it(deploy_scenario, scenarios): tests = item['tests'] black_tests.extend(tests) - except Exception: + except Exception: # pylint: disable=broad-except LOGGER.debug("Scenario exclusion not applied.") return black_tests @@ -267,8 +330,8 @@ class RallyBase(testcase.TestCase): # match if regex pattern is set and found in the needle if pattern and re.search(pattern, needle) is not None: return True - else: - return False + + return False def excl_func(self): """Exclude functionalities.""" @@ -276,11 +339,19 @@ class RallyBase(testcase.TestCase): func_list = [] try: - with open(RallyBase.BLACKLIST_FILE, 'r') as black_list_file: + with open( + RallyBase.blacklist_file, 'r', + encoding='utf-8') as black_list_file: black_list_yaml = yaml.safe_load(black_list_file) + if env.get('BLOCK_MIGRATION').lower() == 'true': + func_list.append("block_migration") if not self._migration_supported(): func_list.append("no_migration") + if not self._network_trunk_supported(): + func_list.append("no_net_trunk_service") + if not self.ext_net: + func_list.append("no_floating_ip") if 'functionality' in black_list_yaml.keys(): for item in black_list_yaml['functionality']: @@ -294,34 +365,28 @@ class RallyBase(testcase.TestCase): return black_tests - def _apply_blacklist(self, case_file_name, result_file_name): + def apply_blacklist(self, case_file_name, result_file_name): """Apply blacklist.""" LOGGER.debug("Applying blacklist...") - cases_file = open(case_file_name, 'r') - result_file = open(result_file_name, 'w') - - black_tests = list(set(self.excl_func() + - self.excl_scenario())) - - if black_tests: - LOGGER.debug("Blacklisted tests: " + str(black_tests)) - - include = True - for cases_line in cases_file: - if include: - for black_tests_line in black_tests: - if re.search(black_tests_line, - cases_line.strip().rstrip(':')): - include = False - break + with open(case_file_name, 'r', encoding='utf-8') as cases_file, open( + result_file_name, 'w', encoding='utf-8') as result_file: + black_tests = list(set(self.excl_func() + self.excl_scenario())) + if black_tests: + LOGGER.debug("Blacklisted tests: %s", str(black_tests)) + + include = True + for cases_line in cases_file: + if include: + for black_tests_line in black_tests: + if re.search(black_tests_line, + cases_line.strip().rstrip(':')): + include = False + break + else: + result_file.write(str(cases_line)) else: - result_file.write(str(cases_line)) - else: - if cases_line.isspace(): - include = True - - cases_file.close() - result_file.close() + if cases_line.isspace(): + include = True @staticmethod def file_is_empty(file_name): @@ -334,325 +399,315 @@ class RallyBase(testcase.TestCase): return True - def _run_task(self, test_name): - """Run a task.""" - LOGGER.info('Starting test scenario "%s" ...', test_name) - - task_file = os.path.join(self.RALLY_DIR, 'task.yaml') - if not os.path.exists(task_file): - LOGGER.error("Task file '%s' does not exist.", task_file) - raise Exception("Task file '%s' does not exist.", task_file) - - file_name = self._prepare_test_list(test_name) - if self.file_is_empty(file_name): - LOGGER.info('No tests for scenario "%s"', test_name) - return - - cmd = (["rally", "task", "start", "--abort-on-sla-failure", "--task", - task_file, "--task-args", - str(self._build_task_args(test_name))]) - LOGGER.debug('running command: %s', cmd) - - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - output = self._get_output(proc, test_name) - task_id = self.get_task_id(output) - LOGGER.debug('task_id : %s', task_id) - - if task_id is None: - LOGGER.error('Failed to retrieve task_id, validating task...') - cmd = (["rally", "task", "validate", "--task", task_file, - "--task-args", str(self._build_task_args(test_name))]) - LOGGER.debug('running command: %s', cmd) - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - output = self.get_cmd_output(proc) - LOGGER.error("Task validation result:" + "\n" + output) - return - + def _save_results(self, test_name, task_id): + """ Generate and save task execution results""" # check for result directory and create it otherwise - if not os.path.exists(self.RESULTS_DIR): + if not os.path.exists(self.results_dir): LOGGER.debug('%s does not exist, we create it.', - self.RESULTS_DIR) - os.makedirs(self.RESULTS_DIR) - - # write html report file - report_html_name = 'opnfv-{}.html'.format(test_name) - report_html_dir = os.path.join(self.RESULTS_DIR, report_html_name) - cmd = (["rally", "task", "report", task_id, "--out", report_html_dir]) + self.results_dir) + os.makedirs(self.results_dir) + # put detailed result to log + cmd = (["rally", "task", "detailed", "--uuid", task_id]) LOGGER.debug('running command: %s', cmd) - subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - - # get and save rally operation JSON result - cmd = (["rally", "task", "results", task_id]) + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + + # save report as JSON + report_json_name = f'{test_name}.json' + report_json_dir = os.path.join(self.results_dir, report_json_name) + cmd = (["rally", "task", "report", "--json", "--uuid", task_id, + "--out", report_json_dir]) LOGGER.debug('running command: %s', cmd) - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - json_results = self.get_cmd_output(proc) - report_json_name = 'opnfv-{}.json'.format(test_name) - report_json_dir = os.path.join(self.RESULTS_DIR, report_json_name) - with open(report_json_dir, 'w') as r_file: - LOGGER.debug('saving json file') - r_file.write(json_results) + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + + with open(report_json_dir, encoding='utf-8') as json_file: + json_results = json_file.read() + self._append_summary(json_results, test_name) # parse JSON operation result if self.task_succeed(json_results): - LOGGER.info('Test scenario: "{}" OK.'.format(test_name) + "\n") + LOGGER.info('Test scenario: "%s" OK.', test_name) else: - LOGGER.info('Test scenario: "{}" Failed.'.format(test_name) + "\n") + LOGGER.info('Test scenario: "%s" Failed.', test_name) - def _get_output(self, proc, test_name): - result = "" + def run_task(self, test_name): + """Run a task.""" + LOGGER.info('Starting test scenario "%s" ...', test_name) + LOGGER.debug('running command: %s', self.run_cmd) + if six.PY3: + subprocess.call( + self.run_cmd, timeout=self.task_timeout, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + else: + with open(os.devnull, 'wb') as devnull: + subprocess.call(self.run_cmd, stdout=devnull, stderr=devnull) + task_id = self.get_task_id(test_name) + LOGGER.debug('task_id : %s', task_id) + if not task_id: + LOGGER.error("Failed to retrieve task_id") + raise Exception("Failed to retrieve task id") + self._save_results(test_name, task_id) + + def _append_summary(self, json_raw, test_name): + # pylint: disable=too-many-locals + """Update statistics summary info.""" nb_tests = 0 + nb_success = 0 overall_duration = 0.0 - success = 0.0 - nb_totals = 0 - - while proc.poll() is None: - line = proc.stdout.readline() - if ("Load duration" in line or - "started" in line or - "finished" in line or - " Preparing" in line or - "+-" in line or - "|" in line): - result += line - elif "test scenario" in line: - result += "\n" + line - elif "Full duration" in line: - result += line + "\n\n" - - # parse output for summary report - if ("| " in line and - "| action" not in line and - "| Starting" not in line and - "| Completed" not in line and - "| ITER" not in line and - "| " not in line and - "| total" not in line): - nb_tests += 1 - elif "| total" in line: - percentage = ((line.split('|')[8]).strip(' ')).strip('%') - try: - success += float(percentage) - except ValueError: - LOGGER.info('Percentage error: %s, %s', - percentage, line) - nb_totals += 1 - elif "Full duration" in line: - duration = line.split(': ')[1] - try: - overall_duration += float(duration) - except ValueError: - LOGGER.info('Duration error: %s, %s', duration, line) - - overall_duration = "{:10.2f}".format(overall_duration) - if nb_totals == 0: - success_avg = 0 - else: - success_avg = "{:0.2f}".format(success / nb_totals) + success = [] + failures = [] + + rally_report = json.loads(json_raw) + for task in rally_report.get('tasks'): + for subtask in task.get('subtasks'): + has_errors = False + for workload in subtask.get('workloads'): + if workload.get('full_duration'): + overall_duration += workload.get('full_duration') + + if workload.get('data'): + nb_tests += len(workload.get('data')) + + for result in workload.get('data'): + if not result.get('error'): + nb_success += 1 + else: + has_errors = True + + if has_errors: + failures.append(subtask['title']) + else: + success.append(subtask['title']) scenario_summary = {'test_name': test_name, 'overall_duration': overall_duration, 'nb_tests': nb_tests, - 'success': success_avg} + 'nb_success': nb_success, + 'success': success, + 'failures': failures, + 'task_status': self.task_succeed(json_raw)} self.summary.append(scenario_summary) - LOGGER.debug("\n" + result) - - return result - - def _prepare_env(self): - LOGGER.debug('Validating the test name...') - if self.test_name not in self.TESTS: - raise Exception("Test name '%s' is invalid" % self.test_name) - - network_name = self.RALLY_PRIVATE_NET_NAME + self.guid - subnet_name = self.RALLY_PRIVATE_SUBNET_NAME + self.guid - router_name = self.RALLY_ROUTER_NAME + self.guid - self.image_name = self.GLANCE_IMAGE_NAME + self.guid - self.flavor_name = self.FLAVOR_NAME + self.guid - self.flavor_alt_name = self.FLAVOR_ALT_NAME + self.guid - self.ext_net_name = snaps_utils.get_ext_net_name(self.os_creds) - self.compute_cnt = snaps_utils.get_active_compute_cnt(self.os_creds) - - LOGGER.debug("Creating image '%s'...", self.image_name) - image_creator = deploy_utils.create_image( - self.os_creds, ImageConfig( - name=self.image_name, - image_file=self.GLANCE_IMAGE_PATH, - img_format=self.GLANCE_IMAGE_FORMAT, - image_user=self.GLANCE_IMAGE_USERNAME, - public=True, - extra_properties=self.GLANCE_IMAGE_EXTRA_PROPERTIES)) - if image_creator is None: - raise Exception("Failed to create image") - self.creators.append(image_creator) - - LOGGER.debug("Creating network '%s'...", network_name) - - rally_network_type = None - rally_physical_network = None - rally_segmentation_id = None - - if hasattr(CONST, 'rally_network_type'): - rally_network_type = CONST.__getattribute__( - 'rally_network_type') - if hasattr(CONST, 'rally_physical_network'): - rally_physical_network = CONST.__getattribute__( - 'rally_physical_network') - if hasattr(CONST, 'rally_segmentation_id'): - rally_segmentation_id = CONST.__getattribute__( - 'rally_segmentation_id') - - network_creator = deploy_utils.create_network( - self.os_creds, NetworkConfig( - name=network_name, - shared=True, - network_type=rally_network_type, - physical_network=rally_physical_network, - segmentation_id=rally_segmentation_id, - subnet_settings=[SubnetConfig( - name=subnet_name, - cidr=self.RALLY_PRIVATE_SUBNET_CIDR) - ])) - if network_creator is None: - raise Exception("Failed to create private network") - self.priv_net_id = network_creator.get_network().id - self.creators.append(network_creator) - - LOGGER.debug("Creating router '%s'...", router_name) - router_creator = deploy_utils.create_router( - self.os_creds, RouterConfig( - name=router_name, - external_gateway=self.ext_net_name, - internal_subnets=[subnet_name])) - if router_creator is None: - raise Exception("Failed to create router") - self.creators.append(router_creator) - - LOGGER.debug("Creating flavor '%s'...", self.flavor_name) - flavor_creator = OpenStackFlavor( - self.os_creds, FlavorConfig( - name=self.flavor_name, ram=self.FLAVOR_RAM, disk=1, vcpus=1, - metadata=self.FLAVOR_EXTRA_SPECS)) - if flavor_creator is None or flavor_creator.create() is None: - raise Exception("Failed to create flavor") - self.creators.append(flavor_creator) - - LOGGER.debug("Creating flavor '%s'...", self.flavor_alt_name) - flavor_alt_creator = OpenStackFlavor( - self.os_creds, FlavorConfig( - name=self.flavor_alt_name, ram=self.FLAVOR_RAM_ALT, disk=1, - vcpus=1, metadata=self.FLAVOR_EXTRA_SPECS)) - if flavor_alt_creator is None or flavor_alt_creator.create() is None: - raise Exception("Failed to create flavor") - self.creators.append(flavor_alt_creator) - - def _run_tests(self): - if self.test_name == 'all': - for test in self.TESTS: - if test == 'all' or test == 'vm': - continue - self._run_task(test) - else: - self._run_task(self.test_name) + def prepare_run(self, **kwargs): + """Prepare resources needed by test scenarios.""" + assert self.cloud + LOGGER.debug('Validating run tests...') + for test in kwargs.get('tests', self.stests): + if test in self.stests: + self.tests.append(test) + else: + raise Exception(f"Test name '{test}' is invalid") + + if not os.path.exists(self.task_dir): + os.makedirs(self.task_dir) + + task = os.path.join(self.rally_dir, 'task.yaml') + if not os.path.exists(task): + LOGGER.error("Task file '%s' does not exist.", task) + raise Exception(f"Task file '{task}' does not exist.") + self.task_file = os.path.join(self.task_dir, 'task.yaml') + shutil.copyfile(task, self.task_file) + + task_macro = os.path.join(self.rally_dir, 'macro') + if not os.path.exists(task_macro): + LOGGER.error("Task macro dir '%s' does not exist.", task_macro) + raise Exception(f"Task macro dir '{task_macro}' does not exist.") + macro_dir = os.path.join(self.task_dir, 'macro') + if os.path.exists(macro_dir): + shutil.rmtree(macro_dir) + shutil.copytree(task_macro, macro_dir) + + self.update_keystone_default_role() + self.compute_cnt = self.count_hypervisors() + self.network_extensions = self.cloud.get_network_extensions() + self.flavor_alt = self.create_flavor_alt() + self.services = [service.name for service in + functest_utils.list_services(self.cloud)] + + LOGGER.debug("flavor: %s", self.flavor_alt) + + def prepare_task(self, test_name): + """Prepare resources for test run.""" + file_name = self._prepare_test_list(test_name) + if self.file_is_empty(file_name): + LOGGER.info('No tests for scenario "%s"', test_name) + return False + self.run_cmd = (["rally", "task", "start", "--tag", test_name, + "--abort-on-sla-failure", + "--task", self.task_file, "--task-args", + str(self.build_task_args(test_name))]) + return True + + def run_tests(self, **kwargs): + """Execute tests.""" + optional = kwargs.get('optional', []) + for test in self.tests: + if test in self.services or test not in optional: + if self.prepare_task(test): + self.run_task(test) def _generate_report(self): - report = ( - "\n" - " " - "\n" - " Rally Summary Report\n" - "\n" - "+===================+============+===============+===========+" - "\n" - "| Module | Duration | nb. Test Run | Success |" - "\n" - "+===================+============+===============+===========+" - "\n") + """Generate test execution summary report.""" + total_duration = 0.0 + total_nb_tests = 0 + total_nb_success = 0 + nb_modules = 0 payload = [] + res_table = prettytable.PrettyTable( + padding_width=2, + field_names=['Module', 'Duration', 'nb. Test Run', 'Success']) + res_table.align['Module'] = "l" + res_table.align['Duration'] = "r" + res_table.align['Success'] = "r" + # for each scenario we draw a row for the table - total_duration = 0.0 - total_nb_tests = 0 - total_success = 0.0 for item in self.summary: - name = "{0:<17}".format(item['test_name']) - duration = float(item['overall_duration']) - total_duration += duration - duration = time.strftime("%M:%S", time.gmtime(duration)) - duration = "{0:<10}".format(duration) - nb_tests = "{0:<13}".format(item['nb_tests']) - total_nb_tests += int(item['nb_tests']) - success = "{0:<10}".format(str(item['success']) + '%') - total_success += float(item['success']) - report += ("" + - "| " + name + " | " + duration + " | " + - nb_tests + " | " + success + "|\n" + - "+-------------------+------------" - "+---------------+-----------+\n") - payload.append({'module': name, + if item['task_status'] is True: + nb_modules += 1 + total_duration += item['overall_duration'] + total_nb_tests += item['nb_tests'] + total_nb_success += item['nb_success'] + try: + success_avg = 100 * item['nb_success'] / item['nb_tests'] + except ZeroDivisionError: + success_avg = 0 + success_str = f"{success_avg:0.2f}%" + duration_str = time.strftime("%H:%M:%S", + time.gmtime(item['overall_duration'])) + res_table.add_row([item['test_name'], duration_str, + item['nb_tests'], success_str]) + payload.append({'module': item['test_name'], 'details': {'duration': item['overall_duration'], 'nb tests': item['nb_tests'], - 'success': item['success']}}) + 'success rate': success_str, + 'success': item['success'], + 'failures': item['failures']}}) total_duration_str = time.strftime("%H:%M:%S", time.gmtime(total_duration)) - total_duration_str2 = "{0:<10}".format(total_duration_str) - total_nb_tests_str = "{0:<13}".format(total_nb_tests) - try: - self.result = total_success / len(self.summary) + self.result = 100 * total_nb_success / total_nb_tests except ZeroDivisionError: self.result = 100 + success_rate = f"{self.result:0.2f}" + success_rate_str = str(success_rate) + '%' + res_table.add_row(["", "", "", ""]) + res_table.add_row(["TOTAL:", total_duration_str, total_nb_tests, + success_rate_str]) + + LOGGER.info("Rally Summary Report:\n\n%s\n", res_table.get_string()) + LOGGER.info("Rally '%s' success_rate is %s%% in %s/%s modules", + self.case_name, success_rate, nb_modules, + len(self.summary)) + self.details['summary'] = {'duration': total_duration, + 'nb tests': total_nb_tests, + 'nb success': success_rate} + self.details["modules"] = payload - success_rate = "{:0.2f}".format(self.result) - success_rate_str = "{0:<10}".format(str(success_rate) + '%') - report += ("+===================+============" - "+===============+===========+") - report += "\n" - report += ("| TOTAL: | " + total_duration_str2 + " | " + - total_nb_tests_str + " | " + success_rate_str + "|\n") - report += ("+===================+============" - "+===============+===========+") - report += "\n" - - LOGGER.info("\n" + report) - payload.append({'summary': {'duration': total_duration, - 'nb tests': total_nb_tests, - 'nb success': success_rate}}) - - self.details = payload - - LOGGER.info("Rally '%s' success_rate is %s%%", - self.case_name, success_rate) - - def _clean_up(self): - for creator in reversed(self.creators): - try: - creator.clean() - except Exception as e: - LOGGER.error('Unexpected error cleaning - %s', e) + @staticmethod + def export_task(file_name, export_type="html"): + """Export all task results (e.g. html or xunit report) + + Raises: + subprocess.CalledProcessError: if Rally doesn't return 0 + + Returns: + None + """ + cmd = ["rally", "task", "export", "--type", export_type, + "--deployment", + str(getattr(config.CONF, 'rally_deployment_name')), + "--to", file_name] + LOGGER.debug('running command: %s', cmd) + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + + @staticmethod + def verify_report(file_name, uuid, export_type="html"): + """Generate the verifier report (e.g. html or xunit report) + + Raises: + subprocess.CalledProcessError: if Rally doesn't return 0 + + Returns: + None + """ + cmd = ["rally", "verify", "report", "--type", export_type, + "--uuid", uuid, "--to", file_name] + LOGGER.debug('running command: %s', cmd) + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + + def clean(self): + """Cleanup of OpenStack resources. Should be called on completion.""" + self.clean_rally_conf() + self.clean_rally_logs() + if self.flavor_alt: + self.orig_cloud.delete_flavor(self.flavor_alt.id) + super().clean() + + def is_successful(self): + """The overall result of the test.""" + for item in self.summary: + if item['task_status'] is False: + return testcase.TestCase.EX_TESTCASE_FAILED + + return super().is_successful() + + @staticmethod + def update_rally_logs(res_dir, rally_conf='/etc/rally/rally.conf'): + """Print rally logs in res dir""" + if not os.path.exists(res_dir): + os.makedirs(res_dir) + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + rconfig.set('DEFAULT', 'debug', True) + rconfig.set('DEFAULT', 'use_stderr', False) + rconfig.set('DEFAULT', 'log-file', 'rally.log') + rconfig.set('DEFAULT', 'log_dir', res_dir) + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + @staticmethod + def clean_rally_logs(rally_conf='/etc/rally/rally.conf'): + """Clean Rally config""" + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if rconfig.has_option('DEFAULT', 'use_stderr'): + rconfig.remove_option('DEFAULT', 'use_stderr') + if rconfig.has_option('DEFAULT', 'debug'): + rconfig.remove_option('DEFAULT', 'debug') + if rconfig.has_option('DEFAULT', 'log-file'): + rconfig.remove_option('DEFAULT', 'log-file') + if rconfig.has_option('DEFAULT', 'log_dir'): + rconfig.remove_option('DEFAULT', 'log_dir') + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) - @energy.enable_recording def run(self, **kwargs): """Run testcase.""" self.start_time = time.time() try: - conf_utils.create_rally_deployment() - self._prepare_env() - self._run_tests() + assert super().run( + **kwargs) == testcase.TestCase.EX_OK + self.update_rally_logs(self.res_dir) + self.create_rally_deployment(environ=self.project.get_environ()) + self.prepare_run(**kwargs) + self.run_tests(**kwargs) self._generate_report() + self.export_task( + f"{self.results_dir}/{self.case_name}.html") + self.export_task( + f"{self.results_dir}/{self.case_name}.xml", + export_type="junit-xml") res = testcase.TestCase.EX_OK - except Exception as exc: # pylint: disable=broad-except - LOGGER.error('Error with run: %s', exc) + except Exception: # pylint: disable=broad-except + LOGGER.exception('Error with run:') + self.result = 0 res = testcase.TestCase.EX_RUN_ERROR - finally: - self._clean_up() - self.stop_time = time.time() return res @@ -664,22 +719,120 @@ class RallySanity(RallyBase): """Initialize RallySanity object.""" if "case_name" not in kwargs: kwargs["case_name"] = "rally_sanity" - super(RallySanity, self).__init__(**kwargs) - self.mode = 'sanity' - self.test_name = 'all' + super().__init__(**kwargs) self.smoke = True - self.scenario_dir = os.path.join(self.RALLY_SCENARIO_DIR, 'sanity') + self.scenario_dir = os.path.join(self.rally_scenario_dir, 'sanity') class RallyFull(RallyBase): """Rally full testcase implementation.""" + task_timeout = 7200 + def __init__(self, **kwargs): """Initialize RallyFull object.""" if "case_name" not in kwargs: kwargs["case_name"] = "rally_full" - super(RallyFull, self).__init__(**kwargs) - self.mode = 'full' - self.test_name = 'all' + super().__init__(**kwargs) self.smoke = False - self.scenario_dir = os.path.join(self.RALLY_SCENARIO_DIR, 'full') + self.scenario_dir = os.path.join(self.rally_scenario_dir, 'full') + + +class RallyJobs(RallyBase): + """Rally OpenStack CI testcase implementation.""" + + stests = ["neutron"] + task_timeout = 7200 + + def __init__(self, **kwargs): + """Initialize RallyJobs object.""" + if "case_name" not in kwargs: + kwargs["case_name"] = "rally_jobs" + super().__init__(**kwargs) + self.task_file = os.path.join(self.rally_dir, 'rally_jobs.yaml') + self.task_yaml = None + + def prepare_run(self, **kwargs): + """Create resources needed by test scenarios.""" + super().prepare_run(**kwargs) + with open( + os.path.join(self.rally_dir, 'rally_jobs.yaml'), + 'r', encoding='utf-8') as task_file: + self.task_yaml = yaml.safe_load(task_file) + + for task in self.task_yaml: + if task not in self.tests: + raise Exception(f"Test '{task}' not in '{self.tests}'") + + def apply_blacklist(self, case_file_name, result_file_name): + # pylint: disable=too-many-branches + """Apply blacklist.""" + LOGGER.debug("Applying blacklist...") + black_tests = list(set(self.excl_func() + + self.excl_scenario())) + if black_tests: + LOGGER.debug("Blacklisted tests: %s", str(black_tests)) + + template = YAML(typ='jinja2') + with open(case_file_name, 'r', encoding='utf-8') as fname: + cases = template.load(fname) + if cases.get("version", 1) == 1: + # scenarios in dictionary + for name in cases.keys(): + if self.in_iterable_re(name, black_tests): + cases.pop(name) + else: + # workloads in subtasks + for sind, subtask in reversed(list( + enumerate(cases.get('subtasks', [])))): + for wind, workload in reversed(list( + enumerate(subtask.get('workloads', [])))): + scenario = workload.get('scenario', {}) + for name in scenario.keys(): + if self.in_iterable_re(name, black_tests): + cases['subtasks'][sind]['workloads'].pop(wind) + break + if 'workloads' in cases['subtasks'][sind]: + if not cases['subtasks'][sind]['workloads']: + cases['subtasks'].pop(sind) + # scenarios in subtasks + for sind, subtask in reversed(list( + enumerate(cases.get('subtasks', [])))): + scenario = subtask.get('scenario', {}) + for name in scenario.keys(): + if self.in_iterable_re(name, black_tests): + cases['subtasks'].pop(sind) + break + + with open(result_file_name, 'w', encoding='utf-8') as fname: + template.dump(cases, fname) + + def build_task_args(self, test_name): + """Build arguments for the Rally task.""" + task_args = {} + if self.ext_net: + task_args['floating_network'] = str(self.ext_net.name) + else: + task_args['floating_network'] = '' + task_args['image_name'] = str(self.image.name) + task_args['flavor_name'] = str(self.flavor.name) + return task_args + + def prepare_task(self, test_name): + """Prepare resources for test run.""" + jobs_dir = os.path.join( + getattr(config.CONF, 'dir_rally_data'), test_name, 'rally-jobs') + task_name = self.task_yaml.get(test_name).get("task") + task = os.path.join(jobs_dir, task_name) + if not os.path.exists(task): + raise Exception(f"The scenario '{task}' does not exist.") + LOGGER.debug('Scenario fetched from : %s', task) + + if not os.path.exists(self.temp_dir): + os.makedirs(self.temp_dir) + task_file_name = os.path.join(self.temp_dir, task_name) + self.apply_blacklist(task, task_file_name) + self.run_cmd = (["rally", "task", "start", "--tag", test_name, + "--task", task_file_name, + "--task-args", str(self.build_task_args(test_name))]) + return True diff --git a/functest/opnfv_tests/openstack/rally/rally_jobs.yaml b/functest/opnfv_tests/openstack/rally/rally_jobs.yaml new file mode 100644 index 000000000..2092fb4cf --- /dev/null +++ b/functest/opnfv_tests/openstack/rally/rally_jobs.yaml @@ -0,0 +1,3 @@ +--- +neutron: + task: task-neutron.yaml diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml deleted file mode 100644 index 7efb5a83b..000000000 --- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml +++ /dev/null @@ -1,458 +0,0 @@ - CeilometerMeters.list_meters: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "benchmark_meter" - counter_type: "gauge" - counter_unit: "%" - counter_volume: 100 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 10 - metadata_list: - - - status: "active" - name: "rally benchmark on" - deleted: "false" - - - status: "terminated" - name: "rally benchmark off" - deleted: "true" - {% endcall %} - args: - limit: 50 - metadata_query: - status: "terminated" - sla: - {{ no_failures_sla() }} - - CeilometerResource.list_resources: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "benchmark_meter" - counter_type: "gauge" - counter_unit: "%" - counter_volume: 100 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 10 - metadata_list: - - - status: "active" - name: "rally benchmark on" - deleted: "false" - - - status: "terminated" - name: "rally benchmark off" - deleted: "true" - {% endcall %} - args: - limit: 50 - metadata_query: - status: "terminated" - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_alarm_and_get_history: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - state: "ok" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_delete_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_get_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_list_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerQueries.create_and_query_alarm_history: - - - args: - orderby: !!null - limit: !!null - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerQueries.create_and_query_alarms: - - - args: - filter: {"and": [{"!=": {"state": "dummy_state"}},{"=": {"type": "threshold"}}]} - orderby: !!null - limit: 10 - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerQueries.create_and_query_samples: - - - args: - filter: {"=": {"counter_unit": "instance"}} - orderby: !!null - limit: 10 - counter_name: "cpu_util" - counter_type: "gauge" - counter_unit: "instance" - counter_volume: 1.0 - resource_id: "resource_id" - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_update_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerStats.create_meter_and_get_stats: - - - args: - user_id: "user-id" - resource_id: "resource-id" - counter_volume: 1.0 - counter_unit: "" - counter_type: "cumulative" - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerEvents.create_user_and_get_event: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerEvents.create_user_and_list_events: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerEvents.create_user_and_list_event_types: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerTraits.create_user_and_list_trait_descriptions: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerTraits.create_user_and_list_traits: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerStats.get_stats: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "benchmark_meter" - counter_type: "gauge" - counter_unit: "%" - counter_volume: 100 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 10 - metadata_list: - - - status: "active" - name: "rally benchmark on" - deleted: "false" - - - status: "terminated" - name: "rally benchmark off" - deleted: "true" - {% endcall %} - args: - meter_name: "benchmark_meter" - filter_by_user_id: true - filter_by_project_id: true - filter_by_resource_id: true - metadata_query: - status: "terminated" - period: 300 - groupby: "resource_id" - sla: - {{ no_failures_sla() }} - - CeilometerResource.get_tenant_resources: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "cpu_util" - counter_type: "gauge" - counter_volume: 1.0 - counter_unit: "instance" - {% endcall %} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.list_alarms: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerSamples.list_matched_samples: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "cpu_util" - counter_type: "gauge" - counter_unit: "instance" - counter_volume: 1.0 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 60 - metadata_list: - - status: "active" - name: "fake_resource" - deleted: "False" - created_at: "2015-09-04T12:34:19.000000" - - status: "not_active" - name: "fake_resource_1" - deleted: "False" - created_at: "2015-09-10T06:55:12.000000" - {% endcall %} - args: - limit: 50 - filter_by_user_id: true - filter_by_project_id: true - filter_by_resource_id: true - metadata_query: - status: "not_active" - sla: - {{ no_failures_sla() }} - - CeilometerMeters.list_matched_meters: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "benchmark_meter" - counter_type: "gauge" - counter_unit: "%" - counter_volume: 100 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 10 - metadata_list: - - - status: "active" - name: "rally benchmark on" - deleted: "false" - - - status: "terminated" - name: "rally benchmark off" - deleted: "true" - {% endcall %} - args: - limit: 50 - filter_by_user_id: true - filter_by_project_id: true - filter_by_resource_id: true - metadata_query: - status: "terminated" - sla: - {{ no_failures_sla() }} - - CeilometerResource.list_matched_resources: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "benchmark_meter" - counter_type: "gauge" - counter_unit: "%" - counter_volume: 100 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 10 - metadata_list: - - - status: "active" - name: "rally benchmark on" - deleted: "false" - - - status: "terminated" - name: "rally benchmark off" - deleted: "true" - {% endcall %} - args: - limit: 50 - filter_by_user_id: true - filter_by_project_id: true - metadata_query: - status: "terminated" - sla: - {{ no_failures_sla() }} - - CeilometerSamples.list_samples: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "cpu_util" - counter_type: "gauge" - counter_unit: "instance" - counter_volume: 1.0 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 60 - metadata_list: - - status: "active" - name: "fake_resource" - deleted: "False" - created_at: "2015-09-04T12:34:19.000000" - - status: "not_active" - name: "fake_resource_1" - deleted: "False" - created_at: "2015-09-10T06:55:12.000000" - batch_size: 5 - {% endcall %} - args: - limit: 50 - metadata_query: - status: "not_active" - sla: - {{ no_failures_sla() }} - diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml index 87fae11a3..7abeeac68 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml @@ -8,6 +8,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -23,6 +25,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {{ volumes() }} {% endcall %} runner: @@ -39,6 +43,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -52,6 +58,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -70,6 +78,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -84,10 +94,15 @@ size: max: 1 min: 1 + create_vm_params: + nics: + - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -100,11 +115,16 @@ {{ vm_params(image_name,flavor_name) }} size: min: 1 - max: 5 + max: 1 + create_vm_params: + nics: + - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -117,17 +137,21 @@ size: 1 context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - args: size: min: 1 - max: 5 + max: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -142,6 +166,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} volumes: size: 1 volumes_per_tenant: 4 @@ -159,6 +185,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {{ volumes() }} {% endcall %} runner: @@ -176,6 +204,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -188,6 +218,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -200,6 +232,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -215,6 +249,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -229,6 +265,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {{ volumes() }} {% endcall %} runner: @@ -244,6 +282,8 @@ read_iops_sec: "1000" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -257,6 +297,8 @@ read_iops_sec: "1000" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -273,6 +315,8 @@ set_read_iops_sec: "1001" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -284,6 +328,8 @@ description: "rally tests creating types" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -295,18 +341,8 @@ description: "rally tests creating types" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - sla: - {{ no_failures_sla() }} - - CinderVolumeTypes.create_and_update_volume_type: - - - args: - description: "test" - update_description: "test update" - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -322,17 +358,8 @@ control_location: "front-end" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - sla: - {{ no_failures_sla() }} - - CinderVolumeTypes.create_volume_type_add_and_list_type_access: - - - args: - description: "rally tests creating types" - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml index dfc1fc156..993b83ff7 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml @@ -36,8 +36,9 @@ flavor: name: {{ flavor_name }} number_instances: 2 - nics: - - net-id: {{ netid }} + boot_server_kwargs: + nics: + - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} quotas: diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml new file mode 100644 index 000000000..b4487daa0 --- /dev/null +++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml @@ -0,0 +1,181 @@ + Gnocchi.list_capabilities: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + Gnocchi.get_status: + - + args: + detailed: false + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicyRule.list_archive_policy_rule: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicyRule.create_archive_policy_rule: + - + args: + metric_pattern: "cpu_*" + archive_policy_name: "low" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicyRule.create_delete_archive_policy_rule: + - + args: + metric_pattern: "cpu_*" + archive_policy_name: "low" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicy.list_archive_policy: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicy.create_archive_policy: + - + args: + definition: + - granularity: "0:00:01" + timespan: "1:00:00" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicy.create_delete_archive_policy: + - + args: + definition: + - granularity: "0:00:01" + timespan: "1:00:00" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResourceType.list_resource_type: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResourceType.create_resource_type: + - + args: + attributes: + foo: + required: false + type: "string" + bar: + required: true + type: "number" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResourceType.create_delete_resource_type: + - + args: + attributes: + foo: + required: false + type: "string" + bar: + required: true + type: "number" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiMetric.list_metric: + - + args: + limit: 10000 + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiMetric.create_metric: + - + args: + archive_policy_name: "low" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiMetric.create_delete_metric: + - + args: + archive_policy_name: "low" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResource.create_resource: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResource.create_delete_resource: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml index 2951e953a..b2248d499 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml @@ -27,7 +27,8 @@ ports_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -50,7 +51,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -74,7 +74,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -108,7 +107,8 @@ ports_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -129,7 +129,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -151,7 +150,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -185,7 +183,8 @@ ports_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -206,7 +205,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -227,7 +225,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -315,7 +312,8 @@ ports_per_network: 2 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -332,7 +330,6 @@ subnets_per_network: 2 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -350,7 +347,8 @@ subnets_per_network: 2 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml index 512448fd4..210591f9b 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml @@ -39,9 +39,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -59,9 +56,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -80,9 +74,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -104,9 +95,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -124,9 +112,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -140,11 +125,13 @@ - args: {{ vm_params(image_name, flavor_name) }} - volume_size: 10 + volume_size: 1 nics: - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -200,7 +187,7 @@ NovaServers.boot_and_live_migrate_server: - args: {{ vm_params(image_name, flavor_name) }} - block_migration: false + block_migration: {{ block_migration }} nics: - net-id: {{ netid }} context: @@ -214,13 +201,15 @@ - args: {{ vm_params(image_name, flavor_name) }} - size: 10 - block_migration: false + size: 1 + block_migration: {{ block_migration }} boot_server_kwargs: nics: - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -229,13 +218,15 @@ NovaServers.boot_server_from_volume_and_live_migrate: - args: {{ vm_params(image_name, flavor_name) }} - block_migration: false - volume_size: 10 + block_migration: {{ block_migration }} + volume_size: 1 force_delete: false nics: - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -245,14 +236,11 @@ - args: {{ vm_params(image_name, flavor_name) }} - server_kwargs: + boot_server_kwargs: nics: - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova(keypairs=true) }} @@ -266,18 +254,17 @@ - args: {{ vm_params(image_name, flavor_name) }} - volume_size: 5 + volume_size: 1 nics: - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_volumes() }} {{ unlimited_neutron() }} {{ unlimited_nova() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -293,9 +280,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -375,6 +359,40 @@ context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} network: {} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} + {% endcall %} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + NovaServers.boot_server_associate_and_dissociate_floating_ip: + - + args: + {{ vm_params(image_name, flavor_name) }} + floating_network: {{ floating_network }} + nics: + - net-id: {{ netid }} + context: + {% call user_context(tenants_amount, users_amount, use_existing_users) %} + network: {} + {% endcall %} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + NovaServers.boot_and_associate_floating_ip: + - + args: + {{ vm_params(image_name, flavor_name) }} + floating_network: {{ floating_network }} + nics: + - net-id: {{ netid }} + context: + {% call user_context(tenants_amount, users_amount, use_existing_users) %} + network: {} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml new file mode 100644 index 000000000..9dd9ca271 --- /dev/null +++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml @@ -0,0 +1,98 @@ + BarbicanContainers.create_and_add: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanContainers.create_certificate_and_delete: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanContainers.create_and_delete: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanContainers.create_rsa_and_delete: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanSecrets.create_and_delete: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanSecrets.create_and_get: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanSecrets.create_and_list: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanSecrets.create: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanSecrets.get: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanContainers.list: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} + + BarbicanSecrets.list: + - + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + sla: + {{ no_failures_sla() }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml index a0682acce..dcb007c50 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml @@ -4,6 +4,8 @@ max_quota: 1024 context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -15,6 +17,8 @@ max_quota: 1024 context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -31,17 +35,6 @@ sla: {{ no_failures_sla() }} - Quotas.nova_update_and_delete: - - - args: - max_quota: 1024 - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - sla: - {{ no_failures_sla() }} - Quotas.nova_update: - args: diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml new file mode 100644 index 000000000..66d7cd24d --- /dev/null +++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml @@ -0,0 +1,71 @@ + SwiftObjects.create_container_and_object_then_list_objects: + - + args: + objects_per_container: 2 + object_size: 5120 + runner: + {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + roles: + - "admin" + sla: + {{ no_failures_sla() }} + + SwiftObjects.list_objects_in_containers: + - + runner: + {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + roles: + - "admin" + swift_objects: + containers_per_tenant: 1 + objects_per_container: 10 + object_size: 1024 + sla: + {{ no_failures_sla() }} + + SwiftObjects.create_container_and_object_then_download_object: + - + args: + objects_per_container: 5 + object_size: 1024 + runner: + {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + roles: + - "admin" + sla: + {{ no_failures_sla() }} + + SwiftObjects.create_container_and_object_then_delete_all: + - + args: + objects_per_container: 5 + object_size: 102400 + runner: + {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + roles: + - "admin" + sla: + {{ no_failures_sla() }} + + SwiftObjects.list_and_download_objects_in_containers: + - + runner: + {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }} + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + roles: + - "admin" + swift_objects: + containers_per_tenant: 1 + objects_per_container: 5 + object_size: 10240 + sla: + {{ no_failures_sla() }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml b/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml index 74f509925..3aa8ac8e5 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml @@ -1,42 +1,19 @@ - VMTasks.boot_runcommand_delete: + VMTasks.dd_load_test: - args: - {{ vm_params(image_name, flavor_name) }} - floating_network: {{ floating_network }} - force_delete: false - command: - interpreter: /bin/sh - script_file: {{ sup_dir }}/instance_dd_test.sh - username: cirros + flavor: + name: {{ flavor_name }} + image: + name: {{ image_name }} nics: - net-id: {{ netid }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} - {% endcall %} - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - sla: - {{ no_failures_sla() }} - - - - args: - {{ vm_params(image_name, flavor_name) }} - fixed_network: private floating_network: {{ floating_network }} force_delete: false - command: - interpreter: /bin/sh - script_file: {{ sup_dir }}/instance_dd_test.sh - use_floatingip: true - username: cirros - nics: - - net-id: {{ netid }} - volume_args: - size: 2 + username: {{ username }} + runner: + {{ constant_runner(concurrency=1, times=iterations, is_smoke=smoke) }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + network: {} sla: {{ no_failures_sla() }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml deleted file mode 100644 index bb070cd3a..000000000 --- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml +++ /dev/null @@ -1,247 +0,0 @@ - CeilometerAlarms.create_alarm_and_get_history: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - state: "ok" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_delete_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_get_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_list_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerQueries.create_and_query_alarm_history: - - - args: - orderby: !!null - limit: !!null - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerQueries.create_and_query_alarms: - - - args: - filter: {"and": [{"!=": {"state": "dummy_state"}},{"=": {"type": "threshold"}}]} - orderby: !!null - limit: 10 - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerQueries.create_and_query_samples: - - - args: - filter: {"=": {"counter_unit": "instance"}} - orderby: !!null - limit: 10 - counter_name: "cpu_util" - counter_type: "gauge" - counter_unit: "instance" - counter_volume: 1.0 - resource_id: "resource_id" - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.create_and_update_alarm: - - - args: - meter_name: "ram_util" - threshold: 10.0 - type: "threshold" - statistic: "avg" - alarm_actions: ["http://localhost:8776/alarm"] - ok_actions: ["http://localhost:8776/ok"] - insufficient_data_actions: ["http://localhost:8776/notok"] - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerEvents.create_user_and_get_event: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerEvents.create_user_and_list_events: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerEvents.create_user_and_list_event_types: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerTraits.create_user_and_list_trait_descriptions: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerTraits.create_user_and_list_traits: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} - - CeilometerStats.get_stats: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "benchmark_meter" - counter_type: "gauge" - counter_unit: "%" - counter_volume: 100 - resources_per_tenant: 100 - samples_per_resource: 100 - timestamp_interval: 10 - metadata_list: - - - status: "active" - name: "rally benchmark on" - deleted: "false" - - - status: "terminated" - name: "rally benchmark off" - deleted: "true" - {% endcall %} - args: - meter_name: "benchmark_meter" - filter_by_user_id: true - filter_by_project_id: true - filter_by_resource_id: true - metadata_query: - status: "terminated" - period: 300 - groupby: "resource_id" - sla: - {{ no_failures_sla() }} - - CeilometerResource.get_tenant_resources: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {% call user_context(tenants_amount, users_amount, use_existing_users) %} - ceilometer: - counter_name: "cpu_util" - counter_type: "gauge" - counter_volume: 1.0 - counter_unit: "instance" - {% endcall %} - sla: - {{ no_failures_sla() }} - - CeilometerAlarms.list_alarms: - - - runner: - {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} - context: - {{ user_context(tenants_amount, users_amount, use_existing_users) }} - sla: - {{ no_failures_sla() }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml index 832358075..f94a5a1a4 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml @@ -6,6 +6,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {{ volumes() }} {% endcall %} runner: @@ -23,6 +25,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -35,6 +39,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -47,6 +53,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -62,6 +70,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -76,6 +86,8 @@ {% call user_context(tenants_amount, users_amount, use_existing_users) %} quotas: {{ unlimited_volumes() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {{ volumes() }} {% endcall %} runner: @@ -91,6 +103,8 @@ read_iops_sec: "1000" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -107,6 +121,8 @@ set_read_iops_sec: "1001" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -118,6 +134,8 @@ description: "rally tests creating types" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -133,6 +151,8 @@ control_location: "front-end" context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml index 1b61762f9..279e81439 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml @@ -36,8 +36,9 @@ flavor: name: {{ flavor_name }} number_instances: 2 - nics: - - net-id: {{ netid }} + boot_server_kwargs: + nics: + - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} quotas: diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml new file mode 100644 index 000000000..d99b15f81 --- /dev/null +++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml @@ -0,0 +1,119 @@ + Gnocchi.list_capabilities: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + Gnocchi.get_status: + - + args: + detailed: false + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicyRule.list_archive_policy_rule: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicyRule.create_delete_archive_policy_rule: + - + args: + metric_pattern: "cpu_*" + archive_policy_name: "low" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicy.list_archive_policy: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiArchivePolicy.create_delete_archive_policy: + - + args: + definition: + - granularity: "0:00:01" + timespan: "1:00:00" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResourceType.list_resource_type: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResourceType.create_delete_resource_type: + - + args: + attributes: + foo: + required: false + type: "string" + bar: + required: true + type: "number" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiMetric.list_metric: + - + args: + limit: 10000 + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiMetric.create_delete_metric: + - + args: + archive_policy_name: "low" + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + GnocchiResource.create_delete_resource: + - + context: + {{ user_context(tenants_amount, users_amount, use_existing_users) }} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml index da99a48b5..3eb7652c0 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml @@ -21,7 +21,8 @@ ports_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -42,7 +43,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -64,7 +64,8 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -98,7 +99,8 @@ ports_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} + network: + router: {} quotas: neutron: network: -1 @@ -119,7 +121,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 @@ -140,7 +141,6 @@ subnets_per_network: 1 context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: {} quotas: neutron: network: -1 diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml index 801938c4e..1fbfccb5a 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml +++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml @@ -1,7 +1,7 @@ NovaServers.boot_and_live_migrate_server: - args: {{ vm_params(image_name, flavor_name) }} - block_migration: false + block_migration: {{ block_migration }} nics: - net-id: {{ netid }} context: @@ -15,13 +15,15 @@ - args: {{ vm_params(image_name, flavor_name) }} - size: 10 - block_migration: false + size: 1 + block_migration: {{ block_migration }} boot_server_kwargs: nics: - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -30,13 +32,15 @@ NovaServers.boot_server_from_volume_and_live_migrate: - args: {{ vm_params(image_name, flavor_name) }} - block_migration: false - volume_size: 10 + block_migration: {{ block_migration }} + volume_size: 1 force_delete: false nics: - net-id: {{ netid }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} sla: @@ -46,14 +50,11 @@ - args: {{ vm_params(image_name, flavor_name) }} - server_kwargs: + boot_server_kwargs: nics: - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova(keypairs=true) }} @@ -67,18 +68,17 @@ - args: {{ vm_params(image_name, flavor_name) }} - volume_size: 5 + volume_size: 1 nics: - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_volumes() }} {{ unlimited_neutron() }} {{ unlimited_nova() }} + api_versions: + {{ volume_service(version=volume_version, service_type=volume_service_type) }} {% endcall %} runner: {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} @@ -94,9 +94,6 @@ - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} - network: - networks_per_tenant: 1 - start_cidr: "100.1.0.0/25" quotas: {{ unlimited_neutron() }} {{ unlimited_nova() }} @@ -122,7 +119,24 @@ - args: {{ vm_params(image_name, flavor_name) }} - auto_assign_nic: true + nics: + - net-id: {{ netid }} + context: + {% call user_context(tenants_amount, users_amount, use_existing_users) %} + network: {} + {% endcall %} + runner: + {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }} + sla: + {{ no_failures_sla() }} + + NovaServers.boot_server_associate_and_dissociate_floating_ip: + - + args: + {{ vm_params(image_name, flavor_name) }} + floating_network: {{ floating_network }} + nics: + - net-id: {{ netid }} context: {% call user_context(tenants_amount, users_amount, use_existing_users) %} network: {} diff --git a/functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh b/functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh deleted file mode 100644 index e3bf23405..000000000 --- a/functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -time_seconds(){ (time -p $1 ) 2>&1 |awk '/real/{print $2}'; } -file=/tmp/test.img -c=${1:-$SIZE} -c=${c:-1000} #default is 1GB -write_seq=$(time_seconds "dd if=/dev/zero of=$file bs=1M count=$c") -read_seq=$(time_seconds "dd if=$file of=/dev/null bs=1M count=$c") -[ -f $file ] && rm $file - -echo "{ - \"write_seq_${c}m\": $write_seq, - \"read_seq_${c}m\": $read_seq - }" diff --git a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template index 35b107838..75afb2dbe 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template +++ b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template @@ -7,7 +7,7 @@ parameters: default: public image: type: string - default: cirros-0.4.0-x86_64-uec + default: cirros-0.6.1-x86_64-uec flavor: type: string default: m1.tiny diff --git a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template index 5c9a86b79..9a0f1aa72 100644 --- a/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template +++ b/functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template @@ -4,7 +4,7 @@ parameters: # set all correct defaults for parameters before launch test image: type: string - default: cirros-0.4.0-x86_64-uec + default: cirros-0.5.1-x86_64-uec flavor: type: string default: m1.tiny diff --git a/functest/opnfv_tests/openstack/rally/task.yaml b/functest/opnfv_tests/openstack/rally/task.yaml index 65f101fbe..649c04557 100644 --- a/functest/opnfv_tests/openstack/rally/task.yaml +++ b/functest/opnfv_tests/openstack/rally/task.yaml @@ -4,7 +4,7 @@ {%- endif %} {%- from "macro/macro.yaml" import user_context, vm_params, unlimited_volumes, constant_runner, rps_runner, no_failures_sla -%} -{%- from "macro/macro.yaml" import volumes, unlimited_nova, unlimited_neutron, glance_args -%} +{%- from "macro/macro.yaml" import volumes, unlimited_nova, unlimited_neutron, glance_args, volume_service -%} --- {% if "authenticate" in service_list %} @@ -15,6 +15,10 @@ {%- include "var/opnfv-cinder.yaml"-%} {% endif %} +{% if "gnocchi" in service_list %} +{%- include "var/opnfv-gnocchi.yaml"-%} +{% endif %} + {% if "keystone" in service_list %} {%- include "var/opnfv-keystone.yaml"-%} {% endif %} @@ -31,10 +35,6 @@ {%- include "var/opnfv-neutron.yaml"-%} {% endif %} -{% if "ceilometer" in service_list %} -{%- include "var/opnfv-ceilometer.yaml"-%} -{% endif %} - {% if "quotas" in service_list %} {%- include "var/opnfv-quotas.yaml"-%} {% endif %} @@ -43,6 +43,14 @@ {%- include "var/opnfv-heat.yaml"-%} {% endif %} +{% if "swift" in service_list %} +{%- include "var/opnfv-swift.yaml"-%} +{% endif %} + +{% if "barbican" in service_list %} +{%- include "var/opnfv-barbican.yaml"-%} +{% endif %} + {% if "vm" in service_list %} {%- include "var/opnfv-vm.yaml"-%} {% endif %} diff --git a/functest/api/resources/__init__.py b/functest/opnfv_tests/openstack/refstack/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/api/resources/__init__.py +++ b/functest/opnfv_tests/openstack/refstack/__init__.py diff --git a/functest/opnfv_tests/openstack/refstack/refstack.py b/functest/opnfv_tests/openstack/refstack/refstack.py new file mode 100644 index 000000000..87932020b --- /dev/null +++ b/functest/opnfv_tests/openstack/refstack/refstack.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 + +"""Refstack testcase implementation.""" + +import logging +import os +import re +import subprocess +import yaml + +from functest.opnfv_tests.openstack.tempest import tempest +from functest.utils import config + + +class Refstack(tempest.TempestCommon): + """Refstack testcase implementation class.""" + + __logger = logging.getLogger(__name__) + + def _extract_refstack_data(self, refstack_list): + yaml_data = "" + with open(refstack_list, encoding='utf-8') as def_file: + for line in def_file: + try: + grp = re.search(r'^([^\[]*)(\[.*\])\n*$', line) + yaml_data = f"{yaml_data}\n{grp.group(1)}: {grp.group(2)}" + except Exception: # pylint: disable=broad-except + self.__logger.warning("Cannot parse %s", line) + return yaml.full_load(yaml_data) + + def _extract_tempest_data(self): + olddir = os.getcwd() + try: + os.chdir(self.verifier_repo_dir) + cmd = ['stestr', 'list', '^tempest.'] + output = subprocess.check_output(cmd) + except subprocess.CalledProcessError as cpe: + self.__logger.error( + "Exception when listing tempest tests: %s\n%s", + cpe.cmd, cpe.output.decode("utf-8")) + raise + finally: + os.chdir(olddir) + yaml_data2 = "" + for line in output.splitlines(): + try: + grp = re.search(r'^([^\[]*)(\[.*\])\n*$', line.decode("utf-8")) + yaml_data2 = f"{yaml_data2}\n{grp.group(1)}: {grp.group(2)}" + except Exception: # pylint: disable=broad-except + self.__logger.warning("Cannot parse %s. skipping it", line) + return yaml.full_load(yaml_data2) + + def generate_test_list(self, **kwargs): + refstack_list = os.path.join( + getattr(config.CONF, 'dir_refstack_data'), + f"{kwargs.get('target', 'compute')}.txt") + self.backup_tempest_config(self.conf_file, '/etc') + refstack_data = self._extract_refstack_data(refstack_list) + tempest_data = self._extract_tempest_data() + with open(self.list, 'w', encoding='utf-8') as ref_file: + for key in refstack_data.keys(): + try: + for data in tempest_data[key]: + if data == refstack_data[key][0]: + break + else: + self.__logger.info("%s: ids differ. skipping it", key) + continue + value = str(tempest_data[key]).replace( + "'", "").replace(", ", ",") + ref_file.write(f"{key}{value}\n") + except Exception: # pylint: disable=broad-except + self.__logger.info("%s: not found. skipping it", key) + continue diff --git a/functest/opnfv_tests/openstack/refstack_client/defcore.txt b/functest/opnfv_tests/openstack/refstack_client/defcore.txt deleted file mode 100644 index e958b47cd..000000000 --- a/functest/opnfv_tests/openstack/refstack_client/defcore.txt +++ /dev/null @@ -1,313 +0,0 @@ -# Set of DefCore tempest test cases not flagged and required. -# According to https://github.com/openstack/interop/blob/master/doc/source/guidelines/2017.09.rst, -# some tests are still flagged due to outstanding bugs in the Tempest library, -# particularly tests that require SSH. Refstack developers -# are working on correcting these bugs upstream. Please note that although some tests -# are flagged because of bugs, there is still an expectation that the capabilities -# covered by the tests are available. -# It only contains Openstack core compute (no object storage) -# The approved guidelines (2017.09) are valid for Mitaka, Newton, Ocata, Pike releases of OpenStack -# The list can be generated using the Rest API from RefStack project: -# https://refstack.openstack.org/api/v1/guidelines/2017.09/tests?target=compute&type=required&alias=true&flag=false -tempest.api.compute.flavors.test_flavors.FlavorsV2TestJSON.test_list_flavors[id-e36c0eaa-dff5-4082-ad1f-3f9a80aa3f59] -tempest.api.compute.flavors.test_flavors.FlavorsV2TestJSON.test_list_flavors_with_detail[id-6e85fde4-b3cd-4137-ab72-ed5f418e8c24] -tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image[id-3731d080-d4c5-4872-b41a-64d0d0021314] -tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name[id-3b7c6fe4-dfe7-477c-9243-b06359db51e6] -tempest.api.compute.servers.test_availability_zone.AZV2TestJSON.test_get_availability_zone_list_with_non_admin_user[id-a8333aa2-205c-449f-a828-d38c2489bf25] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] -tempest.api.compute.servers.test_delete_server.DeleteServersTestJSON.test_delete_active_server[id-925fdfb4-5b13-47ea-ac8a-c36ae6fddb05] -tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action[id-aacc71ca-1d70-4aa5-bbf6-0ff71470e43c] -tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions[id-77ca5cc5-9990-45e0-ab98-1de8fead201a] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor[id-80c574cc-0925-44ba-8602-299028357dd9] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image[id-b3304c3b-97df-46d2-8cd3-e2b6659724e7] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name[id-f9eb2b70-735f-416c-b260-9914ac6181e4] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status[id-de2612ab-b7dd-4044-b0b1-d2539601911f] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results[id-67aec2d0-35fe-4503-9f92-f13272b867ed] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_active_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor[id-573637f5-7325-47bb-9144-3476d0416908] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image[id-05e8a8e7-9659-459a-989d-92c2f501f4ba] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit[id-614cdfc1-d557-4bac-915b-3e67b48eee76] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name[id-9b067a7b-7fee-4f6a-b29c-be43fe18fc5a] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_name_wildcard[id-e9f624ee-92af-4562-8bec-437945a18dcb] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_future_date[id-74745ad8-b346-45b5-b9b8-509d7447fc1f] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date[id-87d12517-e20a-4c9c-97b6-dd1628d6d6c9] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_greater_than_actual_count[id-d47c17fb-eebd-4287-8e95-f20a7e627b18] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value[id-62610dd9-4713-4ee0-8beb-fd2c1aa7f950] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string[id-679bc053-5e70-4514-9800-3dfab1a380a6] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor[id-5913660b-223b-44d4-a651-a0fbfd44ca75] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image[id-ff01387d-c7ad-47b4-ae9e-64fa214638fe] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name[id-e2c77c4a-000a-4af3-a0bd-629a328bde7c] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted[id-93055106-2d34-46fe-af68-d9ddbf7ee570] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing[id-fcdf192d-0f74-4d89-911f-1ec002b822c4] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server[id-24a26f1a-1ddc-4eea-b0d7-a90cc874ad8f] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_lock_unlock_server[id-80a8094c-211e-440a-ab88-9e59d556c7ee] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard[id-2cb1baf6-ac8d-4429-bf0d-ba8a0ba53e32] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_rebuild_server[id-aaa6cdf3-55a7-461a-add9-1c8596b9a07c] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server[id-af8eafd4-38a7-4a4b-bdbc-75145a580560] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item[id-127642d6-4c7b-4486-b7cd-07265a378658] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item[id-3043c57d-7e0e-49a6-9a96-ad569c265e6a] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata[id-479da087-92b3-4dcf-aeb3-fd293b2d14ce] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata[id-211021f6-21de-4657-a68f-908878cfe251] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item[id-58c02d4f-5c67-40be-8744-d3fa5982eb1c] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata[id-344d981e-0c33-4997-8a5d-6c1d803e4134] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password[id-b92d5ec7-b1dd-44a2-87e4-45e888c46ef0] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair[id-f9e15296-d7f9-4e62-b53f-a04e89160833] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name[id-8fea6be7-065e-47cf-89b8-496e6f96c699] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address[id-89b90870-bc13-4b73-96af-f9d4f2b70077] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name[id-5e6ccff8-349d-4852-a8b3-055df7988dd2] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name[id-fd57f159-68d6-4c2a-902b-03070828a87e] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit[id-7fc74810-0bd2-4cd7-8244-4f33a9db865a] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256[id-c3e0fb12-07fc-4d76-a22e-37409887afe8] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor[id-18f5227f-d155-4429-807c-ccb103887537] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image[id-fcba1052-0a50-4cf3-b1ac-fae241edf02f] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid[id-4e72dc2d-44c5-4336-9667-f7972e95c402] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit[id-f4d7279b-5fd2-4bf2-9ba4-ae35df0d18c5] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id[id-75f79124-277c-45e6-a373-a1d6803f4cc4] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server[id-3436b02f-1b1e-4f03-881e-c6a602327439] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address[id-5226dd80-1e9c-4d8a-b5f9-b26ca4763fd0] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server[id-d4c023a0-9c55-4747-9dd5-413b820143c7] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server[id-d86141a7-906e-4731-b187-d64a2ea61422] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_reboot_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank[id-dbbfd247-c40c-449e-8f6c-d2aa7c7da7cf] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server[id-a31460a9-49e1-42aa-82ee-06e0bb7c2d03] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server[id-aa8eed43-e2cb-4ebf-930b-da14f6a21d81] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256[id-5c8e244c-dada-4590-9944-749c455b431f] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name[id-38204696-17c6-44da-9590-40f87fb5a899] -tempest.api.compute.test_quotas.QuotasTestJSON.test_get_default_quotas[id-9bfecac7-b966-4f47-913f-1a9e2c12134a] -tempest.api.compute.test_quotas.QuotasTestJSON.test_get_quotas[id-f1ef0a97-dbbb-4cca-adc5-c9fbc4f76107] -tempest.api.compute.test_versions.TestVersions.test_list_api_versions[id-6c0a0990-43b6-4529-9b61-5fd8daf7c55c] -# tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_attach_detach_volume[id-52e9045a-e90d-4c0d-9087-79d657faffff] -tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_list_get_volume_attachments[id-7fa563fe-f0f7-43eb-9e22-a1ece036b513] -tempest.api.identity.v3.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265] -tempest.api.identity.v3.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd] -tempest.api.identity.v3.TestApiDiscovery.test_api_version_statuses[id-8879a470-abfb-47bb-bb8d-5a7fd279ad1e] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_statuses[id-8879a470-abfb-47bb-bb8d-5a7fd279ad1e] -tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9] -tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image[id-f848bb94-1c6e-45a4-8726-39e3a5b23535] -tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_update_image[id-f66891a7-a35c-41a8-b590-a065c2a1caa6] -tempest.api.image.v2.test_images.ListImagesTest.test_get_image_schema[id-622b925c-479f-4736-860d-adeaf13bc371] -tempest.api.image.v2.test_images.ListImagesTest.test_get_images_schema[id-25c8d7b2-df21-460f-87ac-93130bcdc684] -tempest.api.image.v2.test_images.ListImagesTest.test_index_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_container_format[id-9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_disk_format[id-4a4735a7-f22f-49b6-b0d9-66e1ef7453eb] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_limit[id-e914a891-3cc8-4b40-ad32-e0a39ffbddbb] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_min_max_size[id-4ad8c157-971a-4ba8-aa84-ed61154b1e7f] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_size[id-cf1b9a48-8340-480e-af7b-fe7e17690876] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_status[id-7fc9e369-0f58-4d05-9aa5-0969e2d59d15] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_visibility[id-7a95bb92-d99e-4b12-9718-7bc6ab73e6d2] -tempest.api.image.v2.test_images.ListImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images.ListUserImagesTest.test_get_image_schema[id-622b925c-479f-4736-860d-adeaf13bc371] -tempest.api.image.v2.test_images.ListUserImagesTest.test_get_images_schema[id-25c8d7b2-df21-460f-87ac-93130bcdc684] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_container_format[id-9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_disk_format[id-4a4735a7-f22f-49b6-b0d9-66e1ef7453eb] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_limit[id-e914a891-3cc8-4b40-ad32-e0a39ffbddbb] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_min_max_size[id-4ad8c157-971a-4ba8-aa84-ed61154b1e7f] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_size[id-cf1b9a48-8340-480e-af7b-fe7e17690876] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_status[id-7fc9e369-0f58-4d05-9aa5-0969e2d59d15] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_visibility[id-7a95bb92-d99e-4b12-9718-7bc6ab73e6d2] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_image_null_id[id-32248db1-ab88-4821-9604-c7c369f1f88c] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_existing_image[id-6fe40f1c-57bd-4918-89cc-8500f850f3de] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_delete_deleted_image[id-e57fc127-7ba0-4693-92d7-1d8a05ebcba9] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_image_null_id[id-ef45000d-0a72-4781-866d-4cb7bf2562ad] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_non_existent_image[id-668743d5-08ad-4480-b2b8-15da34f81d9f] -tempest.api.image.v2.test_images_tags.ImagesTagsTest.test_update_delete_tags_for_image[id-10407036-6059-4f95-a2cd-cbbbee7ed329] -tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_delete_non_existing_tag[id-39c023a2-325a-433a-9eea-649bf1414b19] -tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_update_tags_for_non_existing_image[id-8cd30f82-6f9a-4c6e-8034-c1b51fba43d9] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_all_attributes[id-a4d9ec4c-0306-4111-a75c-db01a709030b] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_allocation_pools[id-bec949c4-3147-4ba6-af5f-cd2306118404] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_dhcp_enabled[id-94ce038d-ff0a-4a4c-a56b-09da3ca0b55d] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw[id-9393b468-186d-496d-aa36-732348cd76e7] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw_and_allocation_pools[id-8217a149-0c6c-4cfb-93db-0486f707d13f] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_host_routes_and_dns_nameservers[id-d830de0a-be47-468f-8f02-1fd996118289] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_without_gateway[id-d2d596e2-8e76-47a9-ac51-d4648009f4d3] -tempest.api.network.test_networks.NetworksTest.test_create_update_delete_network_subnet[id-0e269138-0da6-4efc-a46d-578161e7b221] -tempest.api.network.test_networks.NetworksTest.test_delete_network_with_subnet[id-f04f61a9-b7f3-4194-90b2-9bcf660d1bfe] -tempest.api.network.test_networks.NetworksTest.test_list_networks[id-f7ffdeda-e200-4a7a-bcbe-05716e86bf43] -tempest.api.network.test_networks.NetworksTest.test_list_networks_fields[id-6ae6d24f-9194-4869-9c85-c313cb20e080] -tempest.api.network.test_networks.NetworksTest.test_list_subnets[id-db68ba48-f4ea-49e9-81d1-e367f6d0b20a] -tempest.api.network.test_networks.NetworksTest.test_list_subnets_fields[id-842589e3-9663-46b0-85e4-7f01273b0412] -tempest.api.network.test_networks.NetworksTest.test_show_network[id-2bf13842-c93f-4a69-83ed-717d2ec3b44e] -tempest.api.network.test_networks.NetworksTest.test_show_network_fields[id-867819bb-c4b6-45f7-acf9-90edcf70aa5e] -tempest.api.network.test_networks.NetworksTest.test_show_subnet[id-bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc] -tempest.api.network.test_networks.NetworksTest.test_show_subnet_fields[id-270fff0b-8bfc-411f-a184-1e8fd35286f0] -tempest.api.network.test_networks.NetworksTest.test_update_subnet_gw_dns_host_routes_dhcp[id-3d3852eb-3009-49ec-97ac-5ce83b73010a] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_all_attributes[id-a4d9ec4c-0306-4111-a75c-db01a709030b] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_allocation_pools[id-bec949c4-3147-4ba6-af5f-cd2306118404] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_dhcp_enabled[id-94ce038d-ff0a-4a4c-a56b-09da3ca0b55d] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_gw[id-9393b468-186d-496d-aa36-732348cd76e7] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_gw_and_allocation_pools[id-8217a149-0c6c-4cfb-93db-0486f707d13f] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_host_routes_and_dns_nameservers[id-d830de0a-be47-468f-8f02-1fd996118289] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_without_gateway[id-d2d596e2-8e76-47a9-ac51-d4648009f4d3] -tempest.api.network.test_networks.NetworksTestJSON.test_create_update_delete_network_subnet[id-0e269138-0da6-4efc-a46d-578161e7b221] -tempest.api.network.test_networks.NetworksTestJSON.test_delete_network_with_subnet[id-f04f61a9-b7f3-4194-90b2-9bcf660d1bfe] -tempest.api.network.test_networks.NetworksTestJSON.test_list_networks[id-f7ffdeda-e200-4a7a-bcbe-05716e86bf43] -tempest.api.network.test_networks.NetworksTestJSON.test_list_networks_fields[id-6ae6d24f-9194-4869-9c85-c313cb20e080] -tempest.api.network.test_networks.NetworksTestJSON.test_list_subnets[id-db68ba48-f4ea-49e9-81d1-e367f6d0b20a] -tempest.api.network.test_networks.NetworksTestJSON.test_list_subnets_fields[id-842589e3-9663-46b0-85e4-7f01273b0412] -tempest.api.network.test_networks.NetworksTestJSON.test_show_network[id-2bf13842-c93f-4a69-83ed-717d2ec3b44e] -tempest.api.network.test_networks.NetworksTestJSON.test_show_network_fields[id-867819bb-c4b6-45f7-acf9-90edcf70aa5e] -tempest.api.network.test_networks.NetworksTestJSON.test_show_subnet[id-bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc] -tempest.api.network.test_networks.NetworksTestJSON.test_show_subnet_fields[id-270fff0b-8bfc-411f-a184-1e8fd35286f0] -tempest.api.network.test_networks.NetworksTestJSON.test_update_subnet_gw_dns_host_routes_dhcp[id-3d3852eb-3009-49ec-97ac-5ce83b73010a] -tempest.api.network.test_ports.PortsTestJSON.test_create_bulk_port[id-67f1b811-f8db-43e2-86bd-72c074d4a42c] -tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocation_pools[id-0435f278-40ae-48cb-a404-b8a087bc09b1] -tempest.api.network.test_ports.PortsTestJSON.test_create_update_delete_port[id-c72c1c0c-2193-4aca-aaa4-b1442640f51c] -tempest.api.network.test_ports.PortsTestJSON.test_list_ports[id-cf95b358-3e92-4a29-a148-52445e1ac50e] -tempest.api.network.test_ports.PortsTestJSON.test_list_ports_fields[id-ff7f117f-f034-4e0e-abff-ccef05c454b4] -tempest.api.network.test_ports.PortsTestJSON.test_show_port[id-c9a685bd-e83f-499c-939f-9f7863ca259f] -tempest.api.network.test_ports.PortsTestJSON.test_show_port_fields[id-45fcdaf2-dab0-4c13-ac6c-fcddfb579dbd] -tempest.api.network.test_security_groups.SecGroupTest.test_create_list_update_show_delete_security_group[id-bfd128e5-3c92-44b6-9d66-7fe29d22c802] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_additional_args[id-87dfbcf9-1849-43ea-b1e4-efa3eeae9f71] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_icmp_type_code[id-c9463db8-b44d-4f52-b6c0-8dbda99f26ce] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_protocol_integer_value[id-0a307599-6655-4220-bebc-fd70c64f2290] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_group_id[id-c2ed2deb-7a0c-44d8-8b4c-a5825b5c310b] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_ip_prefix[id-16459776-5da2-4634-bce4-4b55ee3ec188] -tempest.api.network.test_security_groups.SecGroupTest.test_create_show_delete_security_group_rule[id-cfb99e0e-7410-4a3d-8a0c-959a63ee77e9] -tempest.api.network.test_security_groups.SecGroupTest.test_list_security_groups[id-e30abd17-fef9-4739-8617-dc26da88e686] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_additional_default_security_group_fails[id-2323061e-9fbf-4eb0-b547-7e8fafc90849] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_duplicate_security_group_rule_fails[id-8fde898f-ce88-493b-adc9-4e4692879fc5] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_ethertype[id-5666968c-fff3-40d6-9efc-df1c8bd01abb] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_protocol[id-981bdc22-ce48-41ed-900a-73148b583958] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_remote_ip_prefix[id-5f8daf69-3c5f-4aaa-88c9-db1d66f68679] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_invalid_ports[id-0d9c7791-f2ad-4e2f-ac73-abf2373b0d2d] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_remote_groupid[id-4bf786fd-2f02-443c-9716-5b98e159a49a] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_security_group[id-be308db6-a7cf-4d5c-9baf-71bafd73f35e] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_delete_non_existent_security_group[id-1f1bb89d-5664-4956-9fcd-83ee0fa603df] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group[id-424fd5c3-9ddc-486a-b45f-39bf0c820fc6] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group_rule[id-4c094c09-000b-4e41-8100-9617600c02a6] -tempest.api.network.test_subnetpools_extensions.SubnetPoolsTestJSON.test_create_list_show_update_delete_subnetpools[id-62595970-ab1c-4b7f-8fcc-fddfe55e9811] -tempest.api.volume.test_availability_zone.AvailabilityZoneTestJSON.test_get_availability_zone_list[id-01f1ae88-eba9-4c6b-a011-6f7ace06b725] -tempest.api.volume.test_availability_zone.AvailabilityZoneV2TestJSON.test_get_availability_zone_list[id-01f1ae88-eba9-4c6b-a011-6f7ace06b725] -tempest.api.volume.test_extensions.ExtensionsTestJSON.test_list_extensions[id-94607eb0-43a5-47ca-82aa-736b41bd2e2c] -tempest.api.volume.test_extensions.ExtensionsV2TestJSON.test_list_extensions[id-94607eb0-43a5-47ca-82aa-736b41bd2e2c] -tempest.api.volume.test_snapshot_metadata.SnapshotMetadataTestJSON.test_crud_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotMetadataTestJSON.test_update_show_snapshot_metadata_item[id-e8ff85c5-8f97-477f-806a-3ac364a949ed] -tempest.api.volume.test_snapshot_metadata.SnapshotMetadataTestJSON.test_update_snapshot_metadata_item[id-e8ff85c5-8f97-477f-806a-3ac364a949ed] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_create_get_delete_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_crud_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_update_snapshot_metadata_item[id-e8ff85c5-8f97-477f-806a-3ac364a949ed] -tempest.api.volume.test_volume_metadata.VolumesMetadataTest.test_crud_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesMetadataTest.test_update_show_volume_metadata_item[id-862261c5-8df4-475a-8c21-946e50e36a20] -tempest.api.volume.test_volume_metadata.VolumesMetadataTest.test_update_volume_metadata_item[id-862261c5-8df4-475a-8c21-946e50e36a20] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_create_get_delete_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_crud_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_update_volume_metadata_item[id-862261c5-8df4-475a-8c21-946e50e36a20] -tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_reserve_unreserve_volume[id-92c4ef64-51b2-40c0-9f7e-4749fbaaba33] -tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_volume_bootable[id-63e21b4c-0a0c-41f6-bfc3-7c2816815599] -tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_volume_readonly_update[id-fff74e1e-5bd3-4b33-9ea9-24c103bc3f59] -tempest.api.volume.test_volumes_actions.VolumesActionsTest.test_volume_upload[id-d8f1ca95-3d5b-44a3-b8ca-909691c9532d] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume[id-92c4ef64-51b2-40c0-9f7e-4749fbaaba33] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable[id-63e21b4c-0a0c-41f6-bfc3-7c2816815599] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update[id-fff74e1e-5bd3-4b33-9ea9-24c103bc3f59] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_upload[id-d8f1ca95-3d5b-44a3-b8ca-909691c9532d] -tempest.api.volume.test_volumes_get.VolumesGetTest.test_volume_create_get_update_delete[id-27fb0e9f-fb64-41dd-8bdb-1ffa762f0d51] -tempest.api.volume.test_volumes_get.VolumesGetTest.test_volume_create_get_update_delete_as_clone[id-3f591b4a-7dc6-444c-bd51-77469506b3a1] -tempest.api.volume.test_volumes_get.VolumesGetTest.test_volume_create_get_update_delete_from_image[id-54a01030-c7fc-447c-86ee-c1182beae638] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete[id-27fb0e9f-fb64-41dd-8bdb-1ffa762f0d51] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_as_clone[id-3f591b4a-7dc6-444c-bd51-77469506b3a1] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_from_image[id-54a01030-c7fc-447c-86ee-c1182beae638] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list[id-0b6ddd39-b948-471f-8038-4787978747c4] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_by_name[id-a28e8da4-0b56-472f-87a8-0f4d3f819c02] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_details_by_name[id-2de3a6d4-12aa-403b-a8f2-fdeb42a89623] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_details_pagination[id-e9138a2c-f67b-4796-8efa-635c196d01de] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_details_with_multiple_params[id-2a7064eb-b9c3-429b-b888-33928fc5edd3] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_pagination[id-af55e775-8e4b-4feb-8719-215c43b0238c] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_param_display_name_and_status[id-777c87c1-2fc4-4883-8b8e-5c0b951d1ec8] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_with_detail_param_display_name_and_status[id-856ab8ca-6009-4c37-b691-be1065528ad4] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_with_detail_param_metadata[id-1ca92d3c-4a8e-4b43-93f5-e4c7fb3b291d] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_with_details[id-adcbb5a7-5ad8-4b61-bd10-5380e111a877] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volume_list_with_param_metadata[id-b5ebea1b-0603-40a0-bb41-15fcd0a53214] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volumes_list_by_availability_zone[id-c0cfa863-3020-40d7-b587-e35f597d5d87] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volumes_list_by_status[id-39654e13-734c-4dab-95ce-7613bf8407ce] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volumes_list_details_by_availability_zone[id-e1b80d13-94f0-4ba2-a40e-386af29f8db1] -tempest.api.volume.test_volumes_list.VolumesListTestJSON.test_volumes_list_details_by_status[id-2943f712-71ec-482a-bf49-d5ca06216b9f] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list[id-0b6ddd39-b948-471f-8038-4787978747c4] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_by_name[id-a28e8da4-0b56-472f-87a8-0f4d3f819c02] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_by_name[id-2de3a6d4-12aa-403b-a8f2-fdeb42a89623] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_param_display_name_and_status[id-777c87c1-2fc4-4883-8b8e-5c0b951d1ec8] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_display_name_and_status[id-856ab8ca-6009-4c37-b691-be1065528ad4] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_metadata[id-1ca92d3c-4a8e-4b43-93f5-e4c7fb3b291d] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_details[id-adcbb5a7-5ad8-4b61-bd10-5380e111a877] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_param_metadata[id-b5ebea1b-0603-40a0-bb41-15fcd0a53214] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_availability_zone[id-c0cfa863-3020-40d7-b587-e35f597d5d87] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_status[id-39654e13-734c-4dab-95ce-7613bf8407ce] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_availability_zone[id-e1b80d13-94f0-4ba2-a40e-386af29f8db1] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_status[id-2943f712-71ec-482a-bf49-d5ca06216b9f] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_with_invalid_size[id-1ed83a8a-682d-4dfb-a30e-ee63ffd6c049] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_with_nonexistent_snapshot_id[id-0c36f6ae-4604-4017-b0a9-34fdc63096f9] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_with_nonexistent_source_volid[id-47c73e08-4be8-45bb-bfdf-0c4e79b88344] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_with_nonexistent_volume_type[id-10254ed8-3849-454e-862e-3ab8e6aa01d2] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_with_size_negative[id-8b472729-9eba-446e-a83b-916bdb34bef7] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_with_size_zero[id-41331caa-eaf4-4001-869d-bc18c1869360] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_create_volume_without_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_delete_invalid_volume_id[id-1f035827-7c32-4019-9240-b4ec2dbd9dfd] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_delete_volume_without_passing_volume_id[id-441a1550-5d44-4b30-af0f-a6d402f52026] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_get_invalid_volume_id[id-30799cfd-7ee4-446c-b66c-45b383ed211b] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_get_volume_without_passing_volume_id[id-c6c3db06-29ad-4e91-beb0-2ab195fe49e3] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_detail_with_invalid_status[id-ba94b27b-be3f-496c-a00e-0283b373fa75] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_detail_with_nonexistent_name[id-9ca17820-a0e7-4cbd-a7fa-f4468735e359] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_with_invalid_status[id-143b279b-7522-466b-81be-34a87d564a7c] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_list_volumes_with_nonexistent_name[id-0f4aa809-8c7b-418f-8fb3-84c7a5dfc52f] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_reserve_volume_with_negative_volume_status[id-449c4ed2-ecdd-47bb-98dc-072aeccf158c] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_reserve_volume_with_nonexistent_volume_id[id-ac6084c0-0546-45f9-b284-38a367e0e0e2] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_unreserve_volume_with_nonexistent_volume_id[id-eb467654-3dc1-4a72-9b46-47c29d22654c] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_update_volume_with_empty_volume_id[id-72aeca85-57a5-4c1f-9057-f320f9ea575b] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_update_volume_with_invalid_volume_id[id-e66e40d6-65e6-4e75-bdc7-636792fa152d] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_update_volume_with_nonexistent_volume_id[id-0186422c-999a-480e-a026-6a665744c30c] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_volume_delete_nonexistent_volume_id[id-555efa6e-efcd-44ef-8a3b-4a7ca4837a29] -tempest.api.volume.test_volumes_negative.VolumesNegativeTest.test_volume_get_nonexistent_volume_id[id-f131c586-9448-44a4-a8b0-54ca838aa43e] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_invalid_size[id-1ed83a8a-682d-4dfb-a30e-ee63ffd6c049] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_snapshot_id[id-0c36f6ae-4604-4017-b0a9-34fdc63096f9] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_source_volid[id-47c73e08-4be8-45bb-bfdf-0c4e79b88344] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_volume_type[id-10254ed8-3849-454e-862e-3ab8e6aa01d2] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_out_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_negative[id-8b472729-9eba-446e-a83b-916bdb34bef7] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_zero[id-41331caa-eaf4-4001-869d-bc18c1869360] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_without_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_invalid_volume_id[id-1f035827-7c32-4019-9240-b4ec2dbd9dfd] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_volume_without_passing_volume_id[id-441a1550-5d44-4b30-af0f-a6d402f52026] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_invalid_volume_id[id-30799cfd-7ee4-446c-b66c-45b383ed211b] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_volume_without_passing_volume_id[id-c6c3db06-29ad-4e91-beb0-2ab195fe49e3] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_invalid_status[id-ba94b27b-be3f-496c-a00e-0283b373fa75] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_nonexistent_name[id-9ca17820-a0e7-4cbd-a7fa-f4468735e359] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_invalid_status[id-143b279b-7522-466b-81be-34a87d564a7c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_nonexistent_name[id-0f4aa809-8c7b-418f-8fb3-84c7a5dfc52f] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_negative_volume_status[id-449c4ed2-ecdd-47bb-98dc-072aeccf158c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_nonexistent_volume_id[id-ac6084c0-0546-45f9-b284-38a367e0e0e2] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_unreserve_volume_with_nonexistent_volume_id[id-eb467654-3dc1-4a72-9b46-47c29d22654c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_empty_volume_id[id-72aeca85-57a5-4c1f-9057-f320f9ea575b] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_invalid_volume_id[id-e66e40d6-65e6-4e75-bdc7-636792fa152d] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_nonexistent_volume_id[id-0186422c-999a-480e-a026-6a665744c30c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_delete_nonexistent_volume_id[id-555efa6e-efcd-44ef-8a3b-4a7ca4837a29] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_get_nonexistent_volume_id[id-f131c586-9448-44a4-a8b0-54ca838aa43e] -tempest.api.volume.test_volumes_snapshots.VolumesSnapshotTestJSON.test_snapshot_create_get_list_update_delete[id-2a8abbe4-d871-46db-b049-c41f5af8216e] -tempest.api.volume.test_volumes_snapshots.VolumesSnapshotTestJSON.test_volume_from_snapshot[id-677863d1-3142-456d-b6ac-9924f667a7f4] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshot_create_get_list_update_delete[id-2a8abbe4-d871-46db-b049-c41f5af8216e] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_volume_from_snapshot[id-677863d1-3142-456d-b6ac-9924f667a7f4] -tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots_list.VolumesSnapshotListTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots_negative.VolumesSnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id[id-e3e466af-70ab-4f4b-a967-ab04e3532ea7] -tempest.api.volume.test_volumes_snapshots_negative.VolumesSnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id[id-bb9da53e-d335-4309-9c15-7e76fd5e4d6d] -tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id[id-e3e466af-70ab-4f4b-a967-ab04e3532ea7] -tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id[id-bb9da53e-d335-4309-9c15-7e76fd5e4d6d] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination[id-e9138a2c-f67b-4796-8efa-635c196d01de] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params[id-2a7064eb-b9c3-429b-b888-33928fc5edd3] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination[id-af55e775-8e4b-4feb-8719-215c43b0238c] diff --git a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py b/functest/opnfv_tests/openstack/refstack_client/refstack_client.py deleted file mode 100644 index fe32da66b..000000000 --- a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -"""Refstack client testcase implemenation.""" - -from __future__ import division - -import argparse -import logging -import os -import re -import sys -import subprocess -import time - -import pkg_resources - -from functest.core import testcase -from functest.energy import energy -from functest.opnfv_tests.openstack.refstack_client.tempest_conf \ - import TempestConf -from functest.opnfv_tests.openstack.tempest import conf_utils -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - -__author__ = ("Matthew Li <matthew.lijun@huawei.com>," - "Linda Wang <wangwulin@huawei.com>") - -# logging configuration """ -LOGGER = logging.getLogger(__name__) - - -class RefstackClient(testcase.TestCase): - """RefstackClient testcase implementation class.""" - - def __init__(self, **kwargs): - """Initialize RefstackClient testcase object.""" - if "case_name" not in kwargs: - kwargs["case_name"] = "refstack_defcore" - super(RefstackClient, self).__init__(**kwargs) - self.tempestconf = None - self.conf_path = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf') - self.functest_test = pkg_resources.resource_filename( - 'functest', 'opnfv_tests') - self.defcore_list = 'openstack/refstack_client/defcore.txt' - self.confpath = os.path.join(self.functest_test, - self.conf_path) - self.defcorelist = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt') - self.testlist = None - self.insecure = '' - if ('https' in CONST.__getattribute__('OS_AUTH_URL') and - CONST.__getattribute__('OS_INSECURE').lower() == 'true'): - self.insecure = '-k' - - def generate_conf(self): - if not os.path.exists(conf_utils.REFSTACK_RESULTS_DIR): - os.makedirs(conf_utils.REFSTACK_RESULTS_DIR) - - self.tempestconf = TempestConf() - self.tempestconf.generate_tempestconf() - - def run_defcore(self, conf, testlist): - """Run defcore sys command.""" - cmd = ("refstack-client test {0} -c {1} -v --test-list {2}" - .format(self.insecure, conf, testlist)) - LOGGER.info("Starting Refstack_defcore test case: '%s'.", cmd) - ft_utils.execute_command(cmd) - - def run_defcore_default(self): - """Run default defcore sys command.""" - options = ["-v"] if not self.insecure else ["-v", self.insecure] - cmd = (["refstack-client", "test", "-c", self.confpath] + - options + ["--test-list", self.defcorelist]) - LOGGER.info("Starting Refstack_defcore test case: '%s'.", cmd) - - with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR, - "environment.log"), 'w+') as f_env: - f_env.write( - ("Refstack environment:\n" - " SUT: {}\n Scenario: {}\n Node: {}\n Date: {}\n").format( - CONST.__getattribute__('INSTALLER_TYPE'), - CONST.__getattribute__('DEPLOY_SCENARIO'), - CONST.__getattribute__('NODE_NAME'), - time.strftime("%a %b %d %H:%M:%S %Z %Y"))) - - with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR, - "refstack.log"), 'w+') as f_stdout: - subprocess.call(cmd, shell=False, stdout=f_stdout, - stderr=subprocess.STDOUT) - - def parse_refstack_result(self): - """Parse Refstack results.""" - try: - with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR, - "refstack.log"), 'r') as logfile: - for line in logfile.readlines(): - if 'Tests' in line: - break - if re.search(r"\} tempest\.", line): - LOGGER.info(line.replace('\n', '')) - - with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR, - "refstack.log"), 'r') as logfile: - output = logfile.read() - - for match in re.findall(r"Ran: (\d+) tests in (\d+\.\d{4}) sec.", - output): - num_tests = match[0] - LOGGER.info("Ran: %s tests in %s sec.", num_tests, match[1]) - for match in re.findall(r"(- Passed: )(\d+)", output): - num_success = match[1] - LOGGER.info("".join(match)) - for match in re.findall(r"(- Skipped: )(\d+)", output): - num_skipped = match[1] - LOGGER.info("".join(match)) - for match in re.findall(r"(- Failed: )(\d+)", output): - num_failures = match[1] - LOGGER.info("".join(match)) - success_testcases = [] - for match in re.findall(r"\{0\} (.*?) \.{3} ok", output): - success_testcases.append(match) - failed_testcases = [] - for match in re.findall(r"\{0\} (.*?) \.{3} FAILED", output): - failed_testcases.append(match) - skipped_testcases = [] - for match in re.findall(r"\{0\} (.*?) \.{3} SKIPPED:", output): - skipped_testcases.append(match) - - num_executed = int(num_tests) - int(num_skipped) - - try: - self.result = 100 * int(num_success) / int(num_executed) - except ZeroDivisionError: - LOGGER.error("No test has been executed") - - self.details = {"tests": int(num_tests), - "failures": int(num_failures), - "success": success_testcases, - "errors": failed_testcases, - "skipped": skipped_testcases} - except Exception: - self.result = 0 - - LOGGER.info("Testcase %s success_rate is %s%%", - self.case_name, self.result) - - @energy.enable_recording - def run(self, **kwargs): - """ - Start RefstackClient testcase. - - used for functest command line, - functest testcase run refstack_defcore - """ - self.start_time = time.time() - - try: - # Make sure that Tempest is configured - if not self.tempestconf: - self.generate_conf() - self.run_defcore_default() - self.parse_refstack_result() - res = testcase.TestCase.EX_OK - except Exception: - LOGGER.exception("Error with run") - res = testcase.TestCase.EX_RUN_ERROR - finally: - self.tempestconf.clean() - - self.stop_time = time.time() - return res - - def _prep_test(self): - """Check that the config file exists.""" - if not os.path.isfile(self.confpath): - LOGGER.error("Conf file not valid: %s", self.confpath) - if not os.path.isfile(self.testlist): - LOGGER.error("testlist file not valid: %s", self.testlist) - - def main(self, **kwargs): - """ - Execute RefstackClient testcase manually. - - used for manually running, - python refstack_client.py -c <tempest_conf_path> - --testlist <testlist_path> - can generate a reference refstack_tempest.conf by - python tempest_conf.py - """ - try: - self.confpath = kwargs['config'] - self.testlist = kwargs['testlist'] - except KeyError as exc: - LOGGER.error("Cannot run refstack client. Please check " - "%s", exc) - return self.EX_RUN_ERROR - try: - self._prep_test() - self.run_defcore(self.confpath, self.testlist) - res = testcase.TestCase.EX_OK - except Exception as exc: - LOGGER.error('Error with run: %s', exc) - res = testcase.TestCase.EX_RUN_ERROR - - return res - - -class RefstackClientParser(object): # pylint: disable=too-few-public-methods - """Command line argument parser helper.""" - - def __init__(self): - """Initialize helper object.""" - self.functest_test = pkg_resources.resource_filename( - 'functest', 'opnfv_tests') - self.conf_path = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf') - self.defcore_list = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt') - self.confpath = os.path.join(self.functest_test, - self.conf_path) - self.defcorelist = os.path.join(self.functest_test, - self.defcore_list) - self.parser = argparse.ArgumentParser() - self.parser.add_argument( - '-c', '--config', - help='the file path of refstack_tempest.conf', - default=self.confpath) - self.parser.add_argument( - '-t', '--testlist', - help='Specify the file path or URL of a test list text file. ' - 'This test list will contain specific test cases that ' - 'should be tested.', - default=self.defcorelist) - - def parse_args(self, argv=None): - """Parse command line arguments.""" - return vars(self.parser.parse_args(argv)) - - -def main(): - """Run RefstackClient testcase with CLI.""" - logging.basicConfig() - refstackclient = RefstackClient() - parser = RefstackClientParser() - args = parser.parse_args(sys.argv[1:]) - try: - result = refstackclient.main(**args) - if result != testcase.TestCase.EX_OK: - return result - except Exception: - return testcase.TestCase.EX_RUN_ERROR diff --git a/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py b/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py deleted file mode 100644 index db7452271..000000000 --- a/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python - -# matthew.lijun@huawei.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 logging -import pkg_resources - -from functest.opnfv_tests.openstack.tempest import conf_utils -from functest.utils import openstack_utils -from functest.utils.constants import CONST -from functest.opnfv_tests.openstack.tempest.tempest \ - import TempestResourcesManager - -""" logging configuration """ -logger = logging.getLogger(__name__) - - -class TempestConf(object): - def __init__(self, **kwargs): - self.VERIFIER_ID = conf_utils.get_verifier_id() - self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir( - self.VERIFIER_ID) - self.DEPLOYMENT_ID = conf_utils.get_verifier_deployment_id() - self.DEPLOYMENT_DIR = conf_utils.get_verifier_deployment_dir( - self.VERIFIER_ID, self.DEPLOYMENT_ID) - self.confpath = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf') - self.resources = TempestResourcesManager(**kwargs) - - def generate_tempestconf(self): - try: - openstack_utils.source_credentials( - CONST.__getattribute__('openstack_creds')) - resources = self.resources.create(create_project=True, - use_custom_images=True, - use_custom_flavors=True) - conf_utils.configure_tempest_defcore( - self.DEPLOYMENT_DIR, - image_id=resources.get("image_id"), - flavor_id=resources.get("flavor_id"), - image_id_alt=resources.get("image_id_alt"), - flavor_id_alt=resources.get("flavor_id_alt"), - tenant_id=resources.get("project_id")) - except Exception as e: - logger.error("error with generating refstack client " - "reference tempest conf file: %s", e) - - def main(self): - try: - self.generate_tempestconf() - logger.info("a reference tempest conf file generated " - "at %s", self.confpath) - except Exception as e: - logger.error('Error with run: %s', e) - - def clean(self): - self.resources.cleanup() - - -def main(): - logging.basicConfig() - tempestconf = TempestConf() - tempestconf.main() diff --git a/functest/api/resources/v1/__init__.py b/functest/opnfv_tests/openstack/shaker/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/api/resources/v1/__init__.py +++ b/functest/opnfv_tests/openstack/shaker/__init__.py diff --git a/functest/opnfv_tests/openstack/shaker/shaker.py b/functest/opnfv_tests/openstack/shaker/shaker.py new file mode 100644 index 000000000..275cc3077 --- /dev/null +++ b/functest/opnfv_tests/openstack/shaker/shaker.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +""" +Shaker_ wraps around popular system network testing tools like iperf, iperf3 +and netperf (with help of flent). Shaker is able to deploy OpenStack instances +and networks in different topologies. Shaker scenario specifies the deployment +and list of tests to execute. + +.. _Shaker: http://pyshaker.readthedocs.io/en/latest/ +""" + +import logging +import os + +import json +import scp + +from functest.core import singlevm +from functest.utils import env + + +class Shaker(singlevm.SingleVm2): + """Run shaker full+perf l2 and l3""" + # pylint: disable=too-many-instance-attributes + + __logger = logging.getLogger(__name__) + + filename = '/home/opnfv/functest/images/shaker-image-1.3.4+stretch.qcow2' + flavor_ram = 512 + flavor_vcpus = 1 + flavor_disk = 3 + username = 'debian' + port = 9000 + ssh_connect_loops = 12 + create_server_timeout = 300 + check_console_loop = 12 + shaker_timeout = '3600' + quota_instances = -1 + quota_cores = -1 + check_console_loop = 12 + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.role = None + + def check_requirements(self): + if self.count_hypervisors() < 2: + self.__logger.warning("Shaker requires at least 2 hypervisors") + self.is_skipped = True + self.project.clean() + + def prepare(self): + super().prepare() + self.cloud.create_security_group_rule( + self.sec.id, port_range_min=self.port, port_range_max=self.port, + protocol='tcp', direction='ingress') + + def execute(self): + """ + Returns: + - 0 if success + - 1 on operation error + """ + assert self.ssh + endpoint = self.get_public_auth_url(self.orig_cloud) + self.__logger.debug("keystone endpoint: %s", endpoint) + if self.orig_cloud.get_role("admin"): + role_name = "admin" + elif self.orig_cloud.get_role("Admin"): + role_name = "Admin" + else: + raise Exception("Cannot detect neither admin nor Admin") + self.orig_cloud.grant_role( + role_name, user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + if not self.orig_cloud.get_role("heat_stack_owner"): + self.role = self.orig_cloud.create_role("heat_stack_owner") + self.orig_cloud.grant_role( + "heat_stack_owner", user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + self.orig_cloud.set_compute_quotas( + self.project.project.name, + instances=self.quota_instances, + cores=self.quota_cores) + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put('/home/opnfv/functest/conf/env_file', remote_path='~/') + if os.environ.get('OS_CACERT'): + scpc.put(os.environ.get('OS_CACERT'), remote_path='~/os_cacert') + opt = 'export OS_CACERT=~/os_cacert && ' if os.environ.get( + 'OS_CACERT') else '' + (_, stdout, stderr) = self.ssh.exec_command( + 'source ~/env_file && ' + 'export OS_INTERFACE=public && ' + f'export OS_AUTH_URL={endpoint} && ' + f'export OS_USERNAME={self.project.user.name} && ' + f'export OS_PROJECT_NAME={self.project.project.name} && ' + f'export OS_PROJECT_ID={self.project.project.id} && ' + 'unset OS_TENANT_NAME && ' + 'unset OS_TENANT_ID && ' + 'unset OS_ENDPOINT_TYPE && ' + f'export OS_PASSWORD="{self.project.password}" && ' + f'{opt}' + 'env && ' + f'timeout {self.shaker_timeout} shaker --debug ' + f'--image-name {self.image.name} --flavor-name {self.flavor.name} ' + f'--server-endpoint {self.fip.floating_ip_address}:9000 ' + f'--external-net {self.ext_net.id} ' + f"--dns-nameservers {env.get('NAMESERVER')} " + '--scenario openstack/full_l2,' + 'openstack/full_l3_east_west,' + 'openstack/full_l3_north_south,' + 'openstack/perf_l3_north_south ' + '--report report.html --output report.json') + self.__logger.info("output:\n%s", stdout.read().decode("utf-8")) + self.__logger.info("error:\n%s", stderr.read().decode("utf-8")) + if not os.path.exists(self.res_dir): + os.makedirs(self.res_dir) + try: + scpc.get('report.json', self.res_dir) + scpc.get('report.html', self.res_dir) + except scp.SCPException: + self.__logger.exception("cannot get report files") + return 1 + with open( + os.path.join(self.res_dir, 'report.json'), + encoding='utf-8') as json_file: + data = json.load(json_file) + for value in data["records"].values(): + if value["status"] != "ok": + self.__logger.error( + "%s failed\n%s", value["scenario"], value["stderr"]) + return 1 + return stdout.channel.recv_exit_status() + + def clean(self): + super().clean() + if self.role: + self.orig_cloud.delete_role(self.role.id) diff --git a/functest/opnfv_tests/openstack/snaps/__init__.py b/functest/opnfv_tests/openstack/snaps/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/opnfv_tests/openstack/snaps/__init__.py +++ /dev/null diff --git a/functest/opnfv_tests/openstack/snaps/api_check.py b/functest/opnfv_tests/openstack/snaps/api_check.py deleted file mode 100644 index e708b4dec..000000000 --- a/functest/opnfv_tests/openstack/snaps/api_check.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 unittest - -from functest.opnfv_tests.openstack.snaps import snaps_suite_builder -from functest.opnfv_tests.openstack.snaps.snaps_test_runner import \ - SnapsTestRunner - - -class ApiCheck(SnapsTestRunner): - """ - This test executes the Python Tests included with the SNAPS libraries - that exercise many of the OpenStack APIs within Keystone, Glance, Neutron, - and Nova - """ - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = "api_check" - super(ApiCheck, self).__init__(**kwargs) - - self.suite = unittest.TestSuite() - - def run(self, **kwargs): - """ - Builds the test suite then calls super.run() - :param kwargs: the arguments to pass on - :return: - """ - snaps_suite_builder.add_openstack_api_tests( - suite=self.suite, - os_creds=self.os_creds, - ext_net_name=self.ext_net_name, - use_keystone=self.use_keystone, - image_metadata=self.image_metadata) - return super(self.__class__, self).run() diff --git a/functest/opnfv_tests/openstack/snaps/connection_check.py b/functest/opnfv_tests/openstack/snaps/connection_check.py deleted file mode 100644 index 1fc49349e..000000000 --- a/functest/opnfv_tests/openstack/snaps/connection_check.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 unittest - -from functest.opnfv_tests.openstack.snaps import snaps_suite_builder -from functest.opnfv_tests.openstack.snaps.snaps_test_runner import \ - SnapsTestRunner - - -class ConnectionCheck(SnapsTestRunner): - """ - This test executes the Python Tests included with the SNAPS libraries - that simply obtain the different OpenStack clients and may perform - simple queries - """ - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = "connection_check" - super(ConnectionCheck, self).__init__(**kwargs) - - self.suite = unittest.TestSuite() - - def run(self, **kwargs): - """ - Builds the test suite then calls super.run() - :param kwargs: the arguments to pass on - :return: - """ - snaps_suite_builder.add_openstack_client_tests( - suite=self.suite, - os_creds=self.os_creds, - ext_net_name=self.ext_net_name, - use_keystone=self.use_keystone) - return super(self.__class__, self).run() diff --git a/functest/opnfv_tests/openstack/snaps/health_check.py b/functest/opnfv_tests/openstack/snaps/health_check.py deleted file mode 100644 index 837c2eae7..000000000 --- a/functest/opnfv_tests/openstack/snaps/health_check.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 unittest - -from functest.opnfv_tests.openstack.snaps.snaps_test_runner import ( - SnapsTestRunner) - -from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase -from snaps.openstack.tests.create_instance_tests import SimpleHealthCheck - - -class HealthCheck(SnapsTestRunner): - """ - This test executes the SNAPS Python Test case SimpleHealthCheck which - creates a VM with a single port with an IPv4 address that is assigned by - DHCP. This test then validates the expected IP with the actual - """ - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = "snaps_images_cirros" - super(HealthCheck, self).__init__(**kwargs) - - self.suite = unittest.TestSuite() - - def run(self, **kwargs): - """ - Builds the test suite then calls super.run() - :param kwargs: the arguments to pass on - :return: - """ - self.suite.addTest( - OSIntegrationTestCase.parameterize( - SimpleHealthCheck, os_creds=self.os_creds, - ext_net_name=self.ext_net_name, - use_keystone=self.use_keystone, - flavor_metadata=self.flavor_metadata, - image_metadata=self.image_metadata, - netconf_override=self.netconf_override)) - return super(self.__class__, self).run() diff --git a/functest/opnfv_tests/openstack/snaps/smoke.py b/functest/opnfv_tests/openstack/snaps/smoke.py deleted file mode 100644 index ded149d0c..000000000 --- a/functest/opnfv_tests/openstack/snaps/smoke.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 unittest - -from functest.opnfv_tests.openstack.snaps import snaps_suite_builder -from functest.opnfv_tests.openstack.snaps.snaps_test_runner import ( - SnapsTestRunner) - - -class SnapsSmoke(SnapsTestRunner): - """ - This test executes the Python Tests included with the SNAPS libraries - that exercise many of the OpenStack APIs within Keystone, Glance, Neutron, - and Nova - """ - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = "snaps_smoke" - super(SnapsSmoke, self).__init__(**kwargs) - - self.suite = unittest.TestSuite() - - def run(self, **kwargs): - """ - Builds the test suite then calls super.run() - :param kwargs: the arguments to pass on - :return: - """ - snaps_suite_builder.add_openstack_integration_tests( - suite=self.suite, - os_creds=self.os_creds, - ext_net_name=self.ext_net_name, - use_keystone=self.use_keystone, - flavor_metadata=self.flavor_metadata, - image_metadata=self.image_metadata, - use_floating_ips=self.use_fip, - netconf_override=self.netconf_override) - return super(self.__class__, self).run() diff --git a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py b/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py deleted file mode 100644 index 3e7c0a39f..000000000 --- a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py +++ /dev/null @@ -1,433 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 logging - -from snaps.openstack.tests.create_flavor_tests import ( - CreateFlavorTests) -from snaps.openstack.tests.create_image_tests import ( - CreateImageSuccessTests, CreateImageNegativeTests, - CreateMultiPartImageTests) -from snaps.openstack.tests.create_instance_tests import ( - CreateInstanceSingleNetworkTests, CreateInstanceOnComputeHost, - CreateInstanceSimpleTests, InstanceSecurityGroupTests, - CreateInstancePortManipulationTests, SimpleHealthCheck, - CreateInstanceFromThreePartImage, CreateInstanceTwoNetTests, - CreateInstanceVolumeTests) -from snaps.openstack.tests.create_keypairs_tests import ( - CreateKeypairsTests, CreateKeypairsCleanupTests) -from snaps.openstack.tests.create_network_tests import ( - CreateNetworkSuccessTests) -from snaps.openstack.tests.create_project_tests import ( - CreateProjectSuccessTests, CreateProjectUserTests) -from snaps.openstack.tests.create_qos_tests import ( - CreateQoSTests) -from snaps.openstack.tests.create_router_tests import ( - CreateRouterSuccessTests, CreateRouterNegativeTests) -from snaps.openstack.tests.create_security_group_tests import ( - CreateSecurityGroupTests) -from snaps.openstack.tests.create_stack_tests import ( - CreateStackSuccessTests, CreateStackNegativeTests, - CreateStackFlavorTests, CreateStackFloatingIpTests, - CreateStackKeypairTests, CreateStackVolumeTests, - CreateStackSecurityGroupTests) -from snaps.openstack.tests.create_user_tests import ( - CreateUserSuccessTests) -from snaps.openstack.tests.create_volume_tests import ( - CreateSimpleVolumeSuccessTests, - CreateVolumeWithTypeTests, CreateVolumeWithImageTests, - CreateSimpleVolumeFailureTests) -from snaps.openstack.tests.create_volume_type_tests import ( - CreateSimpleVolumeTypeSuccessTests, - CreateVolumeTypeComplexTests) -from snaps.openstack.tests.os_source_file_test import ( - OSComponentTestCase, OSIntegrationTestCase) -from snaps.openstack.utils.tests.cinder_utils_tests import ( - CinderSmokeTests, CinderUtilsQoSTests, CinderUtilsSimpleVolumeTypeTests, - CinderUtilsAddEncryptionTests, CinderUtilsVolumeTypeCompleteTests, - CinderUtilsVolumeTests) -from snaps.openstack.utils.tests.glance_utils_tests import ( - GlanceSmokeTests, GlanceUtilsTests) -from snaps.openstack.utils.tests.heat_utils_tests import ( - HeatSmokeTests, HeatUtilsCreateSimpleStackTests, - HeatUtilsCreateComplexStackTests, HeatUtilsFlavorTests, - HeatUtilsKeypairTests, HeatUtilsSecurityGroupTests) -from snaps.openstack.utils.tests.keystone_utils_tests import ( - KeystoneSmokeTests, KeystoneUtilsTests) -from snaps.openstack.utils.tests.neutron_utils_tests import ( - NeutronSmokeTests, NeutronUtilsNetworkTests, NeutronUtilsSubnetTests, - NeutronUtilsRouterTests, NeutronUtilsSecurityGroupTests, - NeutronUtilsFloatingIpTests) -from snaps.openstack.utils.tests.nova_utils_tests import ( - NovaSmokeTests, NovaUtilsKeypairTests, NovaUtilsFlavorTests, - NovaUtilsInstanceTests, NovaUtilsInstanceVolumeTests) -from snaps.provisioning.tests.ansible_utils_tests import ( - AnsibleProvisioningTests) - - -def add_openstack_client_tests(suite, os_creds, ext_net_name, - use_keystone=True, log_level=logging.INFO): - """ - Adds tests written to exercise OpenStack client retrieval - :param suite: the unittest.TestSuite object to which to add the tests - :param os_creds: and instance of OSCreds that holds the credentials - required by OpenStack - :param ext_net_name: the name of an external network on the cloud under - test - :param use_keystone: when True, tests requiring direct access to Keystone - are added as these need to be running on a host that - has access to the cloud's private network - :param log_level: the logging level - :return: None as the tests will be adding to the 'suite' parameter object - """ - # Basic connection tests - suite.addTest( - OSComponentTestCase.parameterize( - GlanceSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - - if use_keystone: - suite.addTest( - OSComponentTestCase.parameterize( - KeystoneSmokeTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level)) - - suite.addTest( - OSComponentTestCase.parameterize( - NeutronSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest( - OSComponentTestCase.parameterize( - NovaSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest( - OSComponentTestCase.parameterize( - HeatSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest( - OSComponentTestCase.parameterize( - CinderSmokeTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - - -def add_openstack_api_tests(suite, os_creds, ext_net_name, use_keystone=True, - image_metadata=None, log_level=logging.INFO): - """ - Adds tests written to exercise all existing OpenStack APIs - :param suite: the unittest.TestSuite object to which to add the tests - :param os_creds: Instance of OSCreds that holds the credentials - required by OpenStack - :param ext_net_name: the name of an external network on the cloud under - test - :param use_keystone: when True, tests requiring direct access to Keystone - are added as these need to be running on a host that - has access to the cloud's private network - :param image_metadata: dict() object containing metadata for creating an - image with custom config - (see YAML files in examples/image-metadata) - :param log_level: the logging level - :return: None as the tests will be adding to the 'suite' parameter object - """ - # Tests the OpenStack API calls - if use_keystone: - suite.addTest(OSComponentTestCase.parameterize( - KeystoneUtilsTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - CreateUserSuccessTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - CreateProjectSuccessTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - CreateProjectUserTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level)) - - suite.addTest(OSComponentTestCase.parameterize( - GlanceUtilsTests, os_creds=os_creds, ext_net_name=ext_net_name, - image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NeutronUtilsNetworkTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NeutronUtilsSubnetTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NeutronUtilsRouterTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NeutronUtilsSecurityGroupTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NeutronUtilsFloatingIpTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NovaUtilsKeypairTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NovaUtilsFlavorTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - NovaUtilsInstanceTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level, image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - NovaUtilsInstanceVolumeTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - CreateFlavorTests, os_creds=os_creds, ext_net_name=ext_net_name, - log_level=log_level)) - suite.addTest(OSComponentTestCase.parameterize( - HeatUtilsCreateSimpleStackTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - HeatUtilsCreateComplexStackTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - HeatUtilsFlavorTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - HeatUtilsKeypairTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - HeatUtilsSecurityGroupTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - CinderUtilsQoSTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - CinderUtilsVolumeTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - CinderUtilsSimpleVolumeTypeTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - CinderUtilsAddEncryptionTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - suite.addTest(OSComponentTestCase.parameterize( - CinderUtilsVolumeTypeCompleteTests, os_creds=os_creds, - ext_net_name=ext_net_name, log_level=log_level, - image_metadata=image_metadata)) - - -def add_openstack_integration_tests(suite, os_creds, ext_net_name, - use_keystone=True, flavor_metadata=None, - image_metadata=None, use_floating_ips=True, - netconf_override=None, - log_level=logging.INFO): - """ - Adds tests written to exercise all long-running OpenStack integration tests - meaning they will be creating VM instances and potentially performing some - SSH functions through floatingIPs - :param suite: the unittest.TestSuite object to which to add the tests - :param os_creds: and instance of OSCreds that holds the credentials - required by OpenStack - :param ext_net_name: the name of an external network on the cloud under - test - :param use_keystone: when True, tests requiring direct access to Keystone - are added as these need to be running on a host that - has access to the cloud's private network - :param image_metadata: dict() object containing metadata for creating an - image with custom config - (see YAML files in examples/image-metadata) - :param flavor_metadata: dict() object containing the metadata required by - your flavor based on your configuration: - (i.e. {'hw:mem_page_size': 'large'}) - :param use_floating_ips: when true, all tests requiring Floating IPs will - be added to the suite - :param netconf_override: dict() containing the reconfigured network_type, - physical_network and segmentation_id - :param log_level: the logging level - :return: None as the tests will be adding to the 'suite' parameter object - """ - # Tests the OpenStack API calls via a creator. If use_keystone, objects - # will be created with a custom user and project - - # Creator Object tests - suite.addTest(OSIntegrationTestCase.parameterize( - CreateSecurityGroupTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateImageSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateImageNegativeTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateMultiPartImageTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateKeypairsTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateKeypairsCleanupTests, os_creds=os_creds, - ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateNetworkSuccessTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateRouterSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateRouterNegativeTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateQoSTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateSimpleVolumeTypeSuccessTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateVolumeTypeComplexTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateSimpleVolumeSuccessTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateSimpleVolumeFailureTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateVolumeWithTypeTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateVolumeWithImageTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - - # VM Instances - suite.addTest(OSIntegrationTestCase.parameterize( - SimpleHealthCheck, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstanceTwoNetTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstanceSimpleTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - netconf_override=netconf_override, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstancePortManipulationTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - netconf_override=netconf_override, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - InstanceSecurityGroupTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - netconf_override=netconf_override, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstanceOnComputeHost, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - netconf_override=netconf_override, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstanceFromThreePartImage, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - netconf_override=netconf_override, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstanceVolumeTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - netconf_override=netconf_override, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackVolumeTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackFlavorTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackKeypairTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackSecurityGroupTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackNegativeTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - - if use_floating_ips: - suite.addTest(OSIntegrationTestCase.parameterize( - CreateInstanceSingleNetworkTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateStackFloatingIpTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - AnsibleProvisioningTests, os_creds=os_creds, - ext_net_name=ext_net_name, use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) diff --git a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py b/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py deleted file mode 100644 index 6dc8288bf..000000000 --- a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 logging - -from functest.core import unit -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.utils.constants import CONST - -from snaps.openstack import create_flavor -from snaps.openstack.tests import openstack_tests - - -class SnapsTestRunner(unit.Suite): - """ - This test executes the SNAPS Python Tests - """ - def __init__(self, **kwargs): - super(SnapsTestRunner, self).__init__(**kwargs) - self.logger = logging.getLogger(__name__) - - if 'os_creds' in kwargs: - self.os_creds = kwargs['os_creds'] - else: - creds_override = None - if hasattr(CONST, 'snaps_os_creds_override'): - creds_override = CONST.__getattribute__( - 'snaps_os_creds_override') - self.os_creds = openstack_tests.get_credentials( - os_env_file=CONST.__getattribute__('openstack_creds'), - proxy_settings_str=None, ssh_proxy_cmd=None, - overrides=creds_override) - - if 'ext_net_name' in kwargs: - self.ext_net_name = kwargs['ext_net_name'] - else: - self.ext_net_name = snaps_utils.get_ext_net_name(self.os_creds) - - self.netconf_override = None - if hasattr(CONST, 'snaps_network_config'): - self.netconf_override = CONST.__getattribute__( - 'snaps_network_config') - - self.use_fip = ( - CONST.__getattribute__('snaps_use_floating_ips') == 'True') - self.use_keystone = ( - CONST.__getattribute__('snaps_use_keystone') == 'True') - scenario = CONST.__getattribute__('DEPLOY_SCENARIO') - - self.flavor_metadata = None - if 'ovs' in scenario or 'fdio' in scenario: - self.flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE - - self.logger.info("Using flavor metadata '%s'", self.flavor_metadata) - - self.image_metadata = None - if hasattr(CONST, 'snaps_images'): - self.image_metadata = CONST.__getattribute__('snaps_images') diff --git a/functest/opnfv_tests/openstack/snaps/snaps_utils.py b/functest/opnfv_tests/openstack/snaps/snaps_utils.py deleted file mode 100644 index 284e88b51..000000000 --- a/functest/opnfv_tests/openstack/snaps/snaps_utils.py +++ /dev/null @@ -1,38 +0,0 @@ -# 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 - -from functest.utils.constants import CONST - -from snaps.openstack.utils import neutron_utils, nova_utils - - -def get_ext_net_name(os_creds): - """ - Returns the configured external network name or - the first retrieved external network name - :param: os_creds: an instance of snaps OSCreds object - :return: - """ - neutron = neutron_utils.neutron_client(os_creds) - ext_nets = neutron_utils.get_external_networks(neutron) - if (hasattr(CONST, 'EXTERNAL_NETWORK')): - extnet_config = CONST.__getattribute__('EXTERNAL_NETWORK') - for ext_net in ext_nets: - if ext_net.name == extnet_config: - return extnet_config - return ext_nets[0].name if ext_nets else "" - - -def get_active_compute_cnt(os_creds): - """ - Returns the number of active compute servers - :param: os_creds: an instance of snaps OSCreds object - :return: the number of active compute servers - """ - nova = nova_utils.nova_client(os_creds) - computes = nova_utils.get_availability_zone_hosts(nova, zone_name='nova') - return len(computes) diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py deleted file mode 100644 index e61ab8138..000000000 --- a/functest/opnfv_tests/openstack/tempest/conf_utils.py +++ /dev/null @@ -1,352 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2015 All rights reserved -# This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -import ConfigParser -import logging -import fileinput -import os -import pkg_resources -import shutil -import subprocess - -import yaml - -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - - -IMAGE_ID_ALT = None -FLAVOR_ID_ALT = None -RALLY_CONF_PATH = "/etc/rally/rally.conf" -RALLY_AARCH64_PATCH_PATH = pkg_resources.resource_filename( - 'functest', 'ci/rally_aarch64_patch.conf') -GLANCE_IMAGE_PATH = os.path.join( - CONST.__getattribute__('dir_functest_images'), - CONST.__getattribute__('openstack_image_file_name')) -TEMPEST_RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'), - 'tempest') -TEMPEST_CUSTOM = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/openstack/tempest/custom_tests/test_list.txt') -TEMPEST_BLACKLIST = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/openstack/tempest/custom_tests/blacklist.txt') -TEMPEST_DEFCORE = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt') -TEMPEST_RAW_LIST = os.path.join(TEMPEST_RESULTS_DIR, 'test_raw_list.txt') -TEMPEST_LIST = os.path.join(TEMPEST_RESULTS_DIR, 'test_list.txt') -REFSTACK_RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'), - 'refstack') -TEMPEST_CONF_YAML = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml') -TEST_ACCOUNTS_FILE = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/tempest/custom_tests/test_accounts.yaml') - -CI_INSTALLER_TYPE = CONST.__getattribute__('INSTALLER_TYPE') -CI_INSTALLER_IP = CONST.__getattribute__('INSTALLER_IP') - -""" logging configuration """ -logger = logging.getLogger(__name__) - - -def create_rally_deployment(): - # set the architecture to default - pod_arch = os.getenv("POD_ARCH", None) - arch_filter = ['aarch64'] - - if pod_arch and pod_arch in arch_filter: - logger.info("Apply aarch64 specific to rally config...") - with open(RALLY_AARCH64_PATCH_PATH, "r") as f: - rally_patch_conf = f.read() - - for line in fileinput.input(RALLY_CONF_PATH, inplace=1): - print line, - if "cirros|testvm" in line: - print rally_patch_conf - - logger.info("Creating Rally environment...") - - cmd = "rally deployment destroy opnfv-rally" - ft_utils.execute_command(cmd, error_msg=( - "Deployment %s does not exist." - % CONST.__getattribute__('rally_deployment_name')), - verbose=False) - - cmd = ("rally deployment create --fromenv --name={0}" - .format(CONST.__getattribute__('rally_deployment_name'))) - error_msg = "Problem while creating Rally deployment" - ft_utils.execute_command_raise(cmd, error_msg=error_msg) - - cmd = "rally deployment check" - error_msg = "OpenStack not responding or faulty Rally deployment." - ft_utils.execute_command_raise(cmd, error_msg=error_msg) - - -def create_verifier(): - logger.info("Create verifier from existing repo...") - cmd = ("rally verify delete-verifier --id '{0}' --force").format( - CONST.__getattribute__('tempest_verifier_name')) - ft_utils.execute_command(cmd, error_msg=( - "Verifier %s does not exist." - % CONST.__getattribute__('tempest_verifier_name')), - verbose=False) - cmd = ("rally verify create-verifier --source {0} " - "--name {1} --type tempest --system-wide" - .format(CONST.__getattribute__('dir_repo_tempest'), - CONST.__getattribute__('tempest_verifier_name'))) - ft_utils.execute_command_raise(cmd, - error_msg='Problem while creating verifier') - - -def get_verifier_id(): - """ - Returns verifier id for current Tempest - """ - create_rally_deployment() - create_verifier() - cmd = ("rally verify list-verifiers | awk '/" + - CONST.__getattribute__('tempest_verifier_name') + - "/ {print $2}'") - p = subprocess.Popen(cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - deployment_uuid = p.stdout.readline().rstrip() - if deployment_uuid == "": - logger.error("Tempest verifier not found.") - raise Exception('Error with command:%s' % cmd) - return deployment_uuid - - -def get_verifier_deployment_id(): - """ - Returns deployment id for active Rally deployment - """ - cmd = ("rally deployment list | awk '/" + - CONST.__getattribute__('rally_deployment_name') + - "/ {print $2}'") - p = subprocess.Popen(cmd, shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - deployment_uuid = p.stdout.readline().rstrip() - if deployment_uuid == "": - logger.error("Rally deployment not found.") - raise Exception('Error with command:%s' % cmd) - return deployment_uuid - - -def get_verifier_repo_dir(verifier_id): - """ - Returns installed verifier repo directory for Tempest - """ - if not verifier_id: - verifier_id = get_verifier_id() - - return os.path.join(CONST.__getattribute__('dir_rally_inst'), - 'verification', - 'verifier-{}'.format(verifier_id), - 'repo') - - -def get_verifier_deployment_dir(verifier_id, deployment_id): - """ - Returns Rally deployment directory for current verifier - """ - if not verifier_id: - verifier_id = get_verifier_id() - - if not deployment_id: - deployment_id = get_verifier_deployment_id() - - return os.path.join(CONST.__getattribute__('dir_rally_inst'), - 'verification', - 'verifier-{}'.format(verifier_id), - 'for-deployment-{}'.format(deployment_id)) - - -def backup_tempest_config(conf_file): - """ - Copy config file to tempest results directory - """ - if not os.path.exists(TEMPEST_RESULTS_DIR): - os.makedirs(TEMPEST_RESULTS_DIR) - shutil.copyfile(conf_file, - os.path.join(TEMPEST_RESULTS_DIR, 'tempest.conf')) - - -def configure_tempest(deployment_dir, image_id=None, flavor_id=None, - compute_cnt=None): - """ - Calls rally verify and updates the generated tempest.conf with - given parameters - """ - conf_file = configure_verifier(deployment_dir) - configure_tempest_update_params(conf_file, image_id, flavor_id, - compute_cnt) - - -def configure_tempest_defcore(deployment_dir, image_id, flavor_id, - image_id_alt, flavor_id_alt, tenant_id): - """ - Add/update needed parameters into tempest.conf file - """ - conf_file = configure_verifier(deployment_dir) - configure_tempest_update_params(conf_file, image_id, flavor_id) - - logger.debug("Updating selected tempest.conf parameters for defcore...") - config = ConfigParser.RawConfigParser() - config.read(conf_file) - config.set('DEFAULT', 'log_file', '{}/tempest.log'.format(deployment_dir)) - config.set('oslo_concurrency', 'lock_path', - '{}/lock_files'.format(deployment_dir)) - generate_test_accounts_file(tenant_id=tenant_id) - config.set('auth', 'test_accounts_file', TEST_ACCOUNTS_FILE) - config.set('scenario', 'img_dir', '{}'.format(deployment_dir)) - config.set('scenario', 'img_file', 'tempest-image') - config.set('compute', 'image_ref', image_id) - config.set('compute', 'image_ref_alt', image_id_alt) - config.set('compute', 'flavor_ref', flavor_id) - config.set('compute', 'flavor_ref_alt', flavor_id_alt) - - with open(conf_file, 'wb') as config_file: - config.write(config_file) - - confpath = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf') - shutil.copyfile(conf_file, confpath) - - -def generate_test_accounts_file(tenant_id): - """ - Add needed tenant and user params into test_accounts.yaml - """ - - logger.debug("Add needed params into test_accounts.yaml...") - accounts_list = [ - { - 'tenant_name': - CONST.__getattribute__('tempest_identity_tenant_name'), - 'tenant_id': str(tenant_id), - 'username': CONST.__getattribute__('tempest_identity_user_name'), - 'password': - CONST.__getattribute__('tempest_identity_user_password') - } - ] - - with open(TEST_ACCOUNTS_FILE, "w") as f: - yaml.dump(accounts_list, f, default_flow_style=False) - - -def configure_tempest_update_params(tempest_conf_file, image_id=None, - flavor_id=None, compute_cnt=1): - """ - Add/update needed parameters into tempest.conf file - """ - logger.debug("Updating selected tempest.conf parameters...") - config = ConfigParser.RawConfigParser() - config.read(tempest_conf_file) - config.set( - 'compute', - 'fixed_network_name', - CONST.__getattribute__('tempest_private_net_name')) - config.set('compute', 'volume_device_name', - CONST.__getattribute__('tempest_volume_device_name')) - - if image_id is not None: - config.set('compute', 'image_ref', image_id) - if IMAGE_ID_ALT is not None: - config.set('compute', 'image_ref_alt', IMAGE_ID_ALT) - if CONST.__getattribute__('tempest_use_custom_flavors'): - if flavor_id is not None: - config.set('compute', 'flavor_ref', flavor_id) - if FLAVOR_ID_ALT is not None: - config.set('compute', 'flavor_ref_alt', FLAVOR_ID_ALT) - if compute_cnt > 1: - # enable multinode tests - config.set('compute', 'min_compute_nodes', compute_cnt) - config.set('compute-feature-enabled', 'live_migration', True) - - config.set('identity', 'region', - CONST.__getattribute__('OS_REGION_NAME')) - identity_api_version = os.getenv( - "OS_IDENTITY_API_VERSION", os.getenv("IDENTITY_API_VERSION")) - if (identity_api_version == '3'): - auth_version = 'v3' - else: - auth_version = 'v2' - config.set('identity', 'auth_version', auth_version) - config.set( - 'validation', 'ssh_timeout', - CONST.__getattribute__('tempest_validation_ssh_timeout')) - config.set('object-storage', 'operator_role', - CONST.__getattribute__('tempest_object_storage_operator_role')) - - if CONST.__getattribute__('OS_ENDPOINT_TYPE') is not None: - config.set('identity', 'v3_endpoint_type', - CONST.__getattribute__('OS_ENDPOINT_TYPE')) - - if (identity_api_version == '3'): - config.set('identity-feature-enabled', 'api_v2', False) - - if CONST.__getattribute__('OS_ENDPOINT_TYPE') is not None: - sections = config.sections() - services_list = ['compute', - 'volume', - 'image', - 'network', - 'data-processing', - 'object-storage', - 'orchestration'] - for service in services_list: - if service not in sections: - config.add_section(service) - config.set(service, 'endpoint_type', - CONST.__getattribute__('OS_ENDPOINT_TYPE')) - - logger.debug('Add/Update required params defined in tempest_conf.yaml ' - 'into tempest.conf file') - with open(TEMPEST_CONF_YAML) as f: - conf_yaml = yaml.safe_load(f) - if conf_yaml: - sections = config.sections() - for section in conf_yaml: - if section not in sections: - config.add_section(section) - sub_conf = conf_yaml.get(section) - for key, value in sub_conf.items(): - config.set(section, key, value) - - with open(tempest_conf_file, 'wb') as config_file: - config.write(config_file) - - backup_tempest_config(tempest_conf_file) - - -def configure_verifier(deployment_dir): - """ - Execute rally verify configure-verifier, which generates tempest.conf - """ - tempest_conf_file = os.path.join(deployment_dir, "tempest.conf") - if os.path.isfile(tempest_conf_file): - logger.debug("Verifier is already configured.") - logger.debug("Reconfiguring the current verifier...") - cmd = "rally verify configure-verifier --reconfigure" - else: - logger.info("Configuring the verifier...") - cmd = "rally verify configure-verifier" - ft_utils.execute_command(cmd) - - logger.debug("Looking for tempest.conf file...") - if not os.path.isfile(tempest_conf_file): - logger.error("Tempest configuration file %s NOT found." - % tempest_conf_file) - raise Exception("Tempest configuration file %s NOT found." - % tempest_conf_file) - else: - return tempest_conf_file diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt b/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt deleted file mode 100644 index bb1aed339..000000000 --- a/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt +++ /dev/null @@ -1,2 +0,0 @@ - -- diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml new file mode 100644 index 000000000..43a77fa3c --- /dev/null +++ b/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml @@ -0,0 +1,19 @@ +--- +- + scenarios: + - os-ovn-nofeature-ha + - os-ovn-nofeature-noha + tests: + - neutron_tempest_plugin.api.admin.test_dhcp_agent_scheduler + - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request + - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request_empty + - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request_inherited_policy + - neutron_tempest_plugin.api.admin.test_ports.PortTestCasesResourceRequest.test_port_resource_request_no_provider_net_conflict + - neutron_tempest_plugin.api.test_ports.PortsTestJSON.test_create_update_port_with_dns_name + - patrole_tempest_plugin.tests.api.network.test_availability_zones_rbac.AvailabilityZoneExtRbacTest.test_list_availability_zone_rbac + - patrole_tempest_plugin.tests.api.network.test_agents_rbac.DHCPAgentSchedulersRbacTest.test_add_dhcp_agent_to_network + - patrole_tempest_plugin.tests.api.network.test_agents_rbac.DHCPAgentSchedulersRbacTest.test_delete_network_from_dhcp_agent + - patrole_tempest_plugin.tests.api.network.test_agents_rbac.DHCPAgentSchedulersRbacTest.test_list_networks_hosted_by_one_dhcp_agent + - patrole_tempest_plugin.tests.api.network.test_networks_rbac.NetworksRbacTest.test_create_network_provider_network_type + - patrole_tempest_plugin.tests.api.network.test_networks_rbac.NetworksRbacTest.test_create_network_provider_segmentation_id + - tempest.api.network.admin.test_dhcp_agent_scheduler diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt b/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt deleted file mode 100644 index fbbee2ffc..000000000 --- a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt +++ /dev/null @@ -1,249 +0,0 @@ -# Set of DefCore tempest test cases not flagged and required. It only contains OpenStack core (no object storage) -# The approved guidelines (2016.08) are valid for Kilo, Liberty, Mitaka and Newton releases of OpenStack -# The list can be generated using the Rest API from RefStack project: -# https://refstack.openstack.org/api/v1/guidelines/2017.01/tests?target=compute&type=required&alias=true&flag=false -tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image[id-3731d080-d4c5-4872-b41a-64d0d0021314] -tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name[id-3b7c6fe4-dfe7-477c-9243-b06359db51e6] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] -tempest.api.compute.servers.test_delete_server.DeleteServersTestJSON.test_delete_active_server[id-925fdfb4-5b13-47ea-ac8a-c36ae6fddb05] -tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action[id-aacc71ca-1d70-4aa5-bbf6-0ff71470e43c] -tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions[id-77ca5cc5-9990-45e0-ab98-1de8fead201a] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor[id-80c574cc-0925-44ba-8602-299028357dd9] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image[id-b3304c3b-97df-46d2-8cd3-e2b6659724e7] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name[id-f9eb2b70-735f-416c-b260-9914ac6181e4] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status[id-de2612ab-b7dd-4044-b0b1-d2539601911f] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results[id-67aec2d0-35fe-4503-9f92-f13272b867ed] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_active_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor[id-573637f5-7325-47bb-9144-3476d0416908] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image[id-05e8a8e7-9659-459a-989d-92c2f501f4ba] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit[id-614cdfc1-d557-4bac-915b-3e67b48eee76] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name[id-9b067a7b-7fee-4f6a-b29c-be43fe18fc5a] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_name_wildcard[id-e9f624ee-92af-4562-8bec-437945a18dcb] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_future_date[id-74745ad8-b346-45b5-b9b8-509d7447fc1f] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date[id-87d12517-e20a-4c9c-97b6-dd1628d6d6c9] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits[id-12c80a9f-2dec-480e-882b-98ba15757659] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_greater_than_actual_count[id-d47c17fb-eebd-4287-8e95-f20a7e627b18] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value[id-62610dd9-4713-4ee0-8beb-fd2c1aa7f950] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string[id-679bc053-5e70-4514-9800-3dfab1a380a6] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor[id-5913660b-223b-44d4-a651-a0fbfd44ca75] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image[id-ff01387d-c7ad-47b4-ae9e-64fa214638fe] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name[id-e2c77c4a-000a-4af3-a0bd-629a328bde7c] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted[id-93055106-2d34-46fe-af68-d9ddbf7ee570] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing[id-fcdf192d-0f74-4d89-911f-1ec002b822c4] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server[id-24a26f1a-1ddc-4eea-b0d7-a90cc874ad8f] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_lock_unlock_server[id-80a8094c-211e-440a-ab88-9e59d556c7ee] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard[id-2cb1baf6-ac8d-4429-bf0d-ba8a0ba53e32] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_rebuild_server[id-aaa6cdf3-55a7-461a-add9-1c8596b9a07c] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server[id-af8eafd4-38a7-4a4b-bdbc-75145a580560] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item[id-127642d6-4c7b-4486-b7cd-07265a378658] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item[id-3043c57d-7e0e-49a6-9a96-ad569c265e6a] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata[id-479da087-92b3-4dcf-aeb3-fd293b2d14ce] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata[id-211021f6-21de-4657-a68f-908878cfe251] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item[id-58c02d4f-5c67-40be-8744-d3fa5982eb1c] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata[id-344d981e-0c33-4997-8a5d-6c1d803e4134] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password[id-b92d5ec7-b1dd-44a2-87e4-45e888c46ef0] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair[id-f9e15296-d7f9-4e62-b53f-a04e89160833] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name[id-8fea6be7-065e-47cf-89b8-496e6f96c699] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address[id-89b90870-bc13-4b73-96af-f9d4f2b70077] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name[id-5e6ccff8-349d-4852-a8b3-055df7988dd2] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name[id-fd57f159-68d6-4c2a-902b-03070828a87e] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit[id-7fc74810-0bd2-4cd7-8244-4f33a9db865a] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256[id-c3e0fb12-07fc-4d76-a22e-37409887afe8] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor[id-18f5227f-d155-4429-807c-ccb103887537] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image[id-fcba1052-0a50-4cf3-b1ac-fae241edf02f] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid[id-4e72dc2d-44c5-4336-9667-f7972e95c402] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit[id-f4d7279b-5fd2-4bf2-9ba4-ae35df0d18c5] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id[id-75f79124-277c-45e6-a373-a1d6803f4cc4] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server[id-3436b02f-1b1e-4f03-881e-c6a602327439] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address[id-5226dd80-1e9c-4d8a-b5f9-b26ca4763fd0] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server[id-d4c023a0-9c55-4747-9dd5-413b820143c7] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server[id-d86141a7-906e-4731-b187-d64a2ea61422] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_reboot_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank[id-dbbfd247-c40c-449e-8f6c-d2aa7c7da7cf] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server[id-a31460a9-49e1-42aa-82ee-06e0bb7c2d03] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server[id-aa8eed43-e2cb-4ebf-930b-da14f6a21d81] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256[id-5c8e244c-dada-4590-9944-749c455b431f] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name[id-38204696-17c6-44da-9590-40f87fb5a899] -tempest.api.compute.test_quotas.QuotasTestJSON.test_get_default_quotas[id-9bfecac7-b966-4f47-913f-1a9e2c12134a] -tempest.api.compute.test_quotas.QuotasTestJSON.test_get_quotas[id-f1ef0a97-dbbb-4cca-adc5-c9fbc4f76107] -tempest.api.compute.test_versions.TestVersions.test_list_api_versions[id-6c0a0990-43b6-4529-9b61-5fd8daf7c55c] -tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_attach_detach_volume[id-52e9045a-e90d-4c0d-9087-79d657faffff] -tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_list_get_volume_attachments[id-7fa563fe-f0f7-43eb-9e22-a1ece036b513] -tempest.api.identity.v3.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265] -tempest.api.identity.v3.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd] -tempest.api.identity.v3.TestApiDiscovery.test_api_version_statuses[id-8879a470-abfb-47bb-bb8d-5a7fd279ad1e] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_statuses[id-8879a470-abfb-47bb-bb8d-5a7fd279ad1e] -tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9] -tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image[id-f848bb94-1c6e-45a4-8726-39e3a5b23535] -tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_update_image[id-f66891a7-a35c-41a8-b590-a065c2a1caa6] -tempest.api.image.v2.test_images.ListImagesTest.test_get_image_schema[id-622b925c-479f-4736-860d-adeaf13bc371] -tempest.api.image.v2.test_images.ListImagesTest.test_get_images_schema[id-25c8d7b2-df21-460f-87ac-93130bcdc684] -tempest.api.image.v2.test_images.ListImagesTest.test_index_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_container_format[id-9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_disk_format[id-4a4735a7-f22f-49b6-b0d9-66e1ef7453eb] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_limit[id-e914a891-3cc8-4b40-ad32-e0a39ffbddbb] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_min_max_size[id-4ad8c157-971a-4ba8-aa84-ed61154b1e7f] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_size[id-cf1b9a48-8340-480e-af7b-fe7e17690876] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_status[id-7fc9e369-0f58-4d05-9aa5-0969e2d59d15] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_visibility[id-7a95bb92-d99e-4b12-9718-7bc6ab73e6d2] -tempest.api.image.v2.test_images.ListImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images.ListUserImagesTest.test_get_image_schema[id-622b925c-479f-4736-860d-adeaf13bc371] -tempest.api.image.v2.test_images.ListUserImagesTest.test_get_images_schema[id-25c8d7b2-df21-460f-87ac-93130bcdc684] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_container_format[id-9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_disk_format[id-4a4735a7-f22f-49b6-b0d9-66e1ef7453eb] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_limit[id-e914a891-3cc8-4b40-ad32-e0a39ffbddbb] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_min_max_size[id-4ad8c157-971a-4ba8-aa84-ed61154b1e7f] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_size[id-cf1b9a48-8340-480e-af7b-fe7e17690876] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_status[id-7fc9e369-0f58-4d05-9aa5-0969e2d59d15] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_visibility[id-7a95bb92-d99e-4b12-9718-7bc6ab73e6d2] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_image_null_id[id-32248db1-ab88-4821-9604-c7c369f1f88c] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_existing_image[id-6fe40f1c-57bd-4918-89cc-8500f850f3de] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_delete_deleted_image[id-e57fc127-7ba0-4693-92d7-1d8a05ebcba9] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_image_null_id[id-ef45000d-0a72-4781-866d-4cb7bf2562ad] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_non_existent_image[id-668743d5-08ad-4480-b2b8-15da34f81d9f] -tempest.api.image.v2.test_images_tags.ImagesTagsTest.test_update_delete_tags_for_image[id-10407036-6059-4f95-a2cd-cbbbee7ed329] -tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_delete_non_existing_tag[id-39c023a2-325a-433a-9eea-649bf1414b19] -tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_update_tags_for_non_existing_image[id-8cd30f82-6f9a-4c6e-8034-c1b51fba43d9] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_all_attributes[id-a4d9ec4c-0306-4111-a75c-db01a709030b] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_allocation_pools[id-bec949c4-3147-4ba6-af5f-cd2306118404] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_dhcp_enabled[id-94ce038d-ff0a-4a4c-a56b-09da3ca0b55d] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw[id-9393b468-186d-496d-aa36-732348cd76e7] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw_and_allocation_pools[id-8217a149-0c6c-4cfb-93db-0486f707d13f] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_host_routes_and_dns_nameservers[id-d830de0a-be47-468f-8f02-1fd996118289] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_without_gateway[id-d2d596e2-8e76-47a9-ac51-d4648009f4d3] -tempest.api.network.test_networks.NetworksTest.test_create_update_delete_network_subnet[id-0e269138-0da6-4efc-a46d-578161e7b221] -tempest.api.network.test_networks.NetworksTest.test_delete_network_with_subnet[id-f04f61a9-b7f3-4194-90b2-9bcf660d1bfe] -tempest.api.network.test_networks.NetworksTest.test_list_networks[id-f7ffdeda-e200-4a7a-bcbe-05716e86bf43] -tempest.api.network.test_networks.NetworksTest.test_list_networks_fields[id-6ae6d24f-9194-4869-9c85-c313cb20e080] -tempest.api.network.test_networks.NetworksTest.test_list_subnets[id-db68ba48-f4ea-49e9-81d1-e367f6d0b20a] -tempest.api.network.test_networks.NetworksTest.test_list_subnets_fields[id-842589e3-9663-46b0-85e4-7f01273b0412] -tempest.api.network.test_networks.NetworksTest.test_show_network[id-2bf13842-c93f-4a69-83ed-717d2ec3b44e] -tempest.api.network.test_networks.NetworksTest.test_show_network_fields[id-867819bb-c4b6-45f7-acf9-90edcf70aa5e] -tempest.api.network.test_networks.NetworksTest.test_show_subnet[id-bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc] -tempest.api.network.test_networks.NetworksTest.test_show_subnet_fields[id-270fff0b-8bfc-411f-a184-1e8fd35286f0] -tempest.api.network.test_networks.NetworksTest.test_update_subnet_gw_dns_host_routes_dhcp[id-3d3852eb-3009-49ec-97ac-5ce83b73010a] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_all_attributes[id-a4d9ec4c-0306-4111-a75c-db01a709030b] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_allocation_pools[id-bec949c4-3147-4ba6-af5f-cd2306118404] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_dhcp_enabled[id-94ce038d-ff0a-4a4c-a56b-09da3ca0b55d] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_gw[id-9393b468-186d-496d-aa36-732348cd76e7] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_gw_and_allocation_pools[id-8217a149-0c6c-4cfb-93db-0486f707d13f] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_host_routes_and_dns_nameservers[id-d830de0a-be47-468f-8f02-1fd996118289] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_without_gateway[id-d2d596e2-8e76-47a9-ac51-d4648009f4d3] -tempest.api.network.test_networks.NetworksTestJSON.test_create_update_delete_network_subnet[id-0e269138-0da6-4efc-a46d-578161e7b221] -tempest.api.network.test_networks.NetworksTestJSON.test_delete_network_with_subnet[id-f04f61a9-b7f3-4194-90b2-9bcf660d1bfe] -tempest.api.network.test_networks.NetworksTestJSON.test_list_networks[id-f7ffdeda-e200-4a7a-bcbe-05716e86bf43] -tempest.api.network.test_networks.NetworksTestJSON.test_list_networks_fields[id-6ae6d24f-9194-4869-9c85-c313cb20e080] -tempest.api.network.test_networks.NetworksTestJSON.test_list_subnets[id-db68ba48-f4ea-49e9-81d1-e367f6d0b20a] -tempest.api.network.test_networks.NetworksTestJSON.test_list_subnets_fields[id-842589e3-9663-46b0-85e4-7f01273b0412] -tempest.api.network.test_networks.NetworksTestJSON.test_show_network[id-2bf13842-c93f-4a69-83ed-717d2ec3b44e] -tempest.api.network.test_networks.NetworksTestJSON.test_show_network_fields[id-867819bb-c4b6-45f7-acf9-90edcf70aa5e] -tempest.api.network.test_networks.NetworksTestJSON.test_show_subnet[id-bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc] -tempest.api.network.test_networks.NetworksTestJSON.test_show_subnet_fields[id-270fff0b-8bfc-411f-a184-1e8fd35286f0] -tempest.api.network.test_networks.NetworksTestJSON.test_update_subnet_gw_dns_host_routes_dhcp[id-3d3852eb-3009-49ec-97ac-5ce83b73010a] -tempest.api.network.test_ports.PortsTestJSON.test_create_bulk_port[id-67f1b811-f8db-43e2-86bd-72c074d4a42c] -tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocation_pools[id-0435f278-40ae-48cb-a404-b8a087bc09b1] -tempest.api.network.test_ports.PortsTestJSON.test_create_update_delete_port[id-c72c1c0c-2193-4aca-aaa4-b1442640f51c] -tempest.api.network.test_ports.PortsTestJSON.test_list_ports[id-cf95b358-3e92-4a29-a148-52445e1ac50e] -tempest.api.network.test_ports.PortsTestJSON.test_list_ports_fields[id-ff7f117f-f034-4e0e-abff-ccef05c454b4] -tempest.api.network.test_ports.PortsTestJSON.test_show_port[id-c9a685bd-e83f-499c-939f-9f7863ca259f] -tempest.api.network.test_ports.PortsTestJSON.test_show_port_fields[id-45fcdaf2-dab0-4c13-ac6c-fcddfb579dbd] -tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_security_group_and_extra_attributes[id-58091b66-4ff4-4cc1-a549-05d60c7acd1a] -tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_two_security_groups_and_extra_attributes[id-edf6766d-3d40-4621-bc6e-2521a44c257d] -tempest.api.network.test_security_groups.SecGroupTest.test_create_list_update_show_delete_security_group[id-bfd128e5-3c92-44b6-9d66-7fe29d22c802] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_additional_args[id-87dfbcf9-1849-43ea-b1e4-efa3eeae9f71] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_icmp_type_code[id-c9463db8-b44d-4f52-b6c0-8dbda99f26ce] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_protocol_integer_value[id-0a307599-6655-4220-bebc-fd70c64f2290] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_group_id[id-c2ed2deb-7a0c-44d8-8b4c-a5825b5c310b] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_ip_prefix[id-16459776-5da2-4634-bce4-4b55ee3ec188] -tempest.api.network.test_security_groups.SecGroupTest.test_create_show_delete_security_group_rule[id-cfb99e0e-7410-4a3d-8a0c-959a63ee77e9] -tempest.api.network.test_security_groups.SecGroupTest.test_list_security_groups[id-e30abd17-fef9-4739-8617-dc26da88e686] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_additional_default_security_group_fails[id-2323061e-9fbf-4eb0-b547-7e8fafc90849] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_duplicate_security_group_rule_fails[id-8fde898f-ce88-493b-adc9-4e4692879fc5] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_ethertype[id-5666968c-fff3-40d6-9efc-df1c8bd01abb] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_protocol[id-981bdc22-ce48-41ed-900a-73148b583958] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_remote_ip_prefix[id-5f8daf69-3c5f-4aaa-88c9-db1d66f68679] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_invalid_ports[id-0d9c7791-f2ad-4e2f-ac73-abf2373b0d2d] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_remote_groupid[id-4bf786fd-2f02-443c-9716-5b98e159a49a] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_security_group[id-be308db6-a7cf-4d5c-9baf-71bafd73f35e] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_delete_non_existent_security_group[id-1f1bb89d-5664-4956-9fcd-83ee0fa603df] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group[id-424fd5c3-9ddc-486a-b45f-39bf0c820fc6] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group_rule[id-4c094c09-000b-4e41-8100-9617600c02a6] -tempest.api.volume.test_availability_zone.AvailabilityZoneV2TestJSON.test_get_availability_zone_list[id-01f1ae88-eba9-4c6b-a011-6f7ace06b725] -tempest.api.volume.test_extensions.ExtensionsV2TestJSON.test_list_extensions[id-94607eb0-43a5-47ca-82aa-736b41bd2e2c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_create_get_delete_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_crud_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_update_snapshot_metadata_item[id-e8ff85c5-8f97-477f-806a-3ac364a949ed] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_create_get_delete_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_crud_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_update_volume_metadata_item[id-862261c5-8df4-475a-8c21-946e50e36a20] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_attach_detach_volume_to_instance[id-fff42874-7db5-4487-a8e1-ddda5fb5288d] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_get_volume_attachment[id-9516a2c8-9135-488c-8dd6-5677a7e5f371] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume[id-92c4ef64-51b2-40c0-9f7e-4749fbaaba33] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable[id-63e21b4c-0a0c-41f6-bfc3-7c2816815599] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update[id-fff74e1e-5bd3-4b33-9ea9-24c103bc3f59] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete[id-27fb0e9f-fb64-41dd-8bdb-1ffa762f0d51] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_as_clone[id-3f591b4a-7dc6-444c-bd51-77469506b3a1] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_from_image[id-54a01030-c7fc-447c-86ee-c1182beae638] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list[id-0b6ddd39-b948-471f-8038-4787978747c4] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_by_name[id-a28e8da4-0b56-472f-87a8-0f4d3f819c02] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_by_name[id-2de3a6d4-12aa-403b-a8f2-fdeb42a89623] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_param_display_name_and_status[id-777c87c1-2fc4-4883-8b8e-5c0b951d1ec8] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_display_name_and_status[id-856ab8ca-6009-4c37-b691-be1065528ad4] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_metadata[id-1ca92d3c-4a8e-4b43-93f5-e4c7fb3b291d] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_details[id-adcbb5a7-5ad8-4b61-bd10-5380e111a877] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_param_metadata[id-b5ebea1b-0603-40a0-bb41-15fcd0a53214] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_availability_zone[id-c0cfa863-3020-40d7-b587-e35f597d5d87] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_status[id-39654e13-734c-4dab-95ce-7613bf8407ce] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_availability_zone[id-e1b80d13-94f0-4ba2-a40e-386af29f8db1] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_status[id-2943f712-71ec-482a-bf49-d5ca06216b9f] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_attach_volumes_with_nonexistent_volume_id[id-f5e56b0a-5d02-43c1-a2a7-c9b792c2e3f6] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_invalid_size[id-1ed83a8a-682d-4dfb-a30e-ee63ffd6c049] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_snapshot_id[id-0c36f6ae-4604-4017-b0a9-34fdc63096f9] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_source_volid[id-47c73e08-4be8-45bb-bfdf-0c4e79b88344] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_volume_type[id-10254ed8-3849-454e-862e-3ab8e6aa01d2] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_out_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_negative[id-8b472729-9eba-446e-a83b-916bdb34bef7] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_zero[id-41331caa-eaf4-4001-869d-bc18c1869360] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_without_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_invalid_volume_id[id-1f035827-7c32-4019-9240-b4ec2dbd9dfd] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_volume_without_passing_volume_id[id-441a1550-5d44-4b30-af0f-a6d402f52026] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_detach_volumes_with_invalid_volume_id[id-9f9c24e4-011d-46b5-b992-952140ce237a] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_invalid_volume_id[id-30799cfd-7ee4-446c-b66c-45b383ed211b] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_volume_without_passing_volume_id[id-c6c3db06-29ad-4e91-beb0-2ab195fe49e3] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_invalid_status[id-ba94b27b-be3f-496c-a00e-0283b373fa75] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_nonexistent_name[id-9ca17820-a0e7-4cbd-a7fa-f4468735e359] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_invalid_status[id-143b279b-7522-466b-81be-34a87d564a7c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_nonexistent_name[id-0f4aa809-8c7b-418f-8fb3-84c7a5dfc52f] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_negative_volume_status[id-449c4ed2-ecdd-47bb-98dc-072aeccf158c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_nonexistent_volume_id[id-ac6084c0-0546-45f9-b284-38a367e0e0e2] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_unreserve_volume_with_nonexistent_volume_id[id-eb467654-3dc1-4a72-9b46-47c29d22654c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_empty_volume_id[id-72aeca85-57a5-4c1f-9057-f320f9ea575b] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_invalid_volume_id[id-e66e40d6-65e6-4e75-bdc7-636792fa152d] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_nonexistent_volume_id[id-0186422c-999a-480e-a026-6a665744c30c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_delete_nonexistent_volume_id[id-555efa6e-efcd-44ef-8a3b-4a7ca4837a29] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_get_nonexistent_volume_id[id-f131c586-9448-44a4-a8b0-54ca838aa43e] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshot_create_get_list_update_delete[id-2a8abbe4-d871-46db-b049-c41f5af8216e] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_volume_from_snapshot[id-677863d1-3142-456d-b6ac-9924f667a7f4] -tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id[id-e3e466af-70ab-4f4b-a967-ab04e3532ea7] -tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id[id-bb9da53e-d335-4309-9c15-7e76fd5e4d6d] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination[id-e9138a2c-f67b-4796-8efa-635c196d01de] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params[id-2a7064eb-b9c3-429b-b888-33928fc5edd3] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination[id-af55e775-8e4b-4feb-8719-215c43b0238c] diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml new file mode 100644 index 000000000..e53b577b2 --- /dev/null +++ b/functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml @@ -0,0 +1,15 @@ +--- +- + scenarios: + - os-* + tests: + - neutron_tempest_plugin.api.admin.test_floating_ips_admin_actions.FloatingIPAdminTestJSON.test_associate_floating_ip_with_port_from_another_project + - neutron_tempest_plugin.api.admin.test_quotas.QuotasTest.test_detail_quotas + - neutron_tempest_plugin.api.admin.test_quotas.QuotasTest.test_quotas + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_floatingip_when_quotas_is_full + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_network_when_quotas_is_full + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_port_when_quotas_is_full + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_router_when_quotas_is_full + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_security_group_rule_when_quotas_is_full + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_security_group_when_quotas_is_full + - neutron_tempest_plugin.api.admin.test_quotas_negative.QuotasAdminNegativeTestJSON.test_create_subnet_when_quotas_is_full diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml index b47a9736a..0ee4ab613 100644 --- a/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml +++ b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml @@ -1,13 +1,104 @@ -# This is an empty configuration file to be filled up with the desired options -# to generate a custom tempest.conf -# Examples: -# network-feature-enabled: -# port_security: True - -# volume-feature-enabled: -# api_v1: False - -# validation: -# image_ssh_user: root -# ssh_timeout: 300 - +--- +compute: + min_microversion: '2.44' + max_microversion: latest +compute-feature-enabled: + attach_encrypted_volume: false + block_migration_for_live_migration: false + block_migrate_cinder_iscsi: false + change_password: false + cold_migration: true + config_drive: true + console_output: true + disk_config: true + enable_instance_password: true + hostname_fqdn_sanitization: true + interface_attach: true + live_migration: true + live_migrate_back_and_forth: false + metadata_service: true + pause: true + personality: false + rdp_console: false + rescue: true + resize: true + scheduler_available_filters: "AvailabilityZoneFilter,ComputeFilter,\ + ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,\ + ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter" + serial_console: false + shelve: true + snapshot: true + spice_console: false + suspend: true + swap_volume: false + vnc_console: true + volume_backed_live_migration: false + volume_multiattach: false +identity: + auth_version: v3 + user_unique_last_password_count: 2 + user_lockout_duration: 10 + user_lockout_failure_attempts: 2 +identity-feature-enabled: + trust: true + api_v2: false + api_v2_admin: false + security_compliance: true + federation: false + external_idp: false + project_tags: true + application_credentials: true + access_rules: true +image-feature-enabled: + api_v2: true + api_v1: false + import_image: false +network-feature-enabled: + port_admin_state_change: true + port_security: true +placement: + max_microversion: latest +validation: + image_ssh_user: cirros + ssh_timeout: 196 + ip_version_for_ssh: 4 + run_validation: true +volume: + max_microversion: latest + storage_protocol: ceph + manage_volume_ref: source-name,volume-%s + manage_snapshot_ref: source-name,snapshot-%s +volume-feature-enabled: + multi_backend: false + backup: true + snapshot: true + clone: true + manage_snapshot: true + manage_volume: true + extend_attached_volume: true + extend_attached_encrypted_volume: false + consistency_group: false + volume_revert: true +load_balancer: + test_with_ipv6: false +neutron_plugin_options: + agent_availability_zone: nova + available_type_drivers: flat,geneve,vlan,gre,local,vxlan + provider_vlans: public, + create_shared_resources: true +object-storage-feature-enabled: + discoverable_apis: "account_quotas,formpost,bulk_upload,bulk_delete,\ + tempurl,crossdomain,container_quotas,staticweb,account_quotas,slo" + object_versioning: true + discoverability: true + tempurl_digest_hashlib: sha1 +heat_plugin: + skip_functional_test_list: EncryptionVolTypeTest + skip_scenario_test_list: "AodhAlarmTest,SoftwareConfigIntegrationTest,\ + VolumeBackupRestoreIntegrationTest,CfnInitIntegrationTest,\ + LoadBalancerTest" + auth_version: 3 +heat_features_enabled: + multi_cloud: false +rbac: + enable_rbac: true diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml new file mode 100644 index 000000000..6b09d8e5a --- /dev/null +++ b/functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml @@ -0,0 +1,104 @@ +--- +compute: + min_microversion: '2.44' + max_microversion: latest +compute-feature-enabled: + attach_encrypted_volume: false + block_migration_for_live_migration: false + block_migrate_cinder_iscsi: false + change_password: false + cold_migration: true + config_drive: true + console_output: true + disk_config: true + enable_instance_password: true + hostname_fqdn_sanitization: true + interface_attach: true + live_migration: true + live_migrate_back_and_forth: false + metadata_service: true + pause: true + personality: false + rdp_console: false + rescue: true + resize: true + scheduler_available_filters: "AvailabilityZoneFilter,ComputeFilter,\ + ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,\ + ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter" + serial_console: false + shelve: true + snapshot: true + spice_console: false + suspend: true + swap_volume: false + vnc_console: true + volume_backed_live_migration: false + volume_multiattach: false +identity: + auth_version: v3 + user_unique_last_password_count: 2 + user_lockout_duration: 10 + user_lockout_failure_attempts: 2 +identity-feature-enabled: + trust: true + api_v2: false + api_v2_admin: false + security_compliance: true + federation: false + external_idp: false + project_tags: true + application_credentials: true + access_rules: true +image-feature-enabled: + api_v2: true + api_v1: false + import_image: false +network-feature-enabled: + port_admin_state_change: true + port_security: true +placement: + max_microversion: latest +validation: + image_ssh_user: cirros + ssh_timeout: 196 + ip_version_for_ssh: 4 + run_validation: true +volume: + max_microversion: latest + storage_protocol: ceph + manage_volume_ref: source-name,volume-%s + manage_snapshot_ref: source-name,snapshot-%s +volume-feature-enabled: + multi_backend: false + backup: true + snapshot: true + clone: true + manage_snapshot: true + manage_volume: true + extend_attached_volume: true + extend_attached_encrypted_volume: false + consistency_group: false + volume_revert: true +load_balancer: + test_with_ipv6: false +neutron_plugin_options: + agent_availability_zone: nova + available_type_drivers: flat,geneve,vlan,local + provider_vlans: public, + create_shared_resources: true +object-storage-feature-enabled: + discoverable_apis: "account_quotas,formpost,bulk_upload,bulk_delete,\ + tempurl,crossdomain,container_quotas,staticweb,account_quotas,slo" + object_versioning: true + discoverability: true + tempurl_digest_hashlib: sha1 +heat_plugin: + skip_functional_test_list: EncryptionVolTypeTest + skip_scenario_test_list: "AodhAlarmTest,SoftwareConfigIntegrationTest,\ + VolumeBackupRestoreIntegrationTest,CfnInitIntegrationTest,\ + LoadBalancerTest" + auth_version: 3 +heat_features_enabled: + multi_cloud: false +rbac: + enable_rbac: true diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index 5481b13b1..7233ffd60 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -8,493 +8,767 @@ # http://www.apache.org/licenses/LICENSE-2.0 # +"""Tempest testcases implementation.""" + from __future__ import division +import json import logging import os import re import shutil import subprocess import time -import uuid +import pkg_resources +from six.moves import configparser +from xtesting.core import testcase import yaml -from functest.core import testcase -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.opnfv_tests.openstack.tempest import conf_utils -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils +from functest.core import singlevm +from functest.opnfv_tests.openstack.rally import rally +from functest.utils import config +from functest.utils import env +from functest.utils import functest_utils + +LOGGER = logging.getLogger(__name__) + + +class TempestCommon(singlevm.VmReady2): + # pylint: disable=too-many-instance-attributes,too-many-public-methods + """TempestCommon testcases implementation class.""" + + visibility = 'public' + filename_alt = '/home/opnfv/functest/images/cirros-0.6.1-x86_64-disk.img' + shared_network = True + tempest_conf_yaml = pkg_resources.resource_filename( + 'functest', + 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml') + tempest_custom = pkg_resources.resource_filename( + 'functest', + 'opnfv_tests/openstack/tempest/custom_tests/test_list.txt') + tempest_blacklist = pkg_resources.resource_filename( + 'functest', + 'opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml') + tempest_public_blacklist = pkg_resources.resource_filename( + 'functest', + 'opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml') -from snaps.config.flavor import FlavorConfig -from snaps.config.network import NetworkConfig, SubnetConfig -from snaps.config.project import ProjectConfig -from snaps.config.user import UserConfig + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'tempest' + super().__init__(**kwargs) + assert self.orig_cloud + assert self.cloud + assert self.project + if self.orig_cloud.get_role("admin"): + self.role_name = "admin" + elif self.orig_cloud.get_role("Admin"): + self.role_name = "Admin" + else: + raise Exception("Cannot detect neither admin nor Admin") + self.orig_cloud.grant_role( + self.role_name, user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + self.orig_cloud.grant_role( + self.role_name, user=self.project.user.id, + domain=self.project.domain.id) + self.deployment_id = None + self.verifier_id = None + self.verifier_repo_dir = None + self.deployment_dir = None + self.verification_id = None + self.res_dir = os.path.join( + getattr(config.CONF, 'dir_results'), self.case_name) + self.raw_list = os.path.join(self.res_dir, 'test_raw_list.txt') + self.list = os.path.join(self.res_dir, 'test_list.txt') + self.conf_file = None + self.image_alt = None + self.flavor_alt = None + self.services = [] + try: + self.services = kwargs['run']['args']['services'] + except Exception: # pylint: disable=broad-except + pass + self.neutron_extensions = [] + try: + self.neutron_extensions = kwargs['run']['args'][ + 'neutron_extensions'] + except Exception: # pylint: disable=broad-except + pass + self.deny_skipping = kwargs.get("deny_skipping", False) + self.tests_count = kwargs.get("tests_count", 0) + + def check_services(self): + """Check the mandatory services.""" + for service in self.services: + try: + self.cloud.search_services(service)[0] + except Exception: # pylint: disable=broad-except + self.is_skipped = True + break -from snaps.openstack import create_flavor -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.tests import openstack_tests -from snaps.openstack.utils import deploy_utils + def check_extensions(self): + """Check the mandatory network extensions.""" + extensions = self.cloud.get_network_extensions() + for network_extension in self.neutron_extensions: + if network_extension not in extensions: + LOGGER.warning( + "Cannot find Neutron extension: %s", network_extension) + self.is_skipped = True + break + def check_requirements(self): + self.check_services() + self.check_extensions() + if self.is_skipped: + self.project.clean() -""" logging configuration """ -logger = logging.getLogger(__name__) + @staticmethod + def read_file(filename): + """Read file and return content as a stripped list.""" + with open(filename, encoding='utf-8') as src: + return [line.strip() for line in src.readlines()] + @staticmethod + def get_verifier_result(verif_id): + """Retrieve verification results.""" + result = { + 'num_tests': 0, + 'num_success': 0, + 'num_failures': 0, + 'num_skipped': 0 + } + cmd = ["rally", "verify", "show", "--uuid", verif_id] + LOGGER.info("Showing result for a verification: '%s'.", cmd) + with subprocess.Popen( + cmd, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) as proc: + for line in proc.stdout: + LOGGER.info(line.decode("utf-8").rstrip()) + new_line = line.decode("utf-8").replace(' ', '').split('|') + if 'Tests' in new_line: + break + if 'Testscount' in new_line: + result['num_tests'] = int(new_line[2]) + elif 'Success' in new_line: + result['num_success'] = int(new_line[2]) + elif 'Skipped' in new_line: + result['num_skipped'] = int(new_line[2]) + elif 'Failures' in new_line: + result['num_failures'] = int(new_line[2]) + return result -class TempestCommon(testcase.TestCase): + @staticmethod + def backup_tempest_config(conf_file, res_dir): + """ + Copy config file to tempest results directory + """ + if not os.path.exists(res_dir): + os.makedirs(res_dir) + shutil.copyfile(conf_file, + os.path.join(res_dir, 'tempest.conf')) - def __init__(self, **kwargs): - super(TempestCommon, self).__init__(**kwargs) - self.resources = TempestResourcesManager(**kwargs) - self.MODE = "" - self.OPTION = "" - self.VERIFIER_ID = conf_utils.get_verifier_id() - self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir( - self.VERIFIER_ID) - self.DEPLOYMENT_ID = conf_utils.get_verifier_deployment_id() - self.DEPLOYMENT_DIR = conf_utils.get_verifier_deployment_dir( - self.VERIFIER_ID, self.DEPLOYMENT_ID) - self.VERIFICATION_ID = None + @staticmethod + def create_verifier(): + """Create new verifier""" + LOGGER.info("Create verifier from existing repo...") + cmd = ['rally', 'verify', 'delete-verifier', + '--id', str(getattr(config.CONF, 'tempest_verifier_name')), + '--force'] + try: + output = subprocess.check_output(cmd) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + except subprocess.CalledProcessError: + pass + + cmd = ['rally', 'verify', 'create-verifier', + '--source', str(getattr(config.CONF, 'dir_repo_tempest')), + '--name', str(getattr(config.CONF, 'tempest_verifier_name')), + '--type', 'tempest', '--system-wide'] + output = subprocess.check_output(cmd) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + return TempestCommon.get_verifier_id() @staticmethod - def read_file(filename): - with open(filename) as src: - return [line.strip() for line in src.readlines()] + def get_verifier_id(): + """ + Returns verifier id for current Tempest + """ + cmd = ("rally verify list-verifiers | awk '/" + + getattr(config.CONF, 'tempest_verifier_name') + + "/ {print $2}'") + with subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) as proc: + verifier_uuid = proc.stdout.readline().rstrip() + return verifier_uuid.decode("utf-8") - def generate_test_list(self, verifier_repo_dir): - logger.debug("Generating test case list...") - if self.MODE == 'defcore': - shutil.copyfile( - conf_utils.TEMPEST_DEFCORE, conf_utils.TEMPEST_RAW_LIST) - elif self.MODE == 'custom': - if os.path.isfile(conf_utils.TEMPEST_CUSTOM): + @staticmethod + def get_verifier_repo_dir(verifier_id): + """ + Returns installed verifier repo directory for Tempest + """ + return os.path.join(getattr(config.CONF, 'dir_rally_inst'), + 'verification', + f'verifier-{verifier_id}', + 'repo') + + @staticmethod + def get_verifier_deployment_dir(verifier_id, deployment_id): + """ + Returns Rally deployment directory for current verifier + """ + return os.path.join(getattr(config.CONF, 'dir_rally_inst'), + 'verification', + f'verifier-{verifier_id}', + f'for-deployment-{deployment_id}') + + @staticmethod + def update_tempest_conf_file(conf_file, rconfig): + """Update defined paramters into tempest config file""" + with open(TempestCommon.tempest_conf_yaml, encoding='utf-8') as yfile: + conf_yaml = yaml.safe_load(yfile) + if conf_yaml: + sections = rconfig.sections() + for section in conf_yaml: + if section not in sections: + rconfig.add_section(section) + sub_conf = conf_yaml.get(section) + for key, value in sub_conf.items(): + rconfig.set(section, key, value) + + with open(conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + @staticmethod + def configure_tempest_update_params( + tempest_conf_file, image_id=None, flavor_id=None, + compute_cnt=1, image_alt_id=None, flavor_alt_id=None, + admin_role_name='admin', cidr='192.168.120.0/24', + domain_id='default'): + # pylint: disable=too-many-branches,too-many-arguments + # pylint: disable=too-many-statements,too-many-locals + """ + Add/update needed parameters into tempest.conf file + """ + LOGGER.debug("Updating selected tempest.conf parameters...") + rconfig = configparser.RawConfigParser() + rconfig.read(tempest_conf_file) + rconfig.set( + 'compute', 'volume_device_name', env.get('VOLUME_DEVICE_NAME')) + if image_id is not None: + rconfig.set('compute', 'image_ref', image_id) + if image_alt_id is not None: + rconfig.set('compute', 'image_ref_alt', image_alt_id) + if flavor_id is not None: + rconfig.set('compute', 'flavor_ref', flavor_id) + if flavor_alt_id is not None: + rconfig.set('compute', 'flavor_ref_alt', flavor_alt_id) + if compute_cnt > 1: + # enable multinode tests + rconfig.set('compute', 'min_compute_nodes', compute_cnt) + rconfig.set('compute-feature-enabled', 'live_migration', True) + if os.environ.get('OS_REGION_NAME'): + rconfig.set('identity', 'region', os.environ.get('OS_REGION_NAME')) + rconfig.set('identity', 'admin_role', admin_role_name) + rconfig.set('identity', 'default_domain_id', domain_id) + if not rconfig.has_section('network'): + rconfig.add_section('network') + rconfig.set('network', 'default_network', cidr) + rconfig.set('network', 'project_network_cidr', cidr) + rconfig.set('network', 'project_networks_reachable', False) + rconfig.set( + 'identity', 'v3_endpoint_type', + os.environ.get('OS_INTERFACE', 'public')) + + sections = rconfig.sections() + services_list = [ + 'compute', 'volume', 'image', 'network', 'data-processing', + 'object-storage', 'orchestration'] + for service in services_list: + if service not in sections: + rconfig.add_section(service) + rconfig.set(service, 'endpoint_type', + os.environ.get('OS_INTERFACE', 'public')) + + LOGGER.debug('Add/Update required params defined in tempest_conf.yaml ' + 'into tempest.conf file') + TempestCommon.update_tempest_conf_file(tempest_conf_file, rconfig) + + @staticmethod + def configure_verifier(deployment_dir): + """ + Execute rally verify configure-verifier, which generates tempest.conf + """ + cmd = ['rally', 'verify', 'configure-verifier', '--reconfigure', + '--id', str(getattr(config.CONF, 'tempest_verifier_name'))] + output = subprocess.check_output(cmd) + LOGGER.info("%s\n%s", " ".join(cmd), output.decode("utf-8")) + + LOGGER.debug("Looking for tempest.conf file...") + tempest_conf_file = os.path.join(deployment_dir, "tempest.conf") + if not os.path.isfile(tempest_conf_file): + LOGGER.error("Tempest configuration file %s NOT found.", + tempest_conf_file) + return None + return tempest_conf_file + + def generate_test_list(self, **kwargs): + """Generate test list based on the test mode.""" + LOGGER.debug("Generating test case list...") + self.backup_tempest_config(self.conf_file, '/etc') + if kwargs.get('mode') == 'custom': + if os.path.isfile(self.tempest_custom): shutil.copyfile( - conf_utils.TEMPEST_CUSTOM, conf_utils.TEMPEST_RAW_LIST) + self.tempest_custom, self.list) else: - raise Exception("Tempest test list file %s NOT found." - % conf_utils.TEMPEST_CUSTOM) + raise Exception( + f"Tempest test list file {self.tempest_custom} NOT found.") else: - if self.MODE == 'smoke': - testr_mode = "smoke" - elif self.MODE == 'full': - testr_mode = "" - else: - testr_mode = 'tempest.api.' + self.MODE - cmd = ("cd {0};" - "testr list-tests {1} > {2};" - "cd -;".format(verifier_repo_dir, - testr_mode, - conf_utils.TEMPEST_RAW_LIST)) - ft_utils.execute_command(cmd) - - def apply_tempest_blacklist(self): - logger.debug("Applying tempest blacklist...") - cases_file = self.read_file(conf_utils.TEMPEST_RAW_LIST) - result_file = open(conf_utils.TEMPEST_LIST, 'w') - black_tests = [] - try: - installer_type = CONST.__getattribute__('INSTALLER_TYPE') - deploy_scenario = CONST.__getattribute__('DEPLOY_SCENARIO') - if (bool(installer_type) * bool(deploy_scenario)): - # if INSTALLER_TYPE and DEPLOY_SCENARIO are set we read the - # file - black_list_file = open(conf_utils.TEMPEST_BLACKLIST) - black_list_yaml = yaml.safe_load(black_list_file) - black_list_file.close() - for item in black_list_yaml: - scenarios = item['scenarios'] - installers = item['installers'] - if (deploy_scenario in scenarios and - installer_type in installers): - tests = item['tests'] - for test in tests: - black_tests.append(test) - break - except Exception: + testr_mode = kwargs.get( + 'mode', r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$') + cmd = (f"(cd {self.verifier_repo_dir}; " + f"stestr list '{testr_mode}' > {self.list} 2>/dev/null)") + output = subprocess.check_output(cmd, shell=True) + LOGGER.info("%s\n%s", cmd, output.decode("utf-8")) + os.remove('/etc/tempest.conf') + + def apply_tempest_blacklist(self, black_list): + """Exclude blacklisted test cases.""" + LOGGER.debug("Applying tempest blacklist...") + if os.path.exists(self.raw_list): + os.remove(self.raw_list) + os.rename(self.list, self.raw_list) + cases_file = self.read_file(self.raw_list) + with open(self.list, 'w', encoding='utf-8') as result_file: black_tests = [] - logger.debug("Tempest blacklist file does not exist.") - - for cases_line in cases_file: - for black_tests_line in black_tests: - if black_tests_line in cases_line: - break - else: - result_file.write(str(cases_line) + '\n') - result_file.close() - - def run_verifier_tests(self): - self.OPTION += (" --load-list {} --detailed" - .format(conf_utils.TEMPEST_LIST)) - - cmd_line = "rally verify start " + self.OPTION - logger.info("Starting Tempest test suite: '%s'." % cmd_line) - - header = ("Tempest environment:\n" - " SUT: %s\n Scenario: %s\n Node: %s\n Date: %s\n" % - (CONST.__getattribute__('INSTALLER_TYPE'), - CONST.__getattribute__('DEPLOY_SCENARIO'), - CONST.__getattribute__('NODE_NAME'), - time.strftime("%a %b %d %H:%M:%S %Z %Y"))) - - f_stdout = open( - os.path.join(conf_utils.TEMPEST_RESULTS_DIR, "tempest.log"), 'w+') - f_stderr = open( - os.path.join(conf_utils.TEMPEST_RESULTS_DIR, - "tempest-error.log"), 'w+') - f_env = open(os.path.join(conf_utils.TEMPEST_RESULTS_DIR, - "environment.log"), 'w+') - f_env.write(header) - - p = subprocess.Popen( - cmd_line, shell=True, - stdout=subprocess.PIPE, - stderr=f_stderr, - bufsize=1) - - with p.stdout: - for line in iter(p.stdout.readline, b''): - if re.search("\} tempest\.", line): - logger.info(line.replace('\n', '')) - elif re.search('Starting verification', line): - logger.info(line.replace('\n', '')) - first_pos = line.index("UUID=") + len("UUID=") - last_pos = line.index(") for deployment") - self.VERIFICATION_ID = line[first_pos:last_pos] - logger.debug('Verification UUID: %s', self.VERIFICATION_ID) - f_stdout.write(line) - p.wait() - - f_stdout.close() - f_stderr.close() - f_env.close() - - def parse_verifier_result(self): - if self.VERIFICATION_ID is None: + try: + deploy_scenario = env.get('DEPLOY_SCENARIO') + if bool(deploy_scenario): + # if DEPLOY_SCENARIO is set we read the file + with open(black_list, encoding='utf-8') as black_list_file: + black_list_yaml = yaml.safe_load(black_list_file) + black_list_file.close() + for item in black_list_yaml: + scenarios = item['scenarios'] + in_it = rally.RallyBase.in_iterable_re + if in_it(deploy_scenario, scenarios): + tests = item['tests'] + black_tests.extend(tests) + except Exception: # pylint: disable=broad-except + black_tests = [] + LOGGER.debug("Tempest blacklist file does not exist.") + + for cases_line in cases_file: + for black_tests_line in black_tests: + if re.search(black_tests_line, cases_line): + break + else: + result_file.write(str(cases_line) + '\n') + + def run_verifier_tests(self, **kwargs): + """Execute tempest test cases.""" + cmd = ["rally", "verify", "start", "--load-list", + self.list] + cmd.extend(kwargs.get('option', [])) + LOGGER.info("Starting Tempest test suite: '%s'.", cmd) + + with open( + os.path.join(self.res_dir, "tempest.log"), 'w+', + encoding='utf-8') as f_stdout: + with subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + bufsize=1) as proc: + with proc.stdout: + for line in iter(proc.stdout.readline, b''): + if re.search(r"\} tempest\.", line.decode("utf-8")): + LOGGER.info(line.rstrip()) + elif re.search(r'(?=\(UUID=(.*)\))', + line.decode("utf-8")): + self.verification_id = re.search( + r'(?=\(UUID=(.*)\))', + line.decode("utf-8")).group(1) + f_stdout.write(line.decode("utf-8")) + proc.wait() + + if self.verification_id is None: raise Exception('Verification UUID not found') + LOGGER.info('Verification UUID: %s', self.verification_id) - cmd_line = "rally verify show --uuid {}".format(self.VERIFICATION_ID) - logger.info("Showing result for a verification: '%s'." % cmd_line) - p = subprocess.Popen(cmd_line, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - for line in p.stdout: - new_line = line.replace(' ', '').split('|') - if 'Tests' in new_line: - break - - logger.info(line) - if 'Testscount' in new_line: - num_tests = new_line[2] - elif 'Success' in new_line: - num_success = new_line[2] - elif 'Skipped' in new_line: - num_skipped = new_line[2] - elif 'Failures' in new_line: - num_failures = new_line[2] + shutil.copy( + f"{self.deployment_dir}/tempest.log", + f"{self.res_dir}/tempest.debug.log") + def parse_verifier_result(self): + """Parse and save test results.""" + stat = self.get_verifier_result(self.verification_id) try: - num_executed = int(num_tests) - int(num_skipped) + num_executed = stat['num_tests'] - stat['num_skipped'] try: - self.result = 100 * int(num_success) / int(num_executed) + self.result = 100 * stat['num_success'] / num_executed except ZeroDivisionError: self.result = 0 - if int(num_tests) > 0: - logger.info("All tests have been skipped") + if stat['num_tests'] > 0: + LOGGER.info("All tests have been skipped") else: - logger.error("No test has been executed") + LOGGER.error("No test has been executed") return - with open(os.path.join(conf_utils.TEMPEST_RESULTS_DIR, - "tempest.log"), 'r') as logfile: + with open(os.path.join(self.res_dir, "rally.log"), + 'r', encoding='utf-8') as logfile: output = logfile.read() success_testcases = [] - for match in re.findall('.*\{0\} (.*?)[. ]*success ', output): + for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} success ', + output): success_testcases.append(match) failed_testcases = [] - for match in re.findall('.*\{0\} (.*?)[. ]*fail ', output): + for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} fail', + output): failed_testcases.append(match) skipped_testcases = [] - for match in re.findall('.*\{0\} (.*?)[. ]*skip:', output): + for match in re.findall(r'.*\{\d{1,2}\} (.*?) \.{3} skip(?::| )', + output): skipped_testcases.append(match) - self.details = {"tests": int(num_tests), - "failures": int(num_failures), + self.details = {"tests_number": stat['num_tests'], + "success_number": stat['num_success'], + "skipped_number": stat['num_skipped'], + "failures_number": stat['num_failures'], "success": success_testcases, - "errors": failed_testcases, - "skipped": skipped_testcases} - except Exception: + "skipped": skipped_testcases, + "failures": failed_testcases} + except Exception: # pylint: disable=broad-except self.result = 0 - logger.info("Tempest %s success_rate is %s%%" - % (self.case_name, self.result)) + LOGGER.info("Tempest %s success_rate is %s%%", + self.case_name, self.result) + + def update_rally_regex(self, rally_conf='/etc/rally/rally.conf'): + """Set image name as tempest img_name_regex""" + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if not rconfig.has_section('openstack'): + rconfig.add_section('openstack') + rconfig.set('openstack', 'img_name_regex', f'^{self.image.name}$') + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_default_role(self, rally_conf='/etc/rally/rally.conf'): + """Detect and update the default role if required""" + role = self.get_default_role(self.cloud) + if not role: + return + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if not rconfig.has_section('openstack'): + rconfig.add_section('openstack') + rconfig.set('openstack', 'swift_operator_role', role.name) + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) - def run(self): + @staticmethod + def clean_rally_conf(rally_conf='/etc/rally/rally.conf'): + """Clean Rally config""" + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if rconfig.has_option('openstack', 'img_name_regex'): + rconfig.remove_option('openstack', 'img_name_regex') + if rconfig.has_option('openstack', 'swift_operator_role'): + rconfig.remove_option('openstack', 'swift_operator_role') + with open(rally_conf, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_auth_section(self): + """Update auth section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if not rconfig.has_section("auth"): + rconfig.add_section("auth") + if env.get("NEW_USER_ROLE").lower() != "member": + tempest_roles = [] + if rconfig.has_option("auth", "tempest_roles"): + tempest_roles = functest_utils.convert_ini_to_list( + rconfig.get("auth", "tempest_roles")) + rconfig.set( + 'auth', 'tempest_roles', + functest_utils.convert_list_to_ini( + [env.get("NEW_USER_ROLE")] + tempest_roles)) + if not json.loads(env.get("USE_DYNAMIC_CREDENTIALS").lower()): + rconfig.set('auth', 'use_dynamic_credentials', False) + account_file = os.path.join( + getattr(config.CONF, 'dir_functest_data'), 'accounts.yaml') + assert os.path.exists( + account_file), f"{account_file} doesn't exist" + rconfig.set('auth', 'test_accounts_file', account_file) + if env.get('NO_TENANT_NETWORK').lower() == 'true': + rconfig.set('auth', 'create_isolated_networks', False) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_network_section(self): + """Update network section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if self.ext_net: + if not rconfig.has_section('network'): + rconfig.add_section('network') + rconfig.set('network', 'public_network_id', self.ext_net.id) + rconfig.set('network', 'floating_network_name', self.ext_net.name) + rconfig.set('network-feature-enabled', 'floating_ips', True) + else: + if not rconfig.has_section('network-feature-enabled'): + rconfig.add_section('network-feature-enabled') + rconfig.set('network-feature-enabled', 'floating_ips', False) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_compute_section(self): + """Update compute section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if not rconfig.has_section('compute'): + rconfig.add_section('compute') + rconfig.set( + 'compute', 'fixed_network_name', + self.network.name if self.network else env.get("EXTERNAL_NETWORK")) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_validation_section(self): + """Update validation section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if not rconfig.has_section('validation'): + rconfig.add_section('validation') + rconfig.set( + 'validation', 'connect_method', + 'floating' if self.ext_net else 'fixed') + rconfig.set( + 'validation', 'network_for_ssh', + self.network.name if self.network else env.get("EXTERNAL_NETWORK")) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_scenario_section(self): + """Update scenario section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + filename = getattr( + config.CONF, f'{self.case_name}_image', self.filename) + if not rconfig.has_section('scenario'): + rconfig.add_section('scenario') + rconfig.set('scenario', 'img_file', filename) + rconfig.set('scenario', 'img_disk_format', getattr( + config.CONF, f'{self.case_name}_image_format', + self.image_format)) + extra_properties = self.extra_properties.copy() + if env.get('IMAGE_PROPERTIES'): + extra_properties.update( + functest_utils.convert_ini_to_dict( + env.get('IMAGE_PROPERTIES'))) + extra_properties.update( + getattr(config.CONF, f'{self.case_name}_extra_properties', {})) + rconfig.set( + 'scenario', 'img_properties', + functest_utils.convert_dict_to_ini(extra_properties)) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + + def update_dashboard_section(self): + """Update dashboard section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if env.get('DASHBOARD_URL'): + if not rconfig.has_section('dashboard'): + rconfig.add_section('dashboard') + rconfig.set('dashboard', 'dashboard_url', env.get('DASHBOARD_URL')) + else: + rconfig.set('service_available', 'horizon', False) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + def configure(self, **kwargs): # pylint: disable=unused-argument + """ + Create all openstack resources for tempest-based testcases and write + tempest.conf. + """ + if not os.path.exists(self.res_dir): + os.makedirs(self.res_dir) + self.deployment_id = rally.RallyBase.create_rally_deployment( + environ=self.project.get_environ()) + if not self.deployment_id: + raise Exception("Deployment create failed") + self.verifier_id = self.create_verifier() + if not self.verifier_id: + raise Exception("Verifier create failed") + self.verifier_repo_dir = self.get_verifier_repo_dir( + self.verifier_id) + self.deployment_dir = self.get_verifier_deployment_dir( + self.verifier_id, self.deployment_id) + + compute_cnt = self.count_hypervisors() if self.count_hypervisors( + ) <= 10 else 10 + self.image_alt = self.publish_image_alt() + self.flavor_alt = self.create_flavor_alt() + LOGGER.debug("flavor: %s", self.flavor_alt) + + self.conf_file = self.configure_verifier(self.deployment_dir) + if not self.conf_file: + raise Exception("Tempest verifier configuring failed") + self.configure_tempest_update_params( + self.conf_file, + image_id=self.image.id, + flavor_id=self.flavor.id, + compute_cnt=compute_cnt, + image_alt_id=self.image_alt.id, + flavor_alt_id=self.flavor_alt.id, + admin_role_name=self.role_name, cidr=self.cidr, + domain_id=self.project.domain.id) + self.update_auth_section() + self.update_network_section() + self.update_compute_section() + self.update_validation_section() + self.update_scenario_section() + self.update_dashboard_section() + self.backup_tempest_config(self.conf_file, self.res_dir) + + def run(self, **kwargs): self.start_time = time.time() try: - if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR): - os.makedirs(conf_utils.TEMPEST_RESULTS_DIR) - resources = self.resources.create() - compute_cnt = snaps_utils.get_active_compute_cnt( - self.resources.os_creds) - conf_utils.configure_tempest( - self.DEPLOYMENT_DIR, - image_id=resources.get("image_id"), - flavor_id=resources.get("flavor_id"), - compute_cnt=compute_cnt) - self.generate_test_list(self.VERIFIER_REPO_DIR) - self.apply_tempest_blacklist() - self.run_verifier_tests() + assert super().run( + **kwargs) == testcase.TestCase.EX_OK + if not os.path.exists(self.res_dir): + os.makedirs(self.res_dir) + self.update_rally_regex() + self.update_default_role() + rally.RallyBase.update_rally_logs(self.res_dir) + shutil.copy("/etc/rally/rally.conf", self.res_dir) + self.configure(**kwargs) + self.generate_test_list(**kwargs) + self.apply_tempest_blacklist(TempestCommon.tempest_blacklist) + if env.get('PUBLIC_ENDPOINT_ONLY').lower() == 'true': + self.apply_tempest_blacklist( + TempestCommon.tempest_public_blacklist) + self.run_verifier_tests(**kwargs) self.parse_verifier_result() + rally.RallyBase.verify_report( + os.path.join(self.res_dir, "tempest-report.html"), + self.verification_id) + rally.RallyBase.verify_report( + os.path.join(self.res_dir, "tempest-report.xml"), + self.verification_id, "junit-xml") res = testcase.TestCase.EX_OK - except Exception as e: - logger.error('Error with run: %s' % e) + except Exception: # pylint: disable=broad-except + LOGGER.exception('Error with run') + self.result = 0 res = testcase.TestCase.EX_RUN_ERROR - finally: - self.resources.cleanup() - self.stop_time = time.time() return res - -class TempestSmokeSerial(TempestCommon): - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_smoke_serial' - TempestCommon.__init__(self, **kwargs) - self.MODE = "smoke" - self.OPTION = "--concurrency 1" - - -class TempestSmokeParallel(TempestCommon): - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_smoke_parallel' - TempestCommon.__init__(self, **kwargs) - self.MODE = "smoke" - self.OPTION = "" - - -class TempestFullParallel(TempestCommon): - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_full_parallel' - TempestCommon.__init__(self, **kwargs) - self.MODE = "full" - - -class TempestCustom(TempestCommon): - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_custom' - TempestCommon.__init__(self, **kwargs) - self.MODE = "custom" - self.OPTION = "--concurrency 1" - - -class TempestDefcore(TempestCommon): - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_defcore' - TempestCommon.__init__(self, **kwargs) - self.MODE = "defcore" - self.OPTION = "--concurrency 1" - - -class TempestResourcesManager(object): + def clean(self): + """ + Cleanup all OpenStack objects. Should be called on completion. + """ + self.clean_rally_conf() + rally.RallyBase.clean_rally_logs() + if self.image_alt: + self.cloud.delete_image(self.image_alt) + if self.flavor_alt: + self.orig_cloud.delete_flavor(self.flavor_alt.id) + super().clean() + + def is_successful(self): + """The overall result of the test.""" + skips = self.details.get("skipped_number", 0) + if skips > 0 and self.deny_skipping: + return testcase.TestCase.EX_TESTCASE_FAILED + if self.tests_count and ( + self.details.get("tests_number", 0) != self.tests_count): + return testcase.TestCase.EX_TESTCASE_FAILED + return super().is_successful() + + +class TempestHeat(TempestCommon): + """Tempest Heat testcase implementation class.""" + + filename_alt = ('/home/opnfv/functest/images/' + 'Fedora-Cloud-Base-30-1.2.x86_64.qcow2') + flavor_alt_ram = 512 + flavor_alt_vcpus = 1 + flavor_alt_disk = 4 def __init__(self, **kwargs): - self.os_creds = None - if 'os_creds' in kwargs: - self.os_creds = kwargs['os_creds'] + super().__init__(**kwargs) + self.user2 = self.orig_cloud.create_user( + name=f'{self.case_name}-user2_{self.project.guid}', + password=self.project.password, + domain_id=self.project.domain.id) + self.orig_cloud.grant_role( + self.role_name, user=self.user2.id, + project=self.project.project.id, domain=self.project.domain.id) + if not self.orig_cloud.get_role("heat_stack_owner"): + self.role = self.orig_cloud.create_role("heat_stack_owner") + self.orig_cloud.grant_role( + "heat_stack_owner", user=self.user2.id, + project=self.project.project.id, + domain=self.project.domain.id) + + def configure(self, **kwargs): + assert self.user2 + super().configure(**kwargs) + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + if not rconfig.has_section('heat_plugin'): + rconfig.add_section('heat_plugin') + # It fails if region and domain ids are unset + rconfig.set( + 'heat_plugin', 'region', + os.environ.get('OS_REGION_NAME', 'RegionOne')) + rconfig.set('heat_plugin', 'auth_url', os.environ["OS_AUTH_URL"]) + rconfig.set('heat_plugin', 'project_domain_id', self.project.domain.id) + rconfig.set('heat_plugin', 'user_domain_id', self.project.domain.id) + rconfig.set( + 'heat_plugin', 'project_domain_name', self.project.domain.name) + rconfig.set( + 'heat_plugin', 'user_domain_name', self.project.domain.name) + rconfig.set('heat_plugin', 'username', self.user2.name) + rconfig.set('heat_plugin', 'password', self.project.password) + rconfig.set('heat_plugin', 'project_name', self.project.project.name) + rconfig.set('heat_plugin', 'admin_username', self.project.user.name) + rconfig.set('heat_plugin', 'admin_password', self.project.password) + rconfig.set( + 'heat_plugin', 'admin_project_name', self.project.project.name) + rconfig.set('heat_plugin', 'image_ref', self.image_alt.id) + rconfig.set('heat_plugin', 'instance_type', self.flavor_alt.id) + rconfig.set('heat_plugin', 'minimal_image_ref', self.image.id) + rconfig.set('heat_plugin', 'minimal_instance_type', self.flavor.id) + if self.ext_net: + rconfig.set( + 'heat_plugin', 'floating_network_name', self.ext_net.name) + if self.network: + rconfig.set('heat_plugin', 'fixed_network_name', self.network.name) + rconfig.set('heat_plugin', 'fixed_subnet_name', self.subnet.name) + rconfig.set('heat_plugin', 'network_for_ssh', self.network.name) else: - self.os_creds = openstack_tests.get_credentials( - os_env_file=CONST.__getattribute__('openstack_creds')) - - self.guid = '-' + str(uuid.uuid4()) - - self.creators = list() - - if hasattr(CONST, 'snaps_images_cirros'): - self.cirros_image_config = CONST.__getattribute__( - 'snaps_images_cirros') - else: - self.cirros_image_config = None - - def create(self, use_custom_images=False, use_custom_flavors=False, - create_project=False): - if create_project: - logger.debug("Creating project (tenant) for Tempest suite") - project_name = CONST.__getattribute__( - 'tempest_identity_tenant_name') + self.guid - project_creator = deploy_utils.create_project( - self.os_creds, ProjectConfig( - name=project_name, - description=CONST.__getattribute__( - 'tempest_identity_tenant_description'))) - if (project_creator is None or - project_creator.get_project() is None): - raise Exception("Failed to create tenant") - project_id = project_creator.get_project().id - self.creators.append(project_creator) - - logger.debug("Creating user for Tempest suite") - user_creator = deploy_utils.create_user( - self.os_creds, UserConfig( - name=CONST.__getattribute__( - 'tempest_identity_user_name') + self.guid, - password=CONST.__getattribute__( - 'tempest_identity_user_password'), - project_name=project_name)) - if user_creator is None or user_creator.get_user() is None: - raise Exception("Failed to create user") - user_id = user_creator.get_user().id - self.creators.append(user_creator) - else: - project_name = None - project_id = None - user_id = None - - logger.debug("Creating private network for Tempest suite") - - tempest_network_type = None - tempest_physical_network = None - tempest_segmentation_id = None - - if hasattr(CONST, 'tempest_network_type'): - tempest_network_type = CONST.__getattribute__( - 'tempest_network_type') - if hasattr(CONST, 'tempest_physical_network'): - tempest_physical_network = CONST.__getattribute__( - 'tempest_physical_network') - if hasattr(CONST, 'tempest_segmentation_id'): - tempest_segmentation_id = CONST.__getattribute__( - 'tempest_segmentation_id') - - network_creator = deploy_utils.create_network( - self.os_creds, NetworkConfig( - name=CONST.__getattribute__( - 'tempest_private_net_name') + self.guid, - project_name=project_name, - network_type=tempest_network_type, - physical_network=tempest_physical_network, - segmentation_id=tempest_segmentation_id, - subnet_settings=[SubnetConfig( - name=CONST.__getattribute__( - 'tempest_private_subnet_name') + self.guid, - cidr=CONST.__getattribute__('tempest_private_subnet_cidr')) - ])) - if network_creator is None or network_creator.get_network() is None: - raise Exception("Failed to create private network") - self.creators.append(network_creator) - - image_id = None - image_id_alt = None - flavor_id = None - flavor_id_alt = None - - logger.debug("Creating image for Tempest suite") - image_base_name = CONST.__getattribute__( - 'openstack_image_name') + self.guid - os_image_settings = openstack_tests.cirros_image_settings( - image_base_name, public=True, - image_metadata=self.cirros_image_config) - logger.debug("Creating image for Tempest suite") - image_creator = deploy_utils.create_image( - self.os_creds, os_image_settings) - if image_creator is None: - raise Exception('Failed to create image') - self.creators.append(image_creator) - image_id = image_creator.get_image().id - - if use_custom_images: - logger.debug("Creating 2nd image for Tempest suite") - image_base_name_alt = CONST.__getattribute__( - 'openstack_image_name_alt') + self.guid - os_image_settings_alt = openstack_tests.cirros_image_settings( - image_base_name_alt, public=True, - image_metadata=self.cirros_image_config) - logger.debug("Creating 2nd image for Tempest suite") - image_creator_alt = deploy_utils.create_image( - self.os_creds, os_image_settings_alt) - if image_creator_alt is None: - raise Exception('Failed to create image') - self.creators.append(image_creator_alt) - image_id_alt = image_creator_alt.get_image().id - - if (CONST.__getattribute__('tempest_use_custom_flavors') == 'True' or - use_custom_flavors): - logger.info("Creating flavor for Tempest suite") - scenario = CONST.__getattribute__('DEPLOY_SCENARIO') - flavor_metadata = None - if 'ovs' in scenario or 'fdio' in scenario: - flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE - flavor_creator = OpenStackFlavor( - self.os_creds, FlavorConfig( - name=CONST.__getattribute__( - 'openstack_flavor_name') + self.guid, - ram=CONST.__getattribute__('openstack_flavor_ram'), - disk=CONST.__getattribute__('openstack_flavor_disk'), - vcpus=CONST.__getattribute__('openstack_flavor_vcpus'), - metadata=flavor_metadata)) - flavor = flavor_creator.create() - if flavor is None: - raise Exception('Failed to create flavor') - self.creators.append(flavor_creator) - flavor_id = flavor.id - - if use_custom_flavors: - logger.info("Creating 2nd flavor for Tempest suite") - scenario = CONST.__getattribute__('DEPLOY_SCENARIO') - flavor_metadata_alt = None - if 'ovs' in scenario or 'fdio' in scenario: - flavor_metadata_alt = create_flavor.MEM_PAGE_SIZE_LARGE - CONST.__setattr__('openstack_flavor_ram', 1024) - flavor_creator_alt = OpenStackFlavor( - self.os_creds, FlavorConfig( - name=CONST.__getattribute__( - 'openstack_flavor_name_alt') + self.guid, - ram=CONST.__getattribute__('openstack_flavor_ram'), - disk=CONST.__getattribute__('openstack_flavor_disk'), - vcpus=CONST.__getattribute__('openstack_flavor_vcpus'), - metadata=flavor_metadata_alt)) - flavor_alt = flavor_creator_alt.create() - if flavor_alt is None: - raise Exception('Failed to create flavor') - self.creators.append(flavor_creator_alt) - flavor_id_alt = flavor_alt.id - - print("RESOURCES CREATE: image_id: %s, image_id_alt: %s, " - "flavor_id: %s, flavor_id_alt: %s" % ( - image_id, image_id_alt, flavor_id, flavor_id_alt,)) - - result = { - 'image_id': image_id, - 'image_id_alt': image_id_alt, - 'flavor_id': flavor_id, - 'flavor_id_alt': flavor_id_alt - } - - if create_project: - result['project_id'] = project_id - result['tenant_id'] = project_id # for compatibility - result['user_id'] = user_id - - return result - - def cleanup(self): + LOGGER.warning( + 'No tenant network created. ' + 'Trying EXTERNAL_NETWORK as a fallback') + rconfig.set( + 'heat_plugin', 'fixed_network_name', + env.get("EXTERNAL_NETWORK")) + rconfig.set( + 'heat_plugin', 'network_for_ssh', env.get("EXTERNAL_NETWORK")) + with open(self.conf_file, 'w', encoding='utf-8') as config_file: + rconfig.write(config_file) + self.backup_tempest_config(self.conf_file, self.res_dir) + + def clean(self): """ Cleanup all OpenStack objects. Should be called on completion. """ - for creator in reversed(self.creators): - try: - creator.clean() - except Exception as e: - logger.error('Unexpected error cleaning - %s', e) + super().clean() + if self.user2: + self.orig_cloud.delete_user(self.user2.id) diff --git a/functest/ci/__init__.py b/functest/opnfv_tests/openstack/vmtp/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/ci/__init__.py +++ b/functest/opnfv_tests/openstack/vmtp/__init__.py diff --git a/functest/opnfv_tests/openstack/vmtp/vmtp.py b/functest/opnfv_tests/openstack/vmtp/vmtp.py new file mode 100644 index 000000000..9833cc72a --- /dev/null +++ b/functest/opnfv_tests/openstack/vmtp/vmtp.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +""" +VMTP_ is a small python application that will automatically perform ping +connectivity, round trip time measurement (latency) and TCP/UDP throughput +measurement for the following East/West flows on any OpenStack deployment: + +- VM to VM same network (private fixed IP, flow #1) +- VM to VM different network using fixed IP (same as intra-tenant L3 fixed IP, + flow #2) +- VM to VM different network using floating IP and NAT (same as floating IP + inter-tenant L3, flow #3) + +.. _VMTP: http://vmtp.readthedocs.io/en/latest/ +""" + +import json +import logging +import os +import subprocess +import tempfile +import time +import yaml + +from xtesting.core import testcase + +from functest.core import singlevm +from functest.utils import env +from functest.utils import functest_utils + + +class Vmtp(singlevm.VmReady2): + """Class to run Vmtp_ as an OPNFV Functest testcase + + .. _Vmtp: http://vmtp.readthedocs.io/en/latest/ + """ + # pylint: disable=too-many-instance-attributes + + __logger = logging.getLogger(__name__) + + filename = ('/home/opnfv/functest/images/' + 'ubuntu-14.04-server-cloudimg-amd64-disk1.img') + flavor_ram = 2048 + flavor_vcpus = 1 + flavor_disk = 0 + create_server_timeout = 300 + ssh_retry_timeout = 240 + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'vmtp' + super().__init__(**kwargs) + self.config = f"{self.res_dir}/vmtp.conf" + (_, self.privkey_filename) = tempfile.mkstemp() + (_, self.pubkey_filename) = tempfile.mkstemp() + + def check_requirements(self): + if self.count_hypervisors() < 2: + self.__logger.warning("Vmtp requires at least 2 hypervisors") + self.is_skipped = True + self.project.clean() + + def create_network_resources(self): + """Create router + + It creates a router which gateway is the external network detected. + + Raises: expection on error + """ + assert self.cloud + assert self.ext_net + self.router = self.cloud.create_router( + name=f'{self.case_name}-router_{self.guid}', + ext_gateway_net_id=self.ext_net.id) + self.__logger.debug("router: %s", self.router) + + def generate_keys(self): + """Generate Keys + + Raises: Exception on error + """ + assert self.cloud + name = f"vmtp_{self.guid}" + self.__logger.info("Creating keypair with name: '%s'", name) + keypair = self.cloud.create_keypair(name) + self.__logger.debug("keypair: %s", keypair) + with open(self.privkey_filename, 'w', encoding='utf-8') as key_file: + key_file.write(keypair.private_key) + with open(self.pubkey_filename, 'w', encoding='utf-8') as key_file: + key_file.write(keypair.public_key) + self.cloud.delete_keypair(keypair.id) + + def write_config(self): + """Write vmtp.conf + + Raises: Exception on error + """ + assert self.cloud + if not os.path.exists(self.res_dir): + os.makedirs(self.res_dir) + cmd = ['vmtp', '-sc'] + output = subprocess.check_output(cmd).decode("utf-8") + self.__logger.info("%s\n%s", " ".join(cmd), output) + with open(self.config, "w+", encoding='utf-8') as conf: + vmtp_conf = yaml.full_load(output) + vmtp_conf["private_key_file"] = self.privkey_filename + vmtp_conf["public_key_file"] = self.pubkey_filename + vmtp_conf["image_name"] = str(self.image.name) + vmtp_conf["router_name"] = str(self.router.name) + vmtp_conf["flavor_type"] = str(self.flavor.name) + vmtp_conf["internal_network_name"] = [ + f"pns-internal-net_{self.guid}", + f"pns-internal-net2_{self.guid}"] + vmtp_conf["vm_name_client"] = f"TestClient_{self.guid}" + vmtp_conf["vm_name_server"] = f"TestServer_{self.guid}" + vmtp_conf["security_group_name"] = f"pns-security{self.guid}" + vmtp_conf["dns_nameservers"] = [env.get('NAMESERVER')] + vmtp_conf["generic_retry_count"] = self.create_server_timeout // 2 + vmtp_conf["ssh_retry_count"] = self.ssh_retry_timeout // 2 + conf.write(yaml.dump(vmtp_conf)) + + def run_vmtp(self): + # pylint: disable=unexpected-keyword-arg + """Run Vmtp and generate charts + + Raises: Exception on error + """ + assert self.cloud + new_env = dict( + os.environ, + OS_USERNAME=self.project.user.name, + OS_PROJECT_NAME=self.project.project.name, + OS_PROJECT_ID=self.project.project.id, + OS_PROJECT_DOMAIN_NAME=self.project.domain.name, + OS_USER_DOMAIN_NAME=self.project.domain.name, + OS_PASSWORD=self.project.password) + if not new_env["OS_AUTH_URL"].endswith(('v3', 'v3/')): + new_env["OS_AUTH_URL"] = f'{new_env["OS_AUTH_URL"]}/v3' + try: + del new_env['OS_TENANT_NAME'] + del new_env['OS_TENANT_ID'] + except Exception: # pylint: disable=broad-except + pass + cmd = ['vmtp', '-d', '--json', f'{self.res_dir}/vmtp.json', + '-c', self.config] + if env.get("VMTP_HYPERVISORS"): + hypervisors = functest_utils.convert_ini_to_list( + env.get("VMTP_HYPERVISORS")) + for hypervisor in hypervisors: + cmd.extend(["--hypervisor", hypervisor]) + self.__logger.debug("cmd: %s", cmd) + output = subprocess.check_output( + cmd, stderr=subprocess.STDOUT, env=new_env).decode("utf-8") + self.__logger.info("%s\n%s", " ".join(cmd), output) + cmd = ['vmtp_genchart', '-c', f'{self.res_dir}/vmtp.html', + f'{self.res_dir}/vmtp.json'] + output = subprocess.check_output( + cmd, stderr=subprocess.STDOUT).decode("utf-8") + self.__logger.info("%s\n%s", " ".join(cmd), output) + with open(f'{self.res_dir}/vmtp.json', 'r', + encoding='utf-8') as res_file: + self.details = json.load(res_file) + + def run(self, **kwargs): + self.start_time = time.time() + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + assert super().run(**kwargs) == self.EX_OK + status = testcase.TestCase.EX_RUN_ERROR + if self.orig_cloud.get_role("admin"): + role_name = "admin" + elif self.orig_cloud.get_role("Admin"): + role_name = "Admin" + else: + raise Exception("Cannot detect neither admin nor Admin") + self.orig_cloud.grant_role( + role_name, user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + self.generate_keys() + self.write_config() + self.run_vmtp() + self.result = 100 + status = testcase.TestCase.EX_OK + except subprocess.CalledProcessError as cpe: + self.__logger.error( + "Exception when calling %s\n%s", cpe.cmd, + cpe.output.decode("utf-8")) + self.result = 0 + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot run vmtp") + self.result = 0 + self.stop_time = time.time() + return status + + def clean(self): + try: + assert self.cloud + super().clean() + os.remove(self.privkey_filename) + os.remove(self.pubkey_filename) + self.cloud.delete_network(f"pns-internal-net_{self.guid}") + self.cloud.delete_network(f"pns-internal-net2_{self.guid}") + except Exception: # pylint: disable=broad-except + pass diff --git a/functest/opnfv_tests/openstack/vping/ping.sh b/functest/opnfv_tests/openstack/vping/ping.sh deleted file mode 100644 index 15f5e84e1..000000000 --- a/functest/opnfv_tests/openstack/vping/ping.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - - -ping -c 1 $1 2>&1 >/dev/null -RES=$? -if [ "Z$RES" = "Z0" ] ; then - echo 'vPing OK' -else - echo 'vPing KO' -fi diff --git a/functest/opnfv_tests/openstack/vping/vping_base.py b/functest/opnfv_tests/openstack/vping/vping_base.py deleted file mode 100644 index df9774ece..000000000 --- a/functest/opnfv_tests/openstack/vping/vping_base.py +++ /dev/null @@ -1,215 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. and others. -# -# 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 - -"""Define the parent class of vping_ssh and vping_userdata testcases.""" - -from datetime import datetime -import logging -import time -import uuid - -from functest.core import testcase -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.utils.constants import CONST - -from snaps.config.flavor import FlavorConfig -from snaps.config.network import NetworkConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.openstack import create_flavor -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.tests import openstack_tests -from snaps.openstack.utils import deploy_utils - - -class VPingBase(testcase.TestCase): - - """ - Base class for vPing tests that check connectivity between two VMs shared - internal network. - This class is responsible for creating the image, internal network. - """ - # pylint: disable=too-many-instance-attributes - - def __init__(self, **kwargs): - super(VPingBase, self).__init__(**kwargs) - - self.logger = logging.getLogger(__name__) - - if 'os_creds' in kwargs: - self.os_creds = kwargs['os_creds'] - else: - creds_override = None - if hasattr(CONST, 'snaps_os_creds_override'): - creds_override = CONST.__getattribute__( - 'snaps_os_creds_override') - - self.os_creds = openstack_tests.get_credentials( - os_env_file=CONST.__getattribute__('openstack_creds'), - overrides=creds_override) - - self.creators = list() - self.image_creator = None - self.network_creator = None - self.vm1_creator = None - self.vm2_creator = None - self.router_creator = None - - # Shared metadata - self.guid = '-' + str(uuid.uuid4()) - - self.router_name = CONST.__getattribute__( - 'vping_router_name') + self.guid - self.vm1_name = CONST.__getattribute__('vping_vm_name_1') + self.guid - self.vm2_name = CONST.__getattribute__('vping_vm_name_2') + self.guid - - self.vm_boot_timeout = CONST.__getattribute__('vping_vm_boot_timeout') - self.vm_delete_timeout = CONST.__getattribute__( - 'vping_vm_delete_timeout') - self.vm_ssh_connect_timeout = CONST.__getattribute__( - 'vping_vm_ssh_connect_timeout') - self.ping_timeout = CONST.__getattribute__('vping_ping_timeout') - self.flavor_name = 'vping-flavor' + self.guid - - # Move this configuration option up for all tests to leverage - if hasattr(CONST, 'snaps_images_cirros'): - self.cirros_image_config = CONST.__getattribute__( - 'snaps_images_cirros') - else: - self.cirros_image_config = None - - def run(self): - """ - Begins the test execution which should originate from the subclass - """ - self.logger.info('Begin virtual environment setup') - - self.start_time = time.time() - self.logger.info( - "vPing Start Time:'%s'", - datetime.fromtimestamp(self.start_time).strftime( - '%Y-%m-%d %H:%M:%S')) - - image_base_name = '{}-{}'.format( - CONST.__getattribute__('vping_image_name'), - str(self.guid)) - os_image_settings = openstack_tests.cirros_image_settings( - image_base_name, image_metadata=self.cirros_image_config) - self.logger.info("Creating image with name: '%s'", image_base_name) - - self.image_creator = deploy_utils.create_image( - self.os_creds, os_image_settings) - self.creators.append(self.image_creator) - - private_net_name = CONST.__getattribute__( - 'vping_private_net_name') + self.guid - private_subnet_name = CONST.__getattribute__( - 'vping_private_subnet_name') + self.guid - private_subnet_cidr = CONST.__getattribute__( - 'vping_private_subnet_cidr') - - vping_network_type = None - vping_physical_network = None - vping_segmentation_id = None - - if hasattr(CONST, 'vping_network_type'): - vping_network_type = CONST.__getattribute__( - 'vping_network_type') - if hasattr(CONST, 'vping_physical_network'): - vping_physical_network = CONST.__getattribute__( - 'vping_physical_network') - if hasattr(CONST, 'vping_segmentation_id'): - vping_segmentation_id = CONST.__getattribute__( - 'vping_segmentation_id') - - self.logger.info( - "Creating network with name: '%s'", private_net_name) - self.network_creator = deploy_utils.create_network( - self.os_creds, - NetworkConfig( - name=private_net_name, - network_type=vping_network_type, - physical_network=vping_physical_network, - segmentation_id=vping_segmentation_id, - subnet_settings=[SubnetConfig( - name=private_subnet_name, - cidr=private_subnet_cidr)])) - self.creators.append(self.network_creator) - - # Creating router to external network - log = "Creating router with name: '%s'" % self.router_name - self.logger.info(log) - ext_net_name = snaps_utils.get_ext_net_name(self.os_creds) - self.router_creator = deploy_utils.create_router( - self.os_creds, - RouterConfig( - name=self.router_name, - external_gateway=ext_net_name, - internal_subnets=[private_subnet_name])) - self.creators.append(self.router_creator) - - self.logger.info( - "Creating flavor with name: '%s'", self.flavor_name) - scenario = CONST.__getattribute__('DEPLOY_SCENARIO') - flavor_metadata = None - flavor_ram = 512 - if 'ovs' in scenario or 'fdio' in scenario: - flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE - flavor_ram = 1024 - flavor_creator = OpenStackFlavor( - self.os_creds, - FlavorConfig(name=self.flavor_name, ram=flavor_ram, disk=1, - vcpus=1, metadata=flavor_metadata)) - flavor_creator.create() - self.creators.append(flavor_creator) - - def _execute(self): - """ - Method called by subclasses after environment has been setup - :return: the exit code - """ - self.logger.info('Begin test execution') - - test_ip = self.vm1_creator.get_port_ip( - self.vm1_creator.instance_settings.port_settings[0].name) - - if self.vm1_creator.vm_active( - block=True) and self.vm2_creator.vm_active(block=True): - result = self._do_vping(self.vm2_creator, test_ip) - else: - raise Exception('VMs never became active') - - self.stop_time = time.time() - - if result != testcase.TestCase.EX_OK: - self.result = 0 - return testcase.TestCase.EX_RUN_ERROR - - self.result = 100 - return testcase.TestCase.EX_OK - - def _cleanup(self): - """ - Cleanup all OpenStack objects. Should be called on completion - :return: - """ - if CONST.__getattribute__('vping_cleanup_objects') == 'True': - for creator in reversed(self.creators): - try: - creator.clean() - except Exception as error: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', error) - - def _do_vping(self, vm_creator, test_ip): - """ - Method to be implemented by subclasses - Begins the real test after the OpenStack environment has been setup - :param vm_creator: the SNAPS VM instance creator object - :param test_ip: the IP to which the VM needs to issue the ping - :return: T/F - """ - raise NotImplementedError('vping execution is not implemented') diff --git a/functest/opnfv_tests/openstack/vping/vping_ssh.py b/functest/opnfv_tests/openstack/vping/vping_ssh.py index 7df767edc..ad64348c4 100644 --- a/functest/opnfv_tests/openstack/vping/vping_ssh.py +++ b/functest/opnfv_tests/openstack/vping/vping_ssh.py @@ -1,5 +1,5 @@ #!/usr/bin/env 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 @@ -7,32 +7,15 @@ # # http://www.apache.org/licenses/LICENSE-2.0 - """vPingSSH testcase.""" -# This 1st import is here simply for pep8 as the 'os' package import appears -# to be required for mock and the unit tests will fail without it -import os # noqa # pylint: disable=unused-import -import time - -from scp import SCPClient -import pkg_resources - -from functest.core.testcase import TestCase -from functest.energy import energy -from functest.opnfv_tests.openstack.vping import vping_base -from functest.utils.constants import CONST - -from snaps.config.keypair import KeypairConfig -from snaps.config.network import PortConfig -from snaps.config.security_group import ( - Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) -from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig +import logging -from snaps.openstack.utils import deploy_utils +from functest.core import singlevm +from functest.utils import config -class VPingSSH(vping_base.VPingBase): +class VPingSSH(singlevm.SingleVm2): """ VPingSSH testcase implementation. @@ -40,200 +23,40 @@ class VPingSSH(vping_base.VPingBase): to issue the ping command to the second """ + __logger = logging.getLogger(__name__) + def __init__(self, **kwargs): """Initialize testcase.""" if "case_name" not in kwargs: kwargs["case_name"] = "vping_ssh" - super(VPingSSH, self).__init__(**kwargs) - - self.kp_name = CONST.__getattribute__('vping_keypair_name') + self.guid - self.kp_priv_file = CONST.__getattribute__('vping_keypair_priv_file') - self.kp_pub_file = CONST.__getattribute__('vping_keypair_pub_file') - self.sg_name = CONST.__getattribute__('vping_sg_name') + self.guid - self.sg_desc = CONST.__getattribute__('vping_sg_desc') - - @energy.enable_recording - def run(self): - """ - Excecute VPingSSH testcase. - - Sets up the OpenStack keypair, router, security group, and VM instance - objects then validates the ping. - :return: the exit code from the super.execute() method - """ - try: - super(VPingSSH, self).run() - - log = "Creating keypair with name: '%s'" % self.kp_name - self.logger.info(log) - kp_creator = deploy_utils.create_keypair( - self.os_creds, - KeypairConfig( - name=self.kp_name, private_filepath=self.kp_priv_file, - public_filepath=self.kp_pub_file)) - self.creators.append(kp_creator) - - # Creating Instance 1 - port1_settings = PortConfig( - name=self.vm1_name + '-vPingPort', - network_name=self.network_creator.network_settings.name) - instance1_settings = VmInstanceConfig( - name=self.vm1_name, flavor=self.flavor_name, - vm_boot_timeout=self.vm_boot_timeout, - vm_delete_timeout=self.vm_delete_timeout, - ssh_connect_timeout=self.vm_ssh_connect_timeout, - port_settings=[port1_settings]) - - log = ("Creating VM 1 instance with name: '%s'" - % instance1_settings.name) - self.logger.info(log) - self.vm1_creator = deploy_utils.create_vm_instance( - self.os_creds, - instance1_settings, - self.image_creator.image_settings, - keypair_creator=kp_creator) - self.creators.append(self.vm1_creator) - - # Creating Instance 2 - sg_creator = self.__create_security_group() - self.creators.append(sg_creator) - - port2_settings = PortConfig( - name=self.vm2_name + '-vPingPort', - network_name=self.network_creator.network_settings.name) - instance2_settings = VmInstanceConfig( - name=self.vm2_name, flavor=self.flavor_name, - vm_boot_timeout=self.vm_boot_timeout, - vm_delete_timeout=self.vm_delete_timeout, - ssh_connect_timeout=self.vm_ssh_connect_timeout, - port_settings=[port2_settings], - security_group_names=[sg_creator.sec_grp_settings.name], - floating_ip_settings=[FloatingIpConfig( - name=self.vm2_name + '-FIPName', - port_name=port2_settings.name, - router_name=self.router_creator.router_settings.name)]) - - log = ("Creating VM 2 instance with name: '%s'" - % instance2_settings.name) - self.logger.info(log) - self.vm2_creator = deploy_utils.create_vm_instance( - self.os_creds, - instance2_settings, - self.image_creator.image_settings, - keypair_creator=kp_creator) - self.creators.append(self.vm2_creator) - - return self._execute() - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error running test - ' + exc.message) - return TestCase.EX_RUN_ERROR - finally: - self._cleanup() - - def _do_vping(self, vm_creator, test_ip): - """ - Execute ping command. - - Override from super - """ - if vm_creator.vm_ssh_active(block=True): - ssh = vm_creator.ssh_client() - if not self._transfer_ping_script(ssh): - return TestCase.EX_RUN_ERROR - return self._do_vping_ssh(ssh, test_ip) - else: - return TestCase.EX_RUN_ERROR - - def _transfer_ping_script(self, ssh): - """ - Transfert vping script to VM. - - Uses SCP to copy the ping script via the SSH client - :param ssh: the SSH client - :return: - """ - self.logger.info("Trying to transfer ping.sh") - scp = SCPClient(ssh.get_transport()) - ping_script = pkg_resources.resource_filename( - 'functest.opnfv_tests.openstack.vping', 'ping.sh') - try: - scp.put(ping_script, "~/") - except Exception: # pylint: disable=broad-except - self.logger.error("Cannot SCP the file '%s'", ping_script) - return False - - cmd = 'chmod 755 ~/ping.sh' - # pylint: disable=unused-variable - (stdin, stdout, stderr) = ssh.exec_command(cmd) - for line in stdout.readlines(): - print line - - return True - - def _do_vping_ssh(self, ssh, test_ip): - """ - Execute ping command via SSH. - - Pings the test_ip via the SSH client - :param ssh: the SSH client used to issue the ping command - :param test_ip: the IP for the ping command to use - :return: exit_code (int) - """ - exit_code = TestCase.EX_TESTCASE_FAILED - self.logger.info("Waiting for ping...") - - sec = 0 - cmd = '~/ping.sh ' + test_ip - flag = False - - while True: - time.sleep(1) - (_, stdout, _) = ssh.exec_command(cmd) - output = stdout.readlines() - - for line in output: - if "vPing OK" in line: - self.logger.info("vPing detected!") - exit_code = TestCase.EX_OK - flag = True - break - - elif sec == self.ping_timeout: - self.logger.info("Timeout reached.") - flag = True - break - if flag: - break - log = "Pinging %s. Waiting for response..." % test_ip - self.logger.debug(log) - sec += 1 - return exit_code - - def __create_security_group(self): - """ - Configure OpenStack security groups. - - Configures and deploys an OpenStack security group object - :return: the creator object - """ - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name=self.sg_name, direction=Direction.ingress, - protocol=Protocol.icmp)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name=self.sg_name, direction=Direction.ingress, - protocol=Protocol.tcp, port_range_min=22, port_range_max=22)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name=self.sg_name, direction=Direction.egress, - protocol=Protocol.tcp, port_range_min=22, port_range_max=22)) - - log = "Security group with name: '%s'" % self.sg_name - self.logger.info(log) - return deploy_utils.create_security_group(self.os_creds, - SecurityGroupConfig( - name=self.sg_name, - description=self.sg_desc, - rule_settings=sg_rules)) + super().__init__(**kwargs) + self.vm2 = None + + def prepare(self): + super().prepare() + self.vm2 = self.boot_vm( + f'{self.case_name}-vm2_{self.guid}', + security_groups=[self.sec.id]) + + def execute(self): + """Ping the second VM + + Returns: ping exit codes + """ + assert self.ssh + if not self.check_regex_in_console(self.vm2.name): + return 1 + ip4 = self.vm2.private_v4 or self.vm2.addresses[ + self.network.name][0].addr + (_, stdout, stderr) = self.ssh.exec_command(f'ping -c 1 {ip4}') + self.__logger.info("output:\n%s", stdout.read().decode("utf-8")) + self.__logger.info("error:\n%s", stderr.read().decode("utf-8")) + return stdout.channel.recv_exit_status() + + def clean(self): + assert self.cloud + if self.vm2: + self.cloud.delete_server( + self.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + super().clean() diff --git a/functest/opnfv_tests/openstack/vping/vping_userdata.py b/functest/opnfv_tests/openstack/vping/vping_userdata.py index ceba0917a..8a8f26f37 100644 --- a/functest/opnfv_tests/openstack/vping/vping_userdata.py +++ b/functest/opnfv_tests/openstack/vping/vping_userdata.py @@ -1,5 +1,5 @@ #!/usr/bin/env 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 @@ -9,17 +9,16 @@ """vping_userdata testcase.""" +import logging import time -from snaps.config.network import PortConfig -from snaps.config.vm_inst import VmInstanceConfig -from snaps.openstack.utils import deploy_utils +from xtesting.core import testcase -from functest.core.testcase import TestCase -from functest.opnfv_tests.openstack.vping import vping_base +from functest.core import singlevm +from functest.utils import config -class VPingUserdata(vping_base.VPingBase): +class VPingUserdata(singlevm.VmReady2): """ Class to execute the vPing test using userdata and the VM's console """ @@ -27,117 +26,112 @@ class VPingUserdata(vping_base.VPingBase): def __init__(self, **kwargs): if "case_name" not in kwargs: kwargs["case_name"] = "vping_userdata" - super(VPingUserdata, self).__init__(**kwargs) + super().__init__(**kwargs) + self.logger = logging.getLogger(__name__) + self.vm1 = None + self.vm2 = None - def run(self): + def run(self, **kwargs): """ Sets up the OpenStack VM instance objects then executes the ping and validates. :return: the exit code from the super.execute() method """ try: - super(VPingUserdata, self).run() - - # Creating Instance 1 - port1_settings = PortConfig( - name=self.vm1_name + '-vPingPort', - network_name=self.network_creator.network_settings.name) - instance1_settings = VmInstanceConfig( - name=self.vm1_name, - flavor=self.flavor_name, - vm_boot_timeout=self.vm_boot_timeout, - port_settings=[port1_settings]) - - self.logger.info( - "Creating VM 1 instance with name: '%s'", - instance1_settings.name) - self.vm1_creator = deploy_utils.create_vm_instance( - self.os_creds, instance1_settings, - self.image_creator.image_settings) - self.creators.append(self.vm1_creator) - - userdata = _get_userdata( - self.vm1_creator.get_port_ip(port1_settings.name)) - if userdata: - # Creating Instance 2 - port2_settings = PortConfig( - name=self.vm2_name + '-vPingPort', - network_name=self.network_creator.network_settings.name) - instance2_settings = VmInstanceConfig( - name=self.vm2_name, - flavor=self.flavor_name, - vm_boot_timeout=self.vm_boot_timeout, - port_settings=[port2_settings], - userdata=userdata) - - self.logger.info( - "Creating VM 2 instance with name: '%s'", - instance2_settings.name) - self.vm2_creator = deploy_utils.create_vm_instance( - self.os_creds, instance2_settings, - self.image_creator.image_settings) - self.creators.append(self.vm2_creator) - else: - raise Exception('Userdata is None') - - return self._execute() - - finally: - self._cleanup() - - def _do_vping(self, vm_creator, test_ip): + assert self.cloud + assert super().run( + **kwargs) == testcase.TestCase.EX_OK + self.result = 0 + self.vm1 = self.boot_vm() + self.vm2 = self.boot_vm( + f'{self.case_name}-vm2_{self.guid}', + userdata=self._get_userdata()) + + result = self._do_vping() + self.stop_time = time.time() + if result != testcase.TestCase.EX_OK: + return testcase.TestCase.EX_RUN_ERROR + self.result = 100 + return testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.logger.exception('Unexpected error running vping_userdata') + return testcase.TestCase.EX_RUN_ERROR + + def _do_vping(self): """ Override from super """ + if not (self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr): + self.logger.error("vm1: IP addr missing") + return testcase.TestCase.EX_TESTCASE_FAILED + self.logger.info("Waiting for ping...") - exit_code = TestCase.EX_TESTCASE_FAILED + exit_code = testcase.TestCase.EX_TESTCASE_FAILED sec = 0 tries = 0 while True: time.sleep(1) - p_console = vm_creator.get_console_output() + p_console = self.cloud.get_server_console(self.vm2.id) + self.logger.debug("console: \n%s", p_console) if "vPing OK" in p_console: self.logger.info("vPing detected!") - exit_code = TestCase.EX_OK + exit_code = testcase.TestCase.EX_OK break - elif "failed to read iid from metadata" in p_console or tries > 5: + if "failed to read iid from metadata" in p_console or tries > 5: self.logger.info("Failed to read iid from metadata") break - elif sec == self.ping_timeout: + if sec == getattr(config.CONF, 'vping_ping_timeout'): self.logger.info("Timeout reached.") break - elif sec % 10 == 0: + if sec % 10 == 0: if "request failed" in p_console: self.logger.debug( - "It seems userdata is not supported in nova boot. " + + "It seems userdata is not supported in nova boot. " "Waiting a bit...") tries += 1 else: self.logger.debug( - "Pinging %s. Waiting for response...", test_ip) + "Pinging %s. Waiting for response...", + self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr) sec += 1 return exit_code - -def _get_userdata(test_ip): - """ - Returns the post VM creation script to be added into the VM's userdata - :param test_ip: the IP value to substitute into the script - :return: the bash script contents - """ - if test_ip: - return ("#!/bin/sh\n\n" - "while true; do\n" - " ping -c 1 %s 2>&1 >/dev/null\n" - " RES=$?\n" - " if [ \"Z$RES\" = \"Z0\" ] ; then\n" - " echo 'vPing OK'\n" - " break\n" - " else\n" - " echo 'vPing KO'\n" - " fi\n" - " sleep 1\n" - "done\n" % str(test_ip)) - return None + def _get_userdata(self): + """ + Returns the post VM creation script to be added into the VM's userdata + :param test_ip: the IP value to substitute into the script + :return: the shell script contents + """ + ip4 = self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr + if self.vm1.private_v4 or self.vm1.addresses[ + self.network.name][0].addr: + return ("#!/bin/sh\n\n" + "while true; do\n" + f" ping -c 1 {ip4} 2>&1 >/dev/null\n" + " RES=$?\n" + " if [ \"Z$RES\" = \"Z0\" ] ; then\n" + " echo 'vPing OK'\n" + " break\n" + " else\n" + " echo 'vPing KO'\n" + " fi\n" + " sleep 1\n" + "done\n") + return None + + def clean(self): + assert self.cloud + if self.vm1: + self.cloud.delete_server( + self.vm1, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + if self.vm2: + self.cloud.delete_server( + self.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + super().clean() diff --git a/functest/opnfv_tests/sdn/odl/odl.py b/functest/opnfv_tests/sdn/odl/odl.py index 6c05c0181..72c38ce2c 100644 --- a/functest/opnfv_tests/sdn/odl/odl.py +++ b/functest/opnfv_tests/sdn/odl/odl.py @@ -25,11 +25,12 @@ import os import re import sys +import os_client_config from six.moves import urllib +from xtesting.core import robotframework -from functest.core import robotframework -from functest.utils import constants -import functest.utils.openstack_utils as op_utils +from functest.utils import config +from functest.utils import env __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" @@ -37,7 +38,7 @@ __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" class ODLTests(robotframework.RobotFramework): """ODL test runner.""" - odl_test_repo = constants.CONST.__getattribute__('dir_repo_odl_test') + odl_test_repo = getattr(config.CONF, 'dir_repo_odl_test') neutron_suite_dir = os.path.join( odl_test_repo, "csit/suites/openstack/neutron") basic_suite_dir = os.path.join( @@ -48,9 +49,9 @@ class ODLTests(robotframework.RobotFramework): __logger = logging.getLogger(__name__) def __init__(self, **kwargs): - super(ODLTests, self).__init__(**kwargs) + super().__init__(**kwargs) self.res_dir = os.path.join( - constants.CONST.__getattribute__('dir_results'), 'odl') + getattr(config.CONF, 'dir_results'), 'odl') self.xml_file = os.path.join(self.res_dir, 'output.xml') @classmethod @@ -65,10 +66,10 @@ class ODLTests(robotframework.RobotFramework): try: for line in fileinput.input(cls.odl_variables_file, inplace=True): - print(re.sub("@{AUTH}.*", - "@{{AUTH}} {} {}".format( - odlusername, odlpassword), - line.rstrip())) + print(re.sub( + "@{AUTH}.*", + f"@{{AUTH}} {odlusername} {odlpassword}", + line.rstrip())) return True except Exception: # pylint: disable=broad-except cls.__logger.exception("Cannot set ODL creds:") @@ -110,9 +111,8 @@ class ODLTests(robotframework.RobotFramework): odlusername = kwargs['odlusername'] odlpassword = kwargs['odlpassword'] osauthurl = kwargs['osauthurl'] - keystoneurl = "{}://{}".format( - urllib.parse.urlparse(osauthurl).scheme, - urllib.parse.urlparse(osauthurl).netloc) + keystoneurl = (f"{urllib.parse.urlparse(osauthurl).scheme}://" + f"{urllib.parse.urlparse(osauthurl).netloc}") variable = ['KEYSTONEURL:' + keystoneurl, 'NEUTRONURL:' + kwargs['neutronurl'], 'OS_AUTH_URL:"' + osauthurl + '"', @@ -134,12 +134,12 @@ class ODLTests(robotframework.RobotFramework): else: if not self.set_robotframework_vars(odlusername, odlpassword): return self.EX_RUN_ERROR - return super(ODLTests, self).run(variable=variable, suites=suites) + return super().run(variable=variable, suites=suites) def run(self, **kwargs): """Run suites in OPNFV environment - It basically check env vars to call main() with the keywords + It basically checks env vars to call main() with the keywords required. Args: @@ -155,17 +155,19 @@ class ODLTests(robotframework.RobotFramework): suites = kwargs["suites"] except KeyError: pass - kwargs = {'neutronurl': op_utils.get_endpoint( - service_type='network')} - kwargs['odlip'] = urllib.parse.urlparse( - kwargs['neutronurl']).hostname - kwargs['odlwebport'] = '8080' - kwargs['odlrestconfport'] = '8181' - kwargs['odlusername'] = 'admin' - kwargs['odlpassword'] = 'admin' - installer_type = None - if 'INSTALLER_TYPE' in os.environ: - installer_type = os.environ['INSTALLER_TYPE'] + cloud = os_client_config.make_shade() + neutron_id = cloud.search_services('neutron')[0].id + endpoint = cloud.search_endpoints( + filters={ + 'interface': os.environ.get( + 'OS_INTERFACE', 'public').replace('URL', ''), + 'service_id': neutron_id})[0].url + kwargs = {'neutronurl': endpoint} + kwargs['odlip'] = env.get('SDN_CONTROLLER_IP') + kwargs['odlwebport'] = env.get('SDN_CONTROLLER_WEBPORT') + kwargs['odlrestconfport'] = env.get('SDN_CONTROLLER_RESTCONFPORT') + kwargs['odlusername'] = env.get('SDN_CONTROLLER_USER') + kwargs['odlpassword'] = env.get('SDN_CONTROLLER_PASSWORD') kwargs['osusername'] = os.environ['OS_USERNAME'] kwargs['osuserdomainname'] = os.environ.get( 'OS_USER_DOMAIN_NAME', 'Default') @@ -174,27 +176,10 @@ class ODLTests(robotframework.RobotFramework): 'OS_PROJECT_DOMAIN_NAME', 'Default') kwargs['osauthurl'] = os.environ['OS_AUTH_URL'] kwargs['ospassword'] = os.environ['OS_PASSWORD'] - if installer_type == 'fuel': - kwargs['odlwebport'] = '8181' - kwargs['odlrestconfport'] = '8282' - elif installer_type == 'apex' or installer_type == 'netvirt': - kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] - kwargs['odlwebport'] = '8081' - kwargs['odlrestconfport'] = '8081' - elif installer_type == 'joid': - kwargs['odlip'] = os.environ['SDN_CONTROLLER'] - elif installer_type == 'compass': - kwargs['odlrestconfport'] = '8080' - elif installer_type == 'daisy': - kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] - kwargs['odlwebport'] = '8181' - kwargs['odlrestconfport'] = '8087' - else: - kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] + assert kwargs['odlip'] except KeyError as ex: - self.__logger.error("Cannot run ODL testcases. " - "Please check env var: " - "%s", str(ex)) + self.__logger.error( + "Cannot run ODL testcases. Please check env var: %s", str(ex)) return self.EX_RUN_ERROR except Exception: # pylint: disable=broad-except self.__logger.exception("Cannot run ODL testcases.") @@ -203,7 +188,7 @@ class ODLTests(robotframework.RobotFramework): return self.run_suites(suites, **kwargs) -class ODLParser(object): # pylint: disable=too-few-public-methods +class ODLParser(): # pylint: disable=too-few-public-methods """Parser to run ODL test suites.""" def __init__(self): @@ -274,7 +259,6 @@ def main(): return result if args['pushtodb']: return odl.push_to_db() - else: - return result + return result except Exception: # pylint: disable=broad-except return robotframework.RobotFramework.EX_RUN_ERROR diff --git a/functest/opnfv_tests/vnf/epc/juju_epc.py b/functest/opnfv_tests/vnf/epc/juju_epc.py index 3146b935c..1cf240b80 100644 --- a/functest/opnfv_tests/vnf/epc/juju_epc.py +++ b/functest/opnfv_tests/vnf/epc/juju_epc.py @@ -8,159 +8,220 @@ # http://www.apache.org/licenses/LICENSE-2.0 """Juju testcase implementation.""" +import errno import logging -import shutil import os import time import json +import re import sys -from copy import deepcopy -from urlparse import urljoin - -import functest.core.vnf as vnf -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.utils.constants import CONST -import functest.utils.openstack_utils as os_utils +from copy import deepcopy import pkg_resources -from snaps.openstack.os_credentials import OSCreds -from snaps.openstack.create_network import (NetworkSettings, - SubnetSettings, OpenStackNetwork) -from snaps.openstack.create_router import (RouterSettings, OpenStackRouter) -from snaps.openstack.create_flavor import (FlavorSettings, OpenStackFlavor) -from snaps.openstack.create_image import (ImageSettings, OpenStackImage) -from snaps.openstack.tests import openstack_tests -from snaps.openstack.utils import keystone_utils -import yaml +import scp + +from functest.core import singlevm +from functest.utils import config +from functest.utils import env +from functest.utils import functest_utils __author__ = "Amarendra Meher <amarendra@rebaca.com>" __author__ = "Soumaya K Nayek <soumaya.nayek@rebaca.com>" +CLOUD_TEMPLATE = """clouds: + abot-epc: + type: openstack + auth-types: [userpass] + endpoint: {url} + regions: + {region}: + endpoint: {url}""" + +CREDS_TEMPLATE2 = """credentials: + abot-epc: + default-credential: abot-epc + abot-epc: + auth-type: userpass + password: '{pass}' + project-domain-name: {project_domain_n} + tenant-name: {tenant_n}""" + +CREDS_TEMPLATE = """credentials: + abot-epc: + default-credential: abot-epc + abot-epc: + auth-type: userpass + password: '{pass}' + project-domain-name: {project_domain_n} + tenant-name: {tenant_n} + user-domain-name: {user_domain_n} + username: {user_n}""" -class JujuEpc(vnf.VnfOnBoarding): + +class JujuEpc(singlevm.SingleVm2): # pylint:disable=too-many-instance-attributes """Abot EPC deployed with JUJU Orchestrator Case""" __logger = logging.getLogger(__name__) - default_region_name = "RegionOne" + cidr = '192.168.120.0/24' + + filename = ('/home/opnfv/functest/images/' + 'ubuntu-16.04-server-cloudimg-amd64-disk1.img') + filename_alt = ('/home/opnfv/functest/images/' + 'ubuntu-14.04-server-cloudimg-amd64-disk1.img') + + flavor_ram = 2048 + flavor_vcpus = 1 + flavor_disk = 10 + flavor_alt_ram = 4096 + flavor_alt_vcpus = 1 + flavor_alt_disk = 10 + username = 'ubuntu' + juju_timeout = '4800' def __init__(self, **kwargs): if "case_name" not in kwargs: kwargs["case_name"] = "juju_epc" - super(JujuEpc, self).__init__(**kwargs) + super().__init__(**kwargs) # Retrieve the configuration self.case_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/vnf/epc') try: - self.config = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) - except Exception: - raise Exception("VNF config file not found") - config_file = os.path.join(self.case_dir, self.config) + self.config = getattr( + config.CONF, f'vnf_{self.case_name}_config') + except Exception as exc: + raise Exception("VNF config file not found") from exc + self.config_file = os.path.join(self.case_dir, self.config) self.orchestrator = dict( - requirements=get_config("orchestrator.requirements", config_file), - ) + requirements=functest_utils.get_parameter_from_yaml( + "orchestrator.requirements", self.config_file)) self.created_object = [] - self.snaps_creds = '' - - self.os_creds = openstack_tests.get_credentials( - os_env_file=CONST.__getattribute__('openstack_creds')) - self.details['orchestrator'] = dict( - name=get_config("orchestrator.name", config_file), - version=get_config("orchestrator.version", config_file), + name=functest_utils.get_parameter_from_yaml( + "orchestrator.name", self.config_file), + version=functest_utils.get_parameter_from_yaml( + "orchestrator.version", self.config_file), status='ERROR', result='' ) self.vnf = dict( - descriptor=get_config("vnf.descriptor", config_file), - requirements=get_config("vnf.requirements", config_file) + descriptor=functest_utils.get_parameter_from_yaml( + "vnf.descriptor", self.config_file), + requirements=functest_utils.get_parameter_from_yaml( + "vnf.requirements", self.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", self.config_file), + version=functest_utils.get_parameter_from_yaml( + "vnf.version", self.config_file), ) self.__logger.debug("VNF configuration: %s", self.vnf) self.details['test_vnf'] = dict( - name=get_config("vnf_test_suite.name", config_file), - version=get_config("vnf_test_suite.version", config_file), - tag_name=get_config("vnf_test_suite.tag_name", config_file) + name=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.name", self.config_file), + version=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.version", self.config_file), + tag_name=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.tag_name", self.config_file) ) - self.images = get_config("tenant_images", config_file) - self.__logger.info("Images needed for vEPC: %s", self.images) - self.keystone_client = os_utils.get_keystone_client() - self.glance_client = os_utils.get_glance_client() - self.neutron_client = os_utils.get_neutron_client() - self.nova_client = os_utils.get_nova_client() - self.sec_group_id = None - self.public_auth_url = None - self.creds = None - self.filename = None - - def prepare(self): - """Prepare testcase (Additional pre-configuration steps).""" - self.__logger.debug("OS Credentials: %s", os_utils.get_credentials()) - super(JujuEpc, self).prepare() - - self.__logger.info("Additional pre-configuration steps") - self.public_auth_url = keystone_utils.get_endpoint( - self.snaps_creds, 'identity') - # it enforces a versioned public identity endpoint as juju simply - # adds /auth/tokens wich fails vs an unversioned endpoint. - if not self.public_auth_url.endswith(('v3', 'v3/', 'v2.0', 'v2.0/')): - self.public_auth_url = urljoin(self.public_auth_url, 'v3') - - self.creds = { - "tenant": self.tenant_name, - "username": self.tenant_name, - "password": self.tenant_name, - "auth_url": os_utils.get_credentials()['auth_url'] - } - - self.snaps_creds = OSCreds( - username=self.creds['username'], - password=self.creds['password'], - auth_url=self.creds['auth_url'], - project_name=self.creds['tenant'], - identity_api_version=int(os_utils.get_keystone_client_version())) + self.res_dir = os.path.join( + getattr(config.CONF, 'dir_results'), self.case_name) + try: + self.public_auth_url = self.get_public_auth_url(self.orig_cloud) + if not self.public_auth_url.endswith(('v3', 'v3/')): + self.public_auth_url = f"{self.public_auth_url}/v3" + except Exception: # pylint: disable=broad-except + self.public_auth_url = None + self.sec = None + self.image_alt = None + self.flavor_alt = None + + def _install_juju(self): + (_, stdout, stderr) = self.ssh.exec_command( + 'sudo snap install juju --channel=2.3/stable --classic') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() + + def _install_juju_wait(self): + (_, stdout, stderr) = self.ssh.exec_command( + 'sudo apt-get update && sudo apt-get install python3-pip -y && ' + 'sudo pip3 install juju_wait===2.6.4') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() + + def _register_cloud(self): + assert self.public_auth_url + self.__logger.info("Creating Cloud for Abot-epc .....") + clouds_yaml = os.path.join(self.res_dir, "clouds.yaml") cloud_data = { 'url': self.public_auth_url, - 'pass': self.tenant_name, - 'tenant_n': self.tenant_name, - 'user_n': self.tenant_name, - 'region': os.environ.get( - "OS_REGION_NAME", self.default_region_name) - } - self.__logger.info("Cloud DATA: %s", cloud_data) - self.filename = os.path.join(self.case_dir, 'abot-epc.yaml') - self.__logger.info("Create %s to add cloud info", self.filename) - write_config(self.filename, CLOUD_TEMPLATE, **cloud_data) - - if self.snaps_creds.identity_api_version == 3: - append_config(self.filename, '{}'.format( - os_utils.get_credentials()['project_domain_name']), - '{}'.format(os_utils.get_credentials()['user_domain_name'])) - - self.__logger.info("Upload some OS images if it doesn't exist") - for image_name, image_file in self.images.iteritems(): - self.__logger.info("image: %s, file: %s", image_name, image_file) - if image_file and image_name: - image_creator = OpenStackImage( - self.snaps_creds, - ImageSettings(name=image_name, - image_user='cloud', - img_format='qcow2', - image_file=image_file)) - image_creator.create() - self.created_object.append(image_creator) + 'region': self.cloud.region_name if self.cloud.region_name else ( + 'RegionOne')} + with open(clouds_yaml, 'w', encoding='utf-8') as yfile: + yfile.write(CLOUD_TEMPLATE.format(**cloud_data)) + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put(clouds_yaml, remote_path='~/') + (_, stdout, stderr) = self.ssh.exec_command( + '/snap/bin/juju add-cloud abot-epc -f clouds.yaml --replace') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() + + def _register_credentials(self): + self.__logger.info("Creating Credentials for Abot-epc .....") + credentials_yaml = os.path.join(self.res_dir, "credentials.yaml") + creds_data = { + 'pass': self.project.password, + 'tenant_n': self.project.project.name, + 'user_n': self.project.user.name, + 'project_domain_n': self.cloud.auth.get( + "project_domain_name", "Default"), + 'user_domain_n': self.cloud.auth.get( + "user_domain_name", "Default")} + with open(credentials_yaml, 'w', encoding='utf-8') as yfile: + yfile.write(CREDS_TEMPLATE.format(**creds_data)) + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put(credentials_yaml, remote_path='~/') + (_, stdout, stderr) = self.ssh.exec_command( + '/snap/bin/juju add-credential abot-epc -f credentials.yaml ' + ' --replace --debug') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() + + def _publish_image(self): + region_name = self.cloud.region_name if self.cloud.region_name else ( + 'RegionOne') + (_, stdout, stderr) = self.ssh.exec_command( + '/snap/bin/juju metadata generate-image -d /home/ubuntu ' + f'-i {self.image.id} -s xenial -r {region_name} ' + f'-u {self.public_auth_url}') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() + + def publish_image_alt(self, name=None): + image_alt = super().publish_image_alt(name) + region_name = self.cloud.region_name if self.cloud.region_name else ( + 'RegionOne') + (_, stdout, stderr) = self.ssh.exec_command( + '/snap/bin/juju metadata generate-image -d /home/ubuntu ' + f'-i {image_alt.id} -s trusty -r {region_name} ' + f'-u {self.public_auth_url}') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return image_alt def deploy_orchestrator(self): # pylint: disable=too-many-locals """ @@ -168,235 +229,181 @@ class JujuEpc(vnf.VnfOnBoarding): Bootstrap juju """ - self.__logger.info("Deployed Orchestrator") - private_net_name = CONST.__getattribute__( - 'vnf_{}_private_net_name'.format(self.case_name)) - private_subnet_name = CONST.__getattribute__( - 'vnf_{}_private_subnet_name'.format(self.case_name)) - private_subnet_cidr = CONST.__getattribute__( - 'vnf_{}_private_subnet_cidr'.format(self.case_name)) - abot_router = CONST.__getattribute__( - 'vnf_{}_external_router'.format(self.case_name)) - dns_nameserver = CONST.__getattribute__( - 'vnf_{}_dns_nameserver'.format(self.case_name)) - ext_net_name = CONST.__getattribute__( - 'vnf_{}_external_network_name'.format(self.case_name)) - - self.__logger.info("Creating full network ...") - subnet_settings = SubnetSettings(name=private_subnet_name, - cidr=private_subnet_cidr, - dns_nameservers=dns_nameserver) - network_settings = NetworkSettings(name=private_net_name, - subnet_settings=[subnet_settings]) - network_creator = OpenStackNetwork(self.snaps_creds, network_settings) - network_creator.create() - self.created_object.append(network_creator) - - ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds) - self.__logger.info("Creating network Router ....") - router_creator = OpenStackRouter( - self.snaps_creds, - RouterSettings( - name=abot_router, - external_gateway=ext_net_name, - internal_subnets=[subnet_settings.name])) - router_creator.create() - self.created_object.append(router_creator) - self.__logger.info("Creating Flavor ....") - flavor_settings = FlavorSettings( - name=self.orchestrator['requirements']['flavor']['name'], - ram=self.orchestrator['requirements']['flavor']['ram_min'], - disk=10, - vcpus=1) - flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings) - self.__logger.info("Juju Bootstrap: Skip creation of flavors") - flavor_creator.create() - self.created_object.append(flavor_creator) - self.__logger.info("Installing Dependency Packages .......") - source_dir = "/src/epc-requirements/juju_bin_build" - if os.path.exists(source_dir): - shutil.rmtree(source_dir) - os.makedirs(source_dir) - os.environ['GOPATH'] = str(source_dir) - os.environ['GOBIN'] = str(source_dir) + "/bin" - os.environ['PATH'] = ((os.path.expandvars('$GOPATH')) + ":" + - (os.path.expandvars('$GOBIN')) + ":" + - (os.path.expandvars('$PATH'))) - os.system('go get -d -v github.com/juju/juju/...') - os.chdir(source_dir + "/src" + "/github.com" + "/juju" + "/juju") - os.system('git checkout tags/juju-2.2.5') - os.system('go get github.com/rogpeppe/godeps') - os.system('godeps -u dependencies.tsv') - os.system('go install -v github.com/juju/juju/...') - self.__logger.info("Creating Cloud for Abot-epc .....") - os.system('juju add-cloud abot-epc -f {}'.format(self.filename)) - os.system('juju add-credential abot-epc -f {}'.format(self.filename)) - for image_name in self.images.keys(): - self.__logger.info("Generating Metadata for %s", image_name) - image_id = os_utils.get_image_id(self.glance_client, image_name) - os.system( - 'juju metadata generate-image -d ~ -i {} -s {} -r ' - '{} -u {}'.format( - image_id, image_name, - os.environ.get("OS_REGION_NAME", self.default_region_name), - self.public_auth_url)) - net_id = os_utils.get_network_id(self.neutron_client, private_net_name) - self.__logger.info("Credential information : %s", net_id) - juju_bootstrap_command = ('juju bootstrap abot-epc abot-controller ' - '--config network={} --metadata-source ~ ' - '--config ssl-hostname-verification=false ' - '--constraints mem=2G --bootstrap-series ' - 'xenial ' - '--config use-floating-ip=true --debug'. - format(net_id)) - os.system(juju_bootstrap_command) + self._publish_image() + self.image_alt = self.publish_image_alt() + self.flavor_alt = self.create_flavor_alt() + self.__logger.info("Starting Juju Bootstrap process...") + region_name = self.cloud.region_name if self.cloud.region_name else ( + 'RegionOne') + (_, stdout, stderr) = self.ssh.exec_command( + f'timeout {JujuEpc.juju_timeout} ' + f'/snap/bin/juju bootstrap abot-epc/{region_name} abot-controller ' + '--agent-version 2.3.9 --metadata-source /home/ubuntu ' + '--constraints mem=2G --bootstrap-series xenial ' + f'--config network={self.network.id} ' + '--config ssl-hostname-verification=false ' + f'--config external-network={self.ext_net.id} ' + '--config use-floating-ip=true ' + '--config use-default-secgroup=true ' + '--debug') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() + + def check_app(self, name='abot-epc-basic', status='active'): + """Check application status.""" + for i in range(10): + (_, stdout, stderr) = self.ssh.exec_command( + f'/snap/bin/juju status --format short {name}') + output = stdout.read().decode("utf-8") + self.__logger.debug("stdout:\n%s", output) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + continue + ret = re.search( + rf'(?=workload:({status})\))', output) + if ret: + self.__logger.info("%s workload is %s", name, status) + break + self.__logger.info( + "loop %d: %s workload differs from %s", i + 1, name, status) + time.sleep(60) + else: + self.__logger.error("%s workload differs from %s", name, status) + return False return True def deploy_vnf(self): """Deploy ABOT-OAI-EPC.""" self.__logger.info("Upload VNFD") - descriptor = self.vnf['descriptor'] - self.__logger.info("Get or create flavor for all Abot-EPC") - flavor_settings = FlavorSettings( - name=self.vnf['requirements']['flavor']['name'], - ram=self.vnf['requirements']['flavor']['ram_min'], - disk=10, - vcpus=1) - flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put( + '/src/epc-requirements/abot_charm', remote_path='~/', + recursive=True) self.__logger.info("Deploying Abot-epc bundle file ...") - os.system('juju deploy {}'.format('/' + descriptor.get('file_name'))) - self.__logger.info("Waiting for instances .....") - status = os.system('juju-wait') - self.__logger.info("juju wait completed: %s", status) - self.__logger.info("Deployed Abot-epc on Openstack") - if status == 0: - instances = os_utils.get_instances(self.nova_client) - for items in instances: - metadata = get_instance_metadata(self.nova_client, items) - if 'juju-units-deployed' in metadata: - sec_group = ('juju-' + metadata['juju-controller-uuid'] + - '-' + metadata['juju-model-uuid']) - self.sec_group_id = os_utils.get_security_group_id( - self.neutron_client, sec_group) - break - self.__logger.info("Adding Security group rule....") - os_utils.create_secgroup_rule(self.neutron_client, - self.sec_group_id, 'ingress', 132) - self.__logger.info("Copying the feature files to Abot_node ") - os.system('juju scp -- -r {}/featureFiles abot-' - 'epc-basic/0:~/'.format(self.case_dir)) - self.__logger.info("Copying the feature files in Abot_node ") - os.system("juju ssh abot-epc-basic/0 'sudo rsync -azvv " - "~/featureFiles /etc/rebaca-test-suite" - "/featureFiles'") - count = 0 - while count < 10: - epcstatus = os.system('juju status oai-epc | ' - 'grep {} | grep {} | grep {}' - .format('EPC', 'is', 'running')) - if epcstatus == 0: - break - else: - time.sleep(60) - count = count + 1 - os.system('juju-wait') - return True - return False + (_, stdout, stderr) = self.ssh.exec_command( + 'sudo mkdir -p /src/epc-requirements && ' + 'sudo mv abot_charm /src/epc-requirements/abot_charm && ' + '/snap/bin/juju deploy ' + '/src/epc-requirements/abot_charm/functest-abot-epc-bundle/' + 'bundle.yaml') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + return not stdout.channel.recv_exit_status() + (_, stdout, stderr) = self.ssh.exec_command( + 'PATH=/snap/bin/:$PATH ' + f'timeout {JujuEpc.juju_timeout} juju-wait') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + return not stdout.channel.recv_exit_status() + self.__logger.info("Checking status of ABot and EPC units ...") + (_, stdout, stderr) = self.ssh.exec_command('/snap/bin/juju status') + output = stdout.read().decode("utf-8") + self.__logger.debug("stdout:\n%s", output) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + return not stdout.channel.recv_exit_status() + for app in ['abot-epc-basic', 'oai-epc', 'oai-hss']: + if not self.check_app(app): + return False + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.put( + f'{self.case_dir}/featureFiles', remote_path='~/', + recursive=True) + (_, stdout, stderr) = self.ssh.exec_command( + f'timeout {JujuEpc.juju_timeout} /snap/bin/juju scp -- -r -v ' + '~/featureFiles abot-epc-basic/0:/etc/rebaca-test-suite/') + output = stdout.read().decode("utf-8") + self.__logger.debug("stdout:\n%s", output) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + return not stdout.channel.recv_exit_status() def test_vnf(self): """Run test on ABoT.""" start_time = time.time() - self.__logger.info("Running VNF Test cases....") - os.system('juju run-action abot-epc-basic/0 run ' - 'tagnames={}'.format(self.details['test_vnf']['tag_name'])) - os.system('juju-wait') + (_, stdout, stderr) = self.ssh.exec_command( + "/snap/bin/juju run-action abot-epc-basic/0 " + f"run tagnames={self.details['test_vnf']['tag_name']}") + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + return not stdout.channel.recv_exit_status() + (_, stdout, stderr) = self.ssh.exec_command( + 'PATH=/snap/bin/:$PATH ' + f'timeout {JujuEpc.juju_timeout} juju-wait') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + return not stdout.channel.recv_exit_status() duration = time.time() - start_time self.__logger.info("Getting results from Abot node....") - os.system('juju scp abot-epc-basic/0:/var/lib/abot-' - 'epc-basic/artifacts/TestResults.json {}/.' - .format(self.case_dir)) + (_, stdout, stderr) = self.ssh.exec_command( + f'timeout {JujuEpc.juju_timeout} /snap/bin/juju scp ' + '-- -v abot-epc-basic/0:' + '/var/lib/abot-epc-basic/artifacts/TestResults.json .') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + if stdout.channel.recv_exit_status(): + return not stdout.channel.recv_exit_status() + scpc = scp.SCPClient(self.ssh.get_transport()) + scpc.get('TestResults.json', self.res_dir) self.__logger.info("Parsing the Test results...") - res = (process_abot_test_result('{}/TestResults.' - 'json'.format(self.case_dir))) + res = process_abot_test_result(f'{self.res_dir}/TestResults.json') short_result = sig_test_format(res) self.__logger.info(short_result) - self.details['test_vnf'].update(status='PASS', - result=short_result, - full_result=res, - duration=duration) - - self.__logger.info("Test VNF result: Passed: %d, Failed:" - "%d, Skipped: %d", short_result['passed'], - short_result['failures'], short_result['skipped']) + self.details['test_vnf'].update( + status='PASS', result=short_result, full_result=res, + duration=duration) + self.__logger.info( + "Test VNF result: Passed: %d, Failed:%d, Skipped: %d", + short_result['passed'], + short_result['failures'], short_result['skipped']) return True - def clean(self): - """Clean created objects/functions.""" + def execute(self): + """Prepare testcase (Additional pre-configuration steps).""" + assert self.public_auth_url + self.__logger.info("Additional pre-configuration steps") + try: + os.makedirs(self.res_dir) + except OSError as ex: + if ex.errno != errno.EEXIST: + self.__logger.exception("Cannot create %s", self.res_dir) + raise Exception from ex + self.__logger.info("ENV:\n%s", env.string()) try: - if not self.orchestrator['requirements']['preserve_setup']: - self.__logger.info("Removing deployment files...") - testresult = os.path.join(self.case_dir, 'TestResults.json') - if os.path.exists(testresult): - os.remove(testresult) - self.__logger.info("Removing %s file ", self.filename) - if os.path.exists(self.filename): - os.remove(self.filename) - self.__logger.info("Destroying Orchestrator...") - os.system('juju destroy-controller -y abot-controller ' - '--destroy-all-models') + assert self._install_juju() + assert self._install_juju_wait() + assert self._register_cloud() + assert self._register_credentials() + assert self.deploy_orchestrator() + assert self.deploy_vnf() + assert self.test_vnf() except Exception: # pylint: disable=broad-except - self.__logger.warn("Some issue during the undeployment ..") - self.__logger.warn("Tenant clean continue ..") - - if not self.orchestrator['requirements']['preserve_setup']: - self.__logger.info('Remove the Abot_epc OS object ..') - for creator in reversed(self.created_object): - try: - creator.clean() - except Exception as exc: # pylint: disable=broad-except - self.__logger.error('Unexpected error cleaning - %s', exc) - - self.__logger.info("Releasing all the floating IPs") - floating_ips = os_utils.get_floating_ips(self.neutron_client) - tenant_id = os_utils.get_tenant_id(self.keystone_client, - self.tenant_name) - self.__logger.info("TENANT ID : %s", tenant_id) - for item in floating_ips: - if item['tenant_id'] == tenant_id: - os_utils.delete_floating_ip(self.neutron_client, - item['id']) - self.__logger.info("Cleaning Projects and Users") - for creator in reversed(self.created_object): - try: - creator.clean() - except Exception as exc: # pylint: disable=broad-except - self.__logger.error('Unexpected error cleaning - %s', exc) - return True - + self.__logger.exception("juju_epc failed") + return 1 + return 0 -# ---------------------------------------------------------- -# -# YAML UTILS -# -# ----------------------------------------------------------- -def get_config(parameter, file_path): - """ - 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 + def clean(self): + """Clean created objects/functions.""" + (_, stdout, stderr) = self.ssh.exec_command( + '/snap/bin/juju debug-log --replay --no-tail') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + (_, stdout, stderr) = self.ssh.exec_command( + '/snap/bin/juju destroy-controller -y abot-controller ' + '--destroy-all-models') + self.__logger.debug("stdout:\n%s", stdout.read().decode("utf-8")) + self.__logger.debug("stderr:\n%s", stderr.read().decode("utf-8")) + for fip in self.cloud.list_floating_ips(): + self.cloud.delete_floating_ip(fip.id) + if self.image_alt: + self.cloud.delete_image(self.image_alt) + if self.flavor_alt: + self.orig_cloud.delete_flavor(self.flavor_alt.id) + super().clean() def sig_test_format(sig_test): @@ -422,7 +429,7 @@ def sig_test_format(sig_test): def process_abot_test_result(file_path): """ Process ABoT Result """ - with open(file_path) as test_result: + with open(file_path, encoding='utf-8') as test_result: data = json.load(test_result) res = [] for tests in data: @@ -432,7 +439,7 @@ def process_abot_test_result(file_path): for steps in flatten_steps: steps['result'] = steps['step_status'] res.append(steps) - except: + except Exception: # pylint: disable=broad-except logging.error("Could not post data to ElasticSearch host") raise return res @@ -474,49 +481,3 @@ def update_data(obj): raise return obj - - -def get_instance_metadata(nova_client, instance): - """ Get instance Metadata - Instance ID """ - try: - instance = nova_client.servers.get(instance.id) - return instance.metadata - except Exception as exc: # pylint: disable=broad-except - logging.error("Error [get_instance_status(nova_client)]: %s", exc) - return None - - -CLOUD_TEMPLATE = """clouds: - abot-epc: - type: openstack - auth-types: [userpass] - endpoint: {url} - regions: - {region}: - endpoint: {url} -credentials: - abot-epc: - abot-epc: - auth-type: userpass - password: {pass} - tenant-name: {tenant_n} - username: {user_n}""" - - -def write_config(fname, template, **kwargs): - """ Generate yaml from template for addinh cloud in juju """ - with open(fname, 'w') as yfile: - yfile.write(template.format(**kwargs)) - - -def append_config(file_name, p_domain, u_domain): - """ Append values into a yaml file """ - with open(file_name) as yfile: - doc = yaml.load(yfile) - doc['credentials']['abot-epc']['abot-epc']['project-domain-name'] = ( - p_domain) - doc['credentials']['abot-epc']['abot-epc']['user-domain-name'] = ( - u_domain) - - with open(file_name, 'w') as yfile: - yaml.safe_dump(doc, yfile, default_flow_style=False) diff --git a/functest/opnfv_tests/vnf/ims/clearwater.py b/functest/opnfv_tests/vnf/ims/clearwater.py new file mode 100644 index 000000000..4c143fd70 --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/clearwater.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# +# Copyright (c) 2017 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 + +"""Ease testing any Clearwater deployment""" + +import logging +import os +import re +import time + +import pkg_resources +import requests + +from functest.utils import config +import functest.utils.functest_utils as ft_utils + +__author__ = ("Valentin Boucher <valentin.boucher@orange.com>, " + "Helen Yao <helanyao@gmail.com>") + + +class ClearwaterTesting(): + """vIMS clearwater base usable by several orchestrators""" + + def __init__(self, case_name, bono_ip, ellis_ip): + self.logger = logging.getLogger(__name__) + self.case_dir = pkg_resources.resource_filename( + 'functest', 'opnfv_tests/vnf/ims') + self.data_dir = getattr(config.CONF, 'dir_ims_data') + self.result_dir = os.path.join( + getattr(config.CONF, 'dir_results'), case_name) + self.test_dir = getattr(config.CONF, 'dir_repo_vims_test') + + if not os.path.exists(self.data_dir): + os.makedirs(self.data_dir) + if not os.path.exists(self.result_dir): + os.makedirs(self.result_dir) + + self.ellis_ip = ellis_ip + self.bono_ip = bono_ip + + def availability_check(self, signup_code='secret', two_numbers=False): + """Create one or two numbers""" + assert self.ellis_ip + output_dict = {} + self.logger.debug('Ellis IP: %s', self.ellis_ip) + output_dict['ellis_ip'] = self.ellis_ip + account_url = f'http://{self.ellis_ip}/accounts' + params = {"password": "functest", + "full_name": "opnfv functest user", + "email": "functest@opnfv.org", + "signup_code": signup_code} + output_dict['login'] = params + + number_res = self._create_ellis_account(account_url, params) + output_dict['number'] = number_res + + session_url = f'http://{self.ellis_ip}/session' + session_data = { + 'username': params['email'], + 'password': params['password'], + 'email': params['email'] + } + cookies = self._get_ellis_session_cookies(session_url, session_data) + + number_url = ( + f"http://{self.ellis_ip}/accounts/{params['email']}/numbers") + self.logger.debug('Create 1st calling number on Ellis') + number_res = self._create_ellis_number(number_url, cookies) + + if two_numbers: + self.logger.debug('Create 2nd calling number on Ellis') + number_res = self._create_ellis_number(number_url, cookies) + output_dict['number2'] = number_res + + return output_dict + + def _create_ellis_account(self, account_url, params): + i = 80 + for iloop in range(i): + try: + req = requests.post(account_url, data=params) + if req.status_code == 201: + account_res = req.json() + self.logger.info( + 'Account %s is created on Ellis\n%s', + params.get('full_name'), account_res) + return account_res + raise Exception("Cannot create ellis account") + except Exception: # pylint: disable=broad-except + self.logger.info( + "try %s: cannot create ellis account", iloop + 1) + time.sleep(30) + raise Exception( + f"Unable to create an account {params.get('full_name')}") + + def _get_ellis_session_cookies(self, session_url, params): + i = 15 + for iloop in range(i): + try: + req = requests.post(session_url, data=params) + if req.status_code == 201: + cookies = req.cookies + self.logger.debug('cookies: %s', cookies) + return cookies + raise Exception('Failed to get cookies for Ellis') + except Exception: # pylint: disable=broad-except + self.logger.info( + "try %s: cannot get cookies for Ellis", iloop + 1) + time.sleep(10) + raise Exception('Failed to get cookies for Ellis') + + def _create_ellis_number(self, number_url, cookies): + i = 30 + for iloop in range(i): + try: + req = requests.post(number_url, cookies=cookies) + if req.status_code == 200: + number_res = req.json() + self.logger.info( + 'Calling number is created: %s', number_res) + return number_res + if req and req.json(): + reason = req.json()['reason'] + else: + reason = req + self.logger.info("cannot create a number: %s", reason) + raise Exception('Failed to create a number') + except Exception: # pylint: disable=broad-except + self.logger.info( + "try %s: cannot create a number", iloop + 1) + time.sleep(25) + raise Exception('Failed to create a number') + + def run_clearwater_live_test(self, public_domain, signup_code='secret'): + """Run the Clearwater live tests + + It first runs dnsmasq to reach clearwater services by FQDN and then the + Clearwater live tests. All results are saved in ims_test_output.txt. + + Returns: + - a dict containing the overall results + - None on error + """ + # pylint: disable=too-many-locals,too-many-arguments + self.logger.info('Run Clearwater live test') + script = (f'cd {self.test_dir};' + f'rake test[{public_domain}] SIGNUP_CODE={signup_code}') + if self.bono_ip and self.ellis_ip: + subscript = f' PROXY={self.bono_ip} ELLIS={self.ellis_ip}' + script = f'{script}{subscript}' + script = f'{script} --trace' + cmd = f"/bin/sh -c '{script}'" + self.logger.debug('Live test cmd: %s', cmd) + output_file = os.path.join(self.result_dir, "ims_test_output.txt") + ft_utils.execute_command(cmd, + error_msg='Clearwater live test failed', + output_file=output_file) + + with open(output_file, 'r', encoding='utf-8') as ofile: + result = ofile.read() + + if result != "": + self.logger.debug(result) + + vims_test_result = {} + try: + grp = re.search( + r'^(\d+) failures out of (\d+) tests run.*\n' + r'(\d+) tests skipped$', result, re.MULTILINE | re.DOTALL) + assert grp + vims_test_result["failures"] = int(grp.group(1)) + vims_test_result["total"] = int(grp.group(2)) + vims_test_result["skipped"] = int(grp.group(3)) + vims_test_result['passed'] = ( + int(grp.group(2)) - int(grp.group(3)) - int(grp.group(1))) + if vims_test_result['total'] - vims_test_result['skipped'] > 0: + vnf_test_rate = vims_test_result['passed'] / ( + vims_test_result['total'] - vims_test_result['skipped']) + else: + vnf_test_rate = 0 + except Exception: # pylint: disable=broad-except + self.logger.exception("Cannot parse live tests results") + return None, 0 + return vims_test_result, vnf_test_rate diff --git a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py b/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py deleted file mode 100644 index 8851f7a48..000000000 --- a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2017 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 logging -import os -import pkg_resources -import shlex -import shutil -import subprocess -import time - -import requests - -import functest.core.vnf as vnf -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - -__author__ = ("Valentin Boucher <valentin.boucher@orange.com>, " - "Helen Yao <helanyao@gmail.com>") - - -class ClearwaterOnBoardingBase(vnf.VnfOnBoarding): - """ vIMS clearwater base usable by several orchestrators""" - - def __init__(self, **kwargs): - self.logger = logging.getLogger(__name__) - super(ClearwaterOnBoardingBase, self).__init__(**kwargs) - self.case_dir = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/vnf/ims') - self.data_dir = CONST.__getattribute__('dir_ims_data') - self.result_dir = os.path.join(CONST.__getattribute__('dir_results'), - self.case_name) - self.test_dir = CONST.__getattribute__('dir_repo_vims_test') - - if not os.path.exists(self.data_dir): - os.makedirs(self.data_dir) - if not os.path.exists(self.result_dir): - os.makedirs(self.result_dir) - - def config_ellis(self, ellis_ip, signup_code='secret', two_numbers=False): - output_dict = {} - self.logger.debug('Configure Ellis: %s', ellis_ip) - output_dict['ellis_ip'] = ellis_ip - account_url = 'http://{0}/accounts'.format(ellis_ip) - params = {"password": "functest", - "full_name": "opnfv functest user", - "email": "functest@opnfv.org", - "signup_code": signup_code} - rq = requests.post(account_url, data=params) - output_dict['login'] = params - if rq.status_code != 201 and rq.status_code != 409: - raise Exception("Unable to create an account for number provision") - self.logger.debug('Account is created on Ellis: %s', params) - - session_url = 'http://{0}/session'.format(ellis_ip) - session_data = { - 'username': params['email'], - 'password': params['password'], - 'email': params['email'] - } - rq = requests.post(session_url, data=session_data) - if rq.status_code != 201: - raise Exception('Failed to get cookie for Ellis') - cookies = rq.cookies - self.logger.debug('Cookies: %s', cookies) - - number_url = 'http://{0}/accounts/{1}/numbers'.format( - ellis_ip, - params['email']) - self.logger.debug('Create 1st calling number on Ellis') - i = 30 - while rq.status_code != 200 and i > 0: - try: - number_res = self.create_ellis_number(number_url, cookies) - break - except: - if i == 1: - raise Exception("Unable to create a number") - self.logger.warn("Unable to create a number. Retry ..") - time.sleep(25) - i = i - 1 - output_dict['number'] = number_res - - if two_numbers: - self.logger.debug('Create 2nd calling number on Ellis') - number_res = self.create_ellis_number(number_url, cookies) - output_dict['number2'] = number_res - - return output_dict - - def create_ellis_number(self, number_url, cookies): - rq = requests.post(number_url, cookies=cookies) - - if rq.status_code != 200: - if rq and rq.json(): - reason = rq.json()['reason'] - else: - reason = rq - raise Exception("Unable to create a number: %s" % reason) - number_res = rq.json() - self.logger.info('Calling number is created: %s', number_res) - return number_res - - def run_clearwater_live_test(self, dns_ip, public_domain, - bono_ip=None, ellis_ip=None, - signup_code='secret'): - self.logger.info('Run Clearwater live test') - dns_file = '/etc/resolv.conf' - dns_file_bak = '/etc/resolv.conf.bak' - self.logger.debug('Backup %s -> %s', dns_file, dns_file_bak) - shutil.copy(dns_file, dns_file_bak) - cmd = ("dnsmasq -d -u root --server=/clearwater.opnfv/{0} " - "-r /etc/resolv.conf.bak".format(dns_ip)) - dnsmasq_process = subprocess.Popen(shlex.split(cmd)) - script = ('echo -e "nameserver {0}" > {1};' - 'cd {2};' - 'rake test[{3}] SIGNUP_CODE={4}' - .format('127.0.0.1', - dns_file, - self.test_dir, - public_domain, - signup_code)) - if bono_ip and ellis_ip: - subscript = ' PROXY={0} ELLIS={1}'.format(bono_ip, ellis_ip) - script = '{0}{1}'.format(script, subscript) - script = ('{0}{1}'.format(script, ' --trace')) - cmd = "/bin/bash -c '{0}'".format(script) - self.logger.debug('Live test cmd: %s', cmd) - output_file = os.path.join(self.result_dir, "ims_test_output.txt") - ft_utils.execute_command(cmd, - error_msg='Clearwater live test failed', - output_file=output_file) - dnsmasq_process.kill() - with open(dns_file_bak, 'r') as bak_file: - result = bak_file.read() - with open(dns_file, 'w') as f: - f.write(result) - - 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 Exception: - self.logger.error("Unable to retrieve test results") - - try: - os.remove(tempFile) - except Exception: - self.logger.error("Deleting file failed") - - return vims_test_result diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py index b8a815c28..b93af7d6d 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py @@ -9,525 +9,254 @@ """CloudifyIms testcase implementation.""" +from __future__ import division + import logging import os import time -from cloudify_rest_client import CloudifyClient -from cloudify_rest_client.executions import Execution -from scp import SCPClient -import yaml - -from functest.energy import energy -from functest.opnfv_tests.openstack.snaps import snaps_utils -import functest.opnfv_tests.vnf.ims.clearwater_ims_base as clearwater_ims_base -from functest.utils.constants import CONST - -from snaps.config.flavor import FlavorConfig -from snaps.config.image import ImageConfig -from snaps.config.keypair import KeypairConfig -from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.config.security_group import ( - Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) -from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig - -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.create_image import OpenStackImage -from snaps.openstack.create_instance import OpenStackVmInstance -from snaps.openstack.create_keypairs import OpenStackKeypair -from snaps.openstack.create_network import OpenStackNetwork -from snaps.openstack.create_router import OpenStackRouter -from snaps.openstack.create_security_group import OpenStackSecurityGroup -from snaps.openstack.utils import keystone_utils +import pkg_resources +import six +from functest.core import cloudify +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@orange.com>" -class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): +class CloudifyIms(cloudify.Cloudify): """Clearwater vIMS deployed with Cloudify Orchestrator Case.""" __logger = logging.getLogger(__name__) + filename_alt = ('/home/opnfv/functest/images/' + 'ubuntu-14.04-server-cloudimg-amd64-disk1.img') + + flavor_alt_ram = 1024 + flavor_alt_vcpus = 1 + flavor_alt_disk = 3 + + quota_security_group = 20 + quota_security_group_rule = 100 + quota_port = 50 + + cop_yaml = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/" + "releases/download/2.14.7/plugin.yaml") + cop_wgn = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/" + "releases/download/2.14.7/cloudify_openstack_plugin-2.14.7-py27" + "-none-linux_x86_64-centos-Core.wgn") + def __init__(self, **kwargs): """Initialize CloudifyIms testcase object.""" if "case_name" not in kwargs: kwargs["case_name"] = "cloudify_ims" - super(CloudifyIms, self).__init__(**kwargs) + super().__init__(**kwargs) # Retrieve the configuration try: - self.config = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) - except Exception: - raise Exception("VNF config file not found") - - self.snaps_creds = '' + self.config = getattr( + 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.orchestrator = dict( - requirements=get_config("orchestrator.requirements", config_file), - ) + self.details['orchestrator'] = dict( - name=get_config("orchestrator.name", config_file), - version=get_config("orchestrator.version", config_file), + name=functest_utils.get_parameter_from_yaml( + "orchestrator.name", config_file), + version=functest_utils.get_parameter_from_yaml( + "orchestrator.version", config_file), status='ERROR', result='' ) - self.__logger.debug("Orchestrator configuration %s", self.orchestrator) + self.vnf = dict( - descriptor=get_config("vnf.descriptor", config_file), - inputs=get_config("vnf.inputs", config_file), - requirements=get_config("vnf.requirements", config_file) + descriptor=functest_utils.get_parameter_from_yaml( + "vnf.descriptor", config_file), + inputs=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.details['test_vnf'] = dict( - name=get_config("vnf_test_suite.name", config_file), - version=get_config("vnf_test_suite.version", config_file) + name=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.name", config_file), + version=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.version", config_file) ) - self.images = get_config("tenant_images", config_file) - self.__logger.info("Images needed for vIMS: %s", self.images) - - def prepare(self): - """Prepare testscase (Additional pre-configuration steps).""" - super(CloudifyIms, self).prepare() - - self.__logger.info("Additional pre-configuration steps") - - compute_quotas = self.os_project.get_compute_quotas() - network_quotas = self.os_project.get_network_quotas() - - for key, value in ( - self.vnf['requirements']['compute_quotas'].items()): - setattr(compute_quotas, key, value) - - for key, value in ( - self.vnf['requirements']['network_quotas'].items()): - setattr(network_quotas, key, value) - - compute_quotas = self.os_project.update_compute_quotas(compute_quotas) - network_quotas = self.os_project.update_network_quotas(network_quotas) - - # needs some images - self.__logger.info("Upload some OS images if it doesn't exist") - for image_name, image_file in self.images.iteritems(): - self.__logger.info("image: %s, file: %s", image_name, image_file) - if image_file and image_name: - image_creator = OpenStackImage( - self.snaps_creds, - ImageConfig( - name=image_name, image_user='cloud', - img_format='qcow2', image_file=image_file)) - image_creator.create() - # self.created_object.append(image_creator) - - def deploy_orchestrator(self): + + self.image_alt = None + self.flavor_alt = None + self.clearwater = None + + def check_requirements(self): + if env.get('NEW_USER_ROLE').lower() == "admin": + self.__logger.warning( + "Defining NEW_USER_ROLE=admin will easily break the testcase " + "because Cloudify doesn't manage tenancy (e.g. subnet " + "overlapping)") + + def execute(self): """ Deploy Cloudify Manager. network, security group, fip, VM creation """ - # network creation - + assert super().execute() == 0 start_time = time.time() - self.__logger.info("Creating keypair ...") - kp_file = os.path.join(self.data_dir, "cloudify_ims.pem") - keypair_settings = KeypairConfig(name='cloudify_ims_kp', - private_filepath=kp_file) - keypair_creator = OpenStackKeypair(self.snaps_creds, keypair_settings) - keypair_creator.create() - self.created_object.append(keypair_creator) - - self.__logger.info("Creating full network ...") - subnet_settings = SubnetConfig(name='cloudify_ims_subnet', - cidr='10.67.79.0/24') - network_settings = NetworkConfig(name='cloudify_ims_network', - subnet_settings=[subnet_settings]) - network_creator = OpenStackNetwork(self.snaps_creds, network_settings) - network_creator.create() - self.created_object.append(network_creator) - ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds) - router_creator = OpenStackRouter( - self.snaps_creds, - RouterConfig( - name='cloudify_ims_router', - external_gateway=ext_net_name, - internal_subnets=[subnet_settings.name])) - router_creator.create() - self.created_object.append(router_creator) - - # security group creation - self.__logger.info("Creating security group for cloudify manager vm") - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="sg-cloudify-manager", - direction=Direction.ingress, protocol=Protocol.tcp, - port_range_min=1, port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="sg-cloudify-manager", - direction=Direction.ingress, protocol=Protocol.udp, - port_range_min=1, port_range_max=65535)) - - securit_group_creator = OpenStackSecurityGroup( - self.snaps_creds, - SecurityGroupConfig( - name="sg-cloudify-manager", - rule_settings=sg_rules)) - - securit_group_creator.create() - self.created_object.append(securit_group_creator) - - # orchestrator VM flavor - self.__logger.info("Get or create flavor for cloudify manager vm ...") - - flavor_settings = FlavorConfig( - name=self.orchestrator['requirements']['flavor']['name'], - ram=self.orchestrator['requirements']['flavor']['ram_min'], - disk=50, - vcpus=2) - flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) - image_settings = ImageConfig( - name=self.orchestrator['requirements']['os_image'], - image_user='centos', - exists=True) - - port_settings = PortConfig(name='cloudify_manager_port', - network_name=network_settings.name) - - manager_settings = VmInstanceConfig( - name='cloudify_manager', - flavor=flavor_settings.name, - port_settings=[port_settings], - security_group_names=[securit_group_creator.sec_grp_settings.name], - floating_ip_settings=[FloatingIpConfig( - name='cloudify_manager_fip', - port_name=port_settings.name, - router_name=router_creator.router_settings.name)]) - - manager_creator = OpenStackVmInstance(self.snaps_creds, - manager_settings, - image_settings, - keypair_settings) - - self.__logger.info("Creating cloudify manager VM") - manager_creator.create() - self.created_object.append(manager_creator) - - public_auth_url = keystone_utils.get_endpoint( - self.snaps_creds, 'identity') - - self.__logger.info("Set creds for cloudify manager") - cfy_creds = dict(keystone_username=self.tenant_name, - keystone_password=self.tenant_name, - keystone_tenant_name=self.tenant_name, - keystone_url=public_auth_url) - - cfy_client = CloudifyClient(host=manager_creator.get_floating_ip().ip, - username='admin', - password='admin', - tenant='default_tenant') - - self.orchestrator['object'] = cfy_client - - self.__logger.info("Attemps running status of the Manager") - cfy_status = None - retry = 10 - while str(cfy_status) != 'running' and retry: + self.orig_cloud.set_network_quotas( + self.project.project.name, + security_group=self.quota_security_group, + security_group_rule=self.quota_security_group_rule, + port=self.quota_port) + self.__logger.info("Put OpenStack creds in manager") + cfy_creds = dict( + keystone_username=self.project.user.name, + keystone_password=self.project.password, + keystone_tenant_name=self.project.project.name, + keystone_url=self.get_public_auth_url(self.orig_cloud), + region=os.environ.get('OS_REGION_NAME', 'RegionOne'), + user_domain_name=os.environ.get( + 'OS_USER_DOMAIN_NAME', 'Default'), + project_domain_name=os.environ.get( + 'OS_PROJECT_DOMAIN_NAME', 'Default')) + self.__logger.info("Set creds for cloudify manager %s", cfy_creds) + + for loop in range(10): try: - cfy_status = cfy_client.manager.get_status()['status'] - self.__logger.debug("The current manager status is %s", - cfy_status) + secrets_list = self.cfy_client.secrets.list() + for k, val in six.iteritems(cfy_creds): + if not any(d.get('key', None) == k for d in secrets_list): + self.cfy_client.secrets.create(k, val) + else: + self.cfy_client.secrets.update(k, val) + break except Exception: # pylint: disable=broad-except - self.__logger.warning("Cloudify Manager isn't " + - "up and running. Retrying ...") - retry = retry - 1 - time.sleep(30) - - if str(cfy_status) == 'running': - self.__logger.info("Cloudify Manager is up and running") + self.__logger.info( + "try %s: Cannot create secrets", loop + 1) + time.sleep(30) else: - raise Exception("Cloudify Manager isn't up and running") - - self.__logger.info("Put OpenStack creds in manager") - secrets_list = cfy_client.secrets.list() - for k, val in cfy_creds.iteritems(): - if not any(d.get('key', None) == k for d in secrets_list): - cfy_client.secrets.create(k, val) - else: - cfy_client.secrets.update(k, val) + self.__logger.error("Cannot create secrets") + return 1 duration = time.time() - start_time - self.__logger.info("Put private keypair in manager") - if manager_creator.vm_ssh_active(block=True): - ssh = manager_creator.ssh_client() - scp = SCPClient(ssh.get_transport(), socket_timeout=15.0) - scp.put(kp_file, '~/') - cmd = "sudo cp ~/cloudify_ims.pem /etc/cloudify/" - run_blocking_ssh_command(ssh, cmd) - cmd = "sudo chmod 444 /etc/cloudify/cloudify_ims.pem" - run_blocking_ssh_command(ssh, cmd) - cmd = "sudo yum install -y gcc python-devel" - run_blocking_ssh_command(ssh, cmd, "Unable to install packages \ - on manager") + self.put_private_key() + self.upload_cfy_plugins(self.cop_yaml, self.cop_wgn) self.details['orchestrator'].update(status='PASS', duration=duration) self.vnf['inputs'].update(dict( - external_network_name=ext_net_name, - network_name=network_settings.name + external_network_name=self.ext_net.name, + network_name=self.network.name, + key_pair_name=self.keypair.name )) + if self.deploy_vnf() and self.test_vnf(): + self.result = 100 + return 0 self.result = 1/3 * 100 - return True + return 1 def deploy_vnf(self): """Deploy Clearwater IMS.""" start_time = time.time() + secgroups = self.cloud.list_security_groups( + filters={'name': 'default', + 'project_id': self.project.project.id}) + if secgroups: + secgroup = secgroups[0] + else: + self.__logger.error("No 'default' security group in project %s", + self.project.project.name) + return False + + self.cloud.create_security_group_rule( + secgroup.id, port_range_min=22, port_range_max=22, + protocol='tcp', direction='ingress') + self.__logger.info("Upload VNFD") - cfy_client = self.orchestrator['object'] descriptor = self.vnf['descriptor'] - cfy_client.blueprints.publish_archive(descriptor.get('url'), - descriptor.get('name'), - descriptor.get('file_name')) - - self.__logger.info("Get or create flavor for all clearwater vm") - flavor_settings = FlavorConfig( - name=self.vnf['requirements']['flavor']['name'], - ram=self.vnf['requirements']['flavor']['ram_min'], - disk=25, - vcpus=1) - flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) + self.cfy_client.blueprints.upload( + descriptor.get('file_name'), descriptor.get('name')) + self.image_alt = self.publish_image_alt() + self.flavor_alt = self.create_flavor_alt() self.vnf['inputs'].update(dict( - flavor_id=self.vnf['requirements']['flavor']['name'], + image_id=self.image_alt.id, + flavor_id=self.flavor_alt.id, )) self.__logger.info("Create VNF Instance") - cfy_client.deployments.create(descriptor.get('name'), - descriptor.get('name'), - self.vnf.get('inputs')) + self.cfy_client.deployments.create( + descriptor.get('name'), descriptor.get('name'), + self.vnf.get('inputs')) - wait_for_execution(cfy_client, - _get_deployment_environment_creation_execution( - cfy_client, descriptor.get('name')), - self.__logger, - timeout=300) + cloudify.wait_for_execution( + self.cfy_client, + cloudify.get_execution_id(self.cfy_client, descriptor.get('name')), + self.__logger, timeout=300) self.__logger.info("Start the VNF Instance deployment") - execution = cfy_client.executions.start(descriptor.get('name'), - 'install') + execution = self.cfy_client.executions.start( + descriptor.get('name'), 'install') # Show execution log - execution = wait_for_execution(cfy_client, execution, self.__logger) - - duration = time.time() - start_time + execution = cloudify.wait_for_execution( + self.cfy_client, execution, self.__logger, timeout=3600) self.__logger.info(execution) - if execution.status == 'terminated': - self.details['vnf'].update(status='PASS', duration=duration) - self.result += 1/3 * 100 - result = True - else: - self.details['vnf'].update(status='FAIL', duration=duration) - result = False - return result + if execution.status != 'terminated': + self.details['vnf'].update(status='FAIL', + duration=time.time() - start_time) + return False + + ellis_ip = self.cfy_client.deployments.outputs.get( + self.vnf['descriptor'].get('name'))['outputs']['ellis_ip'] + bono_ip = self.cfy_client.deployments.outputs.get( + self.vnf['descriptor'].get('name'))['outputs']['bono_ip'] + self.clearwater = clearwater.ClearwaterTesting( + self.case_name, bono_ip, ellis_ip) + self.clearwater.availability_check() + + self.details['vnf'].update(status='PASS', + duration=time.time() - start_time) + self.result += 1/3 * 100 + return True def test_vnf(self): """Run test on clearwater ims instance.""" start_time = time.time() - - cfy_client = self.orchestrator['object'] - - outputs = cfy_client.deployments.outputs.get( - self.vnf['descriptor'].get('name'))['outputs'] - dns_ip = outputs['dns_ip'] - ellis_ip = outputs['ellis_ip'] - self.config_ellis(ellis_ip) - + dns_ip = self.cfy_client.deployments.outputs.get( + self.vnf['descriptor'].get('name'))['outputs']['dns_ip'] if not dns_ip: return False - - vims_test_result = self.run_clearwater_live_test( - dns_ip=dns_ip, + short_result, vnf_test_rate = self.clearwater.run_clearwater_live_test( public_domain=self.vnf['inputs']["public_domain"]) duration = time.time() - start_time - short_result, nb_test = sig_test_format(vims_test_result) self.__logger.info(short_result) - self.details['test_vnf'].update(result=short_result, - full_result=vims_test_result, - duration=duration) - try: - vnf_test_rate = short_result['passed'] / nb_test - # 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'].update(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 - - return True + return bool(vnf_test_rate > 0) def clean(self): """Clean created objects/functions.""" - try: - cfy_client = self.orchestrator['object'] - dep_name = self.vnf['descriptor'].get('name') - # kill existing execution - self.__logger.info('Deleting the current deployment') - exec_list = cfy_client.executions.list(dep_name) - for execution in exec_list: - if execution['status'] == "started": - try: - cfy_client.executions.cancel(execution['id'], - force=True) - except: # pylint: disable=broad-except - self.__logger.warn("Can't cancel the current exec") - - execution = cfy_client.executions.start( - dep_name, - 'uninstall', - parameters=dict(ignore_failure=True), - force=True) - - wait_for_execution(cfy_client, execution, self.__logger) - cfy_client.deployments.delete(self.vnf['descriptor'].get('name')) - cfy_client.blueprints.delete(self.vnf['descriptor'].get('name')) - except: # pylint: disable=broad-except - self.__logger.warn("Some issue during the undeployment ..") - self.__logger.warn("Tenant clean continue ..") - - super(CloudifyIms, self).clean() - - @energy.enable_recording - def run(self, **kwargs): - """Execute CloudifyIms test case.""" - return super(CloudifyIms, self).run(**kwargs) - - -# ---------------------------------------------------------- -# -# 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 - - -def wait_for_execution(client, execution, logger, timeout=1500, ): - """Wait for a workflow execution on Cloudify Manager.""" - # if execution already ended - return without waiting - if execution.status in Execution.END_STATES: - return execution - - if timeout is not None: - deadline = time.time() + timeout - - # Poll for execution status and execution logs, until execution ends - # and we receive an event of type in WORKFLOW_END_TYPES - offset = 0 - batch_size = 50 - event_list = [] - execution_ended = False - while True: - event_list = client.events.list( - execution_id=execution.id, - _offset=offset, - _size=batch_size, - include_logs=False, - sort='@timestamp').items - - offset = offset + len(event_list) - for event in event_list: - logger.debug(event.get('message')) - - if timeout is not None: - if time.time() > deadline: - raise RuntimeError( - 'execution of operation {0} for deployment {1} ' - 'timed out'.format(execution.workflow_id, - execution.deployment_id)) - else: - # update the remaining timeout - timeout = deadline - time.time() - - if not execution_ended: - execution = client.executions.get(execution.id) - execution_ended = execution.status in Execution.END_STATES - - if execution_ended: - break - - time.sleep(5) - - return execution - - -def _get_deployment_environment_creation_execution(client, deployment_id): - """ - Get the execution id of a env preparation. - - network, security group, fip, VM creation - """ - executions = client.executions.list(deployment_id=deployment_id) - for execution in executions: - if execution.workflow_id == 'create_deployment_environment': - return execution - raise RuntimeError('Failed to get create_deployment_environment ' - 'workflow execution.' - 'Available executions: {0}'.format(executions)) - - -def sig_test_format(sig_test): - """Process the signaling result to have a short result.""" - nb_passed = 0 - nb_failures = 0 - nb_skipped = 0 - for data_test in sig_test: - if data_test['result'] == "Passed": - nb_passed += 1 - elif data_test['result'] == "Failed": - nb_failures += 1 - elif data_test['result'] == "Skipped": - nb_skipped += 1 - short_sig_test_result = {} - short_sig_test_result['passed'] = nb_passed - short_sig_test_result['failures'] = nb_failures - short_sig_test_result['skipped'] = nb_skipped - nb_test = nb_passed + nb_skipped - return (short_sig_test_result, nb_test) - - -def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"): - """Command to run ssh command with the exit status.""" - stdin, stdout, stderr = ssh.exec_command(cmd) - if stdout.channel.recv_exit_status() != 0: - raise Exception(error_msg) + self.kill_existing_execution(self.vnf['descriptor'].get('name')) + if self.image_alt: + self.cloud.delete_image(self.image_alt) + if self.flavor_alt: + self.orig_cloud.delete_flavor(self.flavor_alt.id) + super().clean() diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml index e1a7bf316..869281a20 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml @@ -1,46 +1,23 @@ --- -tenant_images: - ubuntu_14.04: - /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img - cloudify_manager_4.0: - /home/opnfv/functest/images/cloudify-manager-premium-4.0.1.qcow2 orchestrator: name: cloudify version: '4.0' - requirements: - flavor: - name: m1.medium - ram_min: 4096 - os_image: 'cloudify_manager_4.0' vnf: name: clearwater - version: '107' + version: '129' descriptor: - file_name: openstack-blueprint.yaml + file_name: /src/cloudify_vims/openstack-blueprint.yaml name: clearwater-opnfv - url: - https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/archive/master.zip - version: '122' - requirements: - flavor: - name: m1.small - ram_min: 2048 - compute_quotas: - cores: 50 - instances: 15 - network_quotas: - security_group: 20 - security_group_rule: 100 - port: 50 + version: '129' inputs: image_id: 'ubuntu_14.04' - flavor_id: 'm1.small' + flavor_id: 'cloudify.small' agent_user: ubuntu key_pair_name: cloudify_ims_kp private_key_path: '/etc/cloudify/cloudify_ims.pem' external_network_name: '' public_domain: clearwater.opnfv - release: repo122 + release: repo129 bono_cluster_size: 1 sprout_cluster_size: 1 vellum_cluster_size: 1 @@ -48,4 +25,4 @@ vnf: homer_cluster_size: 1 vnf_test_suite: name: clearwater-live-test - version: "1.0" + version: '1.0' diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py b/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py deleted file mode 100644 index 6d7428043..000000000 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py +++ /dev/null @@ -1,498 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Orange, IXIA 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 - -"""CloudifyImsPerf testcase implementation.""" - -import logging -import os -import time - -import json -import yaml -import paramiko -import dns.resolver -from jinja2 import Environment, FileSystemLoader - -from functest.energy import energy -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.opnfv_tests.vnf.ims import cloudify_ims -from functest.opnfv_tests.vnf.ims.ixia.utils import IxChassisUtils -from functest.opnfv_tests.vnf.ims.ixia.utils import IxLoadUtils -from functest.opnfv_tests.vnf.ims.ixia.utils import IxRestUtils -from functest.utils.constants import CONST - -from snaps.config.flavor import FlavorConfig -from snaps.config.image import ImageConfig -from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.config.security_group import ( - Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) -from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.create_instance import OpenStackVmInstance -from snaps.openstack.create_network import OpenStackNetwork -from snaps.openstack.create_router import OpenStackRouter -from snaps.openstack.create_security_group import OpenStackSecurityGroup - - -__author__ = "Valentin Boucher <valentin.boucher@orange.com>" - - -class CloudifyImsPerf(cloudify_ims.CloudifyIms): - """Clearwater vIMS deployed with Cloudify Orchestrator Case.""" - - __logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - """Initialize CloudifyIms testcase object.""" - if "case_name" not in kwargs: - kwargs["case_name"] = "cloudify_ims_perf" - super(CloudifyImsPerf, self).__init__(**kwargs) - - # Retrieve the configuration - try: - self.config = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) - except Exception: - raise Exception("VNF config file not found") - - self.snaps_creds = '' - self.created_object = [] - - config_file = os.path.join(self.case_dir, self.config) - self.orchestrator = dict( - requirements=get_config("orchestrator.requirements", config_file), - ) - self.details['orchestrator'] = dict( - name=get_config("orchestrator.name", config_file), - version=get_config("orchestrator.version", config_file), - status='ERROR', - result='' - ) - self.__logger.debug("Orchestrator configuration %s", self.orchestrator) - self.vnf = dict( - descriptor=get_config("vnf.descriptor", config_file), - inputs=get_config("vnf.inputs", config_file), - requirements=get_config("vnf.requirements", 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), - ) - self.__logger.debug("VNF configuration: %s", self.vnf) - - self.test = dict( - version=get_config("vnf_test_suite.version", config_file), - inputs=get_config("vnf_test_suite.inputs", config_file), - requirements=get_config("vnf_test_suite.requirements", config_file) - ) - - self.details['test_vnf'] = dict( - name=get_config("vnf_test_suite.name", config_file), - version=get_config("vnf_test_suite.version", config_file), - requirements=get_config("vnf_test_suite.requirements", config_file) - ) - self.images = get_config("tenant_images", config_file) - self.__logger.info("Images needed for vIMS: %s", self.images) - - def test_vnf(self): - """Run IXIA Stress test on clearwater ims instance.""" - start_time = time.time() - - cfy_client = self.orchestrator['object'] - - outputs = cfy_client.deployments.outputs.get( - self.vnf['descriptor'].get('name'))['outputs'] - dns_ip = outputs['dns_ip'] - ellis_ip = outputs['ellis_ip'] - - self.__logger.info("Creating full IXIA network ...") - subnet_settings = SubnetConfig(name='ixia_management_subnet', - cidr='10.10.10.0/24') - network_settings = NetworkConfig(name='ixia_management_network', - subnet_settings=[subnet_settings]) - network_creator = OpenStackNetwork(self.snaps_creds, network_settings) - network_creator.create() - self.created_object.append(network_creator) - ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds) - router_creator = OpenStackRouter( - self.snaps_creds, - RouterConfig( - name='ixia_management_router', - external_gateway=ext_net_name, - internal_subnets=[subnet_settings.name])) - router_creator.create() - self.created_object.append(router_creator) - - # security group creation - self.__logger.info("Creating security groups for IXIA VMs") - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig(sec_grp_name="ixia_management", - direction=Direction.ingress, - protocol=Protocol.tcp, port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig(sec_grp_name="ixia_management", - direction=Direction.ingress, - protocol=Protocol.udp, port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig(sec_grp_name="ixia_management", - direction=Direction.ingress, - protocol=Protocol.icmp)) - - ixia_managment_sg_settings = SecurityGroupConfig( - name="ixia_management", rule_settings=sg_rules) - securit_group_creator = OpenStackSecurityGroup( - self.snaps_creds, - ixia_managment_sg_settings) - - securit_group_creator.create() - self.created_object.append(securit_group_creator) - - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig(sec_grp_name="ixia_ssh_http", - direction=Direction.ingress, - protocol=Protocol.tcp, port_range_min=1, - port_range_max=65535)) - - ixia_ssh_http_sg_settings = SecurityGroupConfig( - name="ixia_ssh_http", rule_settings=sg_rules) - securit_group_creator = OpenStackSecurityGroup( - self.snaps_creds, - ixia_ssh_http_sg_settings) - - securit_group_creator.create() - self.created_object.append(securit_group_creator) - - chassis_flavor_settings = FlavorConfig( - name="ixia_vChassis", - ram=4096, - disk=40, - vcpus=2) - flavor_creator = OpenStackFlavor(self.snaps_creds, - chassis_flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) - - card_flavor_settings = FlavorConfig( - name="ixia_vCard", - ram=4096, - disk=4, - vcpus=2) - flavor_creator = OpenStackFlavor(self.snaps_creds, - card_flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) - - load_flavor_settings = FlavorConfig( - name="ixia_vLoad", - ram=8192, - disk=100, - vcpus=4) - flavor_creator = OpenStackFlavor(self.snaps_creds, - load_flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) - - chassis_image_settings = ImageConfig( - name=self.test['requirements']['chassis']['image'], - image_user='admin', - exists=True) - - card_image_settings = ImageConfig( - name=self.test['requirements']['card']['image'], - image_user='admin', - exists=True) - - load_image_settings = ImageConfig( - name=self.test['requirements']['load']['image'], - image_user='admin', - exists=True) - - chassis_port_settings = PortConfig( - name='ixia_chassis_port', network_name=network_settings.name) - - card1_port1_settings = PortConfig( - name='ixia_card1_port1', network_name=network_settings.name) - - card2_port1_settings = PortConfig( - name='ixia_card2_port1', network_name=network_settings.name) - - card1_port2_settings = PortConfig( - name='ixia_card1_port2', network_name="cloudify_ims_network") - - card2_port2_settings = PortConfig( - name='ixia_card2_port2', network_name="cloudify_ims_network") - - load_port_settings = PortConfig( - name='ixia_load_port', network_name=network_settings.name) - - chassis_settings = VmInstanceConfig( - name='ixia_vChassis', - flavor=chassis_flavor_settings.name, - port_settings=[chassis_port_settings], - security_group_names=[ixia_ssh_http_sg_settings.name, - ixia_managment_sg_settings.name], - floating_ip_settings=[FloatingIpConfig( - name='ixia_vChassis_fip', - port_name=chassis_port_settings.name, - router_name=router_creator.router_settings.name)]) - - vm_creator = OpenStackVmInstance(self.snaps_creds, - chassis_settings, - chassis_image_settings) - - self.__logger.info("Creating Ixia vChassis VM") - vm_creator.create() - fip_chassis = vm_creator.get_floating_ip().ip - self.created_object.append(vm_creator) - - card1_settings = VmInstanceConfig( - name='ixia_vCard1', - flavor=card_flavor_settings.name, - port_settings=[card1_port1_settings, card1_port2_settings], - security_group_names=[ixia_managment_sg_settings.name]) - - vm_creator = OpenStackVmInstance(self.snaps_creds, - card1_settings, - card_image_settings) - - self.__logger.info("Creating Ixia vCard1 VM") - vm_creator.create() - vcard_ips = list() - vcard_ips_p2 = list() - vcard_ips.append(vm_creator.get_port_ip('ixia_card1_port1')) - vcard_ips_p2.append(vm_creator.get_port_ip('ixia_card1_port2')) - self.created_object.append(vm_creator) - - card2_settings = VmInstanceConfig( - name='ixia_vCard2', - flavor=card_flavor_settings.name, - port_settings=[card2_port1_settings, card2_port2_settings], - security_group_names=[ixia_managment_sg_settings.name]) - - vm_creator = OpenStackVmInstance(self.snaps_creds, - card2_settings, - card_image_settings) - - self.__logger.info("Creating Ixia vCard2 VM") - vm_creator.create() - vcard_ips.append(vm_creator.get_port_ip('ixia_card2_port1')) - vcard_ips_p2.append(vm_creator.get_port_ip('ixia_card2_port2')) - self.created_object.append(vm_creator) - - load_settings = VmInstanceConfig( - name='ixia_vLoad', - flavor=load_flavor_settings.name, - port_settings=[load_port_settings], - security_group_names=[ixia_ssh_http_sg_settings.name, - ixia_managment_sg_settings.name], - floating_ip_settings=[FloatingIpConfig( - name='ixia_vLoad_fip', - port_name=load_port_settings.name, - router_name=router_creator.router_settings.name)]) - - vm_creator = OpenStackVmInstance(self.snaps_creds, - load_settings, - load_image_settings) - - self.__logger.info("Creating Ixia vLoad VM") - vm_creator.create() - fip_load = vm_creator.get_floating_ip().ip - self.created_object.append(vm_creator) - - self.__logger.info("Chassis IP is: %s", fip_chassis) - login_url = "https://" + str(fip_chassis) + "/api/v1/auth/session" - cards_url = "https://" + str(fip_chassis) + "/api/v2/ixos/cards/" - - payload = json.dumps({"username": "admin", - "password": "admin", - "rememberMe": "false"}) - api_key = json.loads(( - IxChassisUtils.ChassisRestAPI.postWithPayload( - login_url, payload)))["apiKey"] - - self.__logger.info("Adding 2 card back inside the ixia chassis...") - - for ip in vcard_ips: - payload = {"ipAddress": str(ip)} - response = json.loads(IxChassisUtils.ChassisRestAPI.postOperation( - cards_url, api_key, payload)) - count = 0 - while (int( - IxChassisUtils.ChassisRestAPI.getWithHeaders( - response['url'], api_key)['progress']) != 100): - self.__logger.debug("Operation did not finish yet. \ - Waiting for 1 more second..") - time.sleep(1) - if count > 60: - raise Exception("Adding card take more than 60 seconds") - count += 1 - - ssh = paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) - ssh.connect(fip_chassis, username="admin", password="admin") - cmd = "set license-check disable" - run_blocking_ssh_command(ssh, cmd) - cmd = "restart-service ixServer" - run_blocking_ssh_command(ssh, cmd) - - self.config_ellis(ellis_ip) - - # Get IPs of P-CSCF - resolver = dns.resolver.Resolver() - resolver.nameservers = [dns_ip] - result = resolver.query("bono.clearwater.local") - - iplistims = '' - i = 0 - for rdata in result: - i = i + 1 - print rdata.address - iplistims += str(rdata.address) - if i != len(result): - iplistims += ';' - - kResourcesUrl = 'http://%s:%s/api/v0/resources' % (fip_load, 8080) - - kRxfPath = r"REG_CALL_OPNFV_v13.rxf" - test_filname = self.test['inputs']['test_filname'] - kGatewaySharedFolder = '/mnt/ixload-share/' - kRxfRelativeUploadPath = 'uploads/%s' % os.path.split(kRxfPath)[1] - kRxfAbsoluteUploadPath = os.path.join(kGatewaySharedFolder, - kRxfRelativeUploadPath) - kChassisList = [str(fip_chassis)] - dataFileNameList = [test_filname, - 'Registration_only_LPS.tst', - 'SIPCall.tst'] - - kPortListPerCommunityCommunity = {"VoIP1@VM1": [(1, 1, 1)], - "VoIP2@VM2": [(1, 2, 1)]} - - kStatsToDisplayDict = self.test['inputs']['stats'] - connection = IxRestUtils.getConnection(fip_load, 8080) - - self.__logger.info("Creating a new session...") - sessionUrl = IxLoadUtils.createSession(connection, - self.test['version']) - - license_server = self.test['inputs']['licenseServer'] - IxLoadUtils.configureLicenseServer(connection, - sessionUrl, - license_server) - - files_dir = os.path.join(self.case_dir, 'ixia/files') - target_file = open(os.path.join(files_dir, test_filname), 'w') - j2_env = Environment(loader=FileSystemLoader(files_dir), - trim_blocks=True) - self.test['inputs'].update(dict( - ipchassis=fip_chassis, ipcard1=vcard_ips_p2[0], - ipcard2=vcard_ips_p2[1], iplistims=iplistims - )) - - target_file.write( - j2_env.get_template(test_filname + '.template').render( - self.test['inputs'] - )) - target_file.close() - - self.__logger.info('Uploading files %s...' % kRxfPath) - for dataFile in dataFileNameList: - localFilePath = os.path.join(files_dir, dataFile) - remoteFilePath = os.path.join(kGatewaySharedFolder, - 'uploads/%s' % dataFile) - IxLoadUtils.uploadFile(connection, kResourcesUrl, - localFilePath, remoteFilePath) - self.__logger.info('Upload file finished.') - - self.__logger.info("Loading repository %s..." % kRxfAbsoluteUploadPath) - IxLoadUtils.loadRepository(connection, sessionUrl, - kRxfAbsoluteUploadPath) - - self.__logger.info("Clearing chassis list...") - IxLoadUtils.clearChassisList(connection, sessionUrl) - - self.__logger.info("Adding chassis %s..." % (kChassisList)) - IxLoadUtils.addChassisList(connection, sessionUrl, kChassisList) - - self.__logger.info("Assigning new ports...") - IxLoadUtils.assignPorts(connection, sessionUrl, - kPortListPerCommunityCommunity) - - self.__logger.info("Starting the test...") - IxLoadUtils.runTest(connection, sessionUrl) - - self.__logger.info( - "Polling values for stats %s..." % (kStatsToDisplayDict)) - result = IxLoadUtils.pollStats(connection, sessionUrl, - kStatsToDisplayDict) - self.__logger.info("Test finished.") - self.__logger.info("Checking test status...") - testRunError = IxLoadUtils.getTestRunError(connection, sessionUrl) - - self.__logger.info(result) - duration = time.time() - start_time - self.details['test_vnf'].update(status='PASS', - result=result, - duration=duration) - if testRunError: - self.__logger.info( - "The test exited with following error: %s" % (testRunError)) - self.details['test_vnf'].update(status='FAIL', duration=duration) - return False - else: - self.__logger.info("The test completed successfully.") - self.details['test_vnf'].update(status='PASS', duration=duration) - self.result += 1/3 * 100 - return True - - def clean(self): - """Clean created objects/functions.""" - super(CloudifyImsPerf, self).clean() - - @energy.enable_recording - def run(self, **kwargs): - """Execute CloudifyIms test case.""" - return super(CloudifyImsPerf, self).run(**kwargs) - - -# ---------------------------------------------------------- -# -# 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 - - -def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"): - """Command to run ssh command with the exit status.""" - stdin, stdout, stderr = ssh.exec_command(cmd) - if stdout.channel.recv_exit_status() != 0: - raise Exception(error_msg) diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml b/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml deleted file mode 100644 index 77b295d0a..000000000 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml +++ /dev/null @@ -1,91 +0,0 @@ ---- -tenant_images: - ubuntu_14.04: - http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img - cloudify_manager_4.0: - http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2 - # PATH of the virtual chassis image. - IXIA_CHASSIS: # Ixia_Virtual_Chassis_8.30_EA_KVM.qcow2 - # PATH of the virtual card image. - IXIA_CARD: # Ixia_Virtual_Load_Module_8.30_EA_KVM.qcow2 - # PATH of the virtual loader image. - IXIA_LOAD: # Ixia_Virtual_Loader_8.30_EA_KVM.qcow2 -orchestrator: - name: cloudify - version: '4.0' - requirements: - flavor: - name: m1.medium - ram_min: 4096 - os_image: 'cloudify_manager_4.0' -vnf: - name: clearwater - version: '107' - descriptor: - file_name: openstack-blueprint-with-numbers.yaml - name: clearwater-opnfv - url: - https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/archive/master.zip - version: '122' - requirements: - flavor: - name: m1.small - ram_min: 2048 - compute_quotas: - cores: 150 - instances: 100 - ram: 256000 - network_quotas: - security_group: 25 - security_group_rule: 100 - port: 150 - inputs: - image_id: 'ubuntu_14.04' - flavor_id: 'm1.small' - agent_user: ubuntu - key_pair_name: cloudify_ims_kp - private_key_path: '/etc/cloudify/cloudify_ims.pem' - external_network_name: '' - public_domain: clearwater.opnfv - release: repo122 - bono_cluster_size: 2 - sprout_cluster_size: 2 - vellum_cluster_size: 2 - dime_cluster_size: 2 - homer_cluster_size: 2 - number_of_subscribers: 50000 -vnf_test_suite: - name: ixia - version: "8.30.0.161" - requirements: - chassis: - image: IXIA_CHASSIS - card: - image: IXIA_CARD - load: - image: IXIA_LOAD - inputs: - ipgw: '10.67.79.1' - pnregistering: '201001[0000-]' - pncalling: '201000[0000-]' - pncalled: '201000[5000-]' - sipportregistering: '[5060-]' - sipportcalling: '[5061-]' - sipportcalled: '[5062-]' - domainname: 'clearwater.opnfv' - authpassword: 'toto' - registeringtotalcalls: '1000' - registeringduration: '180' - activecalls: '1000' - testduration: '360' - test_filname: 'REG_CALL_OPNFV_v13.rxf' - licenseServer: '' # IP of YOUR IXIA LICENSE SERVER - stats: - 'Signaling(VoIPSip)': - - 'Successful Registrations' - - 'Failed Registrations' - - 'Active Calls' - - 'Attempted Calls' - - 'Received Calls' - - 'Failed Attempted Calls' - - 'Failed Received Calls' diff --git a/functest/opnfv_tests/vnf/ims/heat_ims.py b/functest/opnfv_tests/vnf/ims/heat_ims.py new file mode 100644 index 000000000..0d4e345a0 --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/heat_ims.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 Kontron, 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 + +"""HeatIms testcase implementation.""" + +from __future__ import division + +import logging +import os +import re +import time +import tempfile + +import paramiko +import pkg_resources +from xtesting.core import testcase + +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>" + + +class HeatIms(singlevm.VmReady2): + # pylint: disable=too-many-instance-attributes + """Clearwater vIMS deployed with Heat Orchestrator Case.""" + + __logger = logging.getLogger(__name__) + + filename = ('/home/opnfv/functest/images/' + 'ubuntu-14.04-server-cloudimg-amd64-disk1.img') + + 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().__init__(**kwargs) + + # Retrieve the configuration + try: + self.config = getattr( + 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=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=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 + """ + Prepare Tenant/User + + network, security group, fip, VM creation + """ + self.orig_cloud.set_network_quotas( + self.project.project.name, + security_group=self.quota_security_group, + security_group_rule=self.quota_security_group_rule, + port=self.quota_port) + if not self.orig_cloud.get_role("heat_stack_owner"): + self.role = self.orig_cloud.create_role("heat_stack_owner") + self.orig_cloud.grant_role( + "heat_stack_owner", user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + self.keypair = self.cloud.create_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(): + self.result = 100 + return 0 + self.result = 1/3 * 100 + return 1 + + def run(self, **kwargs): + """Deploy and test clearwater + + Here are the main actions: + - deploy clearwater stack via heat + - test the vnf instance + + Returns: + - TestCase.EX_OK + - TestCase.EX_RUN_ERROR on error + """ + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + assert super().run( + **kwargs) == testcase.TestCase.EX_OK + self.result = 0 + if not self.execute(): + self.result = 100 + status = testcase.TestCase.EX_OK + except Exception: # pylint: disable=broad-except + self.__logger.exception('Cannot run %s', self.case_name) + finally: + 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() + descriptor = self.vnf['descriptor'] + parameters = self.vnf['parameters'] + + parameters['public_mgmt_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.update(self.parameters) + + self.__logger.info("Create Heat Stack") + self.stack = self.cloud.create_stack( + name=descriptor.get('name'), + template_file=descriptor.get('file_name'), + 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=1): + return False + if 'ellis' in server.name: + 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 + 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() + + duration = time.time() - start_time + + self.details['vnf'].update(status='PASS', duration=duration) + self.result += 1/3 * 100 + + return True + + 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, 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) + self.result += vnf_test_rate / 3 * 100 + if vnf_test_rate == 0: + self.details['test_vnf'].update(status='FAIL') + self._monit() + return bool(vnf_test_rate > 0) + + def clean(self): + """Clean created objects/functions.""" + assert self.cloud + try: + if self.stack: + self.cloud.delete_stack(self.stack.id, wait=True) + except TypeError: + # shade raises TypeError exceptions when checking stack status + pass + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot clean stack ressources") + super().clean() + if self.role: + self.orig_cloud.delete_role(self.role.id) diff --git a/functest/opnfv_tests/vnf/ims/heat_ims.yaml b/functest/opnfv_tests/vnf/ims/heat_ims.yaml new file mode 100644 index 000000000..2ccdc0bf7 --- /dev/null +++ b/functest/opnfv_tests/vnf/ims/heat_ims.yaml @@ -0,0 +1,22 @@ +--- +orchestrator: + name: heat + version: '4.0' +vnf: + name: clearwater + version: '130' + descriptor: + file_name: /src/heat_vims/clearwater.yaml + name: clearwater-opnfv + version: '130' + inputs: + zone: clearwater.opnfv + dn_range_start: "6505550000" + dn_range_length: "1000" + bono_cluster_size: 1 + sprout_cluster_size: 1 + vellum_cluster_size: 1 + dime_cluster_size: 1 + homer_cluster_size: 1 + dnssec_key: + GkBraPnditvP2Em4oXV5wUTawmZaGGuO+Jt3ZnFkznGV3zFoQ+Ak13nuuOnO0JV5FqAr/KitdW6siqjXSjROXg== diff --git a/functest/opnfv_tests/vnf/ims/ixia/__init__.py b/functest/opnfv_tests/vnf/ims/ixia/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/__init__.py +++ /dev/null diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template b/functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template deleted file mode 100644 index 279362810..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template +++ /dev/null @@ -1,16731 +0,0 @@ -<?xml version="1.0" ?> -<root ver="[21, [1, [0, [0]]]]" type="ixRepository"> - <_smSessionXml ver="[0, [1, [0, [0]]]]" type="ixSMSessionXML"> - <xml type="str"><rpf> <Ixia.Aptixia.StackManager.SMSession type="Ixia.Aptixia.StackManager.SMSession" objectid="d0db76dc-f224-429f-91ba-e207cd4711db" version="6.70.420"> <doWaitLinkUp type="Bool">0</doWaitLinkUp> <doGratArp type="Bool">0</doGratArp> <subscribeToGratArpNotifications type="Bool">0</subscribeToGratArpNotifications> <doInterfaceCheck type="Bool">0</doInterfaceCheck> <rebootPortsBeforeConfigure type="Bool">0</rebootPortsBeforeConfigure> <testDuration type="Int">10000</testDuration> <checkLinkState type="Bool">0</checkLinkState> <portGroupList type="ListNode"> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="e7fa1f9e-23d9-4742-96b2-6edce6c4424e" version="6.70.420"> <name type="String">VM1</name> <category type="String" /> <stack type="Ixia.Aptixia.StackManager.L1EthernetPlugin" objectid="45426251-0720-4316-b8a5-d6bce32e3d2e" version="6.70.420"> <autoNegotiate type="Bool">1</autoNegotiate> <speed type="String">k100FD</speed> <advertise10Half type="Bool">1</advertise10Half> <advertise10Full type="Bool">1</advertise10Full> <advertise100Half type="Bool">1</advertise100Half> <advertise100Full type="Bool">1</advertise100Full> <advertise1000Full type="Bool">1</advertise1000Full> <advertise2500Full type="Bool">1</advertise2500Full> <advertise5000Full type="Bool">1</advertise5000Full> <advertise10000Full type="Bool">0</advertise10000Full> <cardDualPhy type="Ixia.Aptixia.StackManager.DualPhyPlugin" objectid="836ee0d6-1957-42eb-a7a4-53bcfbdd36e0" version="6.70.420"> <medium type="String">copper</medium> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </cardDualPhy> <cardElm type="Ixia.Aptixia.StackManager.EthernetELMPlugin" objectid="8387c005-0df9-4fd2-977e-1c234c7be0cc" version="6.70.420"> <negotiateMasterSlave type="Bool">1</negotiateMasterSlave> <negotiationType type="String">master</negotiationType> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </cardElm> <enableFlowControl type="Bool">0</enableFlowControl> <directedAddress type="String">01:80:C2:00:00:01</directedAddress> <dataCenter type="Ixia.Aptixia.StackManager.DataCenterSettings" objectid="df9be2ec-31d8-47f0-babe-79a1710303f3" version="6.70.420"> <dcSupported type="Bool">1</dcSupported> <dcEnabled type="Bool">0</dcEnabled> <dcFlowControl type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType">0</dcFlowControl> <dcMode type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode">2</dcMode> <dcPfcMapping type="IntList" /> <dcPfcPauseEnable type="Bool">0</dcPfcPauseEnable> <dcPfcPauseDelay type="Int">1</dcPfcPauseDelay> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </dataCenter> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.L2EthernetPlugin type="Ixia.Aptixia.StackManager.L2EthernetPlugin" objectid="166a11b6-4d30-40ea-b9e1-ac4fb44f112b" version="6.70.420"> <macRangeList type="ListNode"> <Ixia.Aptixia.StackManager.MacRange type="Ixia.Aptixia.StackManager.MacRange" objectid="ba896971-1d78-4e03-8f2a-28c65417612e" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">MAC-R11</name> <mac type="String">00:0A:43:4F:1B:00</mac> <incrementBy type="String">00:00:00:00:00:01</incrementBy> <mtu type="Int">1410</mtu> <count type="Int">1</count> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="2b81e36c-9cbb-4d78-a70c-904da8d41b28" version="6.70.420"> <name type="String">VLAN-R11</name> <enabled type="Bool">0</enabled> <firstId type="Int">1</firstId> <incrementStep type="Int">1</incrementStep> <increment type="Int">1</increment> <uniqueCount type="Int">4094</uniqueCount> <priority type="Int">1</priority> <tpid type="String">0x8100</tpid> <innerEnable type="Bool">0</innerEnable> <innerFirstId type="Int">1</innerFirstId> <innerIncrementStep type="Int">1</innerIncrementStep> <innerIncrement type="Int">1</innerIncrement> <innerUniqueCount type="Int">4094</innerUniqueCount> <innerPriority type="Int">1</innerPriority> <idIncrMode type="Int">2</idIncrMode> <innerTpid type="String">0x8100</innerTpid> <ixLoadRestObjectId type="Int">9</ixLoadRestObjectId> </vlanRange> <ixLoadRestObjectId type="Int">9</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacRange> </macRangeList> <vlanRangeList type="ListNode"> <Ixia.Aptixia.StackManager.VlanIdRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="2b81e36c-9cbb-4d78-a70c-904da8d41b28" version="6.70.420" /> </vlanRangeList> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Plugin type="Ixia.Aptixia.StackManager.IpV4V6Plugin" objectid="9ea551b2-a0af-4a7d-9872-e9b94298d7bd" version="6.70.420"> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="5affc0a7-68f6-46f6-b801-0e18e067a572" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">IP-R13</name> <ipType type="String">IPv4</ipType> <ipAddress type="String">{{ipcard1}}</ipAddress> <prefix type="Int">16</prefix> <incrementBy type="String">0.0.0.1</incrementBy> <count type="Int">1</count> <autoCountEnabled type="Bool">0</autoCountEnabled> <gatewayAddress type="String">{{ipgw}}</gatewayAddress> <gatewayIncrement type="String">0.0.0.0</gatewayIncrement> <gatewayIncrementMode type="String">perSubnet</gatewayIncrementMode> <enableGatewayArp type="Bool">0</enableGatewayArp> <generateStatistics type="Bool">0</generateStatistics> <mss type="Int">1410</mss> <randomizeAddress type="Bool">0</randomizeAddress> <randomizeSeed type="Int">1007257123</randomizeSeed> <autoMacGeneration type="Bool">1</autoMacGeneration> <macRange type="Ixia.Aptixia.StackManager.MacRange" objectid="ba896971-1d78-4e03-8f2a-28c65417612e" version="6.70.420" /> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="2b81e36c-9cbb-4d78-a70c-904da8d41b28" version="6.70.420" /> <atmRange type="Ixia.Aptixia.StackManager.AtmRange" objectid="00000000-0000-0000-0000-000000000000" /> <pvcRange type="Ixia.Aptixia.StackManager.PvcRange" objectid="00000000-0000-0000-0000-000000000000" /> <autoIpTypeEnabled type="Bool">0</autoIpTypeEnabled> <ixLoadRestObjectId type="Int">9</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Range> </rangeList> <rangeGroups type="ListNode"> <Ixia.Aptixia.StackManager.RangeGroup type="Ixia.Aptixia.StackManager.RangeGroup" objectid="abf2b6e4-a102-4cbe-bf1b-a11f11b2faac" version="6.70.420"> <name type="String">Group1</name> <distribType type="Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType">0</distribType> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="5affc0a7-68f6-46f6-b801-0e18e067a572" version="6.70.420" /> </rangeList> <ixLoadRestObjectId type="Int">-1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.RangeGroup> </rangeGroups> <childrenList type="ListNode" /> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">IP-8</name> <ixLoadRestObjectId type="Int">26</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Plugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">MAC/VLAN-8</name> <ixLoadRestObjectId type="Int">25</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.L2EthernetPlugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">Ethernet-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </stack> <globalPluginList type="ListNode"> <Ixia.Aptixia.StackManager.FilterPlugin type="Ixia.Aptixia.StackManager.FilterPlugin" objectid="976ba0fd-58ea-44d4-ae43-1b36c2556072" version="6.70.420"> <auto type="Bool">1</auto> <all type="Bool">0</all> <pppoecontrol type="Bool">0</pppoecontrol> <pppoenetwork type="Bool">0</pppoenetwork> <isis type="Bool">0</isis> <ip type="String" /> <tcp type="String" /> <udp type="String" /> <mac type="String" /> <icmp type="String" /> <name type="String">Filter-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.FilterPlugin> <Ixia.Aptixia.StackManager.GratArpPlugin type="Ixia.Aptixia.StackManager.GratArpPlugin" objectid="3ebd05e7-88a6-49be-a50d-134908ac124c" version="6.70.420"> <enabled type="Bool">1</enabled> <forwardGratArp type="Bool">0</forwardGratArp> <rateControlEnabled type="Bool">0</rateControlEnabled> <maxFramesPerSecond type="Int">0</maxFramesPerSecond> <name type="String">GratARP-1</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.GratArpPlugin> <Ixia.Aptixia.StackManager.TCPPlugin type="Ixia.Aptixia.StackManager.TCPPlugin" objectid="1d9748c5-122e-4153-8ffd-67cd1309b8ce" version="6.70.420"> <bestPerfSettings type="Bool">0</bestPerfSettings> <accept_ra_all type="Bool">0</accept_ra_all> <tcp_abort_on_overflow type="Bool">0</tcp_abort_on_overflow> <tcp_adv_win_scale type="Int">2</tcp_adv_win_scale> <tcp_app_win type="Int">31</tcp_app_win> <tcp_bic type="Int">0</tcp_bic> <tcp_bic_fast_convergence type="Int">1</tcp_bic_fast_convergence> <tcp_bic_low_window type="Int">14</tcp_bic_low_window> <tcp_dsack type="Bool">1</tcp_dsack> <tcp_ecn type="Bool">0</tcp_ecn> <tcp_fack type="Bool">1</tcp_fack> <tcp_fin_timeout type="Int">60</tcp_fin_timeout> <tcp_frto type="Int">0</tcp_frto> <tcp_keepalive_intvl type="Int">75</tcp_keepalive_intvl> <tcp_keepalive_probes type="Int">9</tcp_keepalive_probes> <tcp_keepalive_time type="Int">7200</tcp_keepalive_time> <tcp_low_latency type="Int">0</tcp_low_latency> <tcp_max_orphans type="Int">8192</tcp_max_orphans> <tcp_max_syn_backlog type="Int">1024</tcp_max_syn_backlog> <tcp_max_tw_buckets type="Int">180000</tcp_max_tw_buckets> <tcp_mem_low type="Int">24576</tcp_mem_low> <tcp_mem_pressure type="Int">32768</tcp_mem_pressure> <tcp_mem_high type="Int">49152</tcp_mem_high> <tcp_moderate_rcvbuf type="Int">0</tcp_moderate_rcvbuf> <tcp_no_metrics_save type="Bool">0</tcp_no_metrics_save> <tcp_orphan_retries type="Int">0</tcp_orphan_retries> <tcp_reordering type="Int">3</tcp_reordering> <tcp_retrans_collapse type="Bool">1</tcp_retrans_collapse> <tcp_retries1 type="Int">3</tcp_retries1> <tcp_retries2 type="Int">5</tcp_retries2> <tcp_rfc1337 type="Bool">0</tcp_rfc1337> <tcp_rmem_min type="Int">4096</tcp_rmem_min> <tcp_rmem_default type="Int">8192</tcp_rmem_default> <tcp_rmem_max type="Int">262144</tcp_rmem_max> <tcp_sack type="Bool">1</tcp_sack> <tcp_stdurg type="Bool">0</tcp_stdurg> <tcp_synack_retries type="Int">5</tcp_synack_retries> <tcp_syn_retries type="Int">5</tcp_syn_retries> <tcp_timestamps type="Bool">1</tcp_timestamps> <tcp_tw_recycle type="Bool">1</tcp_tw_recycle> <tcp_tw_reuse type="Bool">0</tcp_tw_reuse> <tcp_vegas_alpha type="Int">2</tcp_vegas_alpha> <tcp_vegas_beta type="Int">6</tcp_vegas_beta> <tcp_vegas_cong_avoid type="Int">0</tcp_vegas_cong_avoid> <tcp_vegas_gamma type="Int">2</tcp_vegas_gamma> <tcp_westwood type="Int">0</tcp_westwood> <tcp_window_scaling type="Bool">0</tcp_window_scaling> <ip_no_pmtu_disc type="Bool">1</ip_no_pmtu_disc> <tcp_wmem_min type="Int">4096</tcp_wmem_min> <tcp_wmem_default type="Int">8192</tcp_wmem_default> <tcp_wmem_max type="Int">262144</tcp_wmem_max> <tcp_ipfrag_time type="Int">30</tcp_ipfrag_time> <tcp_port_min type="Int">1024</tcp_port_min> <tcp_port_max type="Int">65535</tcp_port_max> <tcp_rto_min type="Int">1000</tcp_rto_min> <tcp_rto_max type="Int">60000</tcp_rto_max> <tcp_tw_rfc1323_strict type="Bool">0</tcp_tw_rfc1323_strict> <udp_port_randomization type="Bool">0</udp_port_randomization> <disable_min_max_buffer_size type="Bool">1</disable_min_max_buffer_size> <llm_hdr_gap type="Int">8</llm_hdr_gap> <llm_hdr_gap_ns type="Int">10</llm_hdr_gap_ns> <inter_packet_granular_delay type="Double">0</inter_packet_granular_delay> <delayed_acks type="Bool">1</delayed_acks> <accept_ra_default type="Bool">0</accept_ra_default> <rps_needed type="Bool">0</rps_needed> <delayed_acks_segments type="Int">0</delayed_acks_segments> <delayed_acks_timeout type="Int">0</delayed_acks_timeout> <tcp_large_icwnd type="Int">0</tcp_large_icwnd> <tcp_mgmt_rmem type="Int">87380</tcp_mgmt_rmem> <tcp_mgmt_wmem type="Int">32768</tcp_mgmt_wmem> <adjust_tcp_buffers type="Bool">1</adjust_tcp_buffers> <name type="String">TCP-1</name> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.TCPPlugin> <Ixia.Aptixia.StackManager.DnsPlugin type="Ixia.Aptixia.StackManager.DnsPlugin" objectid="9cc60113-3e53-4cf2-b3b7-6fd7d3953bb4" version="6.70.420"> <domain type="String" /> <timeout type="Int">30</timeout> <nameServerList type="ListNode" /> <searchList type="ListNode" /> <hostList type="ListNode" /> <name type="String">DNS-1</name> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.DnsPlugin> <Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type="Ixia.Aptixia.StackManager.IxLoadSettingsPlugin" objectid="399db714-47a8-445d-a24b-90d00d3f2e9e" version="1.0.0"> <teardownInterfaceWithUser type="Bool">0</teardownInterfaceWithUser> <interfaceBehavior type="Int">0</interfaceBehavior> <name type="String">Settings-1</name> <ixLoadRestObjectId type="Int">5</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSettingsPlugin> <Ixia.Aptixia.StackManager.MeshingPlugin type="Ixia.Aptixia.StackManager.MeshingPlugin" objectid="39d2a556-cf85-4102-8461-b1f1413b2db5" version="6.70.420"> <trafficMaps type="ListNode"> <Ixia.Aptixia.StackManager.MeshingTrafficMap type="Ixia.Aptixia.StackManager.MeshingTrafficMap" objectid="cdca1e00-77a3-49ef-8fe5-afb321a51af2" version="6.70.420"> <name type="String">CALLING!VoIP2_CALLED#{{sipportcalled}}</name> <configMapFilename type="String">CALLINGScript.configmap</configMapFilename> <sourceActivityId type="Int">1</sourceActivityId> <ipPreference type="Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eIpPreference">0</ipPreference> <portRangesString type="String">{{sipportcalled}}</portRangesString> <meshingType type="Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eMeshingType">2</meshingType> <destinationActivityId type="Int">0</destinationActivityId> </Ixia.Aptixia.StackManager.MeshingTrafficMap> </trafficMaps> <activityRangeMapInfoList type="ListNode" /> <name type="String">Meshing-1</name> <ixLoadRestObjectId type="Int">11</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MeshingPlugin> </globalPluginList> <portList type="Ixia.RpFramework.Server.Core.ShadowedPropertyStringList"> <String>{{ipchassis}};1;1</String> </portList> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IPSecPortGroupData type="Ixia.Aptixia.StackManager.IPSecPortGroupData" objectid="62e57abd-b4c6-45af-a720-7033259c203c" version="6.70.0"> <role type="String">Initiator</role> <associates type="ListNode" /> <overrideGlobalOptions type="Bool">0</overrideGlobalOptions> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <maxInitiationRate type="Int">50</maxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <maxPendingTunnels type="Int">50</maxPendingTunnels> <teardownRate type="Int">10</teardownRate> <enableESPPerStreamStats type="Bool">0</enableESPPerStreamStats> <enableESPReplayStats type="Bool">0</enableESPReplayStats> <activities type="ListNode" /> <pcpuLogLevel type="String">0</pcpuLogLevel> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecPortGroupData> </typeSpecificData> <virtualMode type="Bool">0</virtualMode> <allowedVirtualModeTypes type="Ixia.RpFramework.Server.Core.ShadowedPropertyStringList" /> <doOwnership type="Bool">0</doOwnership> <branchToNicMap type="ListNode" /> <cpuAggregation type="Bool">0</cpuAggregation> <activePort type="String" /> <networkLayersManager type="Ixia.Aptixia.StackManager.NetworkLayersManager" objectid="f7999b28-d3d6-4a69-bd61-ab5516b7c540" version="6.70.420"> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </networkLayersManager> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.PortGroup> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="b1fbd381-b769-4ec1-8715-299508ecb458" version="6.70.420"> <name type="String">VM2</name> <category type="String" /> <stack type="Ixia.Aptixia.StackManager.L1EthernetPlugin" objectid="48f486a6-f09b-4770-a091-e9ce609e9bec" version="6.70.420"> <autoNegotiate type="Bool">1</autoNegotiate> <speed type="String">k100FD</speed> <advertise10Half type="Bool">1</advertise10Half> <advertise10Full type="Bool">1</advertise10Full> <advertise100Half type="Bool">1</advertise100Half> <advertise100Full type="Bool">1</advertise100Full> <advertise1000Full type="Bool">1</advertise1000Full> <advertise2500Full type="Bool">1</advertise2500Full> <advertise5000Full type="Bool">1</advertise5000Full> <advertise10000Full type="Bool">1</advertise10000Full> <cardDualPhy type="Ixia.Aptixia.StackManager.DualPhyPlugin" objectid="c500685a-4fcb-4335-abe0-70c98cf1ba43" version="6.70.420"> <medium type="String">auto</medium> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </cardDualPhy> <cardElm type="Ixia.Aptixia.StackManager.EthernetELMPlugin" objectid="92644bb5-bda6-4072-98f9-47b47e4597c7" version="6.70.420"> <negotiateMasterSlave type="Bool">1</negotiateMasterSlave> <negotiationType type="String">master</negotiationType> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </cardElm> <enableFlowControl type="Bool">0</enableFlowControl> <directedAddress type="String">01:80:C2:00:00:01</directedAddress> <dataCenter type="Ixia.Aptixia.StackManager.DataCenterSettings" objectid="3726f608-97b7-4bf2-b88e-4c0bf13b45a0" version="6.70.420"> <dcSupported type="Bool">1</dcSupported> <dcEnabled type="Bool">0</dcEnabled> <dcFlowControl type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType">0</dcFlowControl> <dcMode type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode">2</dcMode> <dcPfcMapping type="IntList" /> <dcPfcPauseEnable type="Bool">0</dcPfcPauseEnable> <dcPfcPauseDelay type="Int">1</dcPfcPauseDelay> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </dataCenter> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.L2EthernetPlugin type="Ixia.Aptixia.StackManager.L2EthernetPlugin" objectid="820b0582-6a4c-4109-bd5d-587621a43ce2" version="6.70.420"> <macRangeList type="ListNode"> <Ixia.Aptixia.StackManager.MacRange type="Ixia.Aptixia.StackManager.MacRange" objectid="aa73bd95-9ffb-411e-8ab3-8a128767aacb" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">MAC-R2</name> <mac type="String">00:0A:43:4F:2A:00</mac> <incrementBy type="String">00:00:00:00:00:01</incrementBy> <mtu type="Int">1410</mtu> <count type="Int">1</count> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="7024f4b3-1a75-491a-8da1-17a45a15d5cc" version="6.70.420"> <name type="String">VLAN-R2</name> <enabled type="Bool">0</enabled> <firstId type="Int">1</firstId> <incrementStep type="Int">1</incrementStep> <increment type="Int">1</increment> <uniqueCount type="Int">4094</uniqueCount> <priority type="Int">1</priority> <tpid type="String">0x8100</tpid> <innerEnable type="Bool">0</innerEnable> <innerFirstId type="Int">1</innerFirstId> <innerIncrementStep type="Int">1</innerIncrementStep> <innerIncrement type="Int">1</innerIncrement> <innerUniqueCount type="Int">4094</innerUniqueCount> <innerPriority type="Int">1</innerPriority> <idIncrMode type="Int">2</idIncrMode> <innerTpid type="String">0x8100</innerTpid> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </vlanRange> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacRange> </macRangeList> <vlanRangeList type="ListNode"> <Ixia.Aptixia.StackManager.VlanIdRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="7024f4b3-1a75-491a-8da1-17a45a15d5cc" version="6.70.420" /> </vlanRangeList> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Plugin type="Ixia.Aptixia.StackManager.IpV4V6Plugin" objectid="e53ae54e-ab21-4997-b532-e9bd58210050" version="6.70.420"> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="c69dae97-f1c2-4505-aedb-3f9ca3f4d02a" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">IP-R2</name> <ipType type="String">IPv4</ipType> <ipAddress type="String">{{ipcard2}}</ipAddress> <prefix type="Int">16</prefix> <incrementBy type="String">0.0.0.1</incrementBy> <count type="Int">1</count> <autoCountEnabled type="Bool">0</autoCountEnabled> <gatewayAddress type="String">{{ipgw}}</gatewayAddress> <gatewayIncrement type="String">0.0.0.0</gatewayIncrement> <gatewayIncrementMode type="String">perSubnet</gatewayIncrementMode> <enableGatewayArp type="Bool">0</enableGatewayArp> <generateStatistics type="Bool">0</generateStatistics> <mss type="Int">1410</mss> <randomizeAddress type="Bool">0</randomizeAddress> <randomizeSeed type="Int">3534372608</randomizeSeed> <autoMacGeneration type="Bool">1</autoMacGeneration> <macRange type="Ixia.Aptixia.StackManager.MacRange" objectid="aa73bd95-9ffb-411e-8ab3-8a128767aacb" version="6.70.420" /> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="7024f4b3-1a75-491a-8da1-17a45a15d5cc" version="6.70.420" /> <atmRange type="Ixia.Aptixia.StackManager.AtmRange" objectid="00000000-0000-0000-0000-000000000000" /> <pvcRange type="Ixia.Aptixia.StackManager.PvcRange" objectid="00000000-0000-0000-0000-000000000000" /> <autoIpTypeEnabled type="Bool">0</autoIpTypeEnabled> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Range> </rangeList> <rangeGroups type="ListNode"> <Ixia.Aptixia.StackManager.RangeGroup type="Ixia.Aptixia.StackManager.RangeGroup" objectid="de9d629b-e0dc-41f5-99cb-5aa8a808ceee" version="6.70.420"> <name type="String">DistGroup1</name> <distribType type="Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType">0</distribType> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="c69dae97-f1c2-4505-aedb-3f9ca3f4d02a" version="6.70.420" /> </rangeList> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.RangeGroup> </rangeGroups> <childrenList type="ListNode" /> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">IP-2</name> <ixLoadRestObjectId type="Int">6</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Plugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">MAC/VLAN-2</name> <ixLoadRestObjectId type="Int">5</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.L2EthernetPlugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">Ethernet-2</name> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </stack> <globalPluginList type="ListNode"> <Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type="Ixia.Aptixia.StackManager.IxLoadSettingsPlugin" objectid="26685c48-95e7-4da5-a893-fc527b814b1c" version="1.0.0"> <teardownInterfaceWithUser type="Bool">0</teardownInterfaceWithUser> <interfaceBehavior type="Int">0</interfaceBehavior> <name type="String">Settings-2</name> <ixLoadRestObjectId type="Int">7</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSettingsPlugin> <Ixia.Aptixia.StackManager.FilterPlugin type="Ixia.Aptixia.StackManager.FilterPlugin" objectid="3f42c205-a9ad-433b-b7af-19ea7ec76940" version="6.70.420"> <auto type="Bool">1</auto> <all type="Bool">0</all> <pppoecontrol type="Bool">0</pppoecontrol> <pppoenetwork type="Bool">0</pppoenetwork> <isis type="Bool">0</isis> <ip type="String" /> <tcp type="String" /> <udp type="String" /> <mac type="String" /> <icmp type="String" /> <name type="String">Filter-2</name> <ixLoadRestObjectId type="Int">8</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.FilterPlugin> <Ixia.Aptixia.StackManager.GratArpPlugin type="Ixia.Aptixia.StackManager.GratArpPlugin" objectid="fe43b342-829b-4ff4-8671-49ba1c4441e5" version="6.70.420"> <enabled type="Bool">1</enabled> <forwardGratArp type="Bool">0</forwardGratArp> <rateControlEnabled type="Bool">0</rateControlEnabled> <maxFramesPerSecond type="Int">0</maxFramesPerSecond> <name type="String">GratARP-2</name> <ixLoadRestObjectId type="Int">9</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.GratArpPlugin> <Ixia.Aptixia.StackManager.TCPPlugin type="Ixia.Aptixia.StackManager.TCPPlugin" objectid="57601116-d86b-4c04-856b-2241507a0378" version="6.70.420"> <bestPerfSettings type="Bool">0</bestPerfSettings> <accept_ra_all type="Bool">0</accept_ra_all> <tcp_abort_on_overflow type="Bool">0</tcp_abort_on_overflow> <tcp_adv_win_scale type="Int">2</tcp_adv_win_scale> <tcp_app_win type="Int">31</tcp_app_win> <tcp_bic type="Int">0</tcp_bic> <tcp_bic_fast_convergence type="Int">1</tcp_bic_fast_convergence> <tcp_bic_low_window type="Int">14</tcp_bic_low_window> <tcp_dsack type="Bool">1</tcp_dsack> <tcp_ecn type="Bool">0</tcp_ecn> <tcp_fack type="Bool">1</tcp_fack> <tcp_fin_timeout type="Int">60</tcp_fin_timeout> <tcp_frto type="Int">0</tcp_frto> <tcp_keepalive_intvl type="Int">75</tcp_keepalive_intvl> <tcp_keepalive_probes type="Int">9</tcp_keepalive_probes> <tcp_keepalive_time type="Int">7200</tcp_keepalive_time> <tcp_low_latency type="Int">0</tcp_low_latency> <tcp_max_orphans type="Int">8192</tcp_max_orphans> <tcp_max_syn_backlog type="Int">1024</tcp_max_syn_backlog> <tcp_max_tw_buckets type="Int">180000</tcp_max_tw_buckets> <tcp_mem_low type="Int">24576</tcp_mem_low> <tcp_mem_pressure type="Int">32768</tcp_mem_pressure> <tcp_mem_high type="Int">49152</tcp_mem_high> <tcp_moderate_rcvbuf type="Int">0</tcp_moderate_rcvbuf> <tcp_no_metrics_save type="Bool">0</tcp_no_metrics_save> <tcp_orphan_retries type="Int">0</tcp_orphan_retries> <tcp_reordering type="Int">3</tcp_reordering> <tcp_retrans_collapse type="Bool">1</tcp_retrans_collapse> <tcp_retries1 type="Int">3</tcp_retries1> <tcp_retries2 type="Int">5</tcp_retries2> <tcp_rfc1337 type="Bool">0</tcp_rfc1337> <tcp_rmem_min type="Int">4096</tcp_rmem_min> <tcp_rmem_default type="Int">4096</tcp_rmem_default> <tcp_rmem_max type="Int">262144</tcp_rmem_max> <tcp_sack type="Bool">1</tcp_sack> <tcp_stdurg type="Bool">0</tcp_stdurg> <tcp_synack_retries type="Int">5</tcp_synack_retries> <tcp_syn_retries type="Int">5</tcp_syn_retries> <tcp_timestamps type="Bool">1</tcp_timestamps> <tcp_tw_recycle type="Bool">1</tcp_tw_recycle> <tcp_tw_reuse type="Bool">0</tcp_tw_reuse> <tcp_vegas_alpha type="Int">2</tcp_vegas_alpha> <tcp_vegas_beta type="Int">6</tcp_vegas_beta> <tcp_vegas_cong_avoid type="Int">0</tcp_vegas_cong_avoid> <tcp_vegas_gamma type="Int">2</tcp_vegas_gamma> <tcp_westwood type="Int">0</tcp_westwood> <tcp_window_scaling type="Bool">0</tcp_window_scaling> <ip_no_pmtu_disc type="Bool">1</ip_no_pmtu_disc> <tcp_wmem_min type="Int">4096</tcp_wmem_min> <tcp_wmem_default type="Int">4096</tcp_wmem_default> <tcp_wmem_max type="Int">262144</tcp_wmem_max> <tcp_ipfrag_time type="Int">30</tcp_ipfrag_time> <tcp_port_min type="Int">1024</tcp_port_min> <tcp_port_max type="Int">65535</tcp_port_max> <tcp_rto_min type="Int">200</tcp_rto_min> <tcp_rto_max type="Int">120000</tcp_rto_max> <tcp_tw_rfc1323_strict type="Bool">0</tcp_tw_rfc1323_strict> <udp_port_randomization type="Bool">0</udp_port_randomization> <disable_min_max_buffer_size type="Bool">1</disable_min_max_buffer_size> <llm_hdr_gap type="Int">8</llm_hdr_gap> <llm_hdr_gap_ns type="Int">10</llm_hdr_gap_ns> <inter_packet_granular_delay type="Double">0</inter_packet_granular_delay> <delayed_acks type="Bool">1</delayed_acks> <accept_ra_default type="Bool">0</accept_ra_default> <rps_needed type="Bool">0</rps_needed> <delayed_acks_segments type="Int">0</delayed_acks_segments> <delayed_acks_timeout type="Int">0</delayed_acks_timeout> <tcp_large_icwnd type="Int">0</tcp_large_icwnd> <tcp_mgmt_rmem type="Int">87380</tcp_mgmt_rmem> <tcp_mgmt_wmem type="Int">32768</tcp_mgmt_wmem> <adjust_tcp_buffers type="Bool">1</adjust_tcp_buffers> <name type="String">TCP-2</name> <ixLoadRestObjectId type="Int">10</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.TCPPlugin> <Ixia.Aptixia.StackManager.DnsPlugin type="Ixia.Aptixia.StackManager.DnsPlugin" objectid="7682d113-cd50-4cc6-b23a-569c29f03886" version="6.70.420"> <domain type="String" /> <timeout type="Int">30</timeout> <nameServerList type="ListNode" /> <searchList type="ListNode" /> <hostList type="ListNode" /> <name type="String">DNS-2</name> <ixLoadRestObjectId type="Int">12</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.DnsPlugin> <Ixia.Aptixia.StackManager.MeshingPlugin type="Ixia.Aptixia.StackManager.MeshingPlugin" objectid="f5f1e4c2-eef8-4a34-ac13-e1e3eeb5328b" version="6.70.420"> <trafficMaps type="ListNode" /> <activityRangeMapInfoList type="ListNode" /> <name type="String">Meshing-2</name> <ixLoadRestObjectId type="Int">13</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MeshingPlugin> </globalPluginList> <portList type="Ixia.RpFramework.Server.Core.ShadowedPropertyStringList"> <String>{{ipchassis}};2;1</String> </portList> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IPSecPortGroupData type="Ixia.Aptixia.StackManager.IPSecPortGroupData" objectid="c279f05c-d2a7-476d-b4af-9c8ff0d878dd" version="6.70.0"> <role type="String">Initiator</role> <associates type="ListNode" /> <overrideGlobalOptions type="Bool">0</overrideGlobalOptions> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <maxInitiationRate type="Int">50</maxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <maxPendingTunnels type="Int">50</maxPendingTunnels> <teardownRate type="Int">10</teardownRate> <enableESPPerStreamStats type="Bool">0</enableESPPerStreamStats> <enableESPReplayStats type="Bool">0</enableESPReplayStats> <activities type="ListNode" /> <pcpuLogLevel type="String">0</pcpuLogLevel> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecPortGroupData> </typeSpecificData> <virtualMode type="Bool">0</virtualMode> <allowedVirtualModeTypes type="Ixia.RpFramework.Server.Core.ShadowedPropertyStringList" /> <doOwnership type="Bool">0</doOwnership> <branchToNicMap type="ListNode" /> <cpuAggregation type="Bool">0</cpuAggregation> <activePort type="String" /> <networkLayersManager type="Ixia.Aptixia.StackManager.NetworkLayersManager" objectid="d581a4e6-0e4b-4692-a0e2-12fd25d7db35" version="6.70.420"> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </networkLayersManager> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.PortGroup> </portGroupList> <externalProperties type="Ixia.Aptixia.StackManager.ExternalPropertyManager" objectid="0c7c98dd-4e41-4fb8-adb7-918848d0ba3e" version="6.70.420"> <properties type="ListNode"> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="c7be9c3b-0335-4cf6-bbcb-d9a90d6b78a0" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DHCPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d63defc3-039a-4af6-b0f6-19be5481d6bb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MobileSubscribersRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d62b40dc-41c2-48b0-b3a6-4aa74e171a8c" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DHCPServerRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="45eba56d-c42f-4bbf-830b-1f102bf83c92" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a9e91079-1215-444b-a0a0-59f8ff4e7746" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPGRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="b91778ea-dac5-499a-8c54-b8ba0c78b44b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPRange_SGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="13f113b2-8ce8-4742-ac72-f8ee04caa5d6" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPSUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="f2723794-57ce-471c-b3ae-10cd5ee235a2" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IpV4V6Range</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="3e8d5274-5483-41ca-8f4d-b1fce291dad1" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PppoxRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="85b44e1f-0689-4feb-a14d-b43a1b837c1d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">L2tpRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="c0383f23-e15f-4a97-bbf8-6ade8f6f2b0c" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatLTEUEUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="5912723b-fb9a-4e0a-bae4-38730c73cc0e" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">SixRdRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="9a6cb101-a624-4978-8d0c-85c5b6c26906" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPSgsnS3RangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="4f85b4a9-d55e-494e-beb6-5ef5b5d04cf8" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EmulatedRouterRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="489dbc18-55b5-4902-99ab-9a289a8c2e2b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPNGAPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="2992f902-204b-4050-8798-0b24ee090922" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatRNCIuPSUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="8b53f68d-6027-4150-9ca3-5a62606526bd" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPNGUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="e85d740f-87a2-473a-a133-e08d5bb48ed2" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange_S5S8_SGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="5a179c3f-82db-44b3-95fc-6e4dbfe17556" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPPcrfRange_S5S8_PGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="55d890fe-0faa-41bd-9fca-12463fd14b3d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DSLiteRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="8dc83b0a-45a9-46b7-9b52-731eb114d315" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPSGSNRangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a0883ed3-63b7-47cb-ab77-7ceebb8212e1" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">SlaacRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7bb58c6e-377f-46be-a2b1-7d86997b2fa1" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">AtmRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="8a4c92be-449a-4f0e-bcf3-55fdfcc369cc" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatMMEApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="588aea0d-748b-4b82-9418-4f3a35185d2e" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatENodeBUuApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="9046358f-dde4-4f17-b596-5903079d3bcf" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MacRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a28df47f-783e-4bc9-aa22-78636ceaf1b7" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DualStackIPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="19deb9c9-8aef-41e2-8b8b-f01a8b274266" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange_S2a_TWAN</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="6abb9650-bc55-4e9e-9dfc-81964310e662" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatSGSNIuPSApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="35dc8f8d-44fd-4c73-9771-6c62bd227435" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatENodeBSimUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="3c48b615-2c03-4c1b-8712-e83f63841d13" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">S6dRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="cd5080c1-8de4-4eb3-985a-3e9fe38ebed4" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">UERangeBase</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="24c2c3a6-f9fd-4b8e-bc9f-aeeac63bae01" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPMmeS10RangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="529a2786-eb8c-40cb-80b9-83415888012c" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">S6aRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="6593d153-2b87-4171-a8bf-8ae2b1907487" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PptpRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="819a5c99-14bf-4efb-912a-5d2c985e97d1" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">BmScRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="83ff7bd6-95cf-4d75-91e4-3e2a9f5f6b7d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MBmsGwRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="022d8e72-36c8-4117-b901-baffb9d0805c" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPPMIPHostRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> </properties> <values type="ListNode"> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="57badb9d-afb8-4c05-9182-df7469457e4c" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="5affc0a7-68f6-46f6-b801-0e18e067a572" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="1efc6993-1480-469a-a6af-38b4093fb102" version="6.70.420"> <value type="Bool">0</value> <ixLoadRestObjectId type="Int">13</ixLoadRestObjectId> </value> <enabled type="Bool">1</enabled> <ixLoadRestObjectId type="Int">13</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="22a742ae-d9bd-4548-83f1-84da6cc07c5f" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="c69dae97-f1c2-4505-aedb-3f9ca3f4d02a" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="b664f3f9-4f42-48c1-a481-75ba76740055" version="6.70.420"> <value type="Bool">0</value> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </value> <enabled type="Bool">1</enabled> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="77dd061e-b592-4d9e-9c38-24a46fec1121" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.MacRange" objectid="aa73bd95-9ffb-411e-8ab3-8a128767aacb" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="b5f138be-a18b-46a3-b3f8-c90fa5711597" version="6.70.420"> <value type="Bool">0</value> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </value> <enabled type="Bool">0</enabled> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="6dc25ae2-da26-4df6-8a25-cf296dd9430b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.MacRange" objectid="ba896971-1d78-4e03-8f2a-28c65417612e" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="0858fb9d-2304-44d4-b413-569815c8b6a7" version="6.70.420"> <value type="Bool">0</value> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </value> <enabled type="Bool">0</enabled> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.ExternalProperty> </values> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </externalProperties> <availableNetworkTimelines type="ListNode" /> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IxLoadSessionData type="Ixia.Aptixia.StackManager.IxLoadSessionData" objectid="149d16d7-c594-4866-917f-fe1b44fac83f" version="1.0.0"> <portGroupList type="ListNode"> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="b1fbd381-b769-4ec1-8715-299508ecb458" version="6.70.420" /> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="e7fa1f9e-23d9-4742-96b2-6edce6c4424e" version="6.70.420" /> </portGroupList> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSessionData> <Ixia.Aptixia.StackManager.MacSessionData type="Ixia.Aptixia.StackManager.MacSessionData" objectid="7869d347-cce4-4cd3-9eed-88a3914ae956" version="6.70.420"> <duplicateCheckingScope type="Ixia.Aptixia.StackManager.MacSessionDataSkeleton+eMacValidationOptions">2</duplicateCheckingScope> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacSessionData> <Ixia.Aptixia.StackManager.IpSessionData type="Ixia.Aptixia.StackManager.IpSessionData" objectid="93416b84-eb4a-4637-ab56-4a4de6250c3b" version="6.70.420"> <duplicateCheckingScope type="Ixia.Aptixia.StackManager.IpSessionDataSkeleton+eIpValidationOptions">2</duplicateCheckingScope> <enableGatewayArp type="Bool">0</enableGatewayArp> <gatewayArpRequestRate type="Int">300</gatewayArpRequestRate> <maxOutstandingGatewayArpRequests type="Int">300</maxOutstandingGatewayArpRequests> <ignoreUnresolvedIPs type="Bool">0</ignoreUnresolvedIPs> <sendAllRequests type="Bool">0</sendAllRequests> <individualARPTimeOut type="Int">500</individualARPTimeOut> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpSessionData> <Ixia.Aptixia.StackManager.IPSecSessionData type="Ixia.Aptixia.StackManager.IPSecSessionData" objectid="8611fd36-7f8c-48bc-ac46-f6e2f0816cb5" version="6.70.0"> <ipsecTunnelSetup type="Ixia.Aptixia.StackManager.IPSecTunnelSetup" objectid="e08e1671-e189-4cba-8894-5dda9b24701a" version="6.70.0"> <tunnelSetupTimeout type="Int">30</tunnelSetupTimeout> <tunnelRetransmissionTimeout type="Int">30</tunnelRetransmissionTimeout> <numRetries type="Int">0</numRetries> <retryInterval type="Int">10</retryInterval> <retryDelay type="Int">10</retryDelay> <testType type="String">P2D</testType> <logLevel type="String">3</logLevel> <sendCiscoVid type="Bool">0</sendCiscoVid> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <enableRekey type="Bool">1</enableRekey> <rekeyRetries type="Int">3</rekeyRetries> <rekeyFuzzPercentage type="Int">0</rekeyFuzzPercentage> <rekeyMargin type="Int">10</rekeyMargin> <ixLoadRestObjectId type="Int">7</ixLoadRestObjectId> </ipsecTunnelSetup> <ipsecCertificates type="Ixia.Aptixia.StackManager.IPSecCertificates" objectid="b53c8c74-6c81-4e4a-84cb-5beb05b38343" version="6.70.0"> <uniqueCert type="Bool">0</uniqueCert> <certSource type="String">kNewCert</certSource> <caURL type="String" /> <caDN type="String" /> <certSubjectDN type="String" /> <certSubjectAltDN type="String" /> <remoteIkeId type="String" /> <bitSize type="String">k512</bitSize> <saveCert type="Bool">1</saveCert> <cacheCertFolder type="String">C:\Program Files (x86)\Ixia\CachedCerts</cacheCertFolder> <certParentFolder type="String">C:\Program Files (x86)\Ixia\CachedCerts</certParentFolder> <certNumber type="String" /> <caCertNumber type="String" /> <earlyExpDate type="String" /> <lateExpDate type="String" /> <usePerRangeCertNameExp type="Bool">0</usePerRangeCertNameExp> <checkCrl type="Bool">0</checkCrl> <crlOverrideEnable type="Bool">0</crlOverrideEnable> <crlOverrideUrl type="String" /> <checkOcsp type="Bool">0</checkOcsp> <ocspOverrideEnable type="Bool">0</ocspOverrideEnable> <ocspOverrideUrl type="String" /> <unknownIsRevoked type="Bool">0</unknownIsRevoked> <certProto type="String">kSCEP</certProto> <ixLoadRestObjectId type="Int">7</ixLoadRestObjectId> </ipsecCertificates> <ipsecCertManager type="Ixia.Aptixia.StackManager.IPSecCertManager" objectid="21591e4a-9e87-48e6-8679-68685c5c8383" version="6.70.0"> <caURL type="String" /> <caDN type="String">CN=RootCA,C=RO,L=Bucharest,O=Ixia,OU=IxLoad,IP:201.121.87.2,email:ixia@ixiacom.com</caDN> <certSubjectDN type="String">CN=IxiaVPN,C=RO,L=Bucharest,O=Ixia</certSubjectDN> <keyGenAlgo type="String">kRSA_512</keyGenAlgo> <cacheCertFolder type="String">C:\Program Files (x86)\Ixia\CachedCerts</cacheCertFolder> <caKeyFile type="String">C:\Program Files (x86)\Ixia\ca-priv.key</caKeyFile> <caCrtFile type="String">C:\Program Files (x86)\Ixia\ca-cert.crt</caCrtFile> <certNumber type="Int">1</certNumber> <certProto type="String">kSCEP</certProto> <createRootCA type="Bool">0</createRootCA> <uniqueCert type="Bool">0</uniqueCert> <descFilePath type="String">C:\Program Files (x86)\Ixia\CachedCerts\sample.desc</descFilePath> <useDescFile type="Bool">0</useDescFile> <ixLoadRestObjectId type="Int">6</ixLoadRestObjectId> </ipsecCertManager> <eapSimTuples type="ListNode" /> <eapAkaTuples type="ListNode" /> <maxInitiationRate type="Int">50</maxInitiationRate> <maxPendingTunnels type="Int">50</maxPendingTunnels> <negotiationStartDelay type="Int">0</negotiationStartDelay> <teardownRate type="Int">10</teardownRate> <burstInitiation type="Bool">0</burstInitiation> <parallelInitiation type="Bool">0</parallelInitiation> <enableWildcardTsi type="Bool">0</enableWildcardTsi> <enableWildcardTsr type="Bool">0</enableWildcardTsr> <enablePlutoWildcardTsi type="Bool">0</enablePlutoWildcardTsi> <enablePlutoModeCfgWildcardTsr type="Bool">1</enablePlutoModeCfgWildcardTsr> <enablePlutoS2SWildcardTsr type="Bool">0</enablePlutoS2SWildcardTsr> <payloadAttrTypes type="ListNode" /> <ixLoadRestObjectId type="Int">3</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecSessionData> </typeSpecificData> <statViewManager type="Ixia.Aptixia.StackManager.StatViewManager" objectid="32b6a125-39ad-4da3-9710-e09cc94bf306" version="6.70.420"> <enableStats type="Bool">1</enableStats> <enableOverviewStats type="Bool">1</enableOverviewStats> <enablePerSessionStats type="Bool">1</enablePerSessionStats> </statViewManager> <waitForLinkUp type="Bool">0</waitForLinkUp> <overloadProtection type="Bool">1</overloadProtection> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.SMSession> </rpf></xml> - </_smSessionXml> - <_composerConfig ver="[0, [1, [0, [0]]]]" type="ixComposerConfig"> - <xml type="str"></xml> - </_composerConfig> - <_quickTestConfig ver="[0, [1, [0, [0]]]]" type="ixQuickTestConfig"> - <xml type="str"></xml> - </_quickTestConfig> - <lastApiUniqueId type="int">17217</lastApiUniqueId> - <version type="str">8.30.0.161</version> - <name type="str">REG_CALL_OPNFV_ORANGE_v13.rxf</name> - <comment type="str"></comment> - <path type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</path> - <last type="str">REG_CALL_OPNFV_ORANGE_v9j.rxf</last> - <activeTest type="str">Test1</activeTest> - <chassisChain ver="[2, [1, [0, [0]]]]" oid="6" type="ixChassisChain"> - <chassisList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixChassisSequenceContainer" itemtype="ixChassis"> - <item ver="[1, [1, [0, [0]]]]" oid="0" type="ixChassis"> - <name type="str">{{ipchassis}}</name> - <id type="int">1</id> - <hiddenCards type="NoneType">None</hiddenCards> - </item> - </chassisList> - <_apiUniqueId type="int">15685</_apiUniqueId> - <chassisMap type="dict"> - <item> - <key type="int">1</key> - <value ref="0"/> - </item> - </chassisMap> - <hiddenChassis type="str"></hiddenChassis> - </chassisChain> - <AfmPortPacketRewriteConfigList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixAfmPortPacketRewriteConfigList" itemtype="ixAfmPortPacketRewriteConfig"/> - <networkList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixRepositoryNetworkList" itemtype="ixNullNetwork"/> - <dutList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixDutList" itemtype="ixDut"/> - <trafficList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixTrafficList" itemtype="ixActivityModel"/> - <testList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixTestList" itemtype="ixTestEnvelope"> - <item ver="[18, [1, [0, [0]]]]" type="ixTestEnvelope"> - <name type="str">Test1</name> - <comment type="str"></comment> - <enableForceOwnership type="bool">True</enableForceOwnership> - <enableResetPorts type="bool">False</enableResetPorts> - <statsRequired type="bool">True</statsRequired> - <enableConditionalView type="bool">False</enableConditionalView> - <conditionalViewType type="int">1</conditionalViewType> - <conditionalViewList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixConditionalViewList" itemtype="ixConditionalView"/> - <enableReleaseConfigAfterRun type="bool">False</enableReleaseConfigAfterRun> - <csvInterval type="int">4</csvInterval> - <networkFailureThreshold type="int">0</networkFailureThreshold> - <captureViewOptions ver="[1, [1, [0, [0]]]]" oid="12" type="ixViewOptions"> - <runMode type="int">1</runMode> - <collectScheme type="int">0</collectScheme> - <allocatedBufferMemoryPercentage type="long">30</allocatedBufferMemoryPercentage> - <captureRunAfter type="int">0</captureRunAfter> - <captureRunDuration type="int">0</captureRunDuration> - <_apiUniqueId type="int">15467</_apiUniqueId> - </captureViewOptions> - <scenarioList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioList" itemtype="ixScenario"> - <item ver="[3, [1, [0, [0]]]]" type="ixScenario"> - <name type="str">New Traffic Flow</name> - <columnList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTrafficColumnList" itemtype="ixTrafficColumn"> - <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn"> - <name type="str">Originate</name> - <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement"> - <item ver="[1, [23, [0, [1, [0, [0]]]]]]" oid="5" type="ixNetTraffic"> - <name type="str">VoIP1@VM1</name> - <column type="NoneType">None</column> - <scenarioElementType type="str">netTraffic</scenarioElementType> - <enable type="bool">True</enable> - <role type="str">Peer</role> - <networkType type="str">ethernet</networkType> - <activityFunction type="str">ipTrafficAgent</activityFunction> - <activeRole type="str">Both</activeRole> - <networkActivityList ver="[0, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkActivityList" itemtype="ixNetworkActivity"/> - <activityGroupList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityGroupList" itemtype="ixActivityGroup"/> - <traffic ver="[0, [6, [1, [0, [0]]]]]" type="ixTraffic"> - <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp> - <name type="str">VoIP1</name> - <role type="str">Peer</role> - <activityFunction type="str">ipTrafficAgent</activityFunction> - <payload type="NoneType">None</payload> - <agentList ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="_agentListSequenceContainer" itemtype="ixAgent"> - <item ver="[34, [1, [0, [6, [1, [0, [0]]]], [0, [0]]], [0]]]" oid="18" type="#VoIP_Peer_plugin$Plugin"> - <enable type="bool">True</enable> - <name type="str">REGISTERING</name> - <activityFunction type="NoneType">None</activityFunction> - <needToRefreshStatViews type="bool">False</needToRefreshStatViews> - <activeRole type="str">Both</activeRole> - <cmdListLoops type="int">0</cmdListLoops> - <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/> - <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination"/> - <flowPercentage type="float">100.0</flowPercentage> - <uniqueID type="int">27</uniqueID> - <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyMap_VoIP"> - <szPluginVersion type="str">4.10</szPluginVersion> - <ceCommands ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]], [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_ceCommands" itemtype="ixConfig"> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStart"> - <commandId type="int">-2</commandId> - <commandType type="str">START</commandType> - <cmdName type="str">Start</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Output1</name> - <outputType type="int">0</outputType> - <destCmdId type="int">2</destCmdId> - <objectID type="int">0</objectID> - <destinationCommandIdx type="int">2</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStop"> - <commandId type="int">-3</commandId> - <commandType type="str">STOP</commandType> - <cmdName type="str">Stop</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure"> - <commandId type="int">2</commandId> - <commandType type="str">Procedure</commandType> - <cmdName type="str">Register Complete (#4)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">47</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">3</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [1, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CommandEx"> - <commandId type="int">47</commandId> - <commandType type="str">CommandEx</commandType> - <cmdName type="str">Sleep (#2)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - </outputList> - <cmdType type="str">FlowSleep</cmdType> - </item> - </ceCommands> - <activityLink ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityLinkInfo"> - <name type="str"><None></name> - <activitiesCount type="int">1</activitiesCount> - </activityLink> - <triggers ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TriggerConfig"> - <triggersInCount type="int">0</triggersInCount> - <triggersOutCount type="int">0</triggersOutCount> - </triggers> - <globalSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSettings"> - <globalExecStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalExecSettings"> - <setAborted type="bool">False</setAborted> - <setAllFailed type="bool">False</setAllFailed> - <trigTimeout type="int">600000</trigTimeout> - <notAbortOnTimeout type="bool">False</notAbortOnTimeout> - <limitErrors type="bool">False</limitErrors> - <maxErrors type="int">1</maxErrors> - <limitArrayVarSize type="bool">False</limitArrayVarSize> - <maxArrayVarSize type="int">10</maxArrayVarSize> - </globalExecStg> - <globalSIPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSIPSettings"> - <disableTCP type="bool">False</disableTCP> - <prefQOP type="int">0</prefQOP> - <warnAsError type="bool">False</warnAsError> - <limitQueueSize type="bool">True</limitQueueSize> - <maxChannelsInQueue type="int">25</maxChannelsInQueue> - <enableSIPLogging type="bool">False</enableSIPLogging> - <limitSIPLoggingChannels type="bool">False</limitSIPLoggingChannels> - <maxSIPLoggingChannels type="int">10</maxSIPLoggingChannels> - <minSIPLoggingChannels type="int">0</minSIPLoggingChannels> - <voipPeerLogSettings type="int">0</voipPeerLogSettings> - <voipPeerLogExpForChannels type="str"></voipPeerLogExpForChannels> - <abortLoopOnTriggerTimeout type="bool">False</abortLoopOnTriggerTimeout> - </globalSIPStg> - <globalRTPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalRTPSettings"> - <transmMode type="int">0</transmMode> - <playMode type="int">0</playMode> - <repeatCount type="int">1</repeatCount> - <repeatTime type="int">1000</repeatTime> - <timeUnit type="int">0</timeUnit> - <volume type="int">-20</volume> - <playModePathConf type="int">0</playModePathConf> - <repeatCountPathConf type="int">0</repeatCountPathConf> - <repeatTimePathConf type="int">10</repeatTimePathConf> - <timeUnitPathConf type="int">0</timeUnitPathConf> - <toneDurationPathConf type="int">200</toneDurationPathConf> - <interToneDelayPathConf type="int">200</interToneDelayPathConf> - <toneAmplitudePathConf type="int">-10</toneAmplitudePathConf> - <firstToneTimeoutPathConf type="int">4000</firstToneTimeoutPathConf> - <interToneTimeoutPathConf type="int">2000</interToneTimeoutPathConf> - <qovTalkExtraSilence type="int">500</qovTalkExtraSilence> - <qovListenExtraDuration type="int">2000</qovListenExtraDuration> - <downloadRTPCSV type="bool">True</downloadRTPCSV> - <waitQoVScore type="bool">False</waitQoVScore> - </globalRTPStg> - <globalSTUNStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSTUNSettings"> - <keepAliveInterval type="int">15</keepAliveInterval> - </globalSTUNStg> - <globalSKINNYStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSKINNYSettings"> - <softKeyCount type="int">25</softKeyCount> - <receiveVideo type="bool">False</receiveVideo> - <transmitVideo type="bool">False</transmitVideo> - </globalSKINNYStg> - <globalT38Stg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalT38Settings"> - <t30Log type="bool">False</t30Log> - <t38Log type="bool">False</t38Log> - <receivedImageLog type="bool">False</receivedImageLog> - <logType type="int">0</logType> - <logBegin type="int">1</logBegin> - <logEnd type="int">10</logEnd> - <channelRange type="str">[00-10]</channelRange> - </globalT38Stg> - </globalSettings> - <info ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Info"> - <userChannelsNo type="int">86534</userChannelsNo> - <portInstances type="int">3</portInstances> - <portInstanceIdx type="int">0</portInstanceIdx> - <objectiveType type="str">activeUsers</objectiveType> - <objectiveValue type="int">1000</objectiveValue> - <maxAllowedObjective type="long">9223372036854775807</maxAllowedObjective> - <firstSignalingFnID type="int">23</firstSignalingFnID> - <enableRTPDest type="bool">False</enableRTPDest> - <rtpPortDest type="str"></rtpPortDest> - <rtpObjectiveValue type="int">32000</rtpObjectiveValue> - <hasRtpFunction type="bool">False</hasRtpFunction> - <hasVideoFunction type="bool">False</hasVideoFunction> - <hasT38Function type="bool">False</hasT38Function> - <hasMSRPFunction type="bool">False</hasMSRPFunction> - <src ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str">REGISTERING</name> - <portCount type="int">1</portCount> - <portCountRtp type="int">1</portCountRtp> - <portCountT38 type="int">1</portCountT38> - <portCountMSRP type="int">1</portCountMSRP> - <ipRangeCount type="int">1</ipRangeCount> - <ipCount type="int">1</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">1</ipRuleCh> - <port type="str">{{sipportregistering}}</port> - <portRule type="int">0</portRule> - <portRuleCh type="int">1</portRuleCh> - <phone type="str">{{pnregistering}}</phone> - <aliases type="int">1</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">1</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">1</ipRangeCountRtp> - <ipCountRtp type="int">1</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">1</ipRuleChRtp> - <portRtp type="str">[10000-65535,4]</portRtp> - <portT38 type="str">40000</portT38> - <portMSRP type="str">2855</portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">1</portRuleChRtp> - <ipRangeCountT38 type="int">1</ipRangeCountT38> - <ipCountT38 type="int">1</ipCountT38> - <ipRangeCountMSRP type="int">1</ipRangeCountMSRP> - <ipCountMSRP type="int">1</ipCountMSRP> - <symType type="int">1</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str">5061</tlsPort> - <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp> - <nodeCount type="int">1</nodeCount> - <coreCount type="int">2</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str">aptixia-T.03440c56.4e1a.4def.8406.ec64db91d4c1-L2EthernetPlugin-166a11b6.4d30.40ea.b9e1.ac4fb44f112b-161.105.231.12;1;1default</layerName> - </src> - <dest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str"></name> - <portCount type="int">1</portCount> - <portCountRtp type="int">1</portCountRtp> - <portCountT38 type="int">1</portCountT38> - <portCountMSRP type="int">1</portCountMSRP> - <ipRangeCount type="int">0</ipRangeCount> - <ipCount type="int">0</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">0</ipRuleCh> - <port type="str"></port> - <portRule type="int">0</portRule> - <portRuleCh type="int">0</portRuleCh> - <phone type="str"></phone> - <aliases type="int">1</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">0</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">0</ipRangeCountRtp> - <ipCountRtp type="int">0</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">0</ipRuleChRtp> - <portRtp type="str"></portRtp> - <portT38 type="str"></portT38> - <portMSRP type="str">2855</portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">0</portRuleChRtp> - <ipRangeCountT38 type="int">0</ipRangeCountT38> - <ipCountT38 type="int">0</ipCountT38> - <ipRangeCountMSRP type="int">1</ipRangeCountMSRP> - <ipCountMSRP type="int">12</ipCountMSRP> - <symType type="int">0</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str"></tlsPort> - <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp> - <nodeCount type="int">1</nodeCount> - <coreCount type="int">2</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str"></layerName> - </dest> - <useServerDest type="bool">False</useServerDest> - <srvDomainDest type="str"></srvDomainDest> - <srvAddrDest type="str"></srvAddrDest> - <srvPortDest type="str">5060</srvPortDest> - <cloudServerDest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer"> - <name type="str"></name> - <ipAddr type="str"></ipAddr> - <rangeType type="str"></rangeType> - <ipType type="str"></ipType> - <port type="int">0</port> - <attachedInfo type="str"></attachedInfo> - <firstIp type="str"></firstIp> - <netMask type="str"></netMask> - <ipCount type="str"></ipCount> - <ipStep type="str"></ipStep> - </cloudServerDest> - <transfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str"></name> - <portCount type="int">0</portCount> - <portCountRtp type="int">0</portCountRtp> - <portCountT38 type="int">0</portCountT38> - <portCountMSRP type="int">0</portCountMSRP> - <ipRangeCount type="int">0</ipRangeCount> - <ipCount type="int">0</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">0</ipRuleCh> - <port type="str"></port> - <portRule type="int">0</portRule> - <portRuleCh type="int">0</portRuleCh> - <phone type="str"></phone> - <aliases type="int">0</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">0</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">0</ipRangeCountRtp> - <ipCountRtp type="int">0</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">0</ipRuleChRtp> - <portRtp type="str"></portRtp> - <portT38 type="str"></portT38> - <portMSRP type="str"></portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">0</portRuleChRtp> - <ipRangeCountT38 type="int">0</ipRangeCountT38> - <ipCountT38 type="int">0</ipCountT38> - <ipRangeCountMSRP type="int">0</ipRangeCountMSRP> - <ipCountMSRP type="int">0</ipCountMSRP> - <symType type="int">0</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str"></tlsPort> - <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp> - <nodeCount type="int">0</nodeCount> - <coreCount type="int">1</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str"></layerName> - </transfer> - <useServerTransfer type="bool">False</useServerTransfer> - <registrarSrvTransfer type="bool">False</registrarSrvTransfer> - <srvAddrTransfer type="str"></srvAddrTransfer> - <srvPortTransfer type="str">5060</srvPortTransfer> - <cloudServerTransfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer"> - <name type="str"></name> - <ipAddr type="str"></ipAddr> - <rangeType type="str"></rangeType> - <ipType type="str"></ipType> - <port type="int">0</port> - <attachedInfo type="str"></attachedInfo> - <firstIp type="str"></firstIp> - <netMask type="str"></netMask> - <ipCount type="str"></ipCount> - <ipStep type="str"></ipStep> - </cloudServerTransfer> - </info> - <scenarioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ScenarioSettings"> - <scenarioFile type="str">.\Registration_only_LPS.tst</scenarioFile> - <activeScenarioChannel type="int">0</activeScenarioChannel> - <funcsCount type="int">48</funcsCount> - <isModified type="int">66</isModified> - <activityID type="int">2</activityID> - <exportToRM type="int">0</exportToRM> - </scenarioSettings> - <executionSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExecutionSettings"> - <loopMode type="int">0</loopMode> - <loopCount type="int">1</loopCount> - <loopPreDelay type="int">0</loopPreDelay> - <loopMidDelay type="int">0</loopMidDelay> - <gracefulRampDown type="bool">True</gracefulRampDown> - <rampdownSleep type="bool">False</rampdownSleep> - <aliases type="int">1</aliases> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">1</ipRuleCh> - <portRule type="int">0</portRule> - <portRuleCh type="int">1</portRuleCh> - <phoneRule type="int">1</phoneRule> - <multipleUsersPerIO type="bool">True</multipleUsersPerIO> - <rtpIpRule type="int">0</rtpIpRule> - <rtpIpRuleCh type="int">1</rtpIpRuleCh> - <rtpPortRule type="int">0</rtpPortRule> - <rtpPortRuleCh type="int">1</rtpPortRuleCh> - <dl_BUG type="bool">True</dl_BUG> - <dl_TRACE type="bool">False</dl_TRACE> - <dl_L_INFO type="bool">True</dl_L_INFO> - <dl_L_ADV type="bool">False</dl_L_ADV> - <dl_L_VRB type="bool">False</dl_L_VRB> - <dl_T_IO type="bool">False</dl_T_IO> - <dl_T_INFO type="bool">False</dl_T_INFO> - <dl_T_ADV type="bool">False</dl_T_ADV> - <dl_T_VRB type="bool">False</dl_T_VRB> - <dl_TG_ADV type="bool">False</dl_TG_ADV> - <dl_TG_VRB type="bool">False</dl_TG_VRB> - <dl_Q_ADV type="bool">False</dl_Q_ADV> - <dl_Q_VRB type="bool">False</dl_Q_VRB> - <dl_S_FSM type="bool">False</dl_S_FSM> - <dl_S_SER type="bool">False</dl_S_SER> - <dl_S_SUA type="bool">False</dl_S_SUA> - <dl_S_WAIT type="bool">False</dl_S_WAIT> - <dl_S_SEND type="bool">False</dl_S_SEND> - <dl_S_INFO type="bool">False</dl_S_INFO> - <dl_S_ADV type="bool">False</dl_S_ADV> - <dl_S_VRB type="bool">False</dl_S_VRB> - <dl_R_DD type="bool">False</dl_R_DD> - <dl_R_VRB type="bool">False</dl_R_VRB> - <dl_R_PAR type="bool">False</dl_R_PAR> - <dl_EE_VRB type="bool">False</dl_EE_VRB> - <dl_EE_DD type="bool">False</dl_EE_DD> - <dl_FLOW type="bool">False</dl_FLOW> - <dl_M_IO type="bool">False</dl_M_IO> - <dl_SDP_DD type="bool">False</dl_SDP_DD> - <dl_1 type="bool">False</dl_1> - <dl_2 type="bool">False</dl_2> - <dl_3 type="bool">False</dl_3> - <log_level type="int">9</log_level> - <log_in_memory type="int">1</log_in_memory> - <rtp_log_in_file type="int">1</rtp_log_in_file> - <log_filesize type="int">32</log_filesize> - <_gbDebugLogs type="bool">False</_gbDebugLogs> - <ccExportProfile type="bool">False</ccExportProfile> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_ipRule1</item> - <item ver="[0, [1, [0, [0]]]]" oid="2" type="ixPropertyState"> - <enable type="int">1</enable> - <show type="int">0</show> - </item> - </item> - <item type="tuple"> - <item type="str">dl_S_ADV</item> - <item ver="[0, [1, [0, [0]]]]" oid="1" type="ixPropertyState"> - <enable type="int">1</enable> - <show type="int">1</show> - </item> - </item> - <item type="tuple"> - <item type="str">loopMidDelay</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_IO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SEND</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_rtpIpRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">_estimatedBacklog</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopPreDelay</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_EE_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">log_filesize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtp_log_in_file</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopCount</item> - <item ver="[0, [1, [0, [0]]]]" oid="3" type="ixPropertyState"> - <enable type="int">0</enable> - <show type="int">1</show> - </item> - </item> - <item type="tuple"> - <item type="str">dl_T_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">aliases</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_Q_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">multipleUsersPerIO</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">log_level</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpIpRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rampdownSleep</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_portRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_FLOW</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SER</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">log_in_memory</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_Q_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpPortRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_M_IO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_EE_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpIpRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_FSM</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_rtpPortRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_BUG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SUA</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_PAR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">gracefulRampDown</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_WAIT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_SDP_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TRACE</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbDebugLogs</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">rtpPortRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TG_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TG_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ccExportProfile</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_L_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_VRB</item> - <item ref="1"/> - </item> - </_dict> - </state> - </executionSettings> - <customActivityLinkSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters"> - <enableDbgLog type="bool">False</enableDbgLog> - <dbgLogChannels type="str">1-5</dbgLogChannels> - <bhcaType type="int">0</bhcaType> - <talkTime type="int">10000</talkTime> - <channelsNo type="int">1</channelsNo> - <callSetupTime type="int">500</callSetupTime> - <callTeardownTime type="int">500</callTeardownTime> - <interCallDuration type="int">4000</interCallDuration> - <bhcaObjectiveValue type="int">1</bhcaObjectiveValue> - <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked> - <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked> - <cpsOverwriteValue type="int">18</cpsOverwriteValue> - <cpsType type="int">1</cpsType> - <cpsTalkTime type="int">1500</cpsTalkTime> - <cpsChannelsNo type="int">5</cpsChannelsNo> - <cpsTotalChannelsNo type="int">2500</cpsTotalChannelsNo> - <cpsOverheadTime type="int">1500</cpsOverheadTime> - <cpsInterCallDuration type="int">2000</cpsInterCallDuration> - <cpsObjectiveValue type="int">1</cpsObjectiveValue> - <cpsRegisterTime type="int">40</cpsRegisterTime> - <cpsSplitTimeline type="int">0</cpsSplitTimeline> - <lpsType type="int">0</lpsType> - <lpsTalkTime type="int">800</lpsTalkTime> - <lpsChannelsNo type="int">2150</lpsChannelsNo> - <lpsOverheadTime type="int">1500</lpsOverheadTime> - <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration> - <lpsObjectiveValue type="int">500</lpsObjectiveValue> - <lpsActiveChannel type="int">0</lpsActiveChannel> - <activeUsersTalkTime type="int">750</activeUsersTalkTime> - <activeUsersNo type="int">86534</activeUsersNo> - <activeUsersChannel type="int">0</activeUsersChannel> - <activeUsersObjectiveValue type="int">{{registeringtotalcalls}}</activeUsersObjectiveValue> - </customActivityLinkSettings> - <rtpWaveFiles ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPWaveFiles"> - <wavesCount type="int">0</wavesCount> - </rtpWaveFiles> - <rtpTones ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPTones"> - <usedTonesCount type="int">0</usedTonesCount> - <customTonesCount type="int">35</customTonesCount> - <seqCustTonesCount type="int">0</seqCustTonesCount> - </rtpTones> - <codecCustomPopup ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPopup"> - <captureFile type="str">Default.cap</captureFile> - <parseRTPPort type="bool">False</parseRTPPort> - <parseSSRC type="bool">False</parseSSRC> - <rtpPort type="int">10000</rtpPort> - <ssrc type="str">0x8078C5D3</ssrc> - </codecCustomPopup> - <codecCustomPropDlg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPropDlg"/> - <codecSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecSettings"> - <codecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_codecs" itemtype="ixConfig"> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711u"> - <dPayloadIn type="int">0</dPayloadIn> - <dPayloadOut type="int">0</dPayloadOut> - <frameSize type="int">160</frameSize> - </item> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711a"> - <dPayloadIn type="int">8</dPayloadIn> - <dPayloadOut type="int">8</dPayloadOut> - <frameSize type="int">160</frameSize> - </item> - </codecs> - <codecs_number type="int">2</codecs_number> - <_gbVideoCodecs type="bool">False</_gbVideoCodecs> - <videoPayloadType type="int">96</videoPayloadType> - <_gbDataCodecs type="bool">False</_gbDataCodecs> - <dataCodecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_dataCodecs" itemtype="ixConfig"> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Events"> - <dPayloadType type="int">100</dPayloadType> - </item> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Tones"> - <dPayloadType type="int">101</dPayloadType> - </item> - </dataCodecs> - <crtCustomCodecIndex type="int">-1</crtCustomCodecIndex> - </codecSettings> - <rtpSettings ver="[7, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPSettings"> - <rtpPort type="str">[10000-65535,4]</rtpPort> - <enableAdvStatCalc type="bool">False</enableAdvStatCalc> - <enableRTCP type="bool">False</enableRTCP> - <enableRTCPMux type="bool">False</enableRTCPMux> - <chEnableHwAcc type="bool">False</chEnableHwAcc> - <chDisableHwAcc type="bool">False</chDisableHwAcc> - <enableHwAcc type="bool">False</enableHwAcc> - <enableIxStack type="bool">False</enableIxStack> - <enableNBExec type="bool">False</enableNBExec> - <enablePerStream type="bool">False</enablePerStream> - <enableMDI type="bool">False</enableMDI> - <enableRTP type="bool">False</enableRTP> - <enableMediaSDPParams type="bool">False</enableMediaSDPParams> - <audioB_option type="bool">False</audioB_option> - <audioB_value type="str">AS:48</audioB_value> - <audioRR_option type="bool">False</audioRR_option> - <audioRR_value type="str">800</audioRR_value> - <audioRS_option type="bool">False</audioRS_option> - <audioRS_value type="str">800</audioRS_value> - <videoB_option type="bool">False</videoB_option> - <videoB_value type="str">AS:384</videoB_value> - <videoRR_option type="bool">False</videoRR_option> - <videoRR_value type="str">6400</videoRR_value> - <videoRS_option type="bool">False</videoRS_option> - <videoRS_value type="str">6400</videoRS_value> - <textB_option type="bool">False</textB_option> - <textB_value type="str">AS:48</textB_value> - <textRR_option type="bool">False</textRR_option> - <textRR_value type="str">800</textRR_value> - <textRS_option type="bool">False</textRS_option> - <textRS_value type="str">800</textRS_value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">videoRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbVideoSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">channelsQoVPerZionPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbAudioSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">dedicatedCoreRange</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelTypeQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMediaSDPParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTextSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">activityIdQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serviceEnabledQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitComp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">maxMosStreams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">portIPsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableIxStack</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitMs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCPMux</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">silenceMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbMediaSDPParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">valueQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dedicatedCoreRangeLength</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMDI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">chEnableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">unitsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ixnamSupported</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">chDisableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosGroupBox</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePerStream</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSilence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">audioRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">videoB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mosInterval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAdvStatCalc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">limitMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">metricsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">jitCMaxDrop</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTosRtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">activityNameQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableNBExec</item> - <item ref="1"/> - </item> - </_dict> - </state> - </rtpSettings> - <rtcpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTCPSettings"> - <rtcpIgnoreSSRC type="bool">False</rtcpIgnoreSSRC> - <rtcpCNAMEType type="int">0</rtcpCNAMEType> - <hasSDESName type="bool">False</hasSDESName> - <hasSDESTool type="bool">False</hasSDESTool> - <rtcpSDESTool type="str">IxLoad</rtcpSDESTool> - <rtcpReceiverTimer type="int">2000</rtcpReceiverTimer> - <rtcpSenderTimer type="int">2000</rtcpSenderTimer> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">rtcpSDESTool</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">rtcpSenderTimer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpCNAMEType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">hasSDESTool</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpReceiverTimer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpIgnoreSSRC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">hasSDESName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCPMux2</item> - <item ref="1"/> - </item> - </_dict> - </state> - </rtcpSettings> - <audioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AudioSettings"> - <enableAudio type="bool">False</enableAudio> - <_gbEnableAudio type="bool">False</_gbEnableAudio> - <enableAudioOWD type="bool">False</enableAudioOWD> - <useJitter type="bool">False</useJitter> - <_JB1 type="bool">False</_JB1> - <jitMs type="int">20</jitMs> - <useJitComp type="bool">False</useJitComp> - <jitCMs type="int">1000</jitCMs> - <jitCMaxDrop type="int">7</jitCMaxDrop> - <dodName type="str">rtp_esmad-asordo-l_1224</dodName> - <useMos type="bool">False</useMos> - <useSilence type="bool">False</useSilence> - <silenceMode type="int">1</silenceMode> - <enableTosRtp type="bool">False</enableTosRtp> - <rtpTos type="int">1</rtpTos> - <customTosGroupBox type="bool">False</customTosGroupBox> - <customTos type="str">0x20</customTos> - <rtpTosVal type="int">32</rtpTosVal> - <_COV1 type="bool">False</_COV1> - <useQoV type="bool">False</useQoV> - <qovAnalize type="int">5</qovAnalize> - <qovSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_QoVSettings"> - <activityIdQoV type="int">0</activityIdQoV> - <enableQoV type="bool">False</enableQoV> - <_gbEnableQoV type="bool">False</_gbEnableQoV> - <serviceEnabledQoV type="bool">False</serviceEnabledQoV> - <activityNameQoV type="str"></activityNameQoV> - <portIPsQoV type="str"></portIPsQoV> - <unitsQoV type="int">0</unitsQoV> - <valueQoV type="int">100</valueQoV> - <channelTypeQoV type="int">0</channelTypeQoV> - <metricsQoV type="int">0</metricsQoV> - <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort> - <radioBtnQoVASR type="int">0</radioBtnQoVASR> - <languageASR type="str">English(US)</languageASR> - </qovSettings> - <activityIdQoV type="int">0</activityIdQoV> - <enableQoV type="bool">False</enableQoV> - <_gbEnableQoV type="bool">False</_gbEnableQoV> - <serviceEnabledQoV type="bool">False</serviceEnabledQoV> - <activityNameQoV type="str"></activityNameQoV> - <portIPsQoV type="str"></portIPsQoV> - <unitsQoV type="int">0</unitsQoV> - <valueQoV type="int">100</valueQoV> - <channelTypeQoV type="int">0</channelTypeQoV> - <metricsQoV type="int">0</metricsQoV> - <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort> - <radioBtnQoVASR type="int">0</radioBtnQoVASR> - <languageASR type="str">English(US)</languageASR> - <audioClip type="str">US_042.wav</audioClip> - <_audioFormat type="str">Format: PCM, Duration: 32785 ms, Size: 524556 bytes</_audioFormat> - <outputLevel type="int">-20</outputLevel> - <_gbOutputLevel type="bool">False</_gbOutputLevel> - <playTypeAudio type="int">0</playTypeAudio> - <audioDuration type="int">10</audioDuration> - <audioDurationUnit type="int">1</audioDurationUnit> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbEnableQoV</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">channelTypeQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">pesqPolqa</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePTT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableP56</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">qovAnalize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelsQoVPerZionPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_COV1</item> - <item ver="[0, [1, [0, [0]]]]" oid="4" type="ixPropertyState"> - <enable type="int">0</enable> - <show type="int">0</show> - </item> - </item> - <item type="tuple"> - <item type="str">useTelchemy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">activityIdQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitComp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_JB1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portIPsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbQoVMetrics</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dodName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitMs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbASRLanguage</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">rtpTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">radioBtnQoVASR</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">silenceMode</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">playTypeAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useQoV</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">activityNameQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">valueQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbOutputLevel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">unitsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serviceEnabledQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">languageASR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosGroupBox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">audioDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">qovSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSilence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">metricsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMaxDrop</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTosRtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAudioOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_audioFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableAudio</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">outputLevel</item> - <item ref="1"/> - </item> - </_dict> - </state> - </audioSettings> - <editTos ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditTos"> - <bits012 type="int">0</bits012> - <minDelay type="bool">False</minDelay> - <maxThroughput type="bool">False</maxThroughput> - <maxReliability type="bool">False</maxReliability> - <_gbBtnTosBit7_0 type="bool">False</_gbBtnTosBit7_0> - <_gbBtnTosBit7_1 type="bool">False</_gbBtnTosBit7_1> - <_gbBtnTosBit6_0 type="bool">False</_gbBtnTosBit6_0> - <_gbBtnTosBit6_1 type="bool">False</_gbBtnTosBit6_1> - <_gbBtnTosBit5_0 type="bool">False</_gbBtnTosBit5_0> - <_gbBtnTosBit5_1 type="bool">False</_gbBtnTosBit5_1> - <_gbBtnTosBit4_0 type="bool">False</_gbBtnTosBit4_0> - <_gbBtnTosBit4_1 type="bool">False</_gbBtnTosBit4_1> - <_gbBtnTosBit3_0 type="bool">False</_gbBtnTosBit3_0> - <_gbBtnTosBit3_1 type="bool">False</_gbBtnTosBit3_1> - <_gbBtnTosBit2_0 type="bool">False</_gbBtnTosBit2_0> - <_gbBtnTosBit2_1 type="bool">False</_gbBtnTosBit2_1> - <_gbDisabledBtns type="bool">False</_gbDisabledBtns> - </editTos> - <srtpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SRTPSettings"> - <bEnableSRTP type="bool">False</bEnableSRTP> - <bEnableVideoSRTP type="bool">False</bEnableVideoSRTP> - <bEnableTextSRTP type="bool">False</bEnableTextSRTP> - <bDisableSRTCPEncryption type="bool">False</bDisableSRTCPEncryption> - <bDisableSRTPEncryption type="bool">False</bDisableSRTPEncryption> - <bDisableSRTPAuthentication type="bool">False</bDisableSRTPAuthentication> - <bDisableValidations type="bool">False</bDisableValidations> - <bAllowOnlySecureStreams type="bool">False</bAllowOnlySecureStreams> - <bIncludeMKI type="bool">False</bIncludeMKI> - <bEnablePreencryption type="bool">False</bEnablePreencryption> - <bDisableMasterSalt type="bool">False</bDisableMasterSalt> - <bStaticMasterKeySalt type="bool">False</bStaticMasterKeySalt> - <_masterKeySelection type="int">0</_masterKeySelection> - <staticSingleKeySalt type="str"></staticSingleKeySalt> - <staticKeyFile type="str"></staticKeyFile> - <_enableSRTP type="bool">False</_enableSRTP> - <_useStaticKey type="bool">False</_useStaticKey> - <_singleMasterKeyGrp type="bool">False</_singleMasterKeyGrp> - <_multipleMasterKeysGrp type="bool">False</_multipleMasterKeysGrp> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">bDisableSRTPAuthentication</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_singleMasterKeyGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bIncludeMKI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableValidations</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useStaticKey</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">bEnablePreencryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_multipleMasterKeysGrp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bStaticMasterKeySalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">staticKeyFile</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableMasterSalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">staticSingleKeySalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bAllowOnlySecureStreams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTCPEncryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableVideoSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTPEncryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableTextSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_masterKeySelection</item> - <item ref="1"/> - </item> - </_dict> - </state> - </srtpSettings> - <videoClips ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoClips"> - <videoClipsInfo ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VideoClips_videoClipsInfo" itemtype="ixConfig"/> - <videoClipsInfoLength type="int">0</videoClipsInfoLength> - <H323MaxProfile type="int">0</H323MaxProfile> - <H323MaxLevel type="int">0</H323MaxLevel> - <H323MaxBitRate type="int">0</H323MaxBitRate> - <H323Packetization type="int">0</H323Packetization> - <MaxProfileIdc type="int">66</MaxProfileIdc> - <MaxProfileIop type="int">0</MaxProfileIop> - <MaxLevel type="int">1</MaxLevel> - </videoClips> - <advancedVideo ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedVideoSettings"> - <enableCustomMaxMBPS type="bool">False</enableCustomMaxMBPS> - <customMaxMBPS type="int">0</customMaxMBPS> - <enableCustomMaxFS type="bool">False</enableCustomMaxFS> - <customMaxFS type="int">0</customMaxFS> - <enableCustomMaxDPB type="bool">False</enableCustomMaxDPB> - <customMaxDPB type="int">0</customMaxDPB> - <enableCustomMaxBRandCPB type="bool">False</enableCustomMaxBRandCPB> - <customMaxBRandCPB type="int">0</customMaxBRandCPB> - <enableMaxStaticMBPS type="bool">False</enableMaxStaticMBPS> - <maxStaticMBPS type="int">0</maxStaticMBPS> - <enableMaxRcmdNalUnitSize type="bool">False</enableMaxRcmdNalUnitSize> - <maxRcmdNalUnitSize type="int">0</maxRcmdNalUnitSize> - <enableMaxNalUnitSize type="bool">False</enableMaxNalUnitSize> - <maxNalUnitSize type="int">0</maxNalUnitSize> - </advancedVideo> - <videoSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoSettings"> - <enableVideo type="bool">False</enableVideo> - <enableVideoOWD type="bool">False</enableVideoOWD> - <videoMaxSessions type="int">1</videoMaxSessions> - <_gbEnableVideo type="bool">False</_gbEnableVideo> - <videoClip type="str">Fire_avc.mp4</videoClip> - <_videoFormat type="str">Codec: H264, Duration: 12800 ms, Size: 2012176 bytes, Bitrate: 1225 kbps</_videoFormat> - <playTypeVideo type="int">0</playTypeVideo> - <videoDuration type="int">5</videoDuration> - <videoDurationUnit type="int">1</videoDurationUnit> - <useConference type="bool">False</useConference> - <_gbUseConference type="bool">False</_gbUseConference> - <rotationScheme type="int">0</rotationScheme> - <confVideoDuration type="int">1</confVideoDuration> - <confVideoDurationUnit type="int">1</confVideoDurationUnit> - <confDuration type="int">1</confDuration> - <confDurationUnit type="int">1</confDurationUnit> - <btnTelepresence type="bool">False</btnTelepresence> - <_gbUseTelepresence type="bool">False</_gbUseTelepresence> - <tipSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings"> - <tipEndpointType type="int">1</tipEndpointType> - <tipResolution type="int">1</tipResolution> - <tipVersion type="int">1</tipVersion> - <tipSyntheticPayload type="bool">False</tipSyntheticPayload> - <tipMoreClips type="bool">False</tipMoreClips> - <_gbTipMoreClips type="int">0</_gbTipMoreClips> - <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2> - <tipRotationScheme type="int">0</tipRotationScheme> - <tipConfDuration type="int">1</tipConfDuration> - <tipConfDurationUnit type="int">1</tipConfDurationUnit> - <tipAudioDuration type="int">1</tipAudioDuration> - <tipAudioDurationUnit type="int">1</tipAudioDurationUnit> - <_gbTipPresentation type="bool">False</_gbTipPresentation> - <tipUsePresentationStream type="bool">False</tipUsePresentationStream> - <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip> - <tipAudioClip type="str">US_042.wav</tipAudioClip> - <tipStartAfter type="int">1</tipStartAfter> - <tipStartAfterUnit type="int">1</tipStartAfterUnit> - <tipDuration type="int">1</tipDuration> - <tipDurationUnit type="int">1</tipDurationUnit> - <tipPresentationRotation type="int">0</tipPresentationRotation> - <tipLegacyMode type="bool">False</tipLegacyMode> - <_gbTipLegacy type="int">0</_gbTipLegacy> - <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip> - <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio> - <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio> - <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio> - <tipG722Legacy type="bool">False</tipG722Legacy> - <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric> - <tipDinamicChannels type="bool">False</tipDinamicChannels> - <tipVideoRefresh type="bool">False</tipVideoRefresh> - <tipInbandSets type="bool">False</tipInbandSets> - <tipArithmetingCoding type="bool">False</tipArithmetingCoding> - <tipLTRP type="bool">False</tipLTRP> - <tipGDR type="bool">False</tipGDR> - <tipHighProfile type="bool">False</tipHighProfile> - <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia> - <tipRtcpFeedback type="bool">True</tipRtcpFeedback> - </tipSettings> - <_gbTosVideo type="bool">False</_gbTosVideo> - <enableTosVideo type="bool">False</enableTosVideo> - <tosVideo type="int">1</tosVideo> - <customTosVideo type="str">0x20</customTosVideo> - <_gbCustomTosVideo type="bool">False</_gbCustomTosVideo> - <tosValVideo type="int">32</tosValVideo> - <useMosVideo type="bool">False</useMosVideo> - <enableAcceptSSRCChanges type="bool">False</enableAcceptSSRCChanges> - <ignoreHintTrack type="bool">False</ignoreHintTrack> - <hintTrackType type="int">1</hintTrackType> - <enablePACSI type="bool">True</enablePACSI> - <useSingleNALUnit type="bool">False</useSingleNALUnit> - <_gbH323AdvancedSettings type="bool">False</_gbH323AdvancedSettings> - <useH323AdvancedSettings type="bool">False</useH323AdvancedSettings> - <_gbUseH323AdvancedSettings type="bool">False</_gbUseH323AdvancedSettings> - <rtpmap type="str"></rtpmap> - <fmtp type="str"></fmtp> - <isMP4 type="bool">False</isMP4> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">hintTrackType</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">videoMaxSessions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSingleNALUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useConference</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">playTypeVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbUseH323AdvancedSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">isMP4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosValVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePACSI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_videoFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbUseTelepresence</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableVideoOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fmtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbUseConference</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbH323AdvancedSettings</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">_gbTosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTosVideo</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">ignoreHintTrack</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAcceptSSRCChanges</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useH323AdvancedSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpmap</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">btnTelepresence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useMosVideo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoSettings> - <videoConfSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoConfSettings"> - <rotationScheme type="int">0</rotationScheme> - <_gbRotationScheme type="int">0</_gbRotationScheme> - <confVideoDuration type="int">0</confVideoDuration> - <confVideoDurationUnit type="int">0</confVideoDurationUnit> - <confDuration type="int">0</confDuration> - <confDurationUnit type="int">0</confDurationUnit> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">rotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbRotationScheme</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">confVideoDuration</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoConfSettings> - <videoTelepresenceSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings"> - <tipEndpointType type="int">0</tipEndpointType> - <tipResolution type="int">0</tipResolution> - <tipVersion type="int">0</tipVersion> - <tipSyntheticPayload type="bool">False</tipSyntheticPayload> - <tipMoreClips type="bool">False</tipMoreClips> - <_gbTipMoreClips type="int">0</_gbTipMoreClips> - <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2> - <tipRotationScheme type="int">0</tipRotationScheme> - <tipConfDuration type="int">0</tipConfDuration> - <tipConfDurationUnit type="int">0</tipConfDurationUnit> - <tipAudioDuration type="int">0</tipAudioDuration> - <tipAudioDurationUnit type="int">0</tipAudioDurationUnit> - <_gbTipPresentation type="bool">False</_gbTipPresentation> - <tipUsePresentationStream type="bool">False</tipUsePresentationStream> - <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip> - <tipAudioClip type="str">US_042.wav</tipAudioClip> - <tipStartAfter type="int">0</tipStartAfter> - <tipStartAfterUnit type="int">0</tipStartAfterUnit> - <tipDuration type="int">0</tipDuration> - <tipDurationUnit type="int">0</tipDurationUnit> - <tipPresentationRotation type="int">0</tipPresentationRotation> - <tipLegacyMode type="bool">False</tipLegacyMode> - <_gbTipLegacy type="int">0</_gbTipLegacy> - <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip> - <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio> - <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio> - <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio> - <tipG722Legacy type="bool">False</tipG722Legacy> - <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric> - <tipDinamicChannels type="bool">False</tipDinamicChannels> - <tipVideoRefresh type="bool">False</tipVideoRefresh> - <tipInbandSets type="bool">False</tipInbandSets> - <tipArithmetingCoding type="bool">False</tipArithmetingCoding> - <tipLTRP type="bool">False</tipLTRP> - <tipGDR type="bool">False</tipGDR> - <tipHighProfile type="bool">False</tipHighProfile> - <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia> - <tipRtcpFeedback type="bool">True</tipRtcpFeedback> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tipUnrestrictedMedia</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyClipAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipRotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipLegacyClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoRefresh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipUsePresentationStream</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipRtcpFeedback</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipStartAfterUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipArithmetingCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipLegacyAudio</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipConfDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipConfDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipG722Legacy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipMoreClips</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipInbandSets</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyModeAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipVideoClip2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipResolution</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDinamicChannels</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipLegacyClipAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipSyntheticPayload</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipPresentation</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipHighProfile</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioActivityMetric</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipGDR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoClip2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipMoreClips</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipVideoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipEndpointType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipLegacy</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipLTRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipStartAfter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipAudioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipPresentationRotation</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioDuration</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoTelepresenceSettings> - <textSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TextSettings"> - <enableText type="bool">False</enableText> - <enableTextOWD type="bool">False</enableTextOWD> - <_gbEnableText type="bool">False</_gbEnableText> - <textClip type="str">The quick brown fox jumps over the lazy dog</textClip> - <textFormat type="str">Format: t140, Max duration: 42300 ms</textFormat> - <textChpsMin type="float">1.0</textChpsMin> - <textChpsMax type="float">1.0</textChpsMax> - <textBufferTime type="int">300</textBufferTime> - <textRedundancyLevel type="int">0</textRedundancyLevel> - <textPlayType type="int">0</textPlayType> - <textDuration type="int">5</textDuration> - <textDurationUnit type="int">1</textDurationUnit> - <_gbTosText type="bool">False</_gbTosText> - <enableTosText type="bool">False</enableTosText> - <tosText type="int">1</tosText> - <customTosText type="str">0x20</customTosText> - <_gbCustomTosText type="bool">False</_gbCustomTosText> - <tosValText type="int">32</tosValText> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tosValText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textChpsMin</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRedundancyLevel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textChpsMax</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textBufferTime</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTextOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTosText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textPlayType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTosText</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">enableTosText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tosText</item> - <item ref="3"/> - </item> - </_dict> - </state> - </textSettings> - <t38Settings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T38Settings"> - <enableT38 type="bool">False</enableT38> - <_gbEnableT38 type="bool">False</_gbEnableT38> - <_gbEnableT38_2 type="bool">False</_gbEnableT38_2> - <faxImage type="str">Ixia2Pages.tif</faxImage> - <_faxFormat type="str">Format: TIFF, Img size: 1660 x 2291, Size: 140402 bytes</_faxFormat> - <t38TransportType type="int">1</t38TransportType> - <t38Port type="str">40000</t38Port> - <t38UdpEncapsulation type="int">0</t38UdpEncapsulation> - <_gbT38UdpEncapsulation type="bool">False</_gbT38UdpEncapsulation> - <t38PayloadType type="int">102</t38PayloadType> - <useFaxVersion type="bool">True</useFaxVersion> - <faxVersion type="int">0</faxVersion> - <useT38MaxBitrate type="bool">True</useT38MaxBitrate> - <t38MaxBitrate type="int">5</t38MaxBitrate> - <useT38RateMgmt type="bool">True</useT38RateMgmt> - <t38RateMgmt type="int">0</t38RateMgmt> - <useT38FillBitRemoval type="bool">False</useT38FillBitRemoval> - <t38FillBitRemoval type="int">0</t38FillBitRemoval> - <t38TranscodingMMR type="bool">False</t38TranscodingMMR> - <t38TranscodingJBIG type="bool">False</t38TranscodingJBIG> - <_gbUdpOptions type="bool">False</_gbUdpOptions> - <useErrorRecoverySchema type="bool">True</useErrorRecoverySchema> - <errorRecoverySchema type="int">0</errorRecoverySchema> - <useT38MaxDatagramSize type="bool">True</useT38MaxDatagramSize> - <t38MaxDatagramSize type="int">256</t38MaxDatagramSize> - <useT38MaxBufferSize type="bool">False</useT38MaxBufferSize> - <t38MaxBufferSize type="int">200</t38MaxBufferSize> - <imagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_T38Settings_imagesList" itemtype="ixConfig"/> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">t38TranscodingMMR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38UdpEncapsulation</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxBitrate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38RateMgmt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38TranscodingJBIG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableT38</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38TransportType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableT38_2</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableT38</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useFaxVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38Port</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38FillBitRemoval</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">faxVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38FillBitRemoval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38RateMgmt</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">faxImage</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxBufferSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">errorRecoverySchema</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxDatagramSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxBufferSize</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">t38PayloadType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxDatagramSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxBitrate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_faxFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbUdpOptions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbT38UdpEncapsulation</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">imagesList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useErrorRecoverySchema</item> - <item ref="1"/> - </item> - </_dict> - </state> - </t38Settings> - <t30Parameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T30Parameters"> - <t30StationId type="str">5551[000-]</t30StationId> - <t30SendCoding type="int">0</t30SendCoding> - <t30SendDataRate type="int">5</t30SendDataRate> - <t30SendPageSize type="int">0</t30SendPageSize> - <t30SendMSLT type="int">0</t30SendMSLT> - <t30SendProtocol type="int">1</t30SendProtocol> - <t30SendResolution type="int">0</t30SendResolution> - <sendCNG type="int">1</sendCNG> - <t30ReceiveCoding type="int">2</t30ReceiveCoding> - <t30ReceivePageSize type="int">2</t30ReceivePageSize> - <t30ReceiveMSLT type="int">0</t30ReceiveMSLT> - <t30ReceiveProtocol type="int">1</t30ReceiveProtocol> - <t30ReceiveR8x3 type="bool">True</t30ReceiveR8x3> - <t30ReceiveR8x7 type="bool">True</t30ReceiveR8x7> - <t30ReceiveR8x15 type="bool">True</t30ReceiveR8x15> - <t30Receive200x200 type="bool">True</t30Receive200x200> - <t30ReceiveModulations type="int">3</t30ReceiveModulations> - <sendCedBeforeDIS type="int">1</sendCedBeforeDIS> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">t30SendResolution</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sendCedBeforeDIS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x7</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendPageSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x3</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">t30SendProtocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveProtocol</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">sendCNG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveMSLT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendMSLT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceivePageSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveModulations</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x15</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30StationId</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendDataRate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30Receive200x200</item> - <item ref="1"/> - </item> - </_dict> - </state> - </t30Parameters> - <msrpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPSettings"> - <enableMSRP type="bool">False</enableMSRP> - <_gbEnableMSRP type="bool">False</_gbEnableMSRP> - <msrpPort type="str">2855</msrpPort> - <domainType type="int">0</domainType> - <localDomain type="str">alice[00-99].example.com</localDomain> - <relays ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_relays" itemtype="ixConfig"/> - <relaysCount type="int">0</relaysCount> - <firstRelayIpEnabled type="bool">False</firstRelayIpEnabled> - <firstRelayIp type="str">10.10.10.1</firstRelayIp> - <firstRelayIsIPv4 type="bool">True</firstRelayIsIPv4> - <msrpRelayPort type="int">2855</msrpRelayPort> - <enableMSRPTos type="bool">False</enableMSRPTos> - <msrpTos type="int">0</msrpTos> - <customMSRPTos type="str">0x00</customMSRPTos> - <tosMSRPVal type="int">0</tosMSRPVal> - <automaticMSRPAuth type="bool">True</automaticMSRPAuth> - <msrpReuseTCP type="bool">True</msrpReuseTCP> - <msrpSendEmptyMsg type="bool">False</msrpSendEmptyMsg> - <msrpTransactionTimeout type="int">30000</msrpTransactionTimeout> - <msrpFirstChunkTimeout type="int">60000</msrpFirstChunkTimeout> - <msrpInterChunkTimeout type="int">30000</msrpInterChunkTimeout> - <msrpSessionTimeout type="int">70000</msrpSessionTimeout> - <msrpGuiFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_msrpGuiFiles" itemtype="ixConfig"/> - <files ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_files" itemtype="ixConfig"/> - <filesCount type="int">0</filesCount> - <advSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings"> - <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye> - </advSettings> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">domainType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">filesCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIpEnabled</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">automaticMSRPAuth</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpSendEmptyMsg</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpTransactionTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpInterChunkTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosMSRPVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMSRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">localDomain</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">relaysCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customMSRPTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">advSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">files</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpFirstChunkTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIsIPv4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbMSRPCustomTos</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">msrpSessionTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableMSRP</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableMSRPTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpReuseTCP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpGuiFiles</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">relays</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpRelayPort</item> - <item ref="3"/> - </item> - </_dict> - </state> - </msrpSettings> - <_tempFile ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_FileRecord"> - <synthetic type="int">0</synthetic> - <_typeStr type="str"></_typeStr> - <name type="str"></name> - <nameSynthetic type="str"></nameSynthetic> - <fileClientPath type="str"></fileClientPath> - <filePcpuPath type="str"></filePcpuPath> - <_bFileSize type="int">20</_bFileSize> - <_msrpSizeCombo type="int">2</_msrpSizeCombo> - <size type="int">0</size> - <btnMSRPFileBrowse type="int">0</btnMSRPFileBrowse> - <type type="str">application/octet-stream</type> - <fileHash type="str"></fileHash> - </_tempFile> - <_tempAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings"> - <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye> - </_tempAdvSettings> - <phoneBookInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBookInputLabel"> - <label type="str">5</label> - </phoneBookInputLabel> - <akaConfigurationInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfigurationInputLabel"> - <configurationLabel type="str"></configurationLabel> - </akaConfigurationInputLabel> - <phoneBook ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBook"> - <fromFile type="int">0</fromFile> - <pattern type="str">201004[0000-]</pattern> - <filePath type="str"></filePath> - <_PN1 type="bool">False</_PN1> - <_bTelGrp type="bool">False</_bTelGrp> - <ckTelURIBook type="bool">False</ckTelURIBook> - <_bkTelURIparams type="str">phone-context=example.com</_bkTelURIparams> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">phoneBookList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">filePath</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">pattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ckTelURIBook</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_bkTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_PN1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_bTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fromFile</item> - <item ref="1"/> - </item> - </_dict> - </state> - </phoneBook> - <akaConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfiguration"/> - <milenageConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MilenageConfiguration"/> - <msgBox ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MsgBox"> - <msg1 type="str"></msg1> - <msg2 type="str"></msg2> - </msgBox> - <editCloudRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditCloudRule"> - <_gbStep1 type="bool">False</_gbStep1> - <requestList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_requestList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ANY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INVITE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">BYE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CANCEL</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">OPTIONS</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REGISTER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">NOTIFY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">SUBSCRIBE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REFER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">MESSAGE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">PRACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INFO</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">UPDATE</str> - </item> - </requestList> - <reqList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_reqList" itemtype="ixConfig"/> - <_gbStep2 type="bool">False</_gbStep2> - <what type="int">2</what> - <reqLine type="int">1</reqLine> - <headerTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_headerTypeList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">From</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Contact</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Also</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Call-ID</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Length</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Type</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Event</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authenticate</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RAck</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Record-Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Refer-To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Referred-By</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Replaces</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Subscription-State</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Via</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">WWW-Authenticate</str> - </item> - </headerTypeList> - <headerType type="str">To</headerType> - <compactForm type="str">t</compactForm> - <occurFrom type="str">1</occurFrom> - <occurTo type="str">1</occurTo> - <whatExtract type="int">3</whatExtract> - <extractHeaderName type="bool">False</extractHeaderName> - <paramName type="str"></paramName> - <revHeaderOrder type="bool">False</revHeaderOrder> - <keepHeaderCrlf type="bool">False</keepHeaderCrlf> - <_gbStep3 type="bool">False</_gbStep3> - <usePosition type="int">0</usePosition> - <beginAfter type="bool">False</beginAfter> - <afterStr type="str"><</afterStr> - <afterOccur type="str">1</afterOccur> - <endBefore type="bool">False</endBefore> - <endStr type="str">></endStr> - <endOccur type="str">last</endOccur> - <positionFrom type="str">1</positionFrom> - <positionTo type="str">last</positionTo> - <_gbStep4 type="bool">False</_gbStep4> - <formulaSource type="int">0</formulaSource> - <formula type="str"></formula> - <phoneBookPath type="str"></phoneBookPath> - <phoneBookDodPath type="str"></phoneBookDodPath> - <btnPBBrowse type="int">0</btnPBBrowse> - </editCloudRule> - <cloudRules ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudRules"> - <rulesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CloudRules_rulesList" itemtype="ixConfig"/> - <cloudPhoneBooksAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</cloudPhoneBooksAbsolutePath> - </cloudRules> - <cloudServers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_cloudServers" itemtype="ixConfig"/> - <transferAddress ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TransferAddress"> - <symTransferStr type="str">None</symTransferStr> - <overridePhoneNo type="bool">False</overridePhoneNo> - <_useTPb type="int">0</_useTPb> - <_tBp type="str"><None></_tBp> - <_tBpPrv type="str"></_tBpPrv> - <_tPhone type="str">150[00000000-]</_tPhone> - <tPhoneType type="int">0</tPhoneType> - <tPhone type="str">150[00000000-]</tPhone> - <_tTelGrp type="bool">False</_tTelGrp> - <_ckTTelURIParams type="bool">False</_ckTTelURIParams> - <_tTelURIparams type="str">phone-context=example.com</_tTelURIparams> - <transTelPar type="str"></transTelPar> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_tBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overridePhoneNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">transTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useTPb</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckTTelURIParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">symTransferStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_tBp</item> - <item ref="3"/> - </item> - </_dict> - </state> - </transferAddress> - <editContact ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditContact"> - <useDomainName type="int">0</useDomainName> - <domainName type="str">mysipdomain.ixiacom.com</domainName> - <_useEPb type="int">0</_useEPb> - <_eBp type="str"><None></_eBp> - <_eBpPrv type="str"></_eBpPrv> - <_ePhone type="str">160[00000000-]</_ePhone> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <_eTelGrp type="bool">False</_eTelGrp> - <_ckETelURI type="bool">False</_ckETelURI> - <_eTelURIparams type="str">phone-context=example.com</_eTelURIparams> - <editTelPar type="str"></editTelPar> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_useEPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">domainName</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_eBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useDomainName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">editTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckETelURI</item> - <item ref="1"/> - </item> - </_dict> - </state> - </editContact> - <dialPlan ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DialPlan"> - <sourceIPs type="str"></sourceIPs> - <_useSPb type="int">0</_useSPb> - <_sBp type="str"><None></_sBp> - <_sBpPrv type="str"></_sBpPrv> - <_sPhone type="str">{{pnregistering}}</_sPhone> - <srcPhoneType type="int">0</srcPhoneType> - <srcPhone type="str">{{pnregistering}}</srcPhone> - <_sTelGrp type="bool">False</_sTelGrp> - <_ckSTelURIParams type="bool">False</_ckSTelURIParams> - <_sTelURIparams type="str">phone-context=example.com</_sTelURIparams> - <srcTelPar type="str"></srcTelPar> - <_sTelGrp1 type="bool">False</_sTelGrp1> - <_dTelGrp1 type="bool">False</_dTelGrp1> - <symDestStr type="str">None</symDestStr> - <ovrDestPhone type="bool">False</ovrDestPhone> - <_useDPb type="int">0</_useDPb> - <_dBp type="str"><None></_dBp> - <_dBpPrv type="str"></_dBpPrv> - <_dPhone type="str">170[00000000-]</_dPhone> - <destPhoneType type="int">0</destPhoneType> - <destPhone type="str">170[00000000-]</destPhone> - <_dTelGrp type="bool">False</_dTelGrp> - <_ckDTelURIParams type="bool">False</_ckDTelURIParams> - <_dTelURIparams type="str">phone-context=example.com</_dTelURIparams> - <destTelPar type="str"></destTelPar> - <enableEmergencyCalls type="bool">False</enableEmergencyCalls> - <useAnonymous type="bool">False</useAnonymous> - <makeEmergencyReg type="bool">False</makeEmergencyReg> - <emergencyService type="str">sos</emergencyService> - <emergencyServiceList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_DialPlan_emergencyServiceList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.ambulance</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.fire</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.police</str> - </item> - </emergencyServiceList> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_useSPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelGrp1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sourceIPs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableEmergencyCalls</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useAnonymous</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">symDestStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergencyDest</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_sBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">makeEmergencyReg</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergency</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergencySource</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ckSTelURIParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_dBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ovrDestPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelGrp1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">emergencyServiceList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_UseSrv1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">emergencyService</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useDPb</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ckDTelURIParams</item> - <item ref="1"/> - </item> - </_dict> - </state> - </dialPlan> - <signalingSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SignalingSettings"> - <enableSIP type="bool">True</enableSIP> - <port type="str">{{sipportregistering}}</port> - <tcpWriteImmediate type="bool">False</tcpWriteImmediate> - <fqdn type="bool">False</fqdn> - <realm type="str"></realm> - <user type="str">{{pnregistering}}@{{domainname}}</user> - <passwd type="str">{{authpassword}}</passwd> - <akaConfCombo type="str"><None></akaConfCombo> - <akaConfComboSelIndex type="int">0</akaConfComboSelIndex> - <akaSharedSecretType type="int">0</akaSharedSecretType> - <akaOperatorVariantType type="int">0</akaOperatorVariantType> - <akaSharedSecretSequence type="str">ixia</akaSharedSecretSequence> - <akaAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</akaAbsolutePath> - <akaOperatorVariantSequence type="str">ixia</akaOperatorVariantSequence> - <akaSharedSecretSource type="int">0</akaSharedSecretSource> - <akaOperatorVariantSource type="int">0</akaOperatorVariantSource> - <akaExportComplete type="int">0</akaExportComplete> - <akaUseOPasOPC type="bool">False</akaUseOPasOPC> - <milenageConfCombo type="str"><Default></milenageConfCombo> - <milenage_c1 type="str">00000000000000000000000000000000</milenage_c1> - <milenage_c2 type="str">00000000000000000000000000000001</milenage_c2> - <milenage_c3 type="str">00000000000000000000000000000002</milenage_c3> - <milenage_c4 type="str">00000000000000000000000000000004</milenage_c4> - <milenage_c5 type="str">00000000000000000000000000000008</milenage_c5> - <milenage_r1 type="int">64</milenage_r1> - <milenage_r2 type="int">0</milenage_r2> - <milenage_r3 type="int">32</milenage_r3> - <milenage_r4 type="int">64</milenage_r4> - <milenage_r5 type="int">96</milenage_r5> - <enableTos type="bool">False</enableTos> - <tos type="int">0</tos> - <customSipTos type="str">0x00</customSipTos> - <tosVal type="int">0</tosVal> - <ovrTrans type="bool">False</ovrTrans> - <ovrTransOption type="int">0</ovrTransOption> - <useServer type="bool">True</useServer> - <srvAddr type="str">{{iplistims}}</srvAddr> - <srvPort type="str">5060</srvPort> - <srvDomain type="str">{{domainname}}</srvDomain> - <outboundProxy type="bool">False</outboundProxy> - <useDnsSrv type="bool">False</useDnsSrv> - <registrarSrv type="bool">False</registrarSrv> - <autoRegister type="bool">True</autoRegister> - <overrideRegistrar type="bool">False</overrideRegistrar> - <overrideRegistrarAddress type="str">IP:PORT</overrideRegistrarAddress> - <ovrContact type="bool">False</ovrContact> - <ovrDest type="bool">False</ovrDest> - <ovrDestHostPort type="str"></ovrDestHostPort> - <nUdpMaxSize type="int">1024</nUdpMaxSize> - <enableSigComp type="bool">False</enableSigComp> - <telURISource type="bool">False</telURISource> - <telURIDest type="bool">False</telURIDest> - <securityMechanismValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SignalingSettings_securityMechanismValList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SecurityMechanismVal"> - <checked type="bool">False</checked> - <mechanism type="str">ipsec-3gpp</mechanism> - <algorithm type="int">0</algorithm> - <algorithmStr type="str">hmac-sha-1-96</algorithmStr> - <protocol type="int">0</protocol> - <protocolStr type="str">esp</protocolStr> - <mode type="int">0</mode> - <modeStr type="str">trans</modeStr> - <encrypt_algorithm type="int">0</encrypt_algorithm> - <encrypt_algorithmStr type="str">aes-cbc</encrypt_algorithmStr> - <spi_start_idx type="int">255</spi_start_idx> - <port_c type="str">[3000-4000]</port_c> - <port_s type="str">4060</port_s> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">protocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">encrypt_algorithmStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">algorithm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">modeStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">protocolStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mechanism</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">algorithmStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mode</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port_s</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port_c</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">spi_start_idx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">encrypt_algorithm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - </securityMechanismValList> - <useIPSecDoubleSPIPatch type="bool">False</useIPSecDoubleSPIPatch> - <enablePeriodicDNSQueries type="bool">False</enablePeriodicDNSQueries> - <DNSTimeoutValue type="int">60</DNSTimeoutValue> - <skipDeleteDNSRecordsAtLoopEnd type="bool">False</skipDeleteDNSRecordsAtLoopEnd> - <enableVoLTE type="bool">False</enableVoLTE> - <mediaBearerType type="int">0</mediaBearerType> - <enableCCDedicatedBearer type="bool">True</enableCCDedicatedBearer> - <volte_grbox type="bool">False</volte_grbox> - <_enableAutoHeaders type="bool">False</_enableAutoHeaders> - <_btnAutoHeaders type="bool">False</_btnAutoHeaders> - <dontEndMediaOnBye type="bool">False</dontEndMediaOnBye> - <closeTCPConnectionsOnRampdown type="bool">False</closeTCPConnectionsOnRampdown> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbSrvSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpWriteImmediate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">telURISource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableAutoHeaders</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSIP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fqdn</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretSource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenageConfCombo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c5</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaConfCombo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideRegistrar</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r5</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">realm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">user</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantSource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useServer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">nUdpMaxSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmit1xx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvDomain</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_btnEditContact1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">telURIDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePeriodicDNSQueries</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useIPSecDoubleSPIPatch</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">securityMechanismValList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideRegistrarAddress</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvAddr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrDestHostPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">DNSTimeoutValue</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">passwd</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretSequence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoRegister</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">skipDeleteDNSRecordsAtLoopEnd</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSigComp</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantSequence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableVoLTE</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmitACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_btnAutoHeaders</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">volte_grbox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">customSipTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dontEndMediaOnBye</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaExportComplete</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">mediaBearerType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">registrarSrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaUseOPasOPC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ovrDest1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">outboundProxy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_UseSrv1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableSIP1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">closeTCPConnectionsOnRampdown</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrContact</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaAbsolutePath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serverAddresses</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableCCDedicatedBearer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaConfComboSelIndex</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTos</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">ovrTrans</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useDnsSrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTransOption</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableSIP2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbPeriodicDNSQuery</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ignoreRetransmissions</item> - <item ref="1"/> - </item> - </_dict> - </state> - </signalingSettings> - <timerSettings ver="[2, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TimerSettings"> - <enableTimers type="bool">True</enableTimers> - <expirationValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_expirationValList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">REGISTER</message> - <msgPart type="int">0</msgPart> - <msgPartStr type="str">Expires Header(s)</msgPartStr> - <value type="int">3600</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">INVITE</message> - <msgPart type="int">2</msgPart> - <msgPartStr type="str">Session-Expire(s)</msgPartStr> - <value type="int">90</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">UPDATE</message> - <msgPart type="int">2</msgPart> - <msgPartStr type="str">Session-Expire(s)</msgPartStr> - <value type="int">90</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - </expirationValList> - <sessionRefreshType type="int">1</sessionRefreshType> - <refreshAfterSecs type="int">3000</refreshAfterSecs> - <refreshAfterPercent type="int">50</refreshAfterPercent> - <refreshInSecs type="int">32</refreshInSecs> - <enableRetransmissions type="bool">False</enableRetransmissions> - <T1 type="int">500</T1> - <T2 type="int">4000</T2> - <ignoreRetransmissions type="bool">True</ignoreRetransmissions> - <retransmitACK type="bool">True</retransmitACK> - <stopActiveRetr type="bool">True</stopActiveRetr> - <retransmit1xx type="bool">False</retransmit1xx> - <ovrTimeout type="bool">False</ovrTimeout> - <minInterReregister type="int">0</minInterReregister> - <autoEndCall2 type="bool">False</autoEndCall2> - <enableAutoPRACK type="bool">False</enableAutoPRACK> - <rprSendNegotiatedSDP type="bool">False</rprSendNegotiatedSDP> - <rprTimeUntilNextRPR type="int">150</rprTimeUntilNextRPR> - <rprScenarioHasPRACK type="bool">False</rprScenarioHasPRACK> - <auto4xx type="bool">False</auto4xx> - <auto4xxAbort type="bool">False</auto4xxAbort> - <autoProcedureList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_autoProcedureList" itemtype="ixConfig"/> - <autoProceduresCount type="int">0</autoProceduresCount> - <procListChanged type="bool">True</procListChanged> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">btnRefreshProcList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoEndCall</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreRetransmissions</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">minInterReregister</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoEndCall2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTimers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshInSecs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">retransmit1xx</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">auto4xxAbort</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableTimers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sessionRefreshType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">auto4xx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">procListChanged</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoProcedureList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbAutoPRACK</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">T1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshAfterPercent</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAutoPRACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stopActiveRetr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rprTimeUntilNextRPR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rprScenarioHasPRACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">expirationValList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshAfterSecs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">autoProceduresCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmitACK</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">rprSendNegotiatedSDP</item> - <item ref="1"/> - </item> - </_dict> - </state> - </timerSettings> - <advancedSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedSettings"> - <useCloud type="bool">False</useCloud> - <_useCloud1 type="bool">False</_useCloud1> - <cloud type="str"><None></cloud> - <serverRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_serverRules" itemtype="ixConfig"/> - <enableVirtualIPs type="bool">False</enableVirtualIPs> - <virtualIPTable ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_virtualIPTable" itemtype="ixConfig"/> - <ovrCloudRules type="bool">False</ovrCloudRules> - <_ovrCloudRules1 type="bool">False</_ovrCloudRules1> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbVirtualIPs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useCloud</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrCloudRules</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ovrCloudRules1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_useCloud1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableVirtualIPs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">virtualIPTable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serverRules</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">cloud</item> - <item ref="3"/> - </item> - </_dict> - </state> - </advancedSettings> - <tlsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsSettings"> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <_enableTLS1 type="bool">False</_enableTLS1> - <_enableTLS2 type="bool">False</_enableTLS2> - <_enableTLS3 type="bool">False</_enableTLS3> - <tlsPort type="str">5061</tlsPort> - <tlsProtocol type="int">3</tlsProtocol> - <tlsSessionRefresh type="bool">False</tlsSessionRefresh> - <_tlsSessionRefresh type="bool">False</_tlsSessionRefresh> - <tlsRefreshInterval type="int">3600</tlsRefreshInterval> - <tlsAuthClient type="int">0</tlsAuthClient> - <tlsReuseConnection type="bool">False</tlsReuseConnection> - <_tlsReuseConnection type="bool">False</_tlsReuseConnection> - <ignoreSubjectAltName type="bool">False</ignoreSubjectAltName> - <tlsMutual type="bool">False</tlsMutual> - <_gbTlsMutual type="bool">False</_gbTlsMutual> - <tlsCyphers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TlsSettings_tlsCyphers" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES128-GCM-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES256-GCM-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-RSA-AES128-GCM-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES256-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-RSA-AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">AES256-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-ECDSA-AES256-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-ECDSA-AES128-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES256-GCM-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES128-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES256-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">DES-CBC3-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-RC2-CBC-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-RC4-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP1024-DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP1024-RC4-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">IDEA-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">NULL-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">NULL-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">RC4-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">RC4-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - </tlsCyphers> - <tlsCertificatesPath type="str">C:\Program Files (x86)\Ixia\IxLoad\8.20-EA\aptixia\data\SSL_Certificates</tlsCertificatesPath> - <tlsPrivateKeyCertificate type="str">Unsecured_RSA_key_1024.pem</tlsPrivateKeyCertificate> - <tlsPublicKeyCertificate type="str">Unsecured_RSA_cert_1024.pem</tlsPublicKeyCertificate> - <tlsKeyType type="int">0</tlsKeyType> - <tlsCertType type="int">0</tlsCertType> - <tlsPassword type="str"></tlsPassword> - <sipScheme type="int">0</sipScheme> - <tlsTransportType type="int">0</tlsTransportType> - <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp> - <tlsEnableTcpKeepAlive type="bool">False</tlsEnableTcpKeepAlive> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tlsCertType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPassword</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsMutual</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPrivateKeyCertificate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsTransportType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTLS_HTTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsCyphers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsProtocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsKeyType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tlsSessionRefresh</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tlsCertificatesPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsEnableTcpKeepAlive</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTlsMutual</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tlsPublicKeyCertificate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableCert</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTLS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsAuthClient</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreSubjectAltName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS4</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS2</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS3</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableDTLS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTLS_MSRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsReuseConnection</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsRefreshInterval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsSessionRefresh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsDisableUdpAndTcp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sipScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tlsReuseConnection</item> - <item ref="3"/> - </item> - </_dict> - </state> - </tlsSettings> - <dtlsOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DtlsOptions"> - <dtlsRetry type="int">200</dtlsRetry> - <dtlsTimeout type="int">30000</dtlsTimeout> - <dtlsSessionTicket type="bool">False</dtlsSessionTicket> - </dtlsOptions> - <iceOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_IceOptions"> - <iceRetryCount type="int">6</iceRetryCount> - <iceInitialRetry type="int">100</iceInitialRetry> - <iceTimeout type="int">30000</iceTimeout> - </iceOptions> - <otherSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_OtherSettings"> - <VOIP_Var0 type="str"></VOIP_Var0> - <VOIP_Var1 type="str"></VOIP_Var1> - <VOIP_Var2 type="str"></VOIP_Var2> - <VOIP_Var3 type="str"></VOIP_Var3> - <VOIP_Var4 type="str"></VOIP_Var4> - <VOIP_IPAddress0 type="str"></VOIP_IPAddress0> - <VOIP_IPAddress1 type="str"></VOIP_IPAddress1> - <VOIP_IPAddress2 type="str"></VOIP_IPAddress2> - <VOIP_IPAddress3 type="str"></VOIP_IPAddress3> - <VOIP_IPAddress4 type="str"></VOIP_IPAddress4> - <ipPreference type="int">0</ipPreference> - <bUseHardcoded type="bool">False</bUseHardcoded> - <_gbHardcodedForDemo type="bool">False</_gbHardcodedForDemo> - <_gbStunSettings type="bool">False</_gbStunSettings> - <bUseStun type="bool">False</bUseStun> - <stunAddr type="str">127.0.0.1</stunAddr> - <stunPort type="str">3478</stunPort> - <bUseIce type="bool">False</bUseIce> - <bIceLite type="bool">False</bIceLite> - <_gbSRVCCSettings type="bool">False</_gbSRVCCSettings> - <bUseSRVCC type="bool">False</bUseSRVCC> - <mobilityPath type="str"></mobilityPath> - <ddgGroupboxSRVCC type="bool">False</ddgGroupboxSRVCC> - <PCO_Groupbox type="bool">False</PCO_Groupbox> - <bUsePCO type="bool">False</bUsePCO> - <_gbPCO type="bool">False</_gbPCO> - <PCO_List type="str"></PCO_List> - <useBHCA type="bool">False</useBHCA> - <loadVariablesFromCsv type="bool">False</loadVariablesFromCsv> - <pathForCsvWithVariables type="str"></pathForCsvWithVariables> - <absolutePathForCsvWithVariables type="str"></absolutePathForCsvWithVariables> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbIceSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbPCO</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbStunSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress0</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUseIce</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">mobilityPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var0</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">PCO_List</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbSRVCCSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">absolutePathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">PCO_Groupbox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">bUseHardcoded</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">bUseSRVCC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useBHCA</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipPreference</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnBrowseForVariableCsv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUsePCO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stunPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUseStun</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stunAddr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ddgGroupboxSRVCC</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">_gbHardcodedForDemo</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">pathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">DodPathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_varCsvGroupBox</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loadVariablesFromCsv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bIceLite</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var4</item> - <item ref="1"/> - </item> - </_dict> - </state> - </otherSettings> - <smsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSSettings"> - <enableSMS type="bool">False</enableSMS> - <requestURI type="str">sc.home1.net</requestURI> - <enableTelURI type="bool">False</enableTelURI> - <telURI type="str">phone-context=example</telURI> - <smscPhoneNo type="str">61814712345</smscPhoneNo> - <smscTypeOfNo type="int">0</smscTypeOfNo> - <smscNumberingPlan type="int">0</smscNumberingPlan> - <enableSMOrigOverrideDest type="bool">False</enableSMOrigOverrideDest> - <btnSMOrigEdit type="bool">False</btnSMOrigEdit> - <enableSMOrigReqStatusReport type="bool">False</enableSMOrigReqStatusReport> - <enableSMOrigReplyPath type="bool">False</enableSMOrigReplyPath> - <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo"> - <phoneType type="bool">False</phoneType> - <phoneValue type="str">160[00000000-]</phoneValue> - <comboPhoneBookEntry type="str"><None></comboPhoneBookEntry> - </smsAddressOriginator> - <smOrigTypeOfNo type="int">0</smOrigTypeOfNo> - <smOrigNumberingPlan type="int">0</smOrigNumberingPlan> - <enableSMRecipOverrideSrc type="bool">False</enableSMRecipOverrideSrc> - <btnSMRecipEdit type="bool">False</btnSMRecipEdit> - <enableSMRecipReqStatusReport type="bool">False</enableSMRecipReqStatusReport> - <enableSMRecipReplyPath type="bool">False</enableSMRecipReplyPath> - <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo"> - <phoneType type="bool">False</phoneType> - <phoneValue type="str">160[00000000-]</phoneValue> - <comboPhoneBookEntry type="str"><None></comboPhoneBookEntry> - </smsAddressRecipient> - <smRecipTypeOfNo type="int">0</smRecipTypeOfNo> - <smRecipNumberingPlan type="int">0</smRecipNumberingPlan> - <depActivities ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_depActivities" itemtype="ixConfig"/> - <useFilesFromActivity type="bool">False</useFilesFromActivity> - <verifyUserInfo type="bool">False</verifyUserInfo> - <smsImportFilesActivity type="str">None</smsImportFilesActivity> - <smsActivityForFiles type="int">0</smsActivityForFiles> - <pcpuCommonPath type="str"></pcpuCommonPath> - <smsFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_smsFiles" itemtype="ixConfig"/> - <smsFilesCount type="int">0</smsFilesCount> - <grBoxSMServiceCenter type="bool">False</grBoxSMServiceCenter> - <grBoxSMOriginator type="bool">False</grBoxSMOriginator> - <grBoxSMRecipient type="bool">False</grBoxSMRecipient> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">smOrigNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFiles</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigReplyPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFilesCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSMRecipEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMOriginator</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMRecipient</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipOverrideSrc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigReqStatusReport</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsAddressOriginator</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">telURI</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">depActivities</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">pcpuCommonPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smOrigTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smRecipTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">requestURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFilesBackup</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsAddressRecipient</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useFilesFromActivity</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smRecipNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smscPhoneNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsImportFilesActivity</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipReplyPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSMOrigEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smscNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">duringLoadFromBackup</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipReqStatusReport</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMServiceCenter</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">verifyUserInfo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smscTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigOverrideDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsActivityForFiles</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsSettings> - <smsFilesAdd ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSFilesAdd"> - <loadedFileType type="int">0</loadedFileType> - <fileName type="str"></fileName> - <ixSmsFileName type="str"></ixSmsFileName> - <ixSmsFilePath type="str"></ixSmsFilePath> - <segmentOrder type="str"></segmentOrder> - <totalTpudSize type="str"></totalTpudSize> - <segmentNo type="str">0</segmentNo> - <comboCoding type="int">0</comboCoding> - <comboRefNo type="int">0</comboRefNo> - <contentViewEdit type="str"></contentViewEdit> - <contentViewShow type="str"></contentViewShow> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">segmentNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">contentViewShow</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ixSmsFilePath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">contentViewEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">comboCoding</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">segmentOrder</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboRefNo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">loadedFileType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSmsLoadFiles</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ixSmsFileName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSmsSaveAs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fileName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">totalTpudSize</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsFilesAdd> - <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress"> - <radioBtnPhoneNo type="int">0</radioBtnPhoneNo> - <comboPhoneBook type="str"><None></comboPhoneBook> - <phoneBookPreview type="str"></phoneBookPreview> - <userPattern type="str">160[00000000-]</userPattern> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <fakeEnableTelURI type="bool">False</fakeEnableTelURI> - <fakeTelURI type="str"></fakeTelURI> - <fakeTelToPort type="str"></fakeTelToPort> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">userPattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneBookPreview</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeEnableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelToPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboPhoneBook</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">radioBtnPhoneNo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsAddressOriginator> - <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress"> - <radioBtnPhoneNo type="int">0</radioBtnPhoneNo> - <comboPhoneBook type="str"><None></comboPhoneBook> - <phoneBookPreview type="str"></phoneBookPreview> - <userPattern type="str">160[00000000-]</userPattern> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <fakeEnableTelURI type="bool">False</fakeEnableTelURI> - <fakeTelURI type="str"></fakeTelURI> - <fakeTelToPort type="str"></fakeTelToPort> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">userPattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneBookPreview</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeEnableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelToPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboPhoneBook</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">radioBtnPhoneNo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsAddressRecipient> - <compatibility ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Compatibility"> - <hasRtpChMapRules type="bool">True</hasRtpChMapRules> - </compatibility> - <editAutoHeaderRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditAutoHeaderRule"> - <defaultMessagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_defaultMessagesList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INVITE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">BYE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CANCEL</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">OPTIONS</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REGISTER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">NOTIFY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">SUBSCRIBE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REFER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">MESSAGE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">PRACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INFO</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">UPDATE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">100 (Trying)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">180 (Ringing)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">181 (Call Is Being Forwarded)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">182 (Queued)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">183 (Session Progress)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">200 (OK)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">202 (Accepted)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">300 (Multiple Choices)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">301 (Moved Permanently)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">302 (Moved Temporarily)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">305 (Use Proxy)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">380 (Alternative Service)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">400 (Bad Request)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">401 (Unauthorized)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">402 (Payment Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">403 (Forbidden)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">404 (Not Found)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">405 (Method Not Allowed)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">406 (Not Acceptable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">407 (Proxy Authentication Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">408 (Request Timeout)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">410 (Gone)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">413 (Request Entity Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">414 (Request-URI Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">415 (Unsupported Media Type)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">416 (Unsupported URI Scheme)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">420 (Bad Extension)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">421 (Extension Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">423 (Interval Too Brief)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">480 (Temporarily not available)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">481 (Call Leg/Transaction Does Not Exist)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">482 (Loop Detected)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">483 (Too Many Hops)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">484 (Address Incomplete)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">485 (Ambiguous)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">486 (Busy Here)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">487 (Request Terminated)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">488 (Not Acceptable Here)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">491 (Request Pending)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">493 (Undecipherable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">500 (Internal Server Error)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">501 (Not Implemented)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">502 (Bad Gateway)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">503 (Service Unavailable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">504 (Server Time-out)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">505 (SIP Version not supported)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">513 (Message Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">600 (Busy Everywhere)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">603 (Decline)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">604 (Does not exist anywhere)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">606 (Not Acceptable)</str> - </item> - </defaultMessagesList> - <messagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_messagesList" itemtype="ixConfig"/> - <autoHeaderTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_autoHeaderTypeList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Request-Uri</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Via</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">From</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Call-ID</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Contact</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Length</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Record-Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Referred-By</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Replaces</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Event</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RAck</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Refer-To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Subscription-State</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">WWW-Authenticate</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Also</str> - </item> - </autoHeaderTypeList> - <autoHeaderType type="str">To</autoHeaderType> - <option type="int">0</option> - <appendToUri type="bool">False</appendToUri> - <headerValue type="str"></headerValue> - <parsedHeader ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_parsedHeader" itemtype="ixConfig"/> - <valid type="bool">True</valid> - </editAutoHeaderRule> - <autoHeadersSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AutoHeadersSettings"> - <enableAutoHeaders type="bool">False</enableAutoHeaders> - <tableRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_tableRules" itemtype="ixConfig"/> - <reqAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_reqAutoHeadRules" itemtype="ixConfig"/> - <respAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_respAutoHeadRules" itemtype="ixConfig"/> - </autoHeadersSettings> - <sipAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SipAdvancedSettings"> - <overrideTCPLocalPort type="bool">False</overrideTCPLocalPort> - <tcpLocalPortStart type="int">40000</tcpLocalPortStart> - <tcpLocalPortEnd type="int">60000</tcpLocalPortEnd> - <tcpLocalPortStep type="int">1</tcpLocalPortStep> - <closeNonsecureTcpConnectionsEnable type="bool">False</closeNonsecureTcpConnectionsEnable> - <closeIdleTcpConnectionsEnable type="bool">False</closeIdleTcpConnectionsEnable> - <tcpIdlePeriod type="int">10</tcpIdlePeriod> - <donotCloseTCPInsideCallEnable type="bool">False</donotCloseTCPInsideCallEnable> - <recordingServerEnable type="bool">False</recordingServerEnable> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tcpIdlePeriod</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpEndPortLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpIdlePeriodLabel</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">donotCloseTCPInsideCallEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpPortStepLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortStep</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortEnd</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpStartPortLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortStart</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">closeIdleTcpConnectionsEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">recordingServerEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideTCPLocalPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">closeNonsecureTcpConnectionsEnable</item> - <item ref="1"/> - </item> - </_dict> - </state> - </sipAdvSettings> - </pm> - <objectID type="int">2</objectID> - <_apiUniqueId type="int">15470</_apiUniqueId> - <uniqueID type="int">27</uniqueID> - <commandIdCounter type="int">11</commandIdCounter> - <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport"> - <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"/> - </serializedNetworkSettingsMap> - <protocolName type="str">VoIP</protocolName> - </networkPluginSettings> - </item> - <item ver="[34, [1, [0, [6, [1, [0, [0]]]], [0, [0]]], [0]]]" oid="19" type="#VoIP_Peer_plugin$Plugin"> - <enable type="bool">True</enable> - <name type="str">CALLING</name> - <activityFunction type="NoneType">None</activityFunction> - <needToRefreshStatViews type="bool">False</needToRefreshStatViews> - <activeRole type="str">Both</activeRole> - <cmdListLoops type="int">0</cmdListLoops> - <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/> - <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination"> - <item ver="[0, [3, [1, [0, [0]]]]]" type="ixAgentDestination"> - <name type="str">VoIP2_CALLED</name> - <portMapPolicy type="str">protocolSpecific</portMapPolicy> - <sameAs type="str"></sameAs> - <validPortMapPolicies type="list"> - <item type="str">protocolSpecific</item> - </validPortMapPolicies> - <inUse type="bool">True</inUse> - <customPortMap type="NoneType">None</customPortMap> - <sourceCommunity ref="5"/> - <destinationCommunity ver="[1, [23, [0, [1, [0, [0]]]]]]" oid="23" type="ixNetTraffic"> - <name type="str">VoIP2@VM2</name> - <column type="NoneType">None</column> - <scenarioElementType type="str">netTraffic</scenarioElementType> - <enable type="bool">True</enable> - <role type="str">Peer</role> - <networkType type="str">ethernet</networkType> - <activityFunction type="str">ipTrafficAgent</activityFunction> - <activeRole type="str">Both</activeRole> - <networkActivityList ver="[0, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkActivityList" itemtype="ixNetworkActivity"/> - <activityGroupList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityGroupList" itemtype="ixActivityGroup"/> - <traffic ver="[6, [1, [0, [0]]]]" type="ixActivityModel"> - <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp> - <name type="str">VoIP2</name> - <role type="str">Peer</role> - <activityFunction type="str">ipTrafficAgent</activityFunction> - <payload type="NoneType">None</payload> - <agentList ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="_agentListSequenceContainer" itemtype="ixAgent"> - <item ver="[34, [1, [0, [6, [1, [0, [0]]]], [0, [0]]], [0]]]" oid="10" type="#VoIP_Peer_plugin$Plugin"> - <enable type="int">1</enable> - <name type="str">CALLED</name> - <activityFunction type="NoneType">None</activityFunction> - <needToRefreshStatViews type="bool">False</needToRefreshStatViews> - <activeRole type="str">Both</activeRole> - <cmdListLoops type="int">0</cmdListLoops> - <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/> - <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination"/> - <flowPercentage type="float">100.0</flowPercentage> - <uniqueID type="int">43</uniqueID> - <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyMap_VoIP"> - <szPluginVersion type="str">4.10</szPluginVersion> - <ceCommands ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]], [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_ceCommands" itemtype="ixConfig"> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStart"> - <commandId type="int">-2</commandId> - <commandType type="str">START</commandType> - <cmdName type="str">Start</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Output1</name> - <outputType type="int">0</outputType> - <destCmdId type="int">3</destCmdId> - <objectID type="int">0</objectID> - <destinationCommandIdx type="int">2</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStop"> - <commandId type="int">-3</commandId> - <commandType type="str">STOP</commandType> - <cmdName type="str">Stop</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure"> - <commandId type="int">3</commandId> - <commandType type="str">Procedure</commandType> - <cmdName type="str">SIP ReceiveCall (#3)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">17</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">4</destinationCommandIdx> - </item> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Error</name> - <outputType type="int">1</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">2</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure"> - <commandId type="int">11</commandId> - <commandType type="str">Procedure</commandType> - <cmdName type="str">SIP EndCall Receive (#4)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Error</name> - <outputType type="int">1</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">2</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [1, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CommandEx"> - <commandId type="int">17</commandId> - <commandType type="str">CommandEx</commandType> - <cmdName type="str">Voice Session (#2)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">11</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">3</destinationCommandIdx> - </item> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Error</name> - <outputType type="int">1</outputType> - <destCmdId type="int">11</destCmdId> - <objectID type="int">2</objectID> - <destinationCommandIdx type="int">3</destinationCommandIdx> - </item> - </outputList> - <cmdType type="str">RTPVoiceSession</cmdType> - </item> - </ceCommands> - <activityLink ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityLinkInfo"> - <name type="str">VoiceLink1</name> - <activitiesCount type="int">2</activitiesCount> - </activityLink> - <triggers ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TriggerConfig"> - <triggersInCount type="int">3</triggersInCount> - <triggersOutCount type="int">5</triggersOutCount> - </triggers> - <globalSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSettings"> - <globalExecStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalExecSettings"> - <setAborted type="bool">False</setAborted> - <setAllFailed type="bool">False</setAllFailed> - <trigTimeout type="int">600000</trigTimeout> - <notAbortOnTimeout type="bool">False</notAbortOnTimeout> - <limitErrors type="bool">False</limitErrors> - <maxErrors type="int">1</maxErrors> - <limitArrayVarSize type="bool">False</limitArrayVarSize> - <maxArrayVarSize type="int">10</maxArrayVarSize> - </globalExecStg> - <globalSIPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSIPSettings"> - <disableTCP type="bool">False</disableTCP> - <prefQOP type="int">0</prefQOP> - <warnAsError type="bool">False</warnAsError> - <limitQueueSize type="bool">True</limitQueueSize> - <maxChannelsInQueue type="int">25</maxChannelsInQueue> - <enableSIPLogging type="bool">False</enableSIPLogging> - <limitSIPLoggingChannels type="bool">False</limitSIPLoggingChannels> - <maxSIPLoggingChannels type="int">10</maxSIPLoggingChannels> - <minSIPLoggingChannels type="int">0</minSIPLoggingChannels> - <voipPeerLogSettings type="int">0</voipPeerLogSettings> - <voipPeerLogExpForChannels type="str"></voipPeerLogExpForChannels> - <abortLoopOnTriggerTimeout type="bool">False</abortLoopOnTriggerTimeout> - </globalSIPStg> - <globalRTPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalRTPSettings"> - <transmMode type="int">0</transmMode> - <playMode type="int">0</playMode> - <repeatCount type="int">1</repeatCount> - <repeatTime type="int">1000</repeatTime> - <timeUnit type="int">0</timeUnit> - <volume type="int">-20</volume> - <playModePathConf type="int">0</playModePathConf> - <repeatCountPathConf type="int">0</repeatCountPathConf> - <repeatTimePathConf type="int">10</repeatTimePathConf> - <timeUnitPathConf type="int">0</timeUnitPathConf> - <toneDurationPathConf type="int">200</toneDurationPathConf> - <interToneDelayPathConf type="int">200</interToneDelayPathConf> - <toneAmplitudePathConf type="int">-10</toneAmplitudePathConf> - <firstToneTimeoutPathConf type="int">4000</firstToneTimeoutPathConf> - <interToneTimeoutPathConf type="int">2000</interToneTimeoutPathConf> - <qovTalkExtraSilence type="int">500</qovTalkExtraSilence> - <qovListenExtraDuration type="int">2000</qovListenExtraDuration> - <downloadRTPCSV type="bool">True</downloadRTPCSV> - <waitQoVScore type="bool">False</waitQoVScore> - </globalRTPStg> - <globalSTUNStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSTUNSettings"> - <keepAliveInterval type="int">15</keepAliveInterval> - </globalSTUNStg> - <globalSKINNYStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSKINNYSettings"> - <softKeyCount type="int">25</softKeyCount> - <receiveVideo type="bool">False</receiveVideo> - <transmitVideo type="bool">False</transmitVideo> - </globalSKINNYStg> - <globalT38Stg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalT38Settings"> - <t30Log type="bool">False</t30Log> - <t38Log type="bool">False</t38Log> - <receivedImageLog type="bool">False</receivedImageLog> - <logType type="int">0</logType> - <logBegin type="int">1</logBegin> - <logEnd type="int">10</logEnd> - <channelRange type="str">[00-10]</channelRange> - </globalT38Stg> - </globalSettings> - <info ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Info"> - <userChannelsNo type="int">653520</userChannelsNo> - <portInstances type="int">3</portInstances> - <portInstanceIdx type="int">2</portInstanceIdx> - <objectiveType type="str">activeUsers</objectiveType> - <objectiveValue type="int">1000</objectiveValue> - <maxAllowedObjective type="long">9223372036854775807</maxAllowedObjective> - <firstSignalingFnID type="int">8</firstSignalingFnID> - <enableRTPDest type="bool">False</enableRTPDest> - <rtpPortDest type="str"></rtpPortDest> - <rtpObjectiveValue type="int">32000</rtpObjectiveValue> - <hasRtpFunction type="bool">False</hasRtpFunction> - <hasVideoFunction type="bool">False</hasVideoFunction> - <hasT38Function type="bool">False</hasT38Function> - <hasMSRPFunction type="bool">False</hasMSRPFunction> - <src ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str">CALLED</name> - <portCount type="int">1</portCount> - <portCountRtp type="int">1</portCountRtp> - <portCountT38 type="int">1</portCountT38> - <portCountMSRP type="int">1</portCountMSRP> - <ipRangeCount type="int">1</ipRangeCount> - <ipCount type="int">1</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">1</ipRuleCh> - <port type="str">{{sipportcalled}}</port> - <portRule type="int">0</portRule> - <portRuleCh type="int">1</portRuleCh> - <phone type="str">{{pncalled}}</phone> - <aliases type="int">1</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">1</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">1</ipRangeCountRtp> - <ipCountRtp type="int">1</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">1</ipRuleChRtp> - <portRtp type="str">[10000-65535,4]</portRtp> - <portT38 type="str">40000</portT38> - <portMSRP type="str">2855</portMSRP> - <portRuleRtp type="int">1</portRuleRtp> - <portRuleChRtp type="int">1</portRuleChRtp> - <ipRangeCountT38 type="int">1</ipRangeCountT38> - <ipCountT38 type="int">1</ipCountT38> - <ipRangeCountMSRP type="int">1</ipRangeCountMSRP> - <ipCountMSRP type="int">1</ipCountMSRP> - <symType type="int">1</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str">5061</tlsPort> - <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp> - <nodeCount type="int">1</nodeCount> - <coreCount type="int">2</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str">aptixia-T.03440c56.4e1a.4def.8406.ec64db91d4c1-L2EthernetPlugin-820b0582.6a4c.4109.bd5d.587621a43ce2-161.105.231.12;2;1default</layerName> - </src> - <dest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str"></name> - <portCount type="int">1</portCount> - <portCountRtp type="int">1</portCountRtp> - <portCountT38 type="int">1</portCountT38> - <portCountMSRP type="int">1</portCountMSRP> - <ipRangeCount type="int">0</ipRangeCount> - <ipCount type="int">0</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">0</ipRuleCh> - <port type="str"></port> - <portRule type="int">0</portRule> - <portRuleCh type="int">0</portRuleCh> - <phone type="str"></phone> - <aliases type="int">1</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">0</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">0</ipRangeCountRtp> - <ipCountRtp type="int">0</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">0</ipRuleChRtp> - <portRtp type="str"></portRtp> - <portT38 type="str"></portT38> - <portMSRP type="str">2855</portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">0</portRuleChRtp> - <ipRangeCountT38 type="int">0</ipRangeCountT38> - <ipCountT38 type="int">0</ipCountT38> - <ipRangeCountMSRP type="int">1</ipRangeCountMSRP> - <ipCountMSRP type="int">12</ipCountMSRP> - <symType type="int">0</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str"></tlsPort> - <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp> - <nodeCount type="int">1</nodeCount> - <coreCount type="int">2</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str"></layerName> - </dest> - <useServerDest type="bool">False</useServerDest> - <srvDomainDest type="str"></srvDomainDest> - <srvAddrDest type="str"></srvAddrDest> - <srvPortDest type="str">5060</srvPortDest> - <cloudServerDest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer"> - <name type="str"></name> - <ipAddr type="str"></ipAddr> - <rangeType type="str"></rangeType> - <ipType type="str"></ipType> - <port type="int">0</port> - <attachedInfo type="str"></attachedInfo> - <firstIp type="str"></firstIp> - <netMask type="str"></netMask> - <ipCount type="str"></ipCount> - <ipStep type="str"></ipStep> - </cloudServerDest> - <transfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str"></name> - <portCount type="int">0</portCount> - <portCountRtp type="int">0</portCountRtp> - <portCountT38 type="int">0</portCountT38> - <portCountMSRP type="int">0</portCountMSRP> - <ipRangeCount type="int">0</ipRangeCount> - <ipCount type="int">0</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">0</ipRuleCh> - <port type="str"></port> - <portRule type="int">0</portRule> - <portRuleCh type="int">0</portRuleCh> - <phone type="str"></phone> - <aliases type="int">0</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">0</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">0</ipRangeCountRtp> - <ipCountRtp type="int">0</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">0</ipRuleChRtp> - <portRtp type="str"></portRtp> - <portT38 type="str"></portT38> - <portMSRP type="str"></portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">0</portRuleChRtp> - <ipRangeCountT38 type="int">0</ipRangeCountT38> - <ipCountT38 type="int">0</ipCountT38> - <ipRangeCountMSRP type="int">0</ipRangeCountMSRP> - <ipCountMSRP type="int">0</ipCountMSRP> - <symType type="int">0</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str"></tlsPort> - <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp> - <nodeCount type="int">0</nodeCount> - <coreCount type="int">1</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str"></layerName> - </transfer> - <useServerTransfer type="bool">False</useServerTransfer> - <registrarSrvTransfer type="bool">False</registrarSrvTransfer> - <srvAddrTransfer type="str"></srvAddrTransfer> - <srvPortTransfer type="str">5060</srvPortTransfer> - <cloudServerTransfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer"> - <name type="str"></name> - <ipAddr type="str"></ipAddr> - <rangeType type="str"></rangeType> - <ipType type="str"></ipType> - <port type="int">0</port> - <attachedInfo type="str"></attachedInfo> - <firstIp type="str"></firstIp> - <netMask type="str"></netMask> - <ipCount type="str"></ipCount> - <ipStep type="str"></ipStep> - </cloudServerTransfer> - </info> - <scenarioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ScenarioSettings"> - <scenarioFile type="str">.\SIPCall.tst</scenarioFile> - <activeScenarioChannel type="int">1</activeScenarioChannel> - <funcsCount type="int">18</funcsCount> - <isModified type="int">66</isModified> - <activityID type="int">8</activityID> - <exportToRM type="int">0</exportToRM> - </scenarioSettings> - <executionSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExecutionSettings"> - <loopMode type="int">0</loopMode> - <loopCount type="int">1</loopCount> - <loopPreDelay type="int">0</loopPreDelay> - <loopMidDelay type="int">0</loopMidDelay> - <gracefulRampDown type="bool">True</gracefulRampDown> - <rampdownSleep type="bool">False</rampdownSleep> - <aliases type="int">1</aliases> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">1</ipRuleCh> - <portRule type="int">0</portRule> - <portRuleCh type="int">1</portRuleCh> - <phoneRule type="int">1</phoneRule> - <multipleUsersPerIO type="bool">True</multipleUsersPerIO> - <rtpIpRule type="int">0</rtpIpRule> - <rtpIpRuleCh type="int">1</rtpIpRuleCh> - <rtpPortRule type="int">1</rtpPortRule> - <rtpPortRuleCh type="int">1</rtpPortRuleCh> - <dl_BUG type="bool">True</dl_BUG> - <dl_TRACE type="bool">False</dl_TRACE> - <dl_L_INFO type="bool">True</dl_L_INFO> - <dl_L_ADV type="bool">False</dl_L_ADV> - <dl_L_VRB type="bool">False</dl_L_VRB> - <dl_T_IO type="bool">False</dl_T_IO> - <dl_T_INFO type="bool">False</dl_T_INFO> - <dl_T_ADV type="bool">False</dl_T_ADV> - <dl_T_VRB type="bool">False</dl_T_VRB> - <dl_TG_ADV type="bool">False</dl_TG_ADV> - <dl_TG_VRB type="bool">False</dl_TG_VRB> - <dl_Q_ADV type="bool">False</dl_Q_ADV> - <dl_Q_VRB type="bool">False</dl_Q_VRB> - <dl_S_FSM type="bool">False</dl_S_FSM> - <dl_S_SER type="bool">False</dl_S_SER> - <dl_S_SUA type="bool">False</dl_S_SUA> - <dl_S_WAIT type="bool">False</dl_S_WAIT> - <dl_S_SEND type="bool">False</dl_S_SEND> - <dl_S_INFO type="bool">False</dl_S_INFO> - <dl_S_ADV type="bool">False</dl_S_ADV> - <dl_S_VRB type="bool">False</dl_S_VRB> - <dl_R_DD type="bool">False</dl_R_DD> - <dl_R_VRB type="bool">False</dl_R_VRB> - <dl_R_PAR type="bool">False</dl_R_PAR> - <dl_EE_VRB type="bool">False</dl_EE_VRB> - <dl_EE_DD type="bool">False</dl_EE_DD> - <dl_FLOW type="bool">False</dl_FLOW> - <dl_M_IO type="bool">False</dl_M_IO> - <dl_SDP_DD type="bool">False</dl_SDP_DD> - <dl_1 type="bool">False</dl_1> - <dl_2 type="bool">False</dl_2> - <dl_3 type="bool">False</dl_3> - <log_level type="int">9</log_level> - <log_in_memory type="int">1</log_in_memory> - <rtp_log_in_file type="int">1</rtp_log_in_file> - <log_filesize type="int">32</log_filesize> - <_gbDebugLogs type="bool">False</_gbDebugLogs> - <ccExportProfile type="bool">False</ccExportProfile> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_ipRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_S_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopMidDelay</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_IO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SEND</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_rtpIpRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">_estimatedBacklog</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopPreDelay</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TG_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">log_filesize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtp_log_in_file</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">aliases</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_Q_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">multipleUsersPerIO</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">log_level</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpIpRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rampdownSleep</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_portRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SER</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_Q_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpPortRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_M_IO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_EE_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpIpRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_FSM</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">gracefulRampDown</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_FLOW</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_BUG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SUA</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_rtpPortRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_R_PAR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopCount</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">dl_S_WAIT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_SDP_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TRACE</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbDebugLogs</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">rtpPortRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TG_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_EE_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ccExportProfile</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">log_in_memory</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_VRB</item> - <item ref="1"/> - </item> - </_dict> - </state> - </executionSettings> - <customActivityLinkSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters"> - <enableDbgLog type="bool">False</enableDbgLog> - <dbgLogChannels type="str">1-5</dbgLogChannels> - <bhcaType type="int">0</bhcaType> - <talkTime type="int">10000</talkTime> - <channelsNo type="int">1</channelsNo> - <callSetupTime type="int">500</callSetupTime> - <callTeardownTime type="int">500</callTeardownTime> - <interCallDuration type="int">4000</interCallDuration> - <bhcaObjectiveValue type="int">1</bhcaObjectiveValue> - <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked> - <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked> - <cpsOverwriteValue type="int">18</cpsOverwriteValue> - <cpsType type="int">0</cpsType> - <cpsTalkTime type="int">30000</cpsTalkTime> - <cpsChannelsNo type="int">16750</cpsChannelsNo> - <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo> - <cpsOverheadTime type="int">1500</cpsOverheadTime> - <cpsInterCallDuration type="int">2000</cpsInterCallDuration> - <cpsObjectiveValue type="int">500</cpsObjectiveValue> - <cpsRegisterTime type="int">40</cpsRegisterTime> - <cpsSplitTimeline type="int">0</cpsSplitTimeline> - <lpsType type="int">0</lpsType> - <lpsTalkTime type="int">800</lpsTalkTime> - <lpsChannelsNo type="int">2150</lpsChannelsNo> - <lpsOverheadTime type="int">1500</lpsOverheadTime> - <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration> - <lpsObjectiveValue type="int">500</lpsObjectiveValue> - <lpsActiveChannel type="int">0</lpsActiveChannel> - <activeUsersTalkTime type="int">30000</activeUsersTalkTime> - <activeUsersNo type="int">{{activecalls}}</activeUsersNo> - <activeUsersChannel type="int">0</activeUsersChannel> - <activeUsersObjectiveValue type="int">{{activecalls}}</activeUsersObjectiveValue> - </customActivityLinkSettings> - <rtpWaveFiles ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPWaveFiles"> - <wavesCount type="int">1</wavesCount> - </rtpWaveFiles> - <rtpTones ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPTones"> - <usedTonesCount type="int">0</usedTonesCount> - <customTonesCount type="int">35</customTonesCount> - <seqCustTonesCount type="int">0</seqCustTonesCount> - </rtpTones> - <codecCustomPopup ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPopup"> - <captureFile type="str">Default.cap</captureFile> - <parseRTPPort type="bool">False</parseRTPPort> - <parseSSRC type="bool">False</parseSSRC> - <rtpPort type="int">10000</rtpPort> - <ssrc type="str">0x8078C5D3</ssrc> - </codecCustomPopup> - <codecCustomPropDlg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPropDlg"/> - <codecSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecSettings"> - <codecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_codecs" itemtype="ixConfig"> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711u"> - <dPayloadIn type="int">0</dPayloadIn> - <dPayloadOut type="int">0</dPayloadOut> - <frameSize type="int">160</frameSize> - </item> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711a"> - <dPayloadIn type="int">8</dPayloadIn> - <dPayloadOut type="int">8</dPayloadOut> - <frameSize type="int">160</frameSize> - </item> - </codecs> - <codecs_number type="int">2</codecs_number> - <_gbVideoCodecs type="bool">False</_gbVideoCodecs> - <videoPayloadType type="int">96</videoPayloadType> - <_gbDataCodecs type="bool">False</_gbDataCodecs> - <dataCodecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_dataCodecs" itemtype="ixConfig"> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Events"> - <dPayloadType type="int">100</dPayloadType> - </item> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Tones"> - <dPayloadType type="int">101</dPayloadType> - </item> - </dataCodecs> - <crtCustomCodecIndex type="int">-1</crtCustomCodecIndex> - </codecSettings> - <rtpSettings ver="[7, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPSettings"> - <rtpPort type="str">[10000-65535,4]</rtpPort> - <enableAdvStatCalc type="bool">False</enableAdvStatCalc> - <enableRTCP type="bool">False</enableRTCP> - <enableRTCPMux type="bool">False</enableRTCPMux> - <chEnableHwAcc type="bool">False</chEnableHwAcc> - <chDisableHwAcc type="bool">False</chDisableHwAcc> - <enableHwAcc type="bool">False</enableHwAcc> - <enableIxStack type="bool">False</enableIxStack> - <enableNBExec type="bool">False</enableNBExec> - <enablePerStream type="bool">False</enablePerStream> - <enableMDI type="bool">False</enableMDI> - <enableRTP type="bool">False</enableRTP> - <enableMediaSDPParams type="bool">False</enableMediaSDPParams> - <audioB_option type="bool">False</audioB_option> - <audioB_value type="str">AS:48</audioB_value> - <audioRR_option type="bool">False</audioRR_option> - <audioRR_value type="str">800</audioRR_value> - <audioRS_option type="bool">False</audioRS_option> - <audioRS_value type="str">800</audioRS_value> - <videoB_option type="bool">False</videoB_option> - <videoB_value type="str">AS:384</videoB_value> - <videoRR_option type="bool">False</videoRR_option> - <videoRR_value type="str">6400</videoRR_value> - <videoRS_option type="bool">False</videoRS_option> - <videoRS_value type="str">6400</videoRS_value> - <textB_option type="bool">False</textB_option> - <textB_value type="str">AS:48</textB_value> - <textRR_option type="bool">False</textRR_option> - <textRR_value type="str">800</textRR_value> - <textRS_option type="bool">False</textRS_option> - <textRS_value type="str">800</textRS_value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">videoRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbVideoSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">jitMs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbAudioSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ixnamSupported</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dedicatedCoreRange</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelTypeQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMediaSDPParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTextSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">activityIdQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitComp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dedicatedCoreRangeLength</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">portIPsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">chEnableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelsQoVPerZionPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCPMux</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">silenceMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbMediaSDPParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">valueQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">maxMosStreams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMDI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableIxStack</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">unitsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serviceEnabledQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">chDisableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosGroupBox</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePerStream</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">limitMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">customTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mosInterval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAdvStatCalc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSilence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">metricsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">jitCMaxDrop</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTosRtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">activityNameQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableNBExec</item> - <item ref="1"/> - </item> - </_dict> - </state> - </rtpSettings> - <rtcpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTCPSettings"> - <rtcpIgnoreSSRC type="bool">False</rtcpIgnoreSSRC> - <rtcpCNAMEType type="int">0</rtcpCNAMEType> - <hasSDESName type="bool">False</hasSDESName> - <hasSDESTool type="bool">False</hasSDESTool> - <rtcpSDESTool type="str">IxLoad</rtcpSDESTool> - <rtcpReceiverTimer type="int">2000</rtcpReceiverTimer> - <rtcpSenderTimer type="int">2000</rtcpSenderTimer> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">rtcpSDESTool</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">rtcpSenderTimer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpCNAMEType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">hasSDESTool</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpReceiverTimer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpIgnoreSSRC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">hasSDESName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCPMux2</item> - <item ref="1"/> - </item> - </_dict> - </state> - </rtcpSettings> - <audioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AudioSettings"> - <enableAudio type="bool">False</enableAudio> - <_gbEnableAudio type="bool">False</_gbEnableAudio> - <enableAudioOWD type="bool">False</enableAudioOWD> - <useJitter type="bool">False</useJitter> - <_JB1 type="bool">False</_JB1> - <jitMs type="int">20</jitMs> - <useJitComp type="bool">False</useJitComp> - <jitCMs type="int">1000</jitCMs> - <jitCMaxDrop type="int">7</jitCMaxDrop> - <dodName type="str">rtp_esmad-asordo-l_2170</dodName> - <useMos type="bool">False</useMos> - <useSilence type="bool">False</useSilence> - <silenceMode type="int">1</silenceMode> - <enableTosRtp type="bool">False</enableTosRtp> - <rtpTos type="int">1</rtpTos> - <customTosGroupBox type="bool">False</customTosGroupBox> - <customTos type="str">0x20</customTos> - <rtpTosVal type="int">32</rtpTosVal> - <_COV1 type="bool">False</_COV1> - <useQoV type="bool">False</useQoV> - <qovAnalize type="int">5</qovAnalize> - <qovSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_QoVSettings"> - <activityIdQoV type="int">0</activityIdQoV> - <enableQoV type="bool">False</enableQoV> - <_gbEnableQoV type="bool">False</_gbEnableQoV> - <serviceEnabledQoV type="bool">False</serviceEnabledQoV> - <activityNameQoV type="str"></activityNameQoV> - <portIPsQoV type="str"></portIPsQoV> - <unitsQoV type="int">0</unitsQoV> - <valueQoV type="int">100</valueQoV> - <channelTypeQoV type="int">0</channelTypeQoV> - <metricsQoV type="int">0</metricsQoV> - <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort> - <radioBtnQoVASR type="int">0</radioBtnQoVASR> - <languageASR type="str">English(US)</languageASR> - </qovSettings> - <activityIdQoV type="int">0</activityIdQoV> - <enableQoV type="bool">False</enableQoV> - <_gbEnableQoV type="bool">False</_gbEnableQoV> - <serviceEnabledQoV type="bool">False</serviceEnabledQoV> - <activityNameQoV type="str"></activityNameQoV> - <portIPsQoV type="str"></portIPsQoV> - <unitsQoV type="int">0</unitsQoV> - <valueQoV type="int">100</valueQoV> - <channelTypeQoV type="int">0</channelTypeQoV> - <metricsQoV type="int">0</metricsQoV> - <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort> - <radioBtnQoVASR type="int">0</radioBtnQoVASR> - <languageASR type="str">English(US)</languageASR> - <audioClip type="str">US_042.wav</audioClip> - <_audioFormat type="str">Format: PCM, Duration: 32785 ms, Size: 524556 bytes</_audioFormat> - <outputLevel type="int">-20</outputLevel> - <_gbOutputLevel type="bool">False</_gbOutputLevel> - <playTypeAudio type="int">0</playTypeAudio> - <audioDuration type="int">10</audioDuration> - <audioDurationUnit type="int">1</audioDurationUnit> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbEnableQoV</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">channelTypeQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">pesqPolqa</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePTT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableP56</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">qovAnalize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelsQoVPerZionPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_COV1</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">useTelchemy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">activityIdQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitComp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_JB1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTosRtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portIPsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbQoVMetrics</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dodName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitMs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbASRLanguage</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">rtpTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">radioBtnQoVASR</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">silenceMode</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">playTypeAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useQoV</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">activityNameQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">valueQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbOutputLevel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">unitsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serviceEnabledQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">languageASR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosGroupBox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">audioDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">qovSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSilence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">metricsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMaxDrop</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">channelsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAudioOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_audioFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableAudio</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">outputLevel</item> - <item ref="1"/> - </item> - </_dict> - </state> - </audioSettings> - <editTos ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditTos"> - <bits012 type="int">0</bits012> - <minDelay type="bool">False</minDelay> - <maxThroughput type="bool">False</maxThroughput> - <maxReliability type="bool">False</maxReliability> - <_gbBtnTosBit7_0 type="bool">False</_gbBtnTosBit7_0> - <_gbBtnTosBit7_1 type="bool">False</_gbBtnTosBit7_1> - <_gbBtnTosBit6_0 type="bool">False</_gbBtnTosBit6_0> - <_gbBtnTosBit6_1 type="bool">False</_gbBtnTosBit6_1> - <_gbBtnTosBit5_0 type="bool">False</_gbBtnTosBit5_0> - <_gbBtnTosBit5_1 type="bool">False</_gbBtnTosBit5_1> - <_gbBtnTosBit4_0 type="bool">False</_gbBtnTosBit4_0> - <_gbBtnTosBit4_1 type="bool">False</_gbBtnTosBit4_1> - <_gbBtnTosBit3_0 type="bool">False</_gbBtnTosBit3_0> - <_gbBtnTosBit3_1 type="bool">False</_gbBtnTosBit3_1> - <_gbBtnTosBit2_0 type="bool">False</_gbBtnTosBit2_0> - <_gbBtnTosBit2_1 type="bool">False</_gbBtnTosBit2_1> - <_gbDisabledBtns type="bool">False</_gbDisabledBtns> - </editTos> - <srtpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SRTPSettings"> - <bEnableSRTP type="bool">False</bEnableSRTP> - <bEnableVideoSRTP type="bool">False</bEnableVideoSRTP> - <bEnableTextSRTP type="bool">False</bEnableTextSRTP> - <bDisableSRTCPEncryption type="bool">False</bDisableSRTCPEncryption> - <bDisableSRTPEncryption type="bool">False</bDisableSRTPEncryption> - <bDisableSRTPAuthentication type="bool">False</bDisableSRTPAuthentication> - <bDisableValidations type="bool">False</bDisableValidations> - <bAllowOnlySecureStreams type="bool">False</bAllowOnlySecureStreams> - <bIncludeMKI type="bool">False</bIncludeMKI> - <bEnablePreencryption type="bool">False</bEnablePreencryption> - <bDisableMasterSalt type="bool">False</bDisableMasterSalt> - <bStaticMasterKeySalt type="bool">False</bStaticMasterKeySalt> - <_masterKeySelection type="int">0</_masterKeySelection> - <staticSingleKeySalt type="str"></staticSingleKeySalt> - <staticKeyFile type="str"></staticKeyFile> - <_enableSRTP type="bool">False</_enableSRTP> - <_useStaticKey type="bool">False</_useStaticKey> - <_singleMasterKeyGrp type="bool">False</_singleMasterKeyGrp> - <_multipleMasterKeysGrp type="bool">False</_multipleMasterKeysGrp> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">bEnableSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_singleMasterKeyGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTPEncryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTPAuthentication</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableValidations</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useStaticKey</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">bEnablePreencryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">staticSingleKeySalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bStaticMasterKeySalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">staticKeyFile</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableMasterSalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_multipleMasterKeysGrp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">bAllowOnlySecureStreams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTCPEncryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableVideoSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bIncludeMKI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableTextSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_masterKeySelection</item> - <item ref="1"/> - </item> - </_dict> - </state> - </srtpSettings> - <videoClips ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoClips"> - <videoClipsInfo ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VideoClips_videoClipsInfo" itemtype="ixConfig"/> - <videoClipsInfoLength type="int">0</videoClipsInfoLength> - <H323MaxProfile type="int">0</H323MaxProfile> - <H323MaxLevel type="int">0</H323MaxLevel> - <H323MaxBitRate type="int">0</H323MaxBitRate> - <H323Packetization type="int">0</H323Packetization> - <MaxProfileIdc type="int">66</MaxProfileIdc> - <MaxProfileIop type="int">0</MaxProfileIop> - <MaxLevel type="int">1</MaxLevel> - </videoClips> - <advancedVideo ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedVideoSettings"> - <enableCustomMaxMBPS type="bool">False</enableCustomMaxMBPS> - <customMaxMBPS type="int">0</customMaxMBPS> - <enableCustomMaxFS type="bool">False</enableCustomMaxFS> - <customMaxFS type="int">0</customMaxFS> - <enableCustomMaxDPB type="bool">False</enableCustomMaxDPB> - <customMaxDPB type="int">0</customMaxDPB> - <enableCustomMaxBRandCPB type="bool">False</enableCustomMaxBRandCPB> - <customMaxBRandCPB type="int">0</customMaxBRandCPB> - <enableMaxStaticMBPS type="bool">False</enableMaxStaticMBPS> - <maxStaticMBPS type="int">0</maxStaticMBPS> - <enableMaxRcmdNalUnitSize type="bool">False</enableMaxRcmdNalUnitSize> - <maxRcmdNalUnitSize type="int">0</maxRcmdNalUnitSize> - <enableMaxNalUnitSize type="bool">False</enableMaxNalUnitSize> - <maxNalUnitSize type="int">0</maxNalUnitSize> - </advancedVideo> - <videoSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoSettings"> - <enableVideo type="bool">False</enableVideo> - <enableVideoOWD type="bool">False</enableVideoOWD> - <videoMaxSessions type="int">1</videoMaxSessions> - <_gbEnableVideo type="bool">False</_gbEnableVideo> - <videoClip type="str">Fire_avc.mp4</videoClip> - <_videoFormat type="str">Codec: H264, Duration: 12800 ms, Size: 2012176 bytes, Bitrate: 1225 kbps</_videoFormat> - <playTypeVideo type="int">0</playTypeVideo> - <videoDuration type="int">5</videoDuration> - <videoDurationUnit type="int">1</videoDurationUnit> - <useConference type="bool">False</useConference> - <_gbUseConference type="bool">False</_gbUseConference> - <rotationScheme type="int">0</rotationScheme> - <confVideoDuration type="int">1</confVideoDuration> - <confVideoDurationUnit type="int">1</confVideoDurationUnit> - <confDuration type="int">1</confDuration> - <confDurationUnit type="int">1</confDurationUnit> - <btnTelepresence type="bool">False</btnTelepresence> - <_gbUseTelepresence type="bool">False</_gbUseTelepresence> - <tipSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings"> - <tipEndpointType type="int">1</tipEndpointType> - <tipResolution type="int">1</tipResolution> - <tipVersion type="int">1</tipVersion> - <tipSyntheticPayload type="bool">False</tipSyntheticPayload> - <tipMoreClips type="bool">False</tipMoreClips> - <_gbTipMoreClips type="int">0</_gbTipMoreClips> - <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2> - <tipRotationScheme type="int">0</tipRotationScheme> - <tipConfDuration type="int">1</tipConfDuration> - <tipConfDurationUnit type="int">1</tipConfDurationUnit> - <tipAudioDuration type="int">1</tipAudioDuration> - <tipAudioDurationUnit type="int">1</tipAudioDurationUnit> - <_gbTipPresentation type="bool">False</_gbTipPresentation> - <tipUsePresentationStream type="bool">False</tipUsePresentationStream> - <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip> - <tipAudioClip type="str">US_042.wav</tipAudioClip> - <tipStartAfter type="int">1</tipStartAfter> - <tipStartAfterUnit type="int">1</tipStartAfterUnit> - <tipDuration type="int">1</tipDuration> - <tipDurationUnit type="int">1</tipDurationUnit> - <tipPresentationRotation type="int">0</tipPresentationRotation> - <tipLegacyMode type="bool">False</tipLegacyMode> - <_gbTipLegacy type="int">0</_gbTipLegacy> - <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip> - <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio> - <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio> - <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio> - <tipG722Legacy type="bool">False</tipG722Legacy> - <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric> - <tipDinamicChannels type="bool">False</tipDinamicChannels> - <tipVideoRefresh type="bool">False</tipVideoRefresh> - <tipInbandSets type="bool">False</tipInbandSets> - <tipArithmetingCoding type="bool">False</tipArithmetingCoding> - <tipLTRP type="bool">False</tipLTRP> - <tipGDR type="bool">False</tipGDR> - <tipHighProfile type="bool">False</tipHighProfile> - <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia> - <tipRtcpFeedback type="bool">True</tipRtcpFeedback> - </tipSettings> - <_gbTosVideo type="bool">False</_gbTosVideo> - <enableTosVideo type="bool">False</enableTosVideo> - <tosVideo type="int">1</tosVideo> - <customTosVideo type="str">0x20</customTosVideo> - <_gbCustomTosVideo type="bool">False</_gbCustomTosVideo> - <tosValVideo type="int">32</tosValVideo> - <useMosVideo type="bool">False</useMosVideo> - <enableAcceptSSRCChanges type="bool">False</enableAcceptSSRCChanges> - <ignoreHintTrack type="bool">False</ignoreHintTrack> - <hintTrackType type="int">1</hintTrackType> - <enablePACSI type="bool">True</enablePACSI> - <useSingleNALUnit type="bool">False</useSingleNALUnit> - <_gbH323AdvancedSettings type="bool">False</_gbH323AdvancedSettings> - <useH323AdvancedSettings type="bool">False</useH323AdvancedSettings> - <_gbUseH323AdvancedSettings type="bool">False</_gbUseH323AdvancedSettings> - <rtpmap type="str"></rtpmap> - <fmtp type="str"></fmtp> - <isMP4 type="bool">False</isMP4> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">hintTrackType</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">videoMaxSessions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSingleNALUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useConference</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">playTypeVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbUseH323AdvancedSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">isMP4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosValVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePACSI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_videoFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbUseTelepresence</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableVideoOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fmtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbUseConference</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbH323AdvancedSettings</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">_gbTosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTosVideo</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">ignoreHintTrack</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAcceptSSRCChanges</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useH323AdvancedSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpmap</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">btnTelepresence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useMosVideo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoSettings> - <videoConfSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoConfSettings"> - <rotationScheme type="int">0</rotationScheme> - <_gbRotationScheme type="int">0</_gbRotationScheme> - <confVideoDuration type="int">0</confVideoDuration> - <confVideoDurationUnit type="int">0</confVideoDurationUnit> - <confDuration type="int">0</confDuration> - <confDurationUnit type="int">0</confDurationUnit> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">rotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbRotationScheme</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">confVideoDuration</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoConfSettings> - <videoTelepresenceSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings"> - <tipEndpointType type="int">0</tipEndpointType> - <tipResolution type="int">0</tipResolution> - <tipVersion type="int">0</tipVersion> - <tipSyntheticPayload type="bool">False</tipSyntheticPayload> - <tipMoreClips type="bool">False</tipMoreClips> - <_gbTipMoreClips type="int">0</_gbTipMoreClips> - <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2> - <tipRotationScheme type="int">0</tipRotationScheme> - <tipConfDuration type="int">0</tipConfDuration> - <tipConfDurationUnit type="int">0</tipConfDurationUnit> - <tipAudioDuration type="int">0</tipAudioDuration> - <tipAudioDurationUnit type="int">0</tipAudioDurationUnit> - <_gbTipPresentation type="bool">False</_gbTipPresentation> - <tipUsePresentationStream type="bool">False</tipUsePresentationStream> - <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip> - <tipAudioClip type="str">US_042.wav</tipAudioClip> - <tipStartAfter type="int">0</tipStartAfter> - <tipStartAfterUnit type="int">0</tipStartAfterUnit> - <tipDuration type="int">0</tipDuration> - <tipDurationUnit type="int">0</tipDurationUnit> - <tipPresentationRotation type="int">0</tipPresentationRotation> - <tipLegacyMode type="bool">False</tipLegacyMode> - <_gbTipLegacy type="int">0</_gbTipLegacy> - <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip> - <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio> - <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio> - <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio> - <tipG722Legacy type="bool">False</tipG722Legacy> - <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric> - <tipDinamicChannels type="bool">False</tipDinamicChannels> - <tipVideoRefresh type="bool">False</tipVideoRefresh> - <tipInbandSets type="bool">False</tipInbandSets> - <tipArithmetingCoding type="bool">False</tipArithmetingCoding> - <tipLTRP type="bool">False</tipLTRP> - <tipGDR type="bool">False</tipGDR> - <tipHighProfile type="bool">False</tipHighProfile> - <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia> - <tipRtcpFeedback type="bool">True</tipRtcpFeedback> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tipDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipRotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipLegacyClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoRefresh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipUsePresentationStream</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipGDR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipStartAfterUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipArithmetingCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipLegacyAudio</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipConfDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipConfDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipG722Legacy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyClipAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipMoreClips</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipInbandSets</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipSyntheticPayload</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipVideoClip2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipResolution</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipVideoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipLegacyClipAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyModeAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipPresentation</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipHighProfile</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipRtcpFeedback</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoClip2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipMoreClips</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDinamicChannels</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipEndpointType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipLegacy</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipLTRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipStartAfter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipAudioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipPresentationRotation</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioActivityMetric</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipUnrestrictedMedia</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoTelepresenceSettings> - <textSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TextSettings"> - <enableText type="bool">False</enableText> - <enableTextOWD type="bool">False</enableTextOWD> - <_gbEnableText type="bool">False</_gbEnableText> - <textClip type="str">The quick brown fox jumps over the lazy dog</textClip> - <textFormat type="str">Format: t140, Max duration: 42300 ms</textFormat> - <textChpsMin type="float">1.0</textChpsMin> - <textChpsMax type="float">1.0</textChpsMax> - <textBufferTime type="int">300</textBufferTime> - <textRedundancyLevel type="int">0</textRedundancyLevel> - <textPlayType type="int">0</textPlayType> - <textDuration type="int">5</textDuration> - <textDurationUnit type="int">1</textDurationUnit> - <_gbTosText type="bool">False</_gbTosText> - <enableTosText type="bool">False</enableTosText> - <tosText type="int">1</tosText> - <customTosText type="str">0x20</customTosText> - <_gbCustomTosText type="bool">False</_gbCustomTosText> - <tosValText type="int">32</tosValText> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tosValText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textChpsMin</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRedundancyLevel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textChpsMax</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textBufferTime</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTextOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTosText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textPlayType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTosText</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">enableTosText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tosText</item> - <item ref="3"/> - </item> - </_dict> - </state> - </textSettings> - <t38Settings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T38Settings"> - <enableT38 type="bool">False</enableT38> - <_gbEnableT38 type="bool">False</_gbEnableT38> - <_gbEnableT38_2 type="bool">False</_gbEnableT38_2> - <faxImage type="str">Ixia2Pages.tif</faxImage> - <_faxFormat type="str">Format: TIFF, Img size: 1660 x 2291, Size: 140402 bytes</_faxFormat> - <t38TransportType type="int">1</t38TransportType> - <t38Port type="str">40000</t38Port> - <t38UdpEncapsulation type="int">0</t38UdpEncapsulation> - <_gbT38UdpEncapsulation type="bool">False</_gbT38UdpEncapsulation> - <t38PayloadType type="int">102</t38PayloadType> - <useFaxVersion type="bool">True</useFaxVersion> - <faxVersion type="int">0</faxVersion> - <useT38MaxBitrate type="bool">True</useT38MaxBitrate> - <t38MaxBitrate type="int">5</t38MaxBitrate> - <useT38RateMgmt type="bool">True</useT38RateMgmt> - <t38RateMgmt type="int">0</t38RateMgmt> - <useT38FillBitRemoval type="bool">False</useT38FillBitRemoval> - <t38FillBitRemoval type="int">0</t38FillBitRemoval> - <t38TranscodingMMR type="bool">False</t38TranscodingMMR> - <t38TranscodingJBIG type="bool">False</t38TranscodingJBIG> - <_gbUdpOptions type="bool">False</_gbUdpOptions> - <useErrorRecoverySchema type="bool">True</useErrorRecoverySchema> - <errorRecoverySchema type="int">0</errorRecoverySchema> - <useT38MaxDatagramSize type="bool">True</useT38MaxDatagramSize> - <t38MaxDatagramSize type="int">256</t38MaxDatagramSize> - <useT38MaxBufferSize type="bool">False</useT38MaxBufferSize> - <t38MaxBufferSize type="int">200</t38MaxBufferSize> - <imagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_T38Settings_imagesList" itemtype="ixConfig"/> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">t38TranscodingMMR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38UdpEncapsulation</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxBitrate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38RateMgmt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38TranscodingJBIG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableT38</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38TransportType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableT38_2</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableT38</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">t38Port</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38FillBitRemoval</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">faxVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38FillBitRemoval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38RateMgmt</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">faxImage</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxBufferSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">errorRecoverySchema</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxDatagramSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxBufferSize</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_faxFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38PayloadType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxDatagramSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxBitrate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useFaxVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbUdpOptions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbT38UdpEncapsulation</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">imagesList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useErrorRecoverySchema</item> - <item ref="1"/> - </item> - </_dict> - </state> - </t38Settings> - <t30Parameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T30Parameters"> - <t30StationId type="str">5551[000-]</t30StationId> - <t30SendCoding type="int">0</t30SendCoding> - <t30SendDataRate type="int">5</t30SendDataRate> - <t30SendPageSize type="int">0</t30SendPageSize> - <t30SendMSLT type="int">0</t30SendMSLT> - <t30SendProtocol type="int">1</t30SendProtocol> - <t30SendResolution type="int">0</t30SendResolution> - <sendCNG type="int">1</sendCNG> - <t30ReceiveCoding type="int">2</t30ReceiveCoding> - <t30ReceivePageSize type="int">2</t30ReceivePageSize> - <t30ReceiveMSLT type="int">0</t30ReceiveMSLT> - <t30ReceiveProtocol type="int">1</t30ReceiveProtocol> - <t30ReceiveR8x3 type="bool">True</t30ReceiveR8x3> - <t30ReceiveR8x7 type="bool">True</t30ReceiveR8x7> - <t30ReceiveR8x15 type="bool">True</t30ReceiveR8x15> - <t30Receive200x200 type="bool">True</t30Receive200x200> - <t30ReceiveModulations type="int">3</t30ReceiveModulations> - <sendCedBeforeDIS type="int">1</sendCedBeforeDIS> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">t30SendResolution</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sendCedBeforeDIS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x7</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendPageSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x3</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">t30SendCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveProtocol</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">sendCNG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendProtocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveMSLT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendMSLT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendDataRate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceivePageSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveModulations</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x15</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30StationId</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30Receive200x200</item> - <item ref="1"/> - </item> - </_dict> - </state> - </t30Parameters> - <msrpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPSettings"> - <enableMSRP type="bool">False</enableMSRP> - <_gbEnableMSRP type="bool">False</_gbEnableMSRP> - <msrpPort type="str">2855</msrpPort> - <domainType type="int">0</domainType> - <localDomain type="str">alice[00-99].example.com</localDomain> - <relays ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_relays" itemtype="ixConfig"/> - <relaysCount type="int">0</relaysCount> - <firstRelayIpEnabled type="bool">False</firstRelayIpEnabled> - <firstRelayIp type="str">10.10.10.1</firstRelayIp> - <firstRelayIsIPv4 type="bool">True</firstRelayIsIPv4> - <msrpRelayPort type="int">2855</msrpRelayPort> - <enableMSRPTos type="bool">False</enableMSRPTos> - <msrpTos type="int">0</msrpTos> - <customMSRPTos type="str">0x00</customMSRPTos> - <tosMSRPVal type="int">0</tosMSRPVal> - <automaticMSRPAuth type="bool">True</automaticMSRPAuth> - <msrpReuseTCP type="bool">True</msrpReuseTCP> - <msrpSendEmptyMsg type="bool">False</msrpSendEmptyMsg> - <msrpTransactionTimeout type="int">30000</msrpTransactionTimeout> - <msrpFirstChunkTimeout type="int">60000</msrpFirstChunkTimeout> - <msrpInterChunkTimeout type="int">30000</msrpInterChunkTimeout> - <msrpSessionTimeout type="int">70000</msrpSessionTimeout> - <msrpGuiFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_msrpGuiFiles" itemtype="ixConfig"/> - <files ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_files" itemtype="ixConfig"/> - <filesCount type="int">0</filesCount> - <advSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings"> - <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye> - </advSettings> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">customMSRPTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">filesCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIpEnabled</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">automaticMSRPAuth</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpSendEmptyMsg</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpTransactionTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpInterChunkTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosMSRPVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMSRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">localDomain</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">relaysCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">domainType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">advSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">files</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpFirstChunkTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIsIPv4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbMSRPCustomTos</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">msrpSessionTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableMSRP</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableMSRPTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpReuseTCP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpGuiFiles</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">relays</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpRelayPort</item> - <item ref="3"/> - </item> - </_dict> - </state> - </msrpSettings> - <_tempFile ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_FileRecord"> - <synthetic type="int">0</synthetic> - <_typeStr type="str"></_typeStr> - <name type="str"></name> - <nameSynthetic type="str"></nameSynthetic> - <fileClientPath type="str"></fileClientPath> - <filePcpuPath type="str"></filePcpuPath> - <_bFileSize type="int">20</_bFileSize> - <_msrpSizeCombo type="int">2</_msrpSizeCombo> - <size type="int">0</size> - <btnMSRPFileBrowse type="int">0</btnMSRPFileBrowse> - <type type="str">application/octet-stream</type> - <fileHash type="str"></fileHash> - </_tempFile> - <_tempAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings"> - <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye> - </_tempAdvSettings> - <phoneBookInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBookInputLabel"> - <label type="str">5</label> - </phoneBookInputLabel> - <akaConfigurationInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfigurationInputLabel"> - <configurationLabel type="str"></configurationLabel> - </akaConfigurationInputLabel> - <phoneBook ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBook"> - <fromFile type="int">0</fromFile> - <pattern type="str">201004[0000-]</pattern> - <filePath type="str"></filePath> - <_PN1 type="bool">False</_PN1> - <_bTelGrp type="bool">False</_bTelGrp> - <ckTelURIBook type="bool">False</ckTelURIBook> - <_bkTelURIparams type="str">phone-context=example.com</_bkTelURIparams> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">phoneBookList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">filePath</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">pattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ckTelURIBook</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_bkTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_PN1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_bTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fromFile</item> - <item ref="1"/> - </item> - </_dict> - </state> - </phoneBook> - <akaConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfiguration"/> - <milenageConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MilenageConfiguration"/> - <msgBox ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MsgBox"> - <msg1 type="str"></msg1> - <msg2 type="str"></msg2> - </msgBox> - <editCloudRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditCloudRule"> - <_gbStep1 type="bool">False</_gbStep1> - <requestList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_requestList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ANY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INVITE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">BYE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CANCEL</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">OPTIONS</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REGISTER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">NOTIFY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">SUBSCRIBE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REFER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">MESSAGE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">PRACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INFO</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">UPDATE</str> - </item> - </requestList> - <reqList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_reqList" itemtype="ixConfig"/> - <_gbStep2 type="bool">False</_gbStep2> - <what type="int">2</what> - <reqLine type="int">1</reqLine> - <headerTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_headerTypeList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">From</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Contact</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Also</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Call-ID</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Length</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Type</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Event</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authenticate</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RAck</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Record-Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Refer-To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Referred-By</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Replaces</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Subscription-State</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Via</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">WWW-Authenticate</str> - </item> - </headerTypeList> - <headerType type="str">To</headerType> - <compactForm type="str">t</compactForm> - <occurFrom type="str">1</occurFrom> - <occurTo type="str">1</occurTo> - <whatExtract type="int">3</whatExtract> - <extractHeaderName type="bool">False</extractHeaderName> - <paramName type="str"></paramName> - <revHeaderOrder type="bool">False</revHeaderOrder> - <keepHeaderCrlf type="bool">False</keepHeaderCrlf> - <_gbStep3 type="bool">False</_gbStep3> - <usePosition type="int">0</usePosition> - <beginAfter type="bool">False</beginAfter> - <afterStr type="str"><</afterStr> - <afterOccur type="str">1</afterOccur> - <endBefore type="bool">False</endBefore> - <endStr type="str">></endStr> - <endOccur type="str">last</endOccur> - <positionFrom type="str">1</positionFrom> - <positionTo type="str">last</positionTo> - <_gbStep4 type="bool">False</_gbStep4> - <formulaSource type="int">0</formulaSource> - <formula type="str"></formula> - <phoneBookPath type="str"></phoneBookPath> - <phoneBookDodPath type="str"></phoneBookDodPath> - <btnPBBrowse type="int">0</btnPBBrowse> - </editCloudRule> - <cloudRules ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudRules"> - <rulesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CloudRules_rulesList" itemtype="ixConfig"/> - <cloudPhoneBooksAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</cloudPhoneBooksAbsolutePath> - </cloudRules> - <cloudServers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_cloudServers" itemtype="ixConfig"/> - <transferAddress ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TransferAddress"> - <symTransferStr type="str">None</symTransferStr> - <overridePhoneNo type="bool">False</overridePhoneNo> - <_useTPb type="int">0</_useTPb> - <_tBp type="str"><None></_tBp> - <_tBpPrv type="str"></_tBpPrv> - <_tPhone type="str">150[00000000-]</_tPhone> - <tPhoneType type="int">0</tPhoneType> - <tPhone type="str">150[00000000-]</tPhone> - <_tTelGrp type="bool">False</_tTelGrp> - <_ckTTelURIParams type="bool">False</_ckTTelURIParams> - <_tTelURIparams type="str">phone-context=example.com</_tTelURIparams> - <transTelPar type="str"></transTelPar> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_tBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overridePhoneNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useTPb</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">transTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckTTelURIParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">symTransferStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_tBp</item> - <item ref="3"/> - </item> - </_dict> - </state> - </transferAddress> - <editContact ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditContact"> - <useDomainName type="int">0</useDomainName> - <domainName type="str">mysipdomain.ixiacom.com</domainName> - <_useEPb type="int">0</_useEPb> - <_eBp type="str"><None></_eBp> - <_eBpPrv type="str"></_eBpPrv> - <_ePhone type="str">160[00000000-]</_ePhone> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <_eTelGrp type="bool">False</_eTelGrp> - <_ckETelURI type="bool">False</_ckETelURI> - <_eTelURIparams type="str">phone-context=example.com</_eTelURIparams> - <editTelPar type="str"></editTelPar> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_useEPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">domainName</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_eBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useDomainName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">editTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckETelURI</item> - <item ref="1"/> - </item> - </_dict> - </state> - </editContact> - <dialPlan ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DialPlan"> - <sourceIPs type="str"></sourceIPs> - <_useSPb type="int">0</_useSPb> - <_sBp type="str"><None></_sBp> - <_sBpPrv type="str"></_sBpPrv> - <_sPhone type="str">{{pncalled}}</_sPhone> - <srcPhoneType type="int">0</srcPhoneType> - <srcPhone type="str">{{pncalled}}</srcPhone> - <_sTelGrp type="bool">False</_sTelGrp> - <_ckSTelURIParams type="bool">False</_ckSTelURIParams> - <_sTelURIparams type="str">phone-context=example.com</_sTelURIparams> - <srcTelPar type="str"></srcTelPar> - <_sTelGrp1 type="bool">False</_sTelGrp1> - <_dTelGrp1 type="bool">False</_dTelGrp1> - <symDestStr type="str">None</symDestStr> - <ovrDestPhone type="bool">False</ovrDestPhone> - <_useDPb type="int">0</_useDPb> - <_dBp type="str"><None></_dBp> - <_dBpPrv type="str"></_dBpPrv> - <_dPhone type="str">170[00000000-]</_dPhone> - <destPhoneType type="int">0</destPhoneType> - <destPhone type="str">170[00000000-]</destPhone> - <_dTelGrp type="bool">False</_dTelGrp> - <_ckDTelURIParams type="bool">False</_ckDTelURIParams> - <_dTelURIparams type="str">phone-context=example.com</_dTelURIparams> - <destTelPar type="str"></destTelPar> - <enableEmergencyCalls type="bool">False</enableEmergencyCalls> - <useAnonymous type="bool">False</useAnonymous> - <makeEmergencyReg type="bool">False</makeEmergencyReg> - <emergencyService type="str">sos</emergencyService> - <emergencyServiceList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_DialPlan_emergencyServiceList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.ambulance</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.fire</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.police</str> - </item> - </emergencyServiceList> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_useSPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelGrp1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sourceIPs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableEmergencyCalls</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useAnonymous</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">symDestStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergencyDest</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_sBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">makeEmergencyReg</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergencySource</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ckSTelURIParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_dBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ovrDestPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelGrp1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">emergencyServiceList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergency</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_UseSrv1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">emergencyService</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useDPb</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ckDTelURIParams</item> - <item ref="1"/> - </item> - </_dict> - </state> - </dialPlan> - <signalingSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SignalingSettings"> - <enableSIP type="bool">True</enableSIP> - <port type="str">{{sipportcalled}}</port> - <tcpWriteImmediate type="bool">False</tcpWriteImmediate> - <fqdn type="bool">False</fqdn> - <realm type="str"></realm> - <user type="str">{{pncalled}}@{{domainname}}</user> - <passwd type="str">{{authpassword}}</passwd> - <akaConfCombo type="str"><None></akaConfCombo> - <akaConfComboSelIndex type="int">0</akaConfComboSelIndex> - <akaSharedSecretType type="int">0</akaSharedSecretType> - <akaOperatorVariantType type="int">0</akaOperatorVariantType> - <akaSharedSecretSequence type="str">ixia</akaSharedSecretSequence> - <akaAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</akaAbsolutePath> - <akaOperatorVariantSequence type="str">ixia</akaOperatorVariantSequence> - <akaSharedSecretSource type="int">0</akaSharedSecretSource> - <akaOperatorVariantSource type="int">0</akaOperatorVariantSource> - <akaExportComplete type="int">0</akaExportComplete> - <akaUseOPasOPC type="bool">False</akaUseOPasOPC> - <milenageConfCombo type="str"><Default></milenageConfCombo> - <milenage_c1 type="str">00000000000000000000000000000000</milenage_c1> - <milenage_c2 type="str">00000000000000000000000000000001</milenage_c2> - <milenage_c3 type="str">00000000000000000000000000000002</milenage_c3> - <milenage_c4 type="str">00000000000000000000000000000004</milenage_c4> - <milenage_c5 type="str">00000000000000000000000000000008</milenage_c5> - <milenage_r1 type="int">64</milenage_r1> - <milenage_r2 type="int">0</milenage_r2> - <milenage_r3 type="int">32</milenage_r3> - <milenage_r4 type="int">64</milenage_r4> - <milenage_r5 type="int">96</milenage_r5> - <enableTos type="bool">False</enableTos> - <tos type="int">0</tos> - <customSipTos type="str">0x00</customSipTos> - <tosVal type="int">0</tosVal> - <ovrTrans type="bool">False</ovrTrans> - <ovrTransOption type="int">0</ovrTransOption> - <useServer type="bool">True</useServer> - <srvAddr type="str">{{iplistims}}</srvAddr> - <srvPort type="str">5060</srvPort> - <srvDomain type="str">{{domainname}}</srvDomain> - <outboundProxy type="bool">False</outboundProxy> - <useDnsSrv type="bool">False</useDnsSrv> - <registrarSrv type="bool">True</registrarSrv> - <autoRegister type="bool">True</autoRegister> - <overrideRegistrar type="bool">False</overrideRegistrar> - <overrideRegistrarAddress type="str">IP:PORT</overrideRegistrarAddress> - <ovrContact type="bool">False</ovrContact> - <ovrDest type="bool">True</ovrDest> - <ovrDestHostPort type="str">{{domainname}}</ovrDestHostPort> - <nUdpMaxSize type="int">2048</nUdpMaxSize> - <enableSigComp type="bool">False</enableSigComp> - <telURISource type="bool">False</telURISource> - <telURIDest type="bool">False</telURIDest> - <securityMechanismValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SignalingSettings_securityMechanismValList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SecurityMechanismVal"> - <checked type="bool">False</checked> - <mechanism type="str">ipsec-3gpp</mechanism> - <algorithm type="int">0</algorithm> - <algorithmStr type="str">hmac-sha-1-96</algorithmStr> - <protocol type="int">0</protocol> - <protocolStr type="str">esp</protocolStr> - <mode type="int">0</mode> - <modeStr type="str">trans</modeStr> - <encrypt_algorithm type="int">0</encrypt_algorithm> - <encrypt_algorithmStr type="str">aes-cbc</encrypt_algorithmStr> - <spi_start_idx type="int">255</spi_start_idx> - <port_c type="str">[3000-4000]</port_c> - <port_s type="str">4060</port_s> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">protocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">encrypt_algorithmStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">algorithm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">modeStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">protocolStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mechanism</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">algorithmStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mode</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port_s</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port_c</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">spi_start_idx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">encrypt_algorithm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - </securityMechanismValList> - <useIPSecDoubleSPIPatch type="bool">False</useIPSecDoubleSPIPatch> - <enablePeriodicDNSQueries type="bool">False</enablePeriodicDNSQueries> - <DNSTimeoutValue type="int">60</DNSTimeoutValue> - <skipDeleteDNSRecordsAtLoopEnd type="bool">False</skipDeleteDNSRecordsAtLoopEnd> - <enableVoLTE type="bool">False</enableVoLTE> - <mediaBearerType type="int">0</mediaBearerType> - <enableCCDedicatedBearer type="bool">True</enableCCDedicatedBearer> - <volte_grbox type="bool">False</volte_grbox> - <_enableAutoHeaders type="bool">False</_enableAutoHeaders> - <_btnAutoHeaders type="bool">False</_btnAutoHeaders> - <dontEndMediaOnBye type="bool">False</dontEndMediaOnBye> - <closeTCPConnectionsOnRampdown type="bool">False</closeTCPConnectionsOnRampdown> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbSrvSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_btnAutoHeaders</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpWriteImmediate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableAutoHeaders</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSIP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fqdn</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretSource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenageConfCombo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c5</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaConfCombo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_UseSrv1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideRegistrar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">port</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">registrarSrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r5</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">user</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantSource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">telURISource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useServer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">nUdpMaxSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmit1xx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvDomain</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_btnEditContact1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">telURIDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePeriodicDNSQueries</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useIPSecDoubleSPIPatch</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">securityMechanismValList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">skipDeleteDNSRecordsAtLoopEnd</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideRegistrarAddress</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvAddr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrDestHostPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">DNSTimeoutValue</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">passwd</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoRegister</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSigComp</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantSequence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableVoLTE</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmitACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretSequence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">volte_grbox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">customSipTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dontEndMediaOnBye</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">realm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaExportComplete</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">mediaBearerType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbPeriodicDNSQuery</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaUseOPasOPC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ovrDest1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">outboundProxy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">closeTCPConnectionsOnRampdown</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrContact</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaAbsolutePath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serverAddresses</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableCCDedicatedBearer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaConfComboSelIndex</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTos</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">ovrTrans</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useDnsSrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTransOption</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableSIP2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableSIP1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvPort</item> - <item ref="1"/> - </item> - </_dict> - </state> - </signalingSettings> - <timerSettings ver="[2, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TimerSettings"> - <enableTimers type="bool">True</enableTimers> - <expirationValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_expirationValList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">REGISTER</message> - <msgPart type="int">0</msgPart> - <msgPartStr type="str">Expires Header(s)</msgPartStr> - <value type="int">3600</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">INVITE</message> - <msgPart type="int">2</msgPart> - <msgPartStr type="str">Session-Expire(s)</msgPartStr> - <value type="int">90</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">UPDATE</message> - <msgPart type="int">2</msgPart> - <msgPartStr type="str">Session-Expire(s)</msgPartStr> - <value type="int">90</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - </expirationValList> - <sessionRefreshType type="int">1</sessionRefreshType> - <refreshAfterSecs type="int">3000</refreshAfterSecs> - <refreshAfterPercent type="int">50</refreshAfterPercent> - <refreshInSecs type="int">32</refreshInSecs> - <enableRetransmissions type="bool">False</enableRetransmissions> - <T1 type="int">500</T1> - <T2 type="int">4000</T2> - <ignoreRetransmissions type="bool">True</ignoreRetransmissions> - <retransmitACK type="bool">True</retransmitACK> - <stopActiveRetr type="bool">True</stopActiveRetr> - <retransmit1xx type="bool">False</retransmit1xx> - <ovrTimeout type="bool">False</ovrTimeout> - <minInterReregister type="int">0</minInterReregister> - <autoEndCall2 type="bool">False</autoEndCall2> - <enableAutoPRACK type="bool">False</enableAutoPRACK> - <rprSendNegotiatedSDP type="bool">False</rprSendNegotiatedSDP> - <rprTimeUntilNextRPR type="int">150</rprTimeUntilNextRPR> - <rprScenarioHasPRACK type="bool">False</rprScenarioHasPRACK> - <auto4xx type="bool">False</auto4xx> - <auto4xxAbort type="bool">False</auto4xxAbort> - <autoProcedureList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_autoProcedureList" itemtype="ixConfig"/> - <autoProceduresCount type="int">0</autoProceduresCount> - <procListChanged type="bool">True</procListChanged> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">btnRefreshProcList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoEndCall</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreRetransmissions</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">minInterReregister</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoEndCall2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTimers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshInSecs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">retransmit1xx</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableTimers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sessionRefreshType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">auto4xx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmitACK</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">procListChanged</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoProcedureList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbAutoPRACK</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">T1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshAfterPercent</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAutoPRACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stopActiveRetr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rprTimeUntilNextRPR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rprScenarioHasPRACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">expirationValList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshAfterSecs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">autoProceduresCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">auto4xxAbort</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">rprSendNegotiatedSDP</item> - <item ref="1"/> - </item> - </_dict> - </state> - </timerSettings> - <advancedSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedSettings"> - <useCloud type="bool">False</useCloud> - <_useCloud1 type="bool">False</_useCloud1> - <cloud type="str"><None></cloud> - <serverRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_serverRules" itemtype="ixConfig"/> - <enableVirtualIPs type="bool">False</enableVirtualIPs> - <virtualIPTable ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_virtualIPTable" itemtype="ixConfig"/> - <ovrCloudRules type="bool">False</ovrCloudRules> - <_ovrCloudRules1 type="bool">False</_ovrCloudRules1> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbVirtualIPs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useCloud</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrCloudRules</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ovrCloudRules1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">cloud</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableVirtualIPs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">virtualIPTable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serverRules</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useCloud1</item> - <item ref="3"/> - </item> - </_dict> - </state> - </advancedSettings> - <tlsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsSettings"> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <_enableTLS1 type="bool">False</_enableTLS1> - <_enableTLS2 type="bool">False</_enableTLS2> - <_enableTLS3 type="bool">False</_enableTLS3> - <tlsPort type="str">5061</tlsPort> - <tlsProtocol type="int">3</tlsProtocol> - <tlsSessionRefresh type="bool">False</tlsSessionRefresh> - <_tlsSessionRefresh type="bool">False</_tlsSessionRefresh> - <tlsRefreshInterval type="int">3600</tlsRefreshInterval> - <tlsAuthClient type="int">0</tlsAuthClient> - <tlsReuseConnection type="bool">False</tlsReuseConnection> - <_tlsReuseConnection type="bool">False</_tlsReuseConnection> - <ignoreSubjectAltName type="bool">False</ignoreSubjectAltName> - <tlsMutual type="bool">False</tlsMutual> - <_gbTlsMutual type="bool">False</_gbTlsMutual> - <tlsCyphers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TlsSettings_tlsCyphers" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES128-GCM-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES256-GCM-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-RSA-AES128-GCM-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES256-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-RSA-AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">AES256-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-ECDSA-AES256-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-ECDSA-AES128-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES256-GCM-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES128-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES256-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">DES-CBC3-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-RC2-CBC-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-RC4-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP1024-DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP1024-RC4-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">IDEA-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">NULL-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">NULL-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">RC4-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">RC4-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - </tlsCyphers> - <tlsCertificatesPath type="str">C:\Program Files (x86)\Ixia\IxLoad\8.20-EA\aptixia\data\SSL_Certificates</tlsCertificatesPath> - <tlsPrivateKeyCertificate type="str">Unsecured_RSA_key_1024.pem</tlsPrivateKeyCertificate> - <tlsPublicKeyCertificate type="str">Unsecured_RSA_cert_1024.pem</tlsPublicKeyCertificate> - <tlsKeyType type="int">0</tlsKeyType> - <tlsCertType type="int">0</tlsCertType> - <tlsPassword type="str"></tlsPassword> - <sipScheme type="int">0</sipScheme> - <tlsTransportType type="int">0</tlsTransportType> - <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp> - <tlsEnableTcpKeepAlive type="bool">False</tlsEnableTcpKeepAlive> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tlsCertType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPassword</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreSubjectAltName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPrivateKeyCertificate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsTransportType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTLS_HTTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsCyphers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsProtocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsKeyType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tlsSessionRefresh</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tlsCertificatesPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsEnableTcpKeepAlive</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTlsMutual</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tlsPublicKeyCertificate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableCert</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTLS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsAuthClient</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsMutual</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS4</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS2</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS3</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableDTLS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTLS_MSRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsReuseConnection</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsRefreshInterval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsSessionRefresh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsDisableUdpAndTcp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sipScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tlsReuseConnection</item> - <item ref="3"/> - </item> - </_dict> - </state> - </tlsSettings> - <dtlsOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DtlsOptions"> - <dtlsRetry type="int">200</dtlsRetry> - <dtlsTimeout type="int">30000</dtlsTimeout> - <dtlsSessionTicket type="bool">False</dtlsSessionTicket> - </dtlsOptions> - <iceOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_IceOptions"> - <iceRetryCount type="int">6</iceRetryCount> - <iceInitialRetry type="int">100</iceInitialRetry> - <iceTimeout type="int">30000</iceTimeout> - </iceOptions> - <otherSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_OtherSettings"> - <VOIP_Var0 type="str"></VOIP_Var0> - <VOIP_Var1 type="str"></VOIP_Var1> - <VOIP_Var2 type="str"></VOIP_Var2> - <VOIP_Var3 type="str"></VOIP_Var3> - <VOIP_Var4 type="str"></VOIP_Var4> - <VOIP_IPAddress0 type="str"></VOIP_IPAddress0> - <VOIP_IPAddress1 type="str"></VOIP_IPAddress1> - <VOIP_IPAddress2 type="str"></VOIP_IPAddress2> - <VOIP_IPAddress3 type="str"></VOIP_IPAddress3> - <VOIP_IPAddress4 type="str"></VOIP_IPAddress4> - <ipPreference type="int">0</ipPreference> - <bUseHardcoded type="bool">False</bUseHardcoded> - <_gbHardcodedForDemo type="bool">False</_gbHardcodedForDemo> - <_gbStunSettings type="bool">False</_gbStunSettings> - <bUseStun type="bool">False</bUseStun> - <stunAddr type="str">127.0.0.1</stunAddr> - <stunPort type="str">3478</stunPort> - <bUseIce type="bool">False</bUseIce> - <bIceLite type="bool">False</bIceLite> - <_gbSRVCCSettings type="bool">False</_gbSRVCCSettings> - <bUseSRVCC type="bool">False</bUseSRVCC> - <mobilityPath type="str"></mobilityPath> - <ddgGroupboxSRVCC type="bool">False</ddgGroupboxSRVCC> - <PCO_Groupbox type="bool">False</PCO_Groupbox> - <bUsePCO type="bool">False</bUsePCO> - <_gbPCO type="bool">False</_gbPCO> - <PCO_List type="str"></PCO_List> - <useBHCA type="bool">False</useBHCA> - <loadVariablesFromCsv type="bool">False</loadVariablesFromCsv> - <pathForCsvWithVariables type="str"></pathForCsvWithVariables> - <absolutePathForCsvWithVariables type="str"></absolutePathForCsvWithVariables> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbIceSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbPCO</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress0</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUseIce</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">mobilityPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var0</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbStunSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">PCO_List</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbSRVCCSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">absolutePathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bIceLite</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">PCO_Groupbox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">bUseHardcoded</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">bUseSRVCC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useBHCA</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipPreference</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnBrowseForVariableCsv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUsePCO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stunPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUseStun</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stunAddr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ddgGroupboxSRVCC</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">_gbHardcodedForDemo</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">pathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">DodPathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_varCsvGroupBox</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loadVariablesFromCsv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var4</item> - <item ref="1"/> - </item> - </_dict> - </state> - </otherSettings> - <smsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSSettings"> - <enableSMS type="bool">False</enableSMS> - <requestURI type="str">sc.home1.net</requestURI> - <enableTelURI type="bool">False</enableTelURI> - <telURI type="str">phone-context=example</telURI> - <smscPhoneNo type="str">61814712345</smscPhoneNo> - <smscTypeOfNo type="int">0</smscTypeOfNo> - <smscNumberingPlan type="int">0</smscNumberingPlan> - <enableSMOrigOverrideDest type="bool">False</enableSMOrigOverrideDest> - <btnSMOrigEdit type="bool">False</btnSMOrigEdit> - <enableSMOrigReqStatusReport type="bool">False</enableSMOrigReqStatusReport> - <enableSMOrigReplyPath type="bool">False</enableSMOrigReplyPath> - <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo"> - <phoneType type="bool">False</phoneType> - <phoneValue type="str">160[00000000-]</phoneValue> - <comboPhoneBookEntry type="str"><None></comboPhoneBookEntry> - </smsAddressOriginator> - <smOrigTypeOfNo type="int">0</smOrigTypeOfNo> - <smOrigNumberingPlan type="int">0</smOrigNumberingPlan> - <enableSMRecipOverrideSrc type="bool">False</enableSMRecipOverrideSrc> - <btnSMRecipEdit type="bool">False</btnSMRecipEdit> - <enableSMRecipReqStatusReport type="bool">False</enableSMRecipReqStatusReport> - <enableSMRecipReplyPath type="bool">False</enableSMRecipReplyPath> - <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo"> - <phoneType type="bool">False</phoneType> - <phoneValue type="str">160[00000000-]</phoneValue> - <comboPhoneBookEntry type="str"><None></comboPhoneBookEntry> - </smsAddressRecipient> - <smRecipTypeOfNo type="int">0</smRecipTypeOfNo> - <smRecipNumberingPlan type="int">0</smRecipNumberingPlan> - <depActivities ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_depActivities" itemtype="ixConfig"/> - <useFilesFromActivity type="bool">False</useFilesFromActivity> - <verifyUserInfo type="bool">False</verifyUserInfo> - <smsImportFilesActivity type="str">None</smsImportFilesActivity> - <smsActivityForFiles type="int">0</smsActivityForFiles> - <pcpuCommonPath type="str"></pcpuCommonPath> - <smsFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_smsFiles" itemtype="ixConfig"/> - <smsFilesCount type="int">0</smsFilesCount> - <grBoxSMServiceCenter type="bool">False</grBoxSMServiceCenter> - <grBoxSMOriginator type="bool">False</grBoxSMOriginator> - <grBoxSMRecipient type="bool">False</grBoxSMRecipient> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">smOrigNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFiles</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigReplyPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFilesCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSMRecipEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigReqStatusReport</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMRecipient</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipOverrideSrc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMOriginator</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smsAddressOriginator</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">telURI</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">depActivities</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">pcpuCommonPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smOrigTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smRecipTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">requestURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFilesBackup</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsAddressRecipient</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useFilesFromActivity</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smRecipNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smscPhoneNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsImportFilesActivity</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipReplyPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSMOrigEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smscNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">duringLoadFromBackup</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipReqStatusReport</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMServiceCenter</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">verifyUserInfo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smscTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigOverrideDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsActivityForFiles</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsSettings> - <smsFilesAdd ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSFilesAdd"> - <loadedFileType type="int">0</loadedFileType> - <fileName type="str"></fileName> - <ixSmsFileName type="str"></ixSmsFileName> - <ixSmsFilePath type="str"></ixSmsFilePath> - <segmentOrder type="str"></segmentOrder> - <totalTpudSize type="str"></totalTpudSize> - <segmentNo type="str">0</segmentNo> - <comboCoding type="int">0</comboCoding> - <comboRefNo type="int">0</comboRefNo> - <contentViewEdit type="str"></contentViewEdit> - <contentViewShow type="str"></contentViewShow> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">contentViewShow</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ixSmsFilePath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">contentViewEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">segmentOrder</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboRefNo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">loadedFileType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSmsLoadFiles</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ixSmsFileName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSmsSaveAs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fileName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">segmentNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">totalTpudSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboCoding</item> - <item ref="3"/> - </item> - </_dict> - </state> - </smsFilesAdd> - <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress"> - <radioBtnPhoneNo type="int">0</radioBtnPhoneNo> - <comboPhoneBook type="str"><None></comboPhoneBook> - <phoneBookPreview type="str"></phoneBookPreview> - <userPattern type="str">160[00000000-]</userPattern> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <fakeEnableTelURI type="bool">False</fakeEnableTelURI> - <fakeTelURI type="str"></fakeTelURI> - <fakeTelToPort type="str"></fakeTelToPort> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">userPattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneBookPreview</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeEnableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboPhoneBook</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fakeTelToPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">radioBtnPhoneNo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsAddressOriginator> - <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress"> - <radioBtnPhoneNo type="int">0</radioBtnPhoneNo> - <comboPhoneBook type="str"><None></comboPhoneBook> - <phoneBookPreview type="str"></phoneBookPreview> - <userPattern type="str">160[00000000-]</userPattern> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <fakeEnableTelURI type="bool">False</fakeEnableTelURI> - <fakeTelURI type="str"></fakeTelURI> - <fakeTelToPort type="str"></fakeTelToPort> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">userPattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneBookPreview</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeEnableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboPhoneBook</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fakeTelToPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">radioBtnPhoneNo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsAddressRecipient> - <compatibility ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Compatibility"> - <hasRtpChMapRules type="bool">True</hasRtpChMapRules> - </compatibility> - <editAutoHeaderRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditAutoHeaderRule"> - <defaultMessagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_defaultMessagesList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INVITE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">BYE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CANCEL</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">OPTIONS</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REGISTER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">NOTIFY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">SUBSCRIBE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REFER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">MESSAGE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">PRACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INFO</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">UPDATE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">100 (Trying)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">180 (Ringing)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">181 (Call Is Being Forwarded)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">182 (Queued)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">183 (Session Progress)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">200 (OK)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">202 (Accepted)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">300 (Multiple Choices)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">301 (Moved Permanently)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">302 (Moved Temporarily)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">305 (Use Proxy)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">380 (Alternative Service)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">400 (Bad Request)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">401 (Unauthorized)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">402 (Payment Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">403 (Forbidden)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">404 (Not Found)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">405 (Method Not Allowed)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">406 (Not Acceptable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">407 (Proxy Authentication Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">408 (Request Timeout)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">410 (Gone)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">413 (Request Entity Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">414 (Request-URI Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">415 (Unsupported Media Type)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">416 (Unsupported URI Scheme)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">420 (Bad Extension)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">421 (Extension Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">423 (Interval Too Brief)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">480 (Temporarily not available)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">481 (Call Leg/Transaction Does Not Exist)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">482 (Loop Detected)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">483 (Too Many Hops)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">484 (Address Incomplete)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">485 (Ambiguous)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">486 (Busy Here)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">487 (Request Terminated)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">488 (Not Acceptable Here)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">491 (Request Pending)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">493 (Undecipherable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">500 (Internal Server Error)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">501 (Not Implemented)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">502 (Bad Gateway)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">503 (Service Unavailable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">504 (Server Time-out)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">505 (SIP Version not supported)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">513 (Message Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">600 (Busy Everywhere)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">603 (Decline)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">604 (Does not exist anywhere)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">606 (Not Acceptable)</str> - </item> - </defaultMessagesList> - <messagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_messagesList" itemtype="ixConfig"/> - <autoHeaderTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_autoHeaderTypeList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Request-Uri</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Via</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">From</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Call-ID</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Contact</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Length</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Record-Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Referred-By</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Replaces</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Event</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RAck</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Refer-To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Subscription-State</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">WWW-Authenticate</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Also</str> - </item> - </autoHeaderTypeList> - <autoHeaderType type="str">To</autoHeaderType> - <option type="int">0</option> - <appendToUri type="bool">False</appendToUri> - <headerValue type="str"></headerValue> - <parsedHeader ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_parsedHeader" itemtype="ixConfig"/> - <valid type="bool">True</valid> - </editAutoHeaderRule> - <autoHeadersSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AutoHeadersSettings"> - <enableAutoHeaders type="bool">False</enableAutoHeaders> - <tableRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_tableRules" itemtype="ixConfig"/> - <reqAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_reqAutoHeadRules" itemtype="ixConfig"/> - <respAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_respAutoHeadRules" itemtype="ixConfig"/> - </autoHeadersSettings> - <sipAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SipAdvancedSettings"> - <overrideTCPLocalPort type="bool">False</overrideTCPLocalPort> - <tcpLocalPortStart type="int">40000</tcpLocalPortStart> - <tcpLocalPortEnd type="int">60000</tcpLocalPortEnd> - <tcpLocalPortStep type="int">1</tcpLocalPortStep> - <closeNonsecureTcpConnectionsEnable type="bool">False</closeNonsecureTcpConnectionsEnable> - <closeIdleTcpConnectionsEnable type="bool">False</closeIdleTcpConnectionsEnable> - <tcpIdlePeriod type="int">10</tcpIdlePeriod> - <donotCloseTCPInsideCallEnable type="bool">False</donotCloseTCPInsideCallEnable> - <recordingServerEnable type="bool">False</recordingServerEnable> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tcpIdlePeriod</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpEndPortLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpIdlePeriodLabel</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">donotCloseTCPInsideCallEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpPortStepLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortStep</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortEnd</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpStartPortLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortStart</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">closeIdleTcpConnectionsEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">recordingServerEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideTCPLocalPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">closeNonsecureTcpConnectionsEnable</item> - <item ref="1"/> - </item> - </_dict> - </state> - </sipAdvSettings> - </pm> - <objectID type="int">1</objectID> - <_apiUniqueId type="int">16522</_apiUniqueId> - <uniqueID type="int">43</uniqueID> - <commandIdCounter type="int">3</commandIdCounter> - <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport"> - <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"/> - </serializedNetworkSettingsMap> - <protocolName type="str">VoIP</protocolName> - </networkPluginSettings> - </item> - </agentList> - </traffic> - <network ver="[17, [1, [6, [1, [0, [0]]]]]]" type="ixNetworkGroup"> - <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp> - <name type="str">VM2</name> - <role type="str">Both</role> - <networkType type="str">none</networkType> - <aggregation type="int">0</aggregation> - <lineSpeed type="str">Default</lineSpeed> - <cpuAggregation type="bool">False</cpuAggregation> - <chassisChain ref="6"/> - <cardType type="str">Ixia Virtual Load Module</cardType> - <activePortList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"/> - <portList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" oid="13" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"> - <item ver="[3, [1, [1, [0, [0]]]]]" type="ixPort"> - <chassisId type="int">1</chassisId> - <cardId type="int">2</cardId> - <portId type="int">1</portId> - <enableCapture type="bool">False</enableCapture> - <cardType type="str">Ixia Virtual Load Module</cardType> - <portPersistentSetting ver="[0, [1, [0, [0]]]]" type="ixPortPersistentSetting"> - <viewFilter type="NoneType">None</viewFilter> - </portPersistentSetting> - <analyzerPartialCapture type="str">False;8192</analyzerPartialCapture> - <name type="str"></name> - <afmPort type="NoneType">None</afmPort> - </item> - </portList> - <comment type="str"></comment> - <networkRangeList ver="[0, [2, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkRangeListSequenceContainer" itemtype="ixNetworkRange"> - <item ver="[13, [1, [1, [1, [0, [0]]]]]]" oid="7" type="ixNetworkRange"> - <_smRangeObjectId type="str">c69dae97-f1c2-4505-aedb-3f9ca3f4d02a</_smRangeObjectId> - <name type="str">Network Range IP-R2 in VM2 ({{ipcard2}}+1)</name> - <rangeGroup ver="[3, [0, [1, [0, [0]]]]]" oid="8" type="ixIpDistributionGroup"> - <name type="str">DistGroup1</name> - <ipDistributionMethod type="str">consecutiveIps</ipDistributionMethod> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">16512</_apiUniqueId> - <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixBasicNetworkRange"> - <item ref="7"/> - </_networkRangeList> - <_rangeGroupObjectId type="str">de9d629b-e0dc-41f5-99cb-5aa8a808ceee</_rangeGroupObjectId> - <_smPluginObjectId type="str">e53ae54e-ab21-4997-b532-e9bd58210050</_smPluginObjectId> - </rangeGroup> - <enableStats type="bool">False</enableStats> - </item> - </networkRangeList> - <layerPlugins type="NoneType">None</layerPlugins> - <stack type="NoneType">None</stack> - <rangeGroupList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixIpDistributionGroupList" itemtype="ixIpDistributionGroup"> - <item ref="8"/> - </rangeGroupList> - <dynamicControlPlaneSetting type="int">0</dynamicControlPlaneSetting> - <linkLayerOptions type="int">0</linkLayerOptions> - <ipSourcePortFrom type="int">1024</ipSourcePortFrom> - <ipSourcePortTo type="int">65535</ipSourcePortTo> - <emulatedRouterGateway type="str">0.0.0.0</emulatedRouterGateway> - <emulatedRouterSubnet type="str">255.255.0.0</emulatedRouterSubnet> - <emulatedRouterGatewayIPv6 type="str">::</emulatedRouterGatewayIPv6> - <emulatedRouterSubnetIPv6 type="str">FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0</emulatedRouterSubnetIPv6> - <emulatedRouterIpAddressPool ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="ixEmulatedRouterIpAddressRange"/> - <macMappingMode type="int">0</macMappingMode> - <arpSettings ver="[0, [1, [0, [0]]]]" type="ixArpSettings"> - <gratuitousArp type="bool">True</gratuitousArp> - <processGratArp type="bool">False</processGratArp> - </arpSettings> - <dnsParameters ver="[1, [1, [0, [0]]]]" type="ixDns"> - <enable type="int">0</enable> - <cacheTimeout type="int">30000</cacheTimeout> - <serverList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsServerItem"/> - <suffixList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsSuffixItem"/> - </dnsParameters> - <tcpParameters ver="[0, [1, [0, [0]]]]" type="ixTcpParameters"> - <tcpParametersFull ver="[4, [1, [0, [0]]]]" oid="9" type="ixTcpParametersFull"> - <enableCongestionNotification type="bool">False</enableCongestionNotification> - <enableTimeStamp type="bool">True</enableTimeStamp> - <timeWaitRecycle type="bool">True</timeWaitRecycle> - <timeWaitReuse type="bool">False</timeWaitReuse> - <enableTxBwLimit type="bool">False</enableTxBwLimit> - <txBwLimitUnit type="int">0</txBwLimitUnit> - <txBwLimit type="int">1024</txBwLimit> - <enableRxBwLimit type="bool">False</enableRxBwLimit> - <rxBwLimitUnit type="int">0</rxBwLimitUnit> - <rxBwLimit type="int">1024</rxBwLimit> - <finTimeout type="int">60</finTimeout> - <keepAliveInterval type="int">75</keepAliveInterval> - <keepAliveProbes type="int">9</keepAliveProbes> - <keepAliveTime type="int">7200</keepAliveTime> - <synRetries type="int">5</synRetries> - <synAckRetries type="int">5</synAckRetries> - <retransmitRetries type="int">5</retransmitRetries> - <transmitBuffer type="int">4096</transmitBuffer> - <receiveBuffer type="int">4096</receiveBuffer> - <tcpSack type="bool">True</tcpSack> - <windowScaling type="bool">False</windowScaling> - <rtoMin type="int">200</rtoMin> - <rtoMax type="int">120000</rtoMax> - </tcpParametersFull> - <tcpParametersFull ref="9"/> - </tcpParameters> - <impairment ver="[5, [1, [0, [0]]]]" type="ixImpairment"> - <enable type="bool">False</enable> - <addDelay type="bool">False</addDelay> - <addReorder type="bool">False</addReorder> - <addDrop type="bool">False</addDrop> - <addDuplicate type="bool">False</addDuplicate> - <randomizeSeed type="bool">False</randomizeSeed> - <delay type="int">1</delay> - <reorder type="int">1</reorder> - <reorderLength type="int">1</reorderLength> - <sourcePort type="int">0</sourcePort> - <destinationPort type="int">0</destinationPort> - <drop type="int">1</drop> - <duplicate type="int">1</duplicate> - <jitter type="int">0</jitter> - <gap type="int">1</gap> - <destinationIp type="str">any</destinationIp> - <typeOfService type="str">any</typeOfService> - <protocol type="str">any</protocol> - <addFragmentation type="bool">False</addFragmentation> - <fragmentationType type="str">FragmentationPercent</fragmentationType> - <fragmentPercent type="int">50</fragmentPercent> - <mtu type="int">1000</mtu> - <fragmentSequenceSkip type="int">1</fragmentSequenceSkip> - <fragmentSequenceLength type="int">1</fragmentSequenceLength> - <_seed type="int">1</_seed> - </impairment> - <_portGroupId type="str">b1fbd381-b769-4ec1-8715-299508ecb458</_portGroupId> - <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap"> - <externalLinks type="dict"/> - </_smExternalLinks> - <smVersion type="int">1</smVersion> - </network> - <activityParameters ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityParametersList" itemtype="ixActivityParameters"> - <item ver="[0, [19, [1, [1, [0, [0]]]]]]" oid="25" type="ixActivity"> - <agent ref="10"/> - <protocolAndType type="str">VoIP Peer</protocolAndType> - <name type="str">CALLED</name> - <enable type="bool">True</enable> - <timeline ver="[2, [1, [1, [0, [0]]]]]" oid="11" type="ixTimeline"> - <name type="str">Timeline2</name> - <iterationTime type="int">2014</iterationTime> - <totalTime type="int">2014</totalTime> - <iterations type="int">1</iterations> - <standbyTime type="int">0</standbyTime> - <offlineTime type="int">0</offlineTime> - <sustainTime type="int">4953</sustainTime> - <rampUpType type="int">0</rampUpType> - <rampUpValue type="int">{{activecalls}}</rampUpValue> - <rampUpInterval type="int">1</rampUpInterval> - <rampUpTime type="int">1</rampUpTime> - <rampDownTime type="int">20</rampDownTime> - <rampDownValue type="int">0</rampDownValue> - <timelineType type="int">1</timelineType> - <advancedIteration ver="[0, [1, [0, [0]]]]" type="ixAdvancedIteration"> - <segmentList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTimelineSegmentList" itemtype="ixTimelineSegment"> - <item ver="[2, [0, [1, [0, [0]]]]]" type="ixLinearTimeSegment"> - <name type="str">Linear Segment 1</name> - <noiseAmplitudeScale type="int">0</noiseAmplitudeScale> - <segmentType type="int">1</segmentType> - <startObjectiveScale type="float">0.0</startObjectiveScale> - <endObjectiveScale type="float">1.0</endObjectiveScale> - <duration type="int">1</duration> - <objectID type="int">0</objectID> - </item> - <item ver="[2, [0, [1, [0, [0]]]]]" type="ixLinearTimeSegment"> - <name type="str">Linear Segment 2</name> - <noiseAmplitudeScale type="int">0</noiseAmplitudeScale> - <segmentType type="int">1</segmentType> - <startObjectiveScale type="float">1.0</startObjectiveScale> - <endObjectiveScale type="float">1.0</endObjectiveScale> - <duration type="int">{{testduration}}</duration> - <objectID type="int">4</objectID> - </item> - </segmentList> - <maxscale type="int">20</maxscale> - </advancedIteration> - <objectID type="int">5</objectID> - </timeline> - <customParameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters"> - <enableDbgLog type="bool">False</enableDbgLog> - <dbgLogChannels type="str">1-5</dbgLogChannels> - <bhcaType type="int">0</bhcaType> - <talkTime type="int">10000</talkTime> - <channelsNo type="int">1</channelsNo> - <callSetupTime type="int">500</callSetupTime> - <callTeardownTime type="int">500</callTeardownTime> - <interCallDuration type="int">4000</interCallDuration> - <bhcaObjectiveValue type="int">80000</bhcaObjectiveValue> - <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked> - <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked> - <cpsOverwriteValue type="int">18</cpsOverwriteValue> - <cpsType type="int">0</cpsType> - <cpsTalkTime type="int">30000</cpsTalkTime> - <cpsChannelsNo type="int">16750</cpsChannelsNo> - <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo> - <cpsOverheadTime type="int">1500</cpsOverheadTime> - <cpsInterCallDuration type="int">2000</cpsInterCallDuration> - <cpsObjectiveValue type="int">100</cpsObjectiveValue> - <cpsRegisterTime type="int">40</cpsRegisterTime> - <cpsSplitTimeline type="int">0</cpsSplitTimeline> - <lpsType type="int">0</lpsType> - <lpsTalkTime type="int">800</lpsTalkTime> - <lpsChannelsNo type="int">2150</lpsChannelsNo> - <lpsOverheadTime type="int">1500</lpsOverheadTime> - <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration> - <lpsObjectiveValue type="int">100</lpsObjectiveValue> - <lpsActiveChannel type="int">0</lpsActiveChannel> - <activeUsersTalkTime type="int">30000</activeUsersTalkTime> - <activeUsersNo type="int">{{activecalls}}</activeUsersNo> - <activeUsersChannel type="int">0</activeUsersChannel> - <activeUsersObjectiveValue type="int">100</activeUsersObjectiveValue> - </customParameters> - <role type="str">Peer</role> - <activeRole type="str">Both</activeRole> - <objectivePercent type="float">100.0</objectivePercent> - <objectiveType type="str">concurrentConnections</objectiveType> - <objectiveValue type="int">{{activecalls}}</objectiveValue> - <userObjectiveType type="str">activeUsers</userObjectiveType> - <userObjectiveValue type="long">{{activecalls}}</userObjectiveValue> - <constraintType type="str">SimulatedUserConstraint</constraintType> - <constraintValue type="int">{{activecalls}}</constraintValue> - <timerGranularity type="int">100</timerGranularity> - <enableConstraint type="bool">True</enableConstraint> - <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType> - <secondaryConstraintValue type="int">100</secondaryConstraintValue> - <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint> - <portMapPolicy type="str">protocolSpecific</portMapPolicy> - <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior> - <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior> - <userIpMapping type="str">1:1</userIpMapping> - <destinationIpMapping type="str">Consecutive</destinationIpMapping> - <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/> - <objectID type="int">1</objectID> - <_apiUniqueId type="int">16585</_apiUniqueId> - <resourceGuid type="str">58ff41761a9072107c63efca</resourceGuid> - <_objectiveValue type="int">{{activecalls}}</_objectiveValue> - <timelineScale type="tuple"> - <item type="float">1.0</item> - </timelineScale> - </item> - </activityParameters> - <timeline ref="11"/> - <communityCapture ver="[0, [1, [0, [0]]]]" type="ixViewCommunityCapture"> - <captureViewOptions ref="12"/> - <filter ver="[0, [1, [0, [0]]]]" type="ixViewFilter"> - <filterString type="str"></filterString> - </filter> - <portList ref="13"/> - <enable type="bool">False</enable> - <_apiUniqueId type="int">16521</_apiUniqueId> - </communityCapture> - <payload type="NoneType">None</payload> - <activityIpWiring ver="[0, [1, [0, [0]]]]" oid="14" type="ixRangeAgentEndpointWiring"> - <rangeAgentConnections type="list"/> - <_apiUniqueId type="int">16509</_apiUniqueId> - <rangeAgentDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item ref="7"/> - <item ver="[0, [1, [0, [0]]]]" type="ixRangeAgentWiring"> - <range ref="7"/> - <agentEndpointConnections type="list"/> - <agentConnectionsDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item ref="10"/> - <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring"> - <agent ref="10"/> - <endpoints type="list"/> - <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">SIP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">SIP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">RTP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">RTP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">T38</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">T38</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">MSRP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">MSRP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - </_dict> - </endpointsDict> - </item> - </item> - </_dict> - </agentConnectionsDict> - </item> - </item> - </_dict> - </rangeAgentDict> - </activityIpWiring> - <tcpAccelerationAllowedFlag type="bool">True</tcpAccelerationAllowedFlag> - <iterations type="int">1</iterations> - <standbyTime type="int">0</standbyTime> - <offlineTime type="int">0</offlineTime> - <sustainTime type="int">20</sustainTime> - <iterationTime type="int">60</iterationTime> - <totalTime type="int">1</totalTime> - <portMapPolicy type="str">mixedMap</portMapPolicy> - <objectiveType type="str">n/a</objectiveType> - <objectiveValue type="int">-1</objectiveValue> - <rampUpType type="int">-1</rampUpType> - <rampUpValue type="int">-1</rampUpValue> - <rampUpInterval type="int">-1</rampUpInterval> - <rampUpTime type="int">0</rampUpTime> - <rampDownTime type="int">10</rampDownTime> - <userObjectiveType type="str">n/a</userObjectiveType> - <userObjectiveValue type="int">-1</userObjectiveValue> - <totalUserObjectiveValue type="long">0</totalUserObjectiveValue> - <objectID type="int">1</objectID> - <_apiUniqueId type="int">16508</_apiUniqueId> - <isVisible type="bool">True</isVisible> - <activityIpWiring ref="14"/> - <_portOperationModesAllowed type="dict"> - <item> - <key type="int">0</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">1</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">2</key> - <value type="bool">False</value> - </item> - <item> - <key type="int">3</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">4</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">6</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">8</key> - <value type="bool">True</value> - </item> - </_portOperationModesAllowed> - <_tcpAccelerationAllowed type="dict"> - <item> - <key type="int">0</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">1</key> - <value type="bool">True</value> - </item> - </_tcpAccelerationAllowed> - </destinationCommunity> - <destinationAgentName type="str">CALLED</destinationAgentName> - <portRangeList type="NoneType">None</portRangeList> - <count type="int">1</count> - </item> - </destinations> - <flowPercentage type="float">100.0</flowPercentage> - <uniqueID type="int">39</uniqueID> - <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyMap_VoIP"> - <szPluginVersion type="str">4.10</szPluginVersion> - <ceCommands ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]], [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_ceCommands" itemtype="ixConfig"> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStart"> - <commandId type="int">-2</commandId> - <commandType type="str">START</commandType> - <cmdName type="str">Start</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Output1</name> - <outputType type="int">0</outputType> - <destCmdId type="int">3</destCmdId> - <objectID type="int">0</objectID> - <destinationCommandIdx type="int">2</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]], [0, [0, [0, [0, [1, [0, [0]]]]]]]]" type="#Pdk.ixPdkCommands$ixPropertyCommandStop"> - <commandId type="int">-3</commandId> - <commandType type="str">STOP</commandType> - <cmdName type="str">Stop</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure"> - <commandId type="int">3</commandId> - <commandType type="str">Procedure</commandType> - <cmdName type="str">SIP MakeCall (#1)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">16</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">4</destinationCommandIdx> - </item> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Error</name> - <outputType type="int">1</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">2</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Procedure"> - <commandId type="int">10</commandId> - <commandType type="str">Procedure</commandType> - <cmdName type="str">SIP EndCall Initiate (#2)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Error</name> - <outputType type="int">1</outputType> - <destCmdId type="int">-3</destCmdId> - <objectID type="int">2</objectID> - <destinationCommandIdx type="int">1</destinationCommandIdx> - </item> - </outputList> - </item> - <item ver="[0, [1, [0, [0, [0.1, [1, [0, [0]]]], [0, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CommandEx"> - <commandId type="int">16</commandId> - <commandType type="str">CommandEx</commandType> - <cmdName type="str">Voice Session (#1)</cmdName> - <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">OK</name> - <outputType type="int">0</outputType> - <destCmdId type="int">10</destCmdId> - <objectID type="int">1</objectID> - <destinationCommandIdx type="int">3</destinationCommandIdx> - </item> - <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput"> - <name type="str">Error</name> - <outputType type="int">1</outputType> - <destCmdId type="int">10</destCmdId> - <objectID type="int">2</objectID> - <destinationCommandIdx type="int">3</destinationCommandIdx> - </item> - </outputList> - <cmdType type="str">RTPVoiceSession</cmdType> - </item> - </ceCommands> - <activityLink ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityLinkInfo"> - <name type="str">VoiceLink1</name> - <activitiesCount type="int">2</activitiesCount> - </activityLink> - <triggers ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TriggerConfig"> - <triggersInCount type="int">4</triggersInCount> - <triggersOutCount type="int">4</triggersOutCount> - </triggers> - <globalSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSettings"> - <globalExecStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalExecSettings"> - <setAborted type="bool">False</setAborted> - <setAllFailed type="bool">False</setAllFailed> - <trigTimeout type="int">600000</trigTimeout> - <notAbortOnTimeout type="bool">False</notAbortOnTimeout> - <limitErrors type="bool">False</limitErrors> - <maxErrors type="int">1</maxErrors> - <limitArrayVarSize type="bool">False</limitArrayVarSize> - <maxArrayVarSize type="int">10</maxArrayVarSize> - </globalExecStg> - <globalSIPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSIPSettings"> - <disableTCP type="bool">False</disableTCP> - <prefQOP type="int">0</prefQOP> - <warnAsError type="bool">False</warnAsError> - <limitQueueSize type="bool">True</limitQueueSize> - <maxChannelsInQueue type="int">25</maxChannelsInQueue> - <enableSIPLogging type="bool">False</enableSIPLogging> - <limitSIPLoggingChannels type="bool">False</limitSIPLoggingChannels> - <maxSIPLoggingChannels type="int">10</maxSIPLoggingChannels> - <minSIPLoggingChannels type="int">0</minSIPLoggingChannels> - <voipPeerLogSettings type="int">0</voipPeerLogSettings> - <voipPeerLogExpForChannels type="str"></voipPeerLogExpForChannels> - <abortLoopOnTriggerTimeout type="bool">False</abortLoopOnTriggerTimeout> - </globalSIPStg> - <globalRTPStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalRTPSettings"> - <transmMode type="int">0</transmMode> - <playMode type="int">0</playMode> - <repeatCount type="int">1</repeatCount> - <repeatTime type="int">1000</repeatTime> - <timeUnit type="int">0</timeUnit> - <volume type="int">-20</volume> - <playModePathConf type="int">0</playModePathConf> - <repeatCountPathConf type="int">0</repeatCountPathConf> - <repeatTimePathConf type="int">10</repeatTimePathConf> - <timeUnitPathConf type="int">0</timeUnitPathConf> - <toneDurationPathConf type="int">200</toneDurationPathConf> - <interToneDelayPathConf type="int">200</interToneDelayPathConf> - <toneAmplitudePathConf type="int">-10</toneAmplitudePathConf> - <firstToneTimeoutPathConf type="int">4000</firstToneTimeoutPathConf> - <interToneTimeoutPathConf type="int">2000</interToneTimeoutPathConf> - <qovTalkExtraSilence type="int">500</qovTalkExtraSilence> - <qovListenExtraDuration type="int">2000</qovListenExtraDuration> - <downloadRTPCSV type="bool">True</downloadRTPCSV> - <waitQoVScore type="bool">False</waitQoVScore> - </globalRTPStg> - <globalSTUNStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSTUNSettings"> - <keepAliveInterval type="int">15</keepAliveInterval> - </globalSTUNStg> - <globalSKINNYStg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalSKINNYSettings"> - <softKeyCount type="int">25</softKeyCount> - <receiveVideo type="bool">False</receiveVideo> - <transmitVideo type="bool">False</transmitVideo> - </globalSKINNYStg> - <globalT38Stg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_GlobalT38Settings"> - <t30Log type="bool">False</t30Log> - <t38Log type="bool">False</t38Log> - <receivedImageLog type="bool">False</receivedImageLog> - <logType type="int">0</logType> - <logBegin type="int">1</logBegin> - <logEnd type="int">10</logEnd> - <channelRange type="str">[00-10]</channelRange> - </globalT38Stg> - </globalSettings> - <info ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Info"> - <userChannelsNo type="int">45638</userChannelsNo> - <portInstances type="int">3</portInstances> - <portInstanceIdx type="int">1</portInstanceIdx> - <objectiveType type="str">activeUsers</objectiveType> - <objectiveValue type="int">1000</objectiveValue> - <maxAllowedObjective type="long">9223372036854775807</maxAllowedObjective> - <firstSignalingFnID type="int">8</firstSignalingFnID> - <enableRTPDest type="bool">False</enableRTPDest> - <rtpPortDest type="str"></rtpPortDest> - <rtpObjectiveValue type="int">32000</rtpObjectiveValue> - <hasRtpFunction type="bool">False</hasRtpFunction> - <hasVideoFunction type="bool">False</hasVideoFunction> - <hasT38Function type="bool">False</hasT38Function> - <hasMSRPFunction type="bool">False</hasMSRPFunction> - <src ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str">CALLING</name> - <portCount type="int">1</portCount> - <portCountRtp type="int">1</portCountRtp> - <portCountT38 type="int">1</portCountT38> - <portCountMSRP type="int">1</portCountMSRP> - <ipRangeCount type="int">1</ipRangeCount> - <ipCount type="int">1</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">1</ipRuleCh> - <port type="str">{{sipportcalling}}</port> - <portRule type="int">0</portRule> - <portRuleCh type="int">1</portRuleCh> - <phone type="str">{{pncalling}}</phone> - <aliases type="int">1</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">1</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">1</ipRangeCountRtp> - <ipCountRtp type="int">1</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">1</ipRuleChRtp> - <portRtp type="str">[10000-65535,4]</portRtp> - <portT38 type="str">40000</portT38> - <portMSRP type="str">2855</portMSRP> - <portRuleRtp type="int">1</portRuleRtp> - <portRuleChRtp type="int">1</portRuleChRtp> - <ipRangeCountT38 type="int">1</ipRangeCountT38> - <ipCountT38 type="int">1</ipCountT38> - <ipRangeCountMSRP type="int">1</ipRangeCountMSRP> - <ipCountMSRP type="int">1</ipCountMSRP> - <symType type="int">1</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str">5061</tlsPort> - <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp> - <nodeCount type="int">1</nodeCount> - <coreCount type="int">2</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">1</calActivityID> - <layerName type="str">aptixia-T.03440c56.4e1a.4def.8406.ec64db91d4c1-L2EthernetPlugin-166a11b6.4d30.40ea.b9e1.ac4fb44f112b-161.105.231.12;1;1default</layerName> - </src> - <dest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str"></name> - <portCount type="int">1</portCount> - <portCountRtp type="int">1</portCountRtp> - <portCountT38 type="int">1</portCountT38> - <portCountMSRP type="int">1</portCountMSRP> - <ipRangeCount type="int">0</ipRangeCount> - <ipCount type="int">0</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">0</ipRuleCh> - <port type="str"></port> - <portRule type="int">0</portRule> - <portRuleCh type="int">0</portRuleCh> - <phone type="str"></phone> - <aliases type="int">1</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">0</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">0</ipRangeCountRtp> - <ipCountRtp type="int">0</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">0</ipRuleChRtp> - <portRtp type="str"></portRtp> - <portT38 type="str"></portT38> - <portMSRP type="str">2855</portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">0</portRuleChRtp> - <ipRangeCountT38 type="int">0</ipRangeCountT38> - <ipCountT38 type="int">0</ipCountT38> - <ipRangeCountMSRP type="int">1</ipRangeCountMSRP> - <ipCountMSRP type="int">1</ipCountMSRP> - <symType type="int">1</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str"></tlsPort> - <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp> - <nodeCount type="int">1</nodeCount> - <coreCount type="int">2</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str"></layerName> - </dest> - <useServerDest type="bool">False</useServerDest> - <srvDomainDest type="str"></srvDomainDest> - <srvAddrDest type="str"></srvAddrDest> - <srvPortDest type="str">5060</srvPortDest> - <cloudServerDest ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer"> - <name type="str"></name> - <ipAddr type="str"></ipAddr> - <rangeType type="str"></rangeType> - <ipType type="str"></ipType> - <port type="int">0</port> - <attachedInfo type="str"></attachedInfo> - <firstIp type="str"></firstIp> - <netMask type="str"></netMask> - <ipCount type="str"></ipCount> - <ipStep type="str"></ipStep> - </cloudServerDest> - <transfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ActivityInfo"> - <name type="str"></name> - <portCount type="int">0</portCount> - <portCountRtp type="int">0</portCountRtp> - <portCountT38 type="int">0</portCountT38> - <portCountMSRP type="int">0</portCountMSRP> - <ipRangeCount type="int">0</ipRangeCount> - <ipCount type="int">0</ipCount> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">0</ipRuleCh> - <port type="str"></port> - <portRule type="int">0</portRule> - <portRuleCh type="int">0</portRuleCh> - <phone type="str"></phone> - <aliases type="int">0</aliases> - <phoneType type="int">0</phoneType> - <phoneRule type="int">0</phoneRule> - <phoneCount type="int">0</phoneCount> - <telPar type="str"></telPar> - <ipRangeCountRtp type="int">0</ipRangeCountRtp> - <ipCountRtp type="int">0</ipCountRtp> - <ipRuleRtp type="int">0</ipRuleRtp> - <ipRuleChRtp type="int">0</ipRuleChRtp> - <portRtp type="str"></portRtp> - <portT38 type="str"></portT38> - <portMSRP type="str"></portMSRP> - <portRuleRtp type="int">0</portRuleRtp> - <portRuleChRtp type="int">0</portRuleChRtp> - <ipRangeCountT38 type="int">0</ipRangeCountT38> - <ipCountT38 type="int">0</ipCountT38> - <ipRangeCountMSRP type="int">0</ipRangeCountMSRP> - <ipCountMSRP type="int">0</ipCountMSRP> - <symType type="int">0</symType> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <tlsPort type="str"></tlsPort> - <tlsDisableUdpAndTcp type="bool">False</tlsDisableUdpAndTcp> - <nodeCount type="int">0</nodeCount> - <coreCount type="int">1</coreCount> - <nicCount type="int">1</nicCount> - <gtpEnabled type="bool">False</gtpEnabled> - <dcpEnabled type="bool">False</dcpEnabled> - <rangeType type="int">0</rangeType> - <calActivityID type="int">0</calActivityID> - <layerName type="str"></layerName> - </transfer> - <useServerTransfer type="bool">False</useServerTransfer> - <registrarSrvTransfer type="bool">False</registrarSrvTransfer> - <srvAddrTransfer type="str"></srvAddrTransfer> - <srvPortTransfer type="str">5060</srvPortTransfer> - <cloudServerTransfer ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudServer"> - <name type="str"></name> - <ipAddr type="str"></ipAddr> - <rangeType type="str"></rangeType> - <ipType type="str"></ipType> - <port type="int">0</port> - <attachedInfo type="str"></attachedInfo> - <firstIp type="str"></firstIp> - <netMask type="str"></netMask> - <ipCount type="str"></ipCount> - <ipStep type="str"></ipStep> - </cloudServerTransfer> - </info> - <scenarioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ScenarioSettings"> - <scenarioFile type="str">.\SIPCall.tst</scenarioFile> - <activeScenarioChannel type="int">0</activeScenarioChannel> - <funcsCount type="int">17</funcsCount> - <isModified type="int">68</isModified> - <activityID type="int">6</activityID> - <exportToRM type="int">0</exportToRM> - </scenarioSettings> - <executionSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExecutionSettings"> - <loopMode type="int">0</loopMode> - <loopCount type="int">1</loopCount> - <loopPreDelay type="int">0</loopPreDelay> - <loopMidDelay type="int">0</loopMidDelay> - <gracefulRampDown type="bool">True</gracefulRampDown> - <rampdownSleep type="bool">False</rampdownSleep> - <aliases type="int">1</aliases> - <ipRule type="int">0</ipRule> - <ipRuleCh type="int">1</ipRuleCh> - <portRule type="int">0</portRule> - <portRuleCh type="int">1</portRuleCh> - <phoneRule type="int">1</phoneRule> - <multipleUsersPerIO type="bool">True</multipleUsersPerIO> - <rtpIpRule type="int">0</rtpIpRule> - <rtpIpRuleCh type="int">1</rtpIpRuleCh> - <rtpPortRule type="int">1</rtpPortRule> - <rtpPortRuleCh type="int">1</rtpPortRuleCh> - <dl_BUG type="bool">True</dl_BUG> - <dl_TRACE type="bool">False</dl_TRACE> - <dl_L_INFO type="bool">True</dl_L_INFO> - <dl_L_ADV type="bool">False</dl_L_ADV> - <dl_L_VRB type="bool">False</dl_L_VRB> - <dl_T_IO type="bool">False</dl_T_IO> - <dl_T_INFO type="bool">False</dl_T_INFO> - <dl_T_ADV type="bool">False</dl_T_ADV> - <dl_T_VRB type="bool">False</dl_T_VRB> - <dl_TG_ADV type="bool">False</dl_TG_ADV> - <dl_TG_VRB type="bool">False</dl_TG_VRB> - <dl_Q_ADV type="bool">False</dl_Q_ADV> - <dl_Q_VRB type="bool">False</dl_Q_VRB> - <dl_S_FSM type="bool">False</dl_S_FSM> - <dl_S_SER type="bool">False</dl_S_SER> - <dl_S_SUA type="bool">False</dl_S_SUA> - <dl_S_WAIT type="bool">False</dl_S_WAIT> - <dl_S_SEND type="bool">False</dl_S_SEND> - <dl_S_INFO type="bool">False</dl_S_INFO> - <dl_S_ADV type="bool">False</dl_S_ADV> - <dl_S_VRB type="bool">False</dl_S_VRB> - <dl_R_DD type="bool">False</dl_R_DD> - <dl_R_VRB type="bool">False</dl_R_VRB> - <dl_R_PAR type="bool">False</dl_R_PAR> - <dl_EE_VRB type="bool">False</dl_EE_VRB> - <dl_EE_DD type="bool">False</dl_EE_DD> - <dl_FLOW type="bool">False</dl_FLOW> - <dl_M_IO type="bool">False</dl_M_IO> - <dl_SDP_DD type="bool">False</dl_SDP_DD> - <dl_1 type="bool">False</dl_1> - <dl_2 type="bool">False</dl_2> - <dl_3 type="bool">False</dl_3> - <log_level type="int">9</log_level> - <log_in_memory type="int">1</log_in_memory> - <rtp_log_in_file type="int">1</rtp_log_in_file> - <log_filesize type="int">32</log_filesize> - <_gbDebugLogs type="bool">False</_gbDebugLogs> - <ccExportProfile type="bool">False</ccExportProfile> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_ipRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_S_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopMidDelay</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_IO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SEND</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_rtpIpRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">_estimatedBacklog</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopPreDelay</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TG_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">log_filesize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtp_log_in_file</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">aliases</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_Q_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">multipleUsersPerIO</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">log_level</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpIpRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rampdownSleep</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_portRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SER</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_Q_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpPortRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_M_IO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_EE_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpIpRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_FSM</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">gracefulRampDown</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_FLOW</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_BUG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_S_SUA</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_rtpPortRule1</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">dl_R_PAR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loopCount</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">dl_S_WAIT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_SDP_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TRACE</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbDebugLogs</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">rtpPortRuleCh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_TG_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portRule</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_INFO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_EE_VRB</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_R_DD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_T_ADV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ccExportProfile</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">log_in_memory</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dl_L_VRB</item> - <item ref="1"/> - </item> - </_dict> - </state> - </executionSettings> - <customActivityLinkSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters"> - <enableDbgLog type="bool">False</enableDbgLog> - <dbgLogChannels type="str">1-5</dbgLogChannels> - <bhcaType type="int">0</bhcaType> - <talkTime type="int">10000</talkTime> - <channelsNo type="int">1</channelsNo> - <callSetupTime type="int">500</callSetupTime> - <callTeardownTime type="int">500</callTeardownTime> - <interCallDuration type="int">4000</interCallDuration> - <bhcaObjectiveValue type="int">1</bhcaObjectiveValue> - <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked> - <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked> - <cpsOverwriteValue type="int">18</cpsOverwriteValue> - <cpsType type="int">0</cpsType> - <cpsTalkTime type="int">30000</cpsTalkTime> - <cpsChannelsNo type="int">16750</cpsChannelsNo> - <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo> - <cpsOverheadTime type="int">1500</cpsOverheadTime> - <cpsInterCallDuration type="int">2000</cpsInterCallDuration> - <cpsObjectiveValue type="int">500</cpsObjectiveValue> - <cpsRegisterTime type="int">40</cpsRegisterTime> - <cpsSplitTimeline type="int">0</cpsSplitTimeline> - <lpsType type="int">0</lpsType> - <lpsTalkTime type="int">800</lpsTalkTime> - <lpsChannelsNo type="int">2150</lpsChannelsNo> - <lpsOverheadTime type="int">1500</lpsOverheadTime> - <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration> - <lpsObjectiveValue type="int">500</lpsObjectiveValue> - <lpsActiveChannel type="int">0</lpsActiveChannel> - <activeUsersTalkTime type="int">30000</activeUsersTalkTime> - <activeUsersNo type="int">{{activecalls}}</activeUsersNo> - <activeUsersChannel type="int">0</activeUsersChannel> - <activeUsersObjectiveValue type="int">{{activecalls}}</activeUsersObjectiveValue> - </customActivityLinkSettings> - <rtpWaveFiles ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPWaveFiles"> - <wavesCount type="int">1</wavesCount> - </rtpWaveFiles> - <rtpTones ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPTones"> - <usedTonesCount type="int">0</usedTonesCount> - <customTonesCount type="int">35</customTonesCount> - <seqCustTonesCount type="int">0</seqCustTonesCount> - </rtpTones> - <codecCustomPopup ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPopup"> - <captureFile type="str">Default.cap</captureFile> - <parseRTPPort type="bool">False</parseRTPPort> - <parseSSRC type="bool">False</parseSSRC> - <rtpPort type="int">10000</rtpPort> - <ssrc type="str">0x8078C5D3</ssrc> - </codecCustomPopup> - <codecCustomPropDlg ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecCustomPropDlg"/> - <codecSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecSettings"> - <codecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_codecs" itemtype="ixConfig"> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711u"> - <dPayloadIn type="int">0</dPayloadIn> - <dPayloadOut type="int">0</dPayloadOut> - <frameSize type="int">160</frameSize> - </item> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CodecG711a"> - <dPayloadIn type="int">8</dPayloadIn> - <dPayloadOut type="int">8</dPayloadOut> - <frameSize type="int">160</frameSize> - </item> - </codecs> - <codecs_number type="int">2</codecs_number> - <_gbVideoCodecs type="bool">False</_gbVideoCodecs> - <videoPayloadType type="int">96</videoPayloadType> - <_gbDataCodecs type="bool">False</_gbDataCodecs> - <dataCodecs ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CodecSettings_dataCodecs" itemtype="ixConfig"> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Events"> - <dPayloadType type="int">100</dPayloadType> - </item> - <item ver="[0, [0, [0.1, [1, [0, [0]]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Rtp2833Tones"> - <dPayloadType type="int">101</dPayloadType> - </item> - </dataCodecs> - <crtCustomCodecIndex type="int">-1</crtCustomCodecIndex> - </codecSettings> - <rtpSettings ver="[7, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTPSettings"> - <rtpPort type="str">[10000-65535,4]</rtpPort> - <enableAdvStatCalc type="bool">False</enableAdvStatCalc> - <enableRTCP type="bool">False</enableRTCP> - <enableRTCPMux type="bool">False</enableRTCPMux> - <chEnableHwAcc type="bool">False</chEnableHwAcc> - <chDisableHwAcc type="bool">False</chDisableHwAcc> - <enableHwAcc type="bool">False</enableHwAcc> - <enableIxStack type="bool">False</enableIxStack> - <enableNBExec type="bool">False</enableNBExec> - <enablePerStream type="bool">False</enablePerStream> - <enableMDI type="bool">False</enableMDI> - <enableRTP type="bool">False</enableRTP> - <enableMediaSDPParams type="bool">False</enableMediaSDPParams> - <audioB_option type="bool">False</audioB_option> - <audioB_value type="str">AS:48</audioB_value> - <audioRR_option type="bool">False</audioRR_option> - <audioRR_value type="str">800</audioRR_value> - <audioRS_option type="bool">False</audioRS_option> - <audioRS_value type="str">800</audioRS_value> - <videoB_option type="bool">False</videoB_option> - <videoB_value type="str">AS:384</videoB_value> - <videoRR_option type="bool">False</videoRR_option> - <videoRR_value type="str">6400</videoRR_value> - <videoRS_option type="bool">False</videoRS_option> - <videoRS_value type="str">6400</videoRS_value> - <textB_option type="bool">False</textB_option> - <textB_value type="str">AS:48</textB_value> - <textRR_option type="bool">False</textRR_option> - <textRR_value type="str">800</textRR_value> - <textRS_option type="bool">False</textRS_option> - <textRS_value type="str">800</textRS_value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">videoRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbVideoSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">jitMs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbAudioSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ixnamSupported</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dedicatedCoreRange</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelTypeQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMediaSDPParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTextSDPParams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">activityIdQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitComp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dedicatedCoreRangeLength</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">portIPsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">chEnableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelsQoVPerZionPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCPMux</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">silenceMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbMediaSDPParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">valueQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">maxMosStreams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMDI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableIxStack</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">unitsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serviceEnabledQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">chDisableHwAcc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosGroupBox</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRR_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePerStream</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">limitMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">customTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mosInterval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAdvStatCalc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSilence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">metricsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoRS_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">jitCMaxDrop</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioRR_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textB_value</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTosRtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoB_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">activityNameQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRS_option</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableNBExec</item> - <item ref="1"/> - </item> - </_dict> - </state> - </rtpSettings> - <rtcpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_RTCPSettings"> - <rtcpIgnoreSSRC type="bool">False</rtcpIgnoreSSRC> - <rtcpCNAMEType type="int">0</rtcpCNAMEType> - <hasSDESName type="bool">False</hasSDESName> - <hasSDESTool type="bool">False</hasSDESTool> - <rtcpSDESTool type="str">IxLoad</rtcpSDESTool> - <rtcpReceiverTimer type="int">2000</rtcpReceiverTimer> - <rtcpSenderTimer type="int">2000</rtcpSenderTimer> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">rtcpSDESTool</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">rtcpSenderTimer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpCNAMEType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">hasSDESTool</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpReceiverTimer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtcpIgnoreSSRC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">hasSDESName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableRTCPMux2</item> - <item ref="1"/> - </item> - </_dict> - </state> - </rtcpSettings> - <audioSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AudioSettings"> - <enableAudio type="bool">False</enableAudio> - <_gbEnableAudio type="bool">False</_gbEnableAudio> - <enableAudioOWD type="bool">False</enableAudioOWD> - <useJitter type="bool">False</useJitter> - <_JB1 type="bool">False</_JB1> - <jitMs type="int">20</jitMs> - <useJitComp type="bool">False</useJitComp> - <jitCMs type="int">1000</jitCMs> - <jitCMaxDrop type="int">7</jitCMaxDrop> - <dodName type="str">rtp_esmad-asordo-l_2170</dodName> - <useMos type="bool">False</useMos> - <useSilence type="bool">False</useSilence> - <silenceMode type="int">1</silenceMode> - <enableTosRtp type="bool">False</enableTosRtp> - <rtpTos type="int">1</rtpTos> - <customTosGroupBox type="bool">False</customTosGroupBox> - <customTos type="str">0x20</customTos> - <rtpTosVal type="int">32</rtpTosVal> - <_COV1 type="bool">False</_COV1> - <useQoV type="bool">False</useQoV> - <qovAnalize type="int">5</qovAnalize> - <qovSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_QoVSettings"> - <activityIdQoV type="int">0</activityIdQoV> - <enableQoV type="bool">False</enableQoV> - <_gbEnableQoV type="bool">False</_gbEnableQoV> - <serviceEnabledQoV type="bool">False</serviceEnabledQoV> - <activityNameQoV type="str"></activityNameQoV> - <portIPsQoV type="str"></portIPsQoV> - <unitsQoV type="int">0</unitsQoV> - <valueQoV type="int">100</valueQoV> - <channelTypeQoV type="int">0</channelTypeQoV> - <metricsQoV type="int">0</metricsQoV> - <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort> - <radioBtnQoVASR type="int">0</radioBtnQoVASR> - <languageASR type="str">English(US)</languageASR> - </qovSettings> - <activityIdQoV type="int">0</activityIdQoV> - <enableQoV type="bool">False</enableQoV> - <_gbEnableQoV type="bool">False</_gbEnableQoV> - <serviceEnabledQoV type="bool">False</serviceEnabledQoV> - <activityNameQoV type="str"></activityNameQoV> - <portIPsQoV type="str"></portIPsQoV> - <unitsQoV type="int">0</unitsQoV> - <valueQoV type="int">100</valueQoV> - <channelTypeQoV type="int">0</channelTypeQoV> - <metricsQoV type="int">0</metricsQoV> - <channelsQoVPerZionPort type="int">0</channelsQoVPerZionPort> - <radioBtnQoVASR type="int">0</radioBtnQoVASR> - <languageASR type="str">English(US)</languageASR> - <audioClip type="str">US_042.wav</audioClip> - <_audioFormat type="str">Format: PCM, Duration: 32785 ms, Size: 524556 bytes</_audioFormat> - <outputLevel type="int">-20</outputLevel> - <_gbOutputLevel type="bool">False</_gbOutputLevel> - <playTypeAudio type="int">0</playTypeAudio> - <audioDuration type="int">10</audioDuration> - <audioDurationUnit type="int">1</audioDurationUnit> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbEnableQoV</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">channelTypeQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">pesqPolqa</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePTT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableP56</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">qovAnalize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">channelsQoVPerZionPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_COV1</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">useTelchemy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">activityIdQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpTosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitComp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_JB1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTosRtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">portIPsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbQoVMetrics</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dodName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitMs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbASRLanguage</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">rtpTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">radioBtnQoVASR</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">silenceMode</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">playTypeAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useQoV</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">activityNameQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">valueQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbOutputLevel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">unitsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serviceEnabledQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">audioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">languageASR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosGroupBox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">audioDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useMos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">qovSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useJitter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSilence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">metricsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">jitCMaxDrop</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">channelsQoV</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAudioOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_audioFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableAudio</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">outputLevel</item> - <item ref="1"/> - </item> - </_dict> - </state> - </audioSettings> - <editTos ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditTos"> - <bits012 type="int">0</bits012> - <minDelay type="bool">False</minDelay> - <maxThroughput type="bool">False</maxThroughput> - <maxReliability type="bool">False</maxReliability> - <_gbBtnTosBit7_0 type="bool">False</_gbBtnTosBit7_0> - <_gbBtnTosBit7_1 type="bool">False</_gbBtnTosBit7_1> - <_gbBtnTosBit6_0 type="bool">False</_gbBtnTosBit6_0> - <_gbBtnTosBit6_1 type="bool">False</_gbBtnTosBit6_1> - <_gbBtnTosBit5_0 type="bool">False</_gbBtnTosBit5_0> - <_gbBtnTosBit5_1 type="bool">False</_gbBtnTosBit5_1> - <_gbBtnTosBit4_0 type="bool">False</_gbBtnTosBit4_0> - <_gbBtnTosBit4_1 type="bool">False</_gbBtnTosBit4_1> - <_gbBtnTosBit3_0 type="bool">False</_gbBtnTosBit3_0> - <_gbBtnTosBit3_1 type="bool">False</_gbBtnTosBit3_1> - <_gbBtnTosBit2_0 type="bool">False</_gbBtnTosBit2_0> - <_gbBtnTosBit2_1 type="bool">False</_gbBtnTosBit2_1> - <_gbDisabledBtns type="bool">False</_gbDisabledBtns> - </editTos> - <srtpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SRTPSettings"> - <bEnableSRTP type="bool">False</bEnableSRTP> - <bEnableVideoSRTP type="bool">False</bEnableVideoSRTP> - <bEnableTextSRTP type="bool">False</bEnableTextSRTP> - <bDisableSRTCPEncryption type="bool">False</bDisableSRTCPEncryption> - <bDisableSRTPEncryption type="bool">False</bDisableSRTPEncryption> - <bDisableSRTPAuthentication type="bool">False</bDisableSRTPAuthentication> - <bDisableValidations type="bool">False</bDisableValidations> - <bAllowOnlySecureStreams type="bool">False</bAllowOnlySecureStreams> - <bIncludeMKI type="bool">False</bIncludeMKI> - <bEnablePreencryption type="bool">False</bEnablePreencryption> - <bDisableMasterSalt type="bool">False</bDisableMasterSalt> - <bStaticMasterKeySalt type="bool">False</bStaticMasterKeySalt> - <_masterKeySelection type="int">0</_masterKeySelection> - <staticSingleKeySalt type="str"></staticSingleKeySalt> - <staticKeyFile type="str"></staticKeyFile> - <_enableSRTP type="bool">False</_enableSRTP> - <_useStaticKey type="bool">False</_useStaticKey> - <_singleMasterKeyGrp type="bool">False</_singleMasterKeyGrp> - <_multipleMasterKeysGrp type="bool">False</_multipleMasterKeysGrp> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">bEnableSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_singleMasterKeyGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTPEncryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTPAuthentication</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableValidations</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useStaticKey</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">bEnablePreencryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">staticSingleKeySalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bStaticMasterKeySalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">staticKeyFile</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableMasterSalt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_multipleMasterKeysGrp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">bAllowOnlySecureStreams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bDisableSRTCPEncryption</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableVideoSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bIncludeMKI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bEnableTextSRTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_masterKeySelection</item> - <item ref="1"/> - </item> - </_dict> - </state> - </srtpSettings> - <videoClips ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoClips"> - <videoClipsInfo ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VideoClips_videoClipsInfo" itemtype="ixConfig"/> - <videoClipsInfoLength type="int">0</videoClipsInfoLength> - <H323MaxProfile type="int">0</H323MaxProfile> - <H323MaxLevel type="int">0</H323MaxLevel> - <H323MaxBitRate type="int">0</H323MaxBitRate> - <H323Packetization type="int">0</H323Packetization> - <MaxProfileIdc type="int">66</MaxProfileIdc> - <MaxProfileIop type="int">0</MaxProfileIop> - <MaxLevel type="int">1</MaxLevel> - </videoClips> - <advancedVideo ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedVideoSettings"> - <enableCustomMaxMBPS type="bool">False</enableCustomMaxMBPS> - <customMaxMBPS type="int">0</customMaxMBPS> - <enableCustomMaxFS type="bool">False</enableCustomMaxFS> - <customMaxFS type="int">0</customMaxFS> - <enableCustomMaxDPB type="bool">False</enableCustomMaxDPB> - <customMaxDPB type="int">0</customMaxDPB> - <enableCustomMaxBRandCPB type="bool">False</enableCustomMaxBRandCPB> - <customMaxBRandCPB type="int">0</customMaxBRandCPB> - <enableMaxStaticMBPS type="bool">False</enableMaxStaticMBPS> - <maxStaticMBPS type="int">0</maxStaticMBPS> - <enableMaxRcmdNalUnitSize type="bool">False</enableMaxRcmdNalUnitSize> - <maxRcmdNalUnitSize type="int">0</maxRcmdNalUnitSize> - <enableMaxNalUnitSize type="bool">False</enableMaxNalUnitSize> - <maxNalUnitSize type="int">0</maxNalUnitSize> - </advancedVideo> - <videoSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoSettings"> - <enableVideo type="bool">False</enableVideo> - <enableVideoOWD type="bool">False</enableVideoOWD> - <videoMaxSessions type="int">1</videoMaxSessions> - <_gbEnableVideo type="bool">False</_gbEnableVideo> - <videoClip type="str">Fire_avc.mp4</videoClip> - <_videoFormat type="str">Codec: H264, Duration: 12800 ms, Size: 2012176 bytes, Bitrate: 1225 kbps</_videoFormat> - <playTypeVideo type="int">0</playTypeVideo> - <videoDuration type="int">5</videoDuration> - <videoDurationUnit type="int">1</videoDurationUnit> - <useConference type="bool">False</useConference> - <_gbUseConference type="bool">False</_gbUseConference> - <rotationScheme type="int">0</rotationScheme> - <confVideoDuration type="int">1</confVideoDuration> - <confVideoDurationUnit type="int">1</confVideoDurationUnit> - <confDuration type="int">1</confDuration> - <confDurationUnit type="int">1</confDurationUnit> - <btnTelepresence type="bool">False</btnTelepresence> - <_gbUseTelepresence type="bool">False</_gbUseTelepresence> - <tipSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings"> - <tipEndpointType type="int">1</tipEndpointType> - <tipResolution type="int">1</tipResolution> - <tipVersion type="int">1</tipVersion> - <tipSyntheticPayload type="bool">False</tipSyntheticPayload> - <tipMoreClips type="bool">False</tipMoreClips> - <_gbTipMoreClips type="int">0</_gbTipMoreClips> - <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2> - <tipRotationScheme type="int">0</tipRotationScheme> - <tipConfDuration type="int">1</tipConfDuration> - <tipConfDurationUnit type="int">1</tipConfDurationUnit> - <tipAudioDuration type="int">1</tipAudioDuration> - <tipAudioDurationUnit type="int">1</tipAudioDurationUnit> - <_gbTipPresentation type="bool">False</_gbTipPresentation> - <tipUsePresentationStream type="bool">False</tipUsePresentationStream> - <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip> - <tipAudioClip type="str">US_042.wav</tipAudioClip> - <tipStartAfter type="int">1</tipStartAfter> - <tipStartAfterUnit type="int">1</tipStartAfterUnit> - <tipDuration type="int">1</tipDuration> - <tipDurationUnit type="int">1</tipDurationUnit> - <tipPresentationRotation type="int">0</tipPresentationRotation> - <tipLegacyMode type="bool">False</tipLegacyMode> - <_gbTipLegacy type="int">0</_gbTipLegacy> - <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip> - <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio> - <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio> - <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio> - <tipG722Legacy type="bool">False</tipG722Legacy> - <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric> - <tipDinamicChannels type="bool">False</tipDinamicChannels> - <tipVideoRefresh type="bool">False</tipVideoRefresh> - <tipInbandSets type="bool">False</tipInbandSets> - <tipArithmetingCoding type="bool">False</tipArithmetingCoding> - <tipLTRP type="bool">False</tipLTRP> - <tipGDR type="bool">False</tipGDR> - <tipHighProfile type="bool">False</tipHighProfile> - <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia> - <tipRtcpFeedback type="bool">True</tipRtcpFeedback> - </tipSettings> - <_gbTosVideo type="bool">False</_gbTosVideo> - <enableTosVideo type="bool">False</enableTosVideo> - <tosVideo type="int">1</tosVideo> - <customTosVideo type="str">0x20</customTosVideo> - <_gbCustomTosVideo type="bool">False</_gbCustomTosVideo> - <tosValVideo type="int">32</tosValVideo> - <useMosVideo type="bool">False</useMosVideo> - <enableAcceptSSRCChanges type="bool">False</enableAcceptSSRCChanges> - <ignoreHintTrack type="bool">False</ignoreHintTrack> - <hintTrackType type="int">1</hintTrackType> - <enablePACSI type="bool">True</enablePACSI> - <useSingleNALUnit type="bool">False</useSingleNALUnit> - <_gbH323AdvancedSettings type="bool">False</_gbH323AdvancedSettings> - <useH323AdvancedSettings type="bool">False</useH323AdvancedSettings> - <_gbUseH323AdvancedSettings type="bool">False</_gbUseH323AdvancedSettings> - <rtpmap type="str"></rtpmap> - <fmtp type="str"></fmtp> - <isMP4 type="bool">False</isMP4> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">hintTrackType</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">videoMaxSessions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useSingleNALUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useConference</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">playTypeVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbUseH323AdvancedSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">isMP4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosValVideo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePACSI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_videoFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbUseTelepresence</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableVideoOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fmtp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbUseConference</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbH323AdvancedSettings</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">_gbTosVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTosVideo</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">ignoreHintTrack</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAcceptSSRCChanges</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useH323AdvancedSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">videoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rtpmap</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableVideo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">btnTelepresence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useMosVideo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoSettings> - <videoConfSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoConfSettings"> - <rotationScheme type="int">0</rotationScheme> - <_gbRotationScheme type="int">0</_gbRotationScheme> - <confVideoDuration type="int">0</confVideoDuration> - <confVideoDurationUnit type="int">0</confVideoDurationUnit> - <confDuration type="int">0</confDuration> - <confDurationUnit type="int">0</confDurationUnit> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">rotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confVideoDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">confDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbRotationScheme</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">confVideoDuration</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoConfSettings> - <videoTelepresenceSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_VideoTelepresenceSettings"> - <tipEndpointType type="int">0</tipEndpointType> - <tipResolution type="int">0</tipResolution> - <tipVersion type="int">0</tipVersion> - <tipSyntheticPayload type="bool">False</tipSyntheticPayload> - <tipMoreClips type="bool">False</tipMoreClips> - <_gbTipMoreClips type="int">0</_gbTipMoreClips> - <tipVideoClip2 type="str">Fire_avc.mp4</tipVideoClip2> - <tipRotationScheme type="int">0</tipRotationScheme> - <tipConfDuration type="int">0</tipConfDuration> - <tipConfDurationUnit type="int">0</tipConfDurationUnit> - <tipAudioDuration type="int">0</tipAudioDuration> - <tipAudioDurationUnit type="int">0</tipAudioDurationUnit> - <_gbTipPresentation type="bool">False</_gbTipPresentation> - <tipUsePresentationStream type="bool">False</tipUsePresentationStream> - <tipVideoClip type="str">Fire_avc.mp4</tipVideoClip> - <tipAudioClip type="str">US_042.wav</tipAudioClip> - <tipStartAfter type="int">0</tipStartAfter> - <tipStartAfterUnit type="int">0</tipStartAfterUnit> - <tipDuration type="int">0</tipDuration> - <tipDurationUnit type="int">0</tipDurationUnit> - <tipPresentationRotation type="int">0</tipPresentationRotation> - <tipLegacyMode type="bool">False</tipLegacyMode> - <_gbTipLegacy type="int">0</_gbTipLegacy> - <tipLegacyClip type="str">Fire_avc.mp4</tipLegacyClip> - <tipLegacyModeAudio type="bool">False</tipLegacyModeAudio> - <_gbTipLegacyAudio type="int">0</_gbTipLegacyAudio> - <tipLegacyClipAudio type="str">US_042.wav</tipLegacyClipAudio> - <tipG722Legacy type="bool">False</tipG722Legacy> - <tipAudioActivityMetric type="bool">False</tipAudioActivityMetric> - <tipDinamicChannels type="bool">False</tipDinamicChannels> - <tipVideoRefresh type="bool">False</tipVideoRefresh> - <tipInbandSets type="bool">False</tipInbandSets> - <tipArithmetingCoding type="bool">False</tipArithmetingCoding> - <tipLTRP type="bool">False</tipLTRP> - <tipGDR type="bool">False</tipGDR> - <tipHighProfile type="bool">False</tipHighProfile> - <tipUnrestrictedMedia type="bool">False</tipUnrestrictedMedia> - <tipRtcpFeedback type="bool">True</tipRtcpFeedback> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tipDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipRotationScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyMode</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipLegacyClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoRefresh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipUsePresentationStream</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipGDR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipStartAfterUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipArithmetingCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipLegacyAudio</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipConfDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipConfDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipG722Legacy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyClipAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipMoreClips</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipInbandSets</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipSyntheticPayload</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipVideoClip2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioDurationUnit</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipResolution</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipVideoClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipLegacyClipAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioDuration</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipLegacyModeAudio</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipPresentation</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipHighProfile</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipRtcpFeedback</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipVideoClip2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipMoreClips</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipDinamicChannels</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipEndpointType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTipLegacy</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tipLTRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipStartAfter</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tipAudioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipPresentationRotation</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipAudioActivityMetric</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tipUnrestrictedMedia</item> - <item ref="1"/> - </item> - </_dict> - </state> - </videoTelepresenceSettings> - <textSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TextSettings"> - <enableText type="bool">False</enableText> - <enableTextOWD type="bool">False</enableTextOWD> - <_gbEnableText type="bool">False</_gbEnableText> - <textClip type="str">The quick brown fox jumps over the lazy dog</textClip> - <textFormat type="str">Format: t140, Max duration: 42300 ms</textFormat> - <textChpsMin type="float">1.0</textChpsMin> - <textChpsMax type="float">1.0</textChpsMax> - <textBufferTime type="int">300</textBufferTime> - <textRedundancyLevel type="int">0</textRedundancyLevel> - <textPlayType type="int">0</textPlayType> - <textDuration type="int">5</textDuration> - <textDurationUnit type="int">1</textDurationUnit> - <_gbTosText type="bool">False</_gbTosText> - <enableTosText type="bool">False</enableTosText> - <tosText type="int">1</tosText> - <customTosText type="str">0x20</customTosText> - <_gbCustomTosText type="bool">False</_gbCustomTosText> - <tosValText type="int">32</tosValText> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tosValText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textClip</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">customTosText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textChpsMin</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textRedundancyLevel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textChpsMax</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textBufferTime</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textDuration</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTextOWD</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTosText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableText</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textPlayType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTosText</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">enableTosText</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">textFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">textDurationUnit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tosText</item> - <item ref="3"/> - </item> - </_dict> - </state> - </textSettings> - <t38Settings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T38Settings"> - <enableT38 type="bool">False</enableT38> - <_gbEnableT38 type="bool">False</_gbEnableT38> - <_gbEnableT38_2 type="bool">False</_gbEnableT38_2> - <faxImage type="str">Ixia2Pages.tif</faxImage> - <_faxFormat type="str">Format: TIFF, Img size: 1660 x 2291, Size: 140402 bytes</_faxFormat> - <t38TransportType type="int">1</t38TransportType> - <t38Port type="str">40000</t38Port> - <t38UdpEncapsulation type="int">0</t38UdpEncapsulation> - <_gbT38UdpEncapsulation type="bool">False</_gbT38UdpEncapsulation> - <t38PayloadType type="int">102</t38PayloadType> - <useFaxVersion type="bool">True</useFaxVersion> - <faxVersion type="int">0</faxVersion> - <useT38MaxBitrate type="bool">True</useT38MaxBitrate> - <t38MaxBitrate type="int">5</t38MaxBitrate> - <useT38RateMgmt type="bool">True</useT38RateMgmt> - <t38RateMgmt type="int">0</t38RateMgmt> - <useT38FillBitRemoval type="bool">False</useT38FillBitRemoval> - <t38FillBitRemoval type="int">0</t38FillBitRemoval> - <t38TranscodingMMR type="bool">False</t38TranscodingMMR> - <t38TranscodingJBIG type="bool">False</t38TranscodingJBIG> - <_gbUdpOptions type="bool">False</_gbUdpOptions> - <useErrorRecoverySchema type="bool">True</useErrorRecoverySchema> - <errorRecoverySchema type="int">0</errorRecoverySchema> - <useT38MaxDatagramSize type="bool">True</useT38MaxDatagramSize> - <t38MaxDatagramSize type="int">256</t38MaxDatagramSize> - <useT38MaxBufferSize type="bool">False</useT38MaxBufferSize> - <t38MaxBufferSize type="int">200</t38MaxBufferSize> - <imagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_T38Settings_imagesList" itemtype="ixConfig"/> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">t38TranscodingMMR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38UdpEncapsulation</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxBitrate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38RateMgmt</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38TranscodingJBIG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableT38</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38TransportType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableT38_2</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableT38</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">t38Port</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38FillBitRemoval</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">faxVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38FillBitRemoval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38RateMgmt</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">faxImage</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxBufferSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">errorRecoverySchema</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxDatagramSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxBufferSize</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_faxFormat</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38PayloadType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useT38MaxDatagramSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t38MaxBitrate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useFaxVersion</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbUdpOptions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbT38UdpEncapsulation</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">imagesList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useErrorRecoverySchema</item> - <item ref="1"/> - </item> - </_dict> - </state> - </t38Settings> - <t30Parameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_T30Parameters"> - <t30StationId type="str">5551[000-]</t30StationId> - <t30SendCoding type="int">0</t30SendCoding> - <t30SendDataRate type="int">5</t30SendDataRate> - <t30SendPageSize type="int">0</t30SendPageSize> - <t30SendMSLT type="int">0</t30SendMSLT> - <t30SendProtocol type="int">1</t30SendProtocol> - <t30SendResolution type="int">0</t30SendResolution> - <sendCNG type="int">1</sendCNG> - <t30ReceiveCoding type="int">2</t30ReceiveCoding> - <t30ReceivePageSize type="int">2</t30ReceivePageSize> - <t30ReceiveMSLT type="int">0</t30ReceiveMSLT> - <t30ReceiveProtocol type="int">1</t30ReceiveProtocol> - <t30ReceiveR8x3 type="bool">True</t30ReceiveR8x3> - <t30ReceiveR8x7 type="bool">True</t30ReceiveR8x7> - <t30ReceiveR8x15 type="bool">True</t30ReceiveR8x15> - <t30Receive200x200 type="bool">True</t30Receive200x200> - <t30ReceiveModulations type="int">3</t30ReceiveModulations> - <sendCedBeforeDIS type="int">1</sendCedBeforeDIS> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">t30SendResolution</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sendCedBeforeDIS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x7</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendPageSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x3</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">t30SendCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveProtocol</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">sendCNG</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendProtocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveMSLT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendMSLT</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30SendDataRate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceivePageSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveModulations</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveR8x15</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30StationId</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30ReceiveCoding</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">t30Receive200x200</item> - <item ref="1"/> - </item> - </_dict> - </state> - </t30Parameters> - <msrpSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPSettings"> - <enableMSRP type="bool">False</enableMSRP> - <_gbEnableMSRP type="bool">False</_gbEnableMSRP> - <msrpPort type="str">2855</msrpPort> - <domainType type="int">0</domainType> - <localDomain type="str">alice[00-99].example.com</localDomain> - <relays ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_relays" itemtype="ixConfig"/> - <relaysCount type="int">0</relaysCount> - <firstRelayIpEnabled type="bool">False</firstRelayIpEnabled> - <firstRelayIp type="str">10.10.10.1</firstRelayIp> - <firstRelayIsIPv4 type="bool">True</firstRelayIsIPv4> - <msrpRelayPort type="int">2855</msrpRelayPort> - <enableMSRPTos type="bool">False</enableMSRPTos> - <msrpTos type="int">0</msrpTos> - <customMSRPTos type="str">0x00</customMSRPTos> - <tosMSRPVal type="int">0</tosMSRPVal> - <automaticMSRPAuth type="bool">True</automaticMSRPAuth> - <msrpReuseTCP type="bool">True</msrpReuseTCP> - <msrpSendEmptyMsg type="bool">False</msrpSendEmptyMsg> - <msrpTransactionTimeout type="int">30000</msrpTransactionTimeout> - <msrpFirstChunkTimeout type="int">60000</msrpFirstChunkTimeout> - <msrpInterChunkTimeout type="int">30000</msrpInterChunkTimeout> - <msrpSessionTimeout type="int">70000</msrpSessionTimeout> - <msrpGuiFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_msrpGuiFiles" itemtype="ixConfig"/> - <files ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_MSRPSettings_files" itemtype="ixConfig"/> - <filesCount type="int">0</filesCount> - <advSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings"> - <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye> - </advSettings> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">customMSRPTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">filesCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIpEnabled</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">automaticMSRPAuth</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpSendEmptyMsg</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpTransactionTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpInterChunkTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tosMSRPVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableMSRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">localDomain</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">relaysCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">domainType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">advSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">files</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpFirstChunkTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">firstRelayIsIPv4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbMSRPCustomTos</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">msrpSessionTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableMSRP</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableMSRPTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpReuseTCP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpGuiFiles</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpTos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">relays</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msrpRelayPort</item> - <item ref="3"/> - </item> - </_dict> - </state> - </msrpSettings> - <_tempFile ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_FileRecord"> - <synthetic type="int">0</synthetic> - <_typeStr type="str"></_typeStr> - <name type="str"></name> - <nameSynthetic type="str"></nameSynthetic> - <fileClientPath type="str"></fileClientPath> - <filePcpuPath type="str"></filePcpuPath> - <_bFileSize type="int">20</_bFileSize> - <_msrpSizeCombo type="int">2</_msrpSizeCombo> - <size type="int">0</size> - <btnMSRPFileBrowse type="int">0</btnMSRPFileBrowse> - <type type="str">application/octet-stream</type> - <fileHash type="str"></fileHash> - </_tempFile> - <_tempAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MSRPAdvancedSettings"> - <closeTCPConnectionAfterBye type="bool">False</closeTCPConnectionAfterBye> - </_tempAdvSettings> - <phoneBookInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBookInputLabel"> - <label type="str">5</label> - </phoneBookInputLabel> - <akaConfigurationInputLabel ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfigurationInputLabel"> - <configurationLabel type="str"></configurationLabel> - </akaConfigurationInputLabel> - <phoneBook ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_PhoneBook"> - <fromFile type="int">0</fromFile> - <pattern type="str">201004[0000-]</pattern> - <filePath type="str"></filePath> - <_PN1 type="bool">False</_PN1> - <_bTelGrp type="bool">False</_bTelGrp> - <ckTelURIBook type="bool">False</ckTelURIBook> - <_bkTelURIparams type="str">phone-context=example.com</_bkTelURIparams> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">phoneBookList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">filePath</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">pattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ckTelURIBook</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_bkTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_PN1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_bTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fromFile</item> - <item ref="1"/> - </item> - </_dict> - </state> - </phoneBook> - <akaConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AKAConfiguration"/> - <milenageConfiguration ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MilenageConfiguration"/> - <msgBox ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_MsgBox"> - <msg1 type="str"></msg1> - <msg2 type="str"></msg2> - </msgBox> - <editCloudRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditCloudRule"> - <_gbStep1 type="bool">False</_gbStep1> - <requestList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_requestList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ANY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INVITE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">BYE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CANCEL</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">OPTIONS</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REGISTER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">NOTIFY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">SUBSCRIBE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REFER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">MESSAGE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">PRACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INFO</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">UPDATE</str> - </item> - </requestList> - <reqList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_reqList" itemtype="ixConfig"/> - <_gbStep2 type="bool">False</_gbStep2> - <what type="int">2</what> - <reqLine type="int">1</reqLine> - <headerTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditCloudRule_headerTypeList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">From</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Contact</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Also</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Call-ID</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Length</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Type</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Event</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authenticate</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RAck</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Record-Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Refer-To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Referred-By</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Replaces</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Subscription-State</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Via</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">WWW-Authenticate</str> - </item> - </headerTypeList> - <headerType type="str">To</headerType> - <compactForm type="str">t</compactForm> - <occurFrom type="str">1</occurFrom> - <occurTo type="str">1</occurTo> - <whatExtract type="int">3</whatExtract> - <extractHeaderName type="bool">False</extractHeaderName> - <paramName type="str"></paramName> - <revHeaderOrder type="bool">False</revHeaderOrder> - <keepHeaderCrlf type="bool">False</keepHeaderCrlf> - <_gbStep3 type="bool">False</_gbStep3> - <usePosition type="int">0</usePosition> - <beginAfter type="bool">False</beginAfter> - <afterStr type="str"><</afterStr> - <afterOccur type="str">1</afterOccur> - <endBefore type="bool">False</endBefore> - <endStr type="str">></endStr> - <endOccur type="str">last</endOccur> - <positionFrom type="str">1</positionFrom> - <positionTo type="str">last</positionTo> - <_gbStep4 type="bool">False</_gbStep4> - <formulaSource type="int">0</formulaSource> - <formula type="str"></formula> - <phoneBookPath type="str"></phoneBookPath> - <phoneBookDodPath type="str"></phoneBookDodPath> - <btnPBBrowse type="int">0</btnPBBrowse> - </editCloudRule> - <cloudRules ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CloudRules"> - <rulesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_CloudRules_rulesList" itemtype="ixConfig"/> - <cloudPhoneBooksAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</cloudPhoneBooksAbsolutePath> - </cloudRules> - <cloudServers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_VoIP_cloudServers" itemtype="ixConfig"/> - <transferAddress ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TransferAddress"> - <symTransferStr type="str">None</symTransferStr> - <overridePhoneNo type="bool">False</overridePhoneNo> - <_useTPb type="int">0</_useTPb> - <_tBp type="str"><None></_tBp> - <_tBpPrv type="str"></_tBpPrv> - <_tPhone type="str">150[00000000-]</_tPhone> - <tPhoneType type="int">0</tPhoneType> - <tPhone type="str">150[00000000-]</tPhone> - <_tTelGrp type="bool">False</_tTelGrp> - <_ckTTelURIParams type="bool">False</_ckTTelURIParams> - <_tTelURIparams type="str">phone-context=example.com</_tTelURIparams> - <transTelPar type="str"></transTelPar> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_tBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overridePhoneNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useTPb</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">transTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckTTelURIParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">symTransferStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_tBp</item> - <item ref="3"/> - </item> - </_dict> - </state> - </transferAddress> - <editContact ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditContact"> - <useDomainName type="int">0</useDomainName> - <domainName type="str">mysipdomain.ixiacom.com</domainName> - <_useEPb type="int">0</_useEPb> - <_eBp type="str"><None></_eBp> - <_eBpPrv type="str"></_eBpPrv> - <_ePhone type="str">160[00000000-]</_ePhone> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <_eTelGrp type="bool">False</_eTelGrp> - <_ckETelURI type="bool">False</_ckETelURI> - <_eTelURIparams type="str">phone-context=example.com</_eTelURIparams> - <editTelPar type="str"></editTelPar> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_useEPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">domainName</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_eBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_eTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useDomainName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">editTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckETelURI</item> - <item ref="1"/> - </item> - </_dict> - </state> - </editContact> - <dialPlan ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DialPlan"> - <sourceIPs type="str"></sourceIPs> - <_useSPb type="int">0</_useSPb> - <_sBp type="str"><None></_sBp> - <_sBpPrv type="str"></_sBpPrv> - <_sPhone type="str">{{pncalling}}</_sPhone> - <srcPhoneType type="int">0</srcPhoneType> - <srcPhone type="str">{{pncalling}}</srcPhone> - <_sTelGrp type="bool">False</_sTelGrp> - <_ckSTelURIParams type="bool">False</_ckSTelURIParams> - <_sTelURIparams type="str">phone-context=example.com</_sTelURIparams> - <srcTelPar type="str"></srcTelPar> - <_sTelGrp1 type="bool">False</_sTelGrp1> - <_dTelGrp1 type="bool">False</_dTelGrp1> - <symDestStr type="str">VoIP2_CALLED:{{sipportcalled}}</symDestStr> - <ovrDestPhone type="bool">True</ovrDestPhone> - <_useDPb type="int">0</_useDPb> - <_dBp type="str"><None></_dBp> - <_dBpPrv type="str"></_dBpPrv> - <_dPhone type="str">{{pncalled}}</_dPhone> - <destPhoneType type="int">0</destPhoneType> - <destPhone type="str">{{pncalled}}</destPhone> - <_dTelGrp type="bool">False</_dTelGrp> - <_ckDTelURIParams type="bool">False</_ckDTelURIParams> - <_dTelURIparams type="str">phone-context=example.com</_dTelURIparams> - <destTelPar type="str"></destTelPar> - <enableEmergencyCalls type="bool">False</enableEmergencyCalls> - <useAnonymous type="bool">False</useAnonymous> - <makeEmergencyReg type="bool">False</makeEmergencyReg> - <emergencyService type="str">sos</emergencyService> - <emergencyServiceList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_DialPlan_emergencyServiceList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.ambulance</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.fire</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">sos.police</str> - </item> - </emergencyServiceList> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_useSPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelGrp1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sourceIPs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableEmergencyCalls</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_sPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useAnonymous</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">symDestStr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergencyDest</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_sBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">makeEmergencyReg</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">destPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcTelPar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergencySource</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_ckSTelURIParams</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_dBp</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ovrDestPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelGrp1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">emergencyServiceList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_dPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcPhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbEmergency</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_sTelURIparams</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_UseSrv1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srcPhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sBpPrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_sTelGrp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">emergencyService</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useDPb</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ckDTelURIParams</item> - <item ref="1"/> - </item> - </_dict> - </state> - </dialPlan> - <signalingSettings ver="[1, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SignalingSettings"> - <enableSIP type="bool">True</enableSIP> - <port type="str">{{sipportcalling}}</port> - <tcpWriteImmediate type="bool">False</tcpWriteImmediate> - <fqdn type="bool">False</fqdn> - <realm type="str"></realm> - <user type="str">{{pncalling}}@{{domainname}}</user> - <passwd type="str">{{authpassword}}</passwd> - <akaConfCombo type="str"><None></akaConfCombo> - <akaConfComboSelIndex type="int">0</akaConfComboSelIndex> - <akaSharedSecretType type="int">0</akaSharedSecretType> - <akaOperatorVariantType type="int">0</akaOperatorVariantType> - <akaSharedSecretSequence type="str">ixia</akaSharedSecretSequence> - <akaAbsolutePath type="str">C:\Users\asordo\Documents\__Customers\Orange\OPNFV2_Lannion</akaAbsolutePath> - <akaOperatorVariantSequence type="str">ixia</akaOperatorVariantSequence> - <akaSharedSecretSource type="int">0</akaSharedSecretSource> - <akaOperatorVariantSource type="int">0</akaOperatorVariantSource> - <akaExportComplete type="int">0</akaExportComplete> - <akaUseOPasOPC type="bool">False</akaUseOPasOPC> - <milenageConfCombo type="str"><Default></milenageConfCombo> - <milenage_c1 type="str">00000000000000000000000000000000</milenage_c1> - <milenage_c2 type="str">00000000000000000000000000000001</milenage_c2> - <milenage_c3 type="str">00000000000000000000000000000002</milenage_c3> - <milenage_c4 type="str">00000000000000000000000000000004</milenage_c4> - <milenage_c5 type="str">00000000000000000000000000000008</milenage_c5> - <milenage_r1 type="int">64</milenage_r1> - <milenage_r2 type="int">0</milenage_r2> - <milenage_r3 type="int">32</milenage_r3> - <milenage_r4 type="int">64</milenage_r4> - <milenage_r5 type="int">96</milenage_r5> - <enableTos type="bool">False</enableTos> - <tos type="int">0</tos> - <customSipTos type="str">0x00</customSipTos> - <tosVal type="int">0</tosVal> - <ovrTrans type="bool">False</ovrTrans> - <ovrTransOption type="int">0</ovrTransOption> - <useServer type="bool">True</useServer> - <srvAddr type="str">{{iplistims}}</srvAddr> - <srvPort type="str">5060</srvPort> - <srvDomain type="str">{{domainname}}</srvDomain> - <outboundProxy type="bool">False</outboundProxy> - <useDnsSrv type="bool">False</useDnsSrv> - <registrarSrv type="bool">True</registrarSrv> - <autoRegister type="bool">True</autoRegister> - <overrideRegistrar type="bool">False</overrideRegistrar> - <overrideRegistrarAddress type="str">IP:PORT</overrideRegistrarAddress> - <ovrContact type="bool">False</ovrContact> - <ovrDest type="bool">True</ovrDest> - <ovrDestHostPort type="str">{{domainname}}</ovrDestHostPort> - <nUdpMaxSize type="int">2048</nUdpMaxSize> - <enableSigComp type="bool">False</enableSigComp> - <telURISource type="bool">False</telURISource> - <telURIDest type="bool">False</telURIDest> - <securityMechanismValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SignalingSettings_securityMechanismValList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SecurityMechanismVal"> - <checked type="bool">False</checked> - <mechanism type="str">ipsec-3gpp</mechanism> - <algorithm type="int">0</algorithm> - <algorithmStr type="str">hmac-sha-1-96</algorithmStr> - <protocol type="int">0</protocol> - <protocolStr type="str">esp</protocolStr> - <mode type="int">0</mode> - <modeStr type="str">trans</modeStr> - <encrypt_algorithm type="int">0</encrypt_algorithm> - <encrypt_algorithmStr type="str">aes-cbc</encrypt_algorithmStr> - <spi_start_idx type="int">255</spi_start_idx> - <port_c type="str">[3000-4000]</port_c> - <port_s type="str">4060</port_s> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">protocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">encrypt_algorithmStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">algorithm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">modeStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">protocolStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mechanism</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">algorithmStr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">mode</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port_s</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">port_c</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">spi_start_idx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">encrypt_algorithm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - </securityMechanismValList> - <useIPSecDoubleSPIPatch type="bool">False</useIPSecDoubleSPIPatch> - <enablePeriodicDNSQueries type="bool">False</enablePeriodicDNSQueries> - <DNSTimeoutValue type="int">60</DNSTimeoutValue> - <skipDeleteDNSRecordsAtLoopEnd type="bool">False</skipDeleteDNSRecordsAtLoopEnd> - <enableVoLTE type="bool">False</enableVoLTE> - <mediaBearerType type="int">0</mediaBearerType> - <enableCCDedicatedBearer type="bool">True</enableCCDedicatedBearer> - <volte_grbox type="bool">False</volte_grbox> - <_enableAutoHeaders type="bool">False</_enableAutoHeaders> - <_btnAutoHeaders type="bool">False</_btnAutoHeaders> - <dontEndMediaOnBye type="bool">False</dontEndMediaOnBye> - <closeTCPConnectionsOnRampdown type="bool">False</closeTCPConnectionsOnRampdown> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbSrvSettings</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_btnAutoHeaders</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpWriteImmediate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableAutoHeaders</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSIP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fqdn</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretSource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenageConfCombo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c5</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaConfCombo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_UseSrv1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideRegistrar</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">port</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">registrarSrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r5</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_r1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tos</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">user</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantSource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">telURISource</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useServer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">nUdpMaxSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmit1xx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvDomain</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_btnEditContact1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">telURIDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enablePeriodicDNSQueries</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useIPSecDoubleSPIPatch</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">securityMechanismValList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">skipDeleteDNSRecordsAtLoopEnd</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideRegistrarAddress</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvAddr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrDestHostPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">DNSTimeoutValue</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tosVal</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">passwd</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoRegister</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSigComp</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">akaOperatorVariantSequence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableVoLTE</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmitACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaSharedSecretSequence</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">volte_grbox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">customSipTos</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">dontEndMediaOnBye</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">realm</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaExportComplete</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">mediaBearerType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbPeriodicDNSQuery</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">milenage_c1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaUseOPasOPC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ovrDest1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">outboundProxy</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">closeTCPConnectionsOnRampdown</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrContact</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaAbsolutePath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serverAddresses</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableCCDedicatedBearer</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">akaConfComboSelIndex</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbCustomTos</item> - <item ref="4"/> - </item> - <item type="tuple"> - <item type="str">ovrTrans</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useDnsSrv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTransOption</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableSIP2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableSIP1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">srvPort</item> - <item ref="1"/> - </item> - </_dict> - </state> - </signalingSettings> - <timerSettings ver="[2, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TimerSettings"> - <enableTimers type="bool">True</enableTimers> - <expirationValList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_expirationValList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">REGISTER</message> - <msgPart type="int">0</msgPart> - <msgPartStr type="str">Expires Header(s)</msgPartStr> - <value type="int">3600</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">INVITE</message> - <msgPart type="int">2</msgPart> - <msgPartStr type="str">Session-Expire(s)</msgPartStr> - <value type="int">90</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ExpirationVal"> - <checked type="bool">True</checked> - <message type="str">UPDATE</message> - <msgPart type="int">2</msgPart> - <msgPartStr type="str">Session-Expire(s)</msgPartStr> - <value type="int">90</value> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">message</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">msgPart</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">checked</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">value</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">msgPartStr</item> - <item ref="1"/> - </item> - </_dict> - </state> - </item> - </expirationValList> - <sessionRefreshType type="int">1</sessionRefreshType> - <refreshAfterSecs type="int">3000</refreshAfterSecs> - <refreshAfterPercent type="int">50</refreshAfterPercent> - <refreshInSecs type="int">32</refreshInSecs> - <enableRetransmissions type="bool">False</enableRetransmissions> - <T1 type="int">500</T1> - <T2 type="int">4000</T2> - <ignoreRetransmissions type="bool">True</ignoreRetransmissions> - <retransmitACK type="bool">True</retransmitACK> - <stopActiveRetr type="bool">True</stopActiveRetr> - <retransmit1xx type="bool">False</retransmit1xx> - <ovrTimeout type="bool">False</ovrTimeout> - <minInterReregister type="int">0</minInterReregister> - <autoEndCall2 type="bool">False</autoEndCall2> - <enableAutoPRACK type="bool">False</enableAutoPRACK> - <rprSendNegotiatedSDP type="bool">False</rprSendNegotiatedSDP> - <rprTimeUntilNextRPR type="int">150</rprTimeUntilNextRPR> - <rprScenarioHasPRACK type="bool">False</rprScenarioHasPRACK> - <auto4xx type="bool">False</auto4xx> - <auto4xxAbort type="bool">False</auto4xxAbort> - <autoProcedureList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TimerSettings_autoProcedureList" itemtype="ixConfig"/> - <autoProceduresCount type="int">0</autoProceduresCount> - <procListChanged type="bool">True</procListChanged> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">btnRefreshProcList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoEndCall</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreRetransmissions</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">minInterReregister</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoEndCall2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTimers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshInSecs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">retransmit1xx</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbEnableTimers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrTimeout</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sessionRefreshType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">auto4xx</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">retransmitACK</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">procListChanged</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">T2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">autoProcedureList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbAutoPRACK</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">T1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshAfterPercent</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableAutoPRACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stopActiveRetr</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableRetransmissions</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rprTimeUntilNextRPR</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">rprScenarioHasPRACK</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">expirationValList</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">refreshAfterSecs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">autoProceduresCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">auto4xxAbort</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">rprSendNegotiatedSDP</item> - <item ref="1"/> - </item> - </_dict> - </state> - </timerSettings> - <advancedSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AdvancedSettings"> - <useCloud type="bool">False</useCloud> - <_useCloud1 type="bool">False</_useCloud1> - <cloud type="str"><None></cloud> - <serverRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_serverRules" itemtype="ixConfig"/> - <enableVirtualIPs type="bool">False</enableVirtualIPs> - <virtualIPTable ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AdvancedSettings_virtualIPTable" itemtype="ixConfig"/> - <ovrCloudRules type="bool">False</ovrCloudRules> - <_ovrCloudRules1 type="bool">False</_ovrCloudRules1> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbVirtualIPs</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">useCloud</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ovrCloudRules</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_ovrCloudRules1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">cloud</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableVirtualIPs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">virtualIPTable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">serverRules</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_useCloud1</item> - <item ref="3"/> - </item> - </_dict> - </state> - </advancedSettings> - <tlsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsSettings"> - <enableTLS type="bool">False</enableTLS> - <enableDTLS type="bool">False</enableDTLS> - <enableTLS_MSRP type="bool">False</enableTLS_MSRP> - <enableTLS_HTTP type="bool">False</enableTLS_HTTP> - <_enableTLS1 type="bool">False</_enableTLS1> - <_enableTLS2 type="bool">False</_enableTLS2> - <_enableTLS3 type="bool">False</_enableTLS3> - <tlsPort type="str">5061</tlsPort> - <tlsProtocol type="int">3</tlsProtocol> - <tlsSessionRefresh type="bool">False</tlsSessionRefresh> - <_tlsSessionRefresh type="bool">False</_tlsSessionRefresh> - <tlsRefreshInterval type="int">3600</tlsRefreshInterval> - <tlsAuthClient type="int">0</tlsAuthClient> - <tlsReuseConnection type="bool">False</tlsReuseConnection> - <_tlsReuseConnection type="bool">False</_tlsReuseConnection> - <ignoreSubjectAltName type="bool">False</ignoreSubjectAltName> - <tlsMutual type="bool">False</tlsMutual> - <_gbTlsMutual type="bool">False</_gbTlsMutual> - <tlsCyphers ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_TlsSettings_tlsCyphers" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES128-GCM-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES256-GCM-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-RSA-AES128-GCM-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES256-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-ECDSA-AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">ECDHE-RSA-AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">AES128-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">True</enabled> - <name type="str">AES256-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-ECDSA-AES256-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-ECDSA-AES128-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES256-GCM-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES128-SHA256</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">ECDHE-RSA-AES256-SHA384</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">DES-CBC3-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-RC2-CBC-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP-RC4-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP1024-DES-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">EXP1024-RC4-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">IDEA-CBC-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">NULL-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">NULL-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">RC4-MD5</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_TlsCyphers"> - <enabled type="bool">False</enabled> - <name type="str">RC4-SHA</name> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">enabled</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">name</item> - <item ref="3"/> - </item> - </_dict> - </state> - </item> - </tlsCyphers> - <tlsCertificatesPath type="str">C:\Program Files (x86)\Ixia\IxLoad\8.20-EA\aptixia\data\SSL_Certificates</tlsCertificatesPath> - <tlsPrivateKeyCertificate type="str">Unsecured_RSA_key_1024.pem</tlsPrivateKeyCertificate> - <tlsPublicKeyCertificate type="str">Unsecured_RSA_cert_1024.pem</tlsPublicKeyCertificate> - <tlsKeyType type="int">0</tlsKeyType> - <tlsCertType type="int">0</tlsCertType> - <tlsPassword type="str"></tlsPassword> - <sipScheme type="int">0</sipScheme> - <tlsTransportType type="int">0</tlsTransportType> - <tlsDisableUdpAndTcp type="bool">True</tlsDisableUdpAndTcp> - <tlsEnableTcpKeepAlive type="bool">False</tlsEnableTcpKeepAlive> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tlsCertType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPassword</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ignoreSubjectAltName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsPrivateKeyCertificate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsTransportType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTLS_HTTP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsCyphers</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsProtocol</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsKeyType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tlsSessionRefresh</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tlsCertificatesPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsEnableTcpKeepAlive</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbTlsMutual</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tlsPublicKeyCertificate</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableCert</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableTLS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsAuthClient</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsMutual</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS4</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS1</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS2</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_enableTLS3</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableDTLS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTLS_MSRP</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsReuseConnection</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsRefreshInterval</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsSessionRefresh</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tlsDisableUdpAndTcp</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">sipScheme</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_tlsReuseConnection</item> - <item ref="3"/> - </item> - </_dict> - </state> - </tlsSettings> - <dtlsOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_DtlsOptions"> - <dtlsRetry type="int">200</dtlsRetry> - <dtlsTimeout type="int">30000</dtlsTimeout> - <dtlsSessionTicket type="bool">False</dtlsSessionTicket> - </dtlsOptions> - <iceOptions ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_IceOptions"> - <iceRetryCount type="int">6</iceRetryCount> - <iceInitialRetry type="int">100</iceInitialRetry> - <iceTimeout type="int">30000</iceTimeout> - </iceOptions> - <otherSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_OtherSettings"> - <VOIP_Var0 type="str"></VOIP_Var0> - <VOIP_Var1 type="str"></VOIP_Var1> - <VOIP_Var2 type="str"></VOIP_Var2> - <VOIP_Var3 type="str"></VOIP_Var3> - <VOIP_Var4 type="str"></VOIP_Var4> - <VOIP_IPAddress0 type="str"></VOIP_IPAddress0> - <VOIP_IPAddress1 type="str"></VOIP_IPAddress1> - <VOIP_IPAddress2 type="str"></VOIP_IPAddress2> - <VOIP_IPAddress3 type="str"></VOIP_IPAddress3> - <VOIP_IPAddress4 type="str"></VOIP_IPAddress4> - <ipPreference type="int">0</ipPreference> - <bUseHardcoded type="bool">False</bUseHardcoded> - <_gbHardcodedForDemo type="bool">False</_gbHardcodedForDemo> - <_gbStunSettings type="bool">False</_gbStunSettings> - <bUseStun type="bool">False</bUseStun> - <stunAddr type="str">127.0.0.1</stunAddr> - <stunPort type="str">3478</stunPort> - <bUseIce type="bool">False</bUseIce> - <bIceLite type="bool">False</bIceLite> - <_gbSRVCCSettings type="bool">False</_gbSRVCCSettings> - <bUseSRVCC type="bool">False</bUseSRVCC> - <mobilityPath type="str"></mobilityPath> - <ddgGroupboxSRVCC type="bool">False</ddgGroupboxSRVCC> - <PCO_Groupbox type="bool">False</PCO_Groupbox> - <bUsePCO type="bool">False</bUsePCO> - <_gbPCO type="bool">False</_gbPCO> - <PCO_List type="str"></PCO_List> - <useBHCA type="bool">False</useBHCA> - <loadVariablesFromCsv type="bool">False</loadVariablesFromCsv> - <pathForCsvWithVariables type="str"></pathForCsvWithVariables> - <absolutePathForCsvWithVariables type="str"></absolutePathForCsvWithVariables> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">_gbIceSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">_gbPCO</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress4</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress0</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_IPAddress2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUseIce</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">mobilityPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var0</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbStunSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">PCO_List</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_gbSRVCCSettings</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">absolutePathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bIceLite</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">PCO_Groupbox</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">bUseHardcoded</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">bUseSRVCC</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useBHCA</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ipPreference</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnBrowseForVariableCsv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUsePCO</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stunPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">bUseStun</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">stunAddr</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ddgGroupboxSRVCC</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">_gbHardcodedForDemo</item> - <item ref="2"/> - </item> - <item type="tuple"> - <item type="str">pathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">DodPathForCsvWithVariables</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">_varCsvGroupBox</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var1</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">loadVariablesFromCsv</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var3</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var2</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">VOIP_Var4</item> - <item ref="1"/> - </item> - </_dict> - </state> - </otherSettings> - <smsSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSSettings"> - <enableSMS type="bool">False</enableSMS> - <requestURI type="str">sc.home1.net</requestURI> - <enableTelURI type="bool">False</enableTelURI> - <telURI type="str">phone-context=example</telURI> - <smscPhoneNo type="str">61814712345</smscPhoneNo> - <smscTypeOfNo type="int">0</smscTypeOfNo> - <smscNumberingPlan type="int">0</smscNumberingPlan> - <enableSMOrigOverrideDest type="bool">False</enableSMOrigOverrideDest> - <btnSMOrigEdit type="bool">False</btnSMOrigEdit> - <enableSMOrigReqStatusReport type="bool">False</enableSMOrigReqStatusReport> - <enableSMOrigReplyPath type="bool">False</enableSMOrigReplyPath> - <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo"> - <phoneType type="bool">False</phoneType> - <phoneValue type="str">160[00000000-]</phoneValue> - <comboPhoneBookEntry type="str"><None></comboPhoneBookEntry> - </smsAddressOriginator> - <smOrigTypeOfNo type="int">0</smOrigTypeOfNo> - <smOrigNumberingPlan type="int">0</smOrigNumberingPlan> - <enableSMRecipOverrideSrc type="bool">False</enableSMRecipOverrideSrc> - <btnSMRecipEdit type="bool">False</btnSMRecipEdit> - <enableSMRecipReqStatusReport type="bool">False</enableSMRecipReqStatusReport> - <enableSMRecipReplyPath type="bool">False</enableSMRecipReplyPath> - <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddressInfo"> - <phoneType type="bool">False</phoneType> - <phoneValue type="str">160[00000000-]</phoneValue> - <comboPhoneBookEntry type="str"><None></comboPhoneBookEntry> - </smsAddressRecipient> - <smRecipTypeOfNo type="int">0</smRecipTypeOfNo> - <smRecipNumberingPlan type="int">0</smRecipNumberingPlan> - <depActivities ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_depActivities" itemtype="ixConfig"/> - <useFilesFromActivity type="bool">False</useFilesFromActivity> - <verifyUserInfo type="bool">False</verifyUserInfo> - <smsImportFilesActivity type="str">None</smsImportFilesActivity> - <smsActivityForFiles type="int">0</smsActivityForFiles> - <pcpuCommonPath type="str"></pcpuCommonPath> - <smsFiles ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_SMSSettings_smsFiles" itemtype="ixConfig"/> - <smsFilesCount type="int">0</smsFilesCount> - <grBoxSMServiceCenter type="bool">False</grBoxSMServiceCenter> - <grBoxSMOriginator type="bool">False</grBoxSMOriginator> - <grBoxSMRecipient type="bool">False</grBoxSMRecipient> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">smOrigNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFiles</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMS</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigReplyPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFilesCount</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSMRecipEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigReqStatusReport</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMRecipient</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipOverrideSrc</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMOriginator</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smsAddressOriginator</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">telURI</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">depActivities</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">pcpuCommonPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smOrigTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smRecipTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">requestURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsFilesBackup</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsAddressRecipient</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">useFilesFromActivity</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smRecipNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smscPhoneNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsImportFilesActivity</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipReplyPath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSMOrigEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smscNumberingPlan</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">duringLoadFromBackup</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMRecipReqStatusReport</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">grBoxSMServiceCenter</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">verifyUserInfo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">smscTypeOfNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">enableSMOrigOverrideDest</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">smsActivityForFiles</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsSettings> - <smsFilesAdd ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSFilesAdd"> - <loadedFileType type="int">0</loadedFileType> - <fileName type="str"></fileName> - <ixSmsFileName type="str"></ixSmsFileName> - <ixSmsFilePath type="str"></ixSmsFilePath> - <segmentOrder type="str"></segmentOrder> - <totalTpudSize type="str"></totalTpudSize> - <segmentNo type="str">0</segmentNo> - <comboCoding type="int">0</comboCoding> - <comboRefNo type="int">0</comboRefNo> - <contentViewEdit type="str"></contentViewEdit> - <contentViewShow type="str"></contentViewShow> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">contentViewShow</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">ixSmsFilePath</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">contentViewEdit</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">segmentOrder</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboRefNo</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">loadedFileType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSmsLoadFiles</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ixSmsFileName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">btnSmsSaveAs</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fileName</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">segmentNo</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">totalTpudSize</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboCoding</item> - <item ref="3"/> - </item> - </_dict> - </state> - </smsFilesAdd> - <smsAddressOriginator ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress"> - <radioBtnPhoneNo type="int">0</radioBtnPhoneNo> - <comboPhoneBook type="str"><None></comboPhoneBook> - <phoneBookPreview type="str"></phoneBookPreview> - <userPattern type="str">160[00000000-]</userPattern> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <fakeEnableTelURI type="bool">False</fakeEnableTelURI> - <fakeTelURI type="str"></fakeTelURI> - <fakeTelToPort type="str"></fakeTelToPort> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">userPattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneBookPreview</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeEnableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboPhoneBook</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fakeTelToPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">radioBtnPhoneNo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsAddressOriginator> - <smsAddressRecipient ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SMSAddress"> - <radioBtnPhoneNo type="int">0</radioBtnPhoneNo> - <comboPhoneBook type="str"><None></comboPhoneBook> - <phoneBookPreview type="str"></phoneBookPreview> - <userPattern type="str">160[00000000-]</userPattern> - <ePhoneType type="int">0</ePhoneType> - <ePhone type="str">160[00000000-]</ePhone> - <fakeEnableTelURI type="bool">False</fakeEnableTelURI> - <fakeTelURI type="str"></fakeTelURI> - <fakeTelToPort type="str"></fakeTelToPort> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">userPattern</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">phoneBookPreview</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhoneType</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">ePhone</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeEnableTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">comboPhoneBook</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">fakeTelToPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">fakeTelURI</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">radioBtnPhoneNo</item> - <item ref="1"/> - </item> - </_dict> - </state> - </smsAddressRecipient> - <compatibility ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_Compatibility"> - <hasRtpChMapRules type="bool">True</hasRtpChMapRules> - </compatibility> - <editAutoHeaderRule ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_EditAutoHeaderRule"> - <defaultMessagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_defaultMessagesList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INVITE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">ACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">BYE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CANCEL</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">OPTIONS</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REGISTER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">NOTIFY</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">SUBSCRIBE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">REFER</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">MESSAGE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">PRACK</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">INFO</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">UPDATE</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">100 (Trying)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">180 (Ringing)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">181 (Call Is Being Forwarded)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">182 (Queued)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">183 (Session Progress)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">200 (OK)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">202 (Accepted)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">300 (Multiple Choices)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">301 (Moved Permanently)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">302 (Moved Temporarily)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">305 (Use Proxy)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">380 (Alternative Service)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">400 (Bad Request)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">401 (Unauthorized)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">402 (Payment Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">403 (Forbidden)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">404 (Not Found)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">405 (Method Not Allowed)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">406 (Not Acceptable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">407 (Proxy Authentication Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">408 (Request Timeout)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">410 (Gone)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">413 (Request Entity Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">414 (Request-URI Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">415 (Unsupported Media Type)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">416 (Unsupported URI Scheme)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">420 (Bad Extension)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">421 (Extension Required)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">423 (Interval Too Brief)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">480 (Temporarily not available)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">481 (Call Leg/Transaction Does Not Exist)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">482 (Loop Detected)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">483 (Too Many Hops)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">484 (Address Incomplete)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">485 (Ambiguous)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">486 (Busy Here)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">487 (Request Terminated)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">488 (Not Acceptable Here)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">491 (Request Pending)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">493 (Undecipherable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">500 (Internal Server Error)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">501 (Not Implemented)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">502 (Bad Gateway)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">503 (Service Unavailable)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">504 (Server Time-out)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">505 (SIP Version not supported)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">513 (Message Too Large)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">600 (Busy Everywhere)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">603 (Decline)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">604 (Does not exist anywhere)</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">606 (Not Acceptable)</str> - </item> - </defaultMessagesList> - <messagesList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_messagesList" itemtype="ixConfig"/> - <autoHeaderTypeList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_autoHeaderTypeList" itemtype="ixConfig"> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Request-Uri</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Via</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">From</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Call-ID</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">CSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Contact</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Content-Length</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Record-Route</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Proxy-Authorization</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Referred-By</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Replaces</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Event</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RAck</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">RSeq</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Refer-To</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Subscription-State</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">WWW-Authenticate</str> - </item> - <item ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_CString"> - <str type="str">Also</str> - </item> - </autoHeaderTypeList> - <autoHeaderType type="str">To</autoHeaderType> - <option type="int">0</option> - <appendToUri type="bool">False</appendToUri> - <headerValue type="str"></headerValue> - <parsedHeader ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_EditAutoHeaderRule_parsedHeader" itemtype="ixConfig"/> - <valid type="bool">True</valid> - </editAutoHeaderRule> - <autoHeadersSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_AutoHeadersSettings"> - <enableAutoHeaders type="bool">False</enableAutoHeaders> - <tableRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_tableRules" itemtype="ixConfig"/> - <reqAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_reqAutoHeadRules" itemtype="ixConfig"/> - <respAutoHeadRules ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyGroupSequence_AutoHeadersSettings_respAutoHeadRules" itemtype="ixConfig"/> - </autoHeadersSettings> - <sipAdvSettings ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_SipAdvancedSettings"> - <overrideTCPLocalPort type="bool">False</overrideTCPLocalPort> - <tcpLocalPortStart type="int">40000</tcpLocalPortStart> - <tcpLocalPortEnd type="int">60000</tcpLocalPortEnd> - <tcpLocalPortStep type="int">1</tcpLocalPortStep> - <closeNonsecureTcpConnectionsEnable type="bool">False</closeNonsecureTcpConnectionsEnable> - <closeIdleTcpConnectionsEnable type="bool">False</closeIdleTcpConnectionsEnable> - <tcpIdlePeriod type="int">10</tcpIdlePeriod> - <donotCloseTCPInsideCallEnable type="bool">False</donotCloseTCPInsideCallEnable> - <recordingServerEnable type="bool">False</recordingServerEnable> - <state ver="[0, [0, [0]]]" type="ixPropertyStateDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">tcpIdlePeriod</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpEndPortLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpIdlePeriodLabel</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">donotCloseTCPInsideCallEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">tcpPortStepLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortStep</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortEnd</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpStartPortLabel</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">tcpLocalPortStart</item> - <item ref="3"/> - </item> - <item type="tuple"> - <item type="str">closeIdleTcpConnectionsEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">recordingServerEnable</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">overrideTCPLocalPort</item> - <item ref="1"/> - </item> - <item type="tuple"> - <item type="str">closeNonsecureTcpConnectionsEnable</item> - <item ref="1"/> - </item> - </_dict> - </state> - </sipAdvSettings> - </pm> - <objectID type="int">6</objectID> - <_apiUniqueId type="int">16382</_apiUniqueId> - <uniqueID type="int">39</uniqueID> - <commandIdCounter type="int">59</commandIdCounter> - <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport"> - <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"/> - </serializedNetworkSettingsMap> - <protocolName type="str">VoIP</protocolName> - </networkPluginSettings> - </item> - </agentList> - </traffic> - <network ver="[17, [1, [6, [1, [0, [0]]]]]]" type="ixNetworkGroup"> - <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp> - <name type="str">VM1</name> - <role type="str">Both</role> - <networkType type="str">none</networkType> - <aggregation type="int">0</aggregation> - <lineSpeed type="str">Default</lineSpeed> - <cpuAggregation type="bool">False</cpuAggregation> - <chassisChain ref="6"/> - <cardType type="str">Ixia Virtual Load Module</cardType> - <activePortList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"/> - <portList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" oid="21" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"> - <item ver="[3, [1, [1, [0, [0]]]]]" type="ixPort"> - <chassisId type="int">1</chassisId> - <cardId type="int">1</cardId> - <portId type="int">1</portId> - <enableCapture type="bool">False</enableCapture> - <cardType type="str">Ixia Virtual Load Module</cardType> - <portPersistentSetting ver="[0, [1, [0, [0]]]]" type="ixPortPersistentSetting"> - <viewFilter type="NoneType">None</viewFilter> - </portPersistentSetting> - <analyzerPartialCapture type="str">False;8192</analyzerPartialCapture> - <name type="str"></name> - <afmPort type="NoneType">None</afmPort> - </item> - </portList> - <comment type="str"></comment> - <networkRangeList ver="[0, [2, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkRangeListSequenceContainer" itemtype="ixNetworkRange"> - <item ver="[13, [1, [1, [1, [0, [0]]]]]]" oid="15" type="ixNetworkRange"> - <_smRangeObjectId type="str">5affc0a7-68f6-46f6-b801-0e18e067a572</_smRangeObjectId> - <name type="str">Network Range IP-R13 in VM1 ({{ipcard1}}+1)</name> - <rangeGroup ver="[3, [0, [1, [0, [0]]]]]" oid="16" type="ixIpDistributionGroup"> - <name type="str">Group1</name> - <ipDistributionMethod type="str">consecutiveIps</ipDistributionMethod> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">15457</_apiUniqueId> - <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixNetworkRange"> - <item ref="15"/> - </_networkRangeList> - <_rangeGroupObjectId type="str">abf2b6e4-a102-4cbe-bf1b-a11f11b2faac</_rangeGroupObjectId> - <_smPluginObjectId type="str">9ea551b2-a0af-4a7d-9872-e9b94298d7bd</_smPluginObjectId> - </rangeGroup> - <enableStats type="bool">False</enableStats> - </item> - </networkRangeList> - <layerPlugins type="NoneType">None</layerPlugins> - <stack type="NoneType">None</stack> - <rangeGroupList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixIpDistributionGroupList" itemtype="ixIpDistributionGroup"> - <item ref="16"/> - </rangeGroupList> - <dynamicControlPlaneSetting type="int">0</dynamicControlPlaneSetting> - <linkLayerOptions type="int">0</linkLayerOptions> - <ipSourcePortFrom type="int">1024</ipSourcePortFrom> - <ipSourcePortTo type="int">65535</ipSourcePortTo> - <emulatedRouterGateway type="str">0.0.0.0</emulatedRouterGateway> - <emulatedRouterSubnet type="str">255.255.0.0</emulatedRouterSubnet> - <emulatedRouterGatewayIPv6 type="str">::</emulatedRouterGatewayIPv6> - <emulatedRouterSubnetIPv6 type="str">FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0</emulatedRouterSubnetIPv6> - <emulatedRouterIpAddressPool ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="ixEmulatedRouterIpAddressRange"/> - <macMappingMode type="int">0</macMappingMode> - <arpSettings ver="[0, [1, [0, [0]]]]" type="ixArpSettings"> - <gratuitousArp type="bool">True</gratuitousArp> - <processGratArp type="bool">False</processGratArp> - </arpSettings> - <dnsParameters ver="[1, [1, [0, [0]]]]" type="ixDns"> - <enable type="bool">False</enable> - <cacheTimeout type="int">30000</cacheTimeout> - <serverList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsServerItem"/> - <suffixList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsSuffixItem"/> - </dnsParameters> - <tcpParameters ver="[0, [1, [0, [0]]]]" type="ixTcpParameters"> - <tcpParametersFull ver="[4, [1, [0, [0]]]]" oid="17" type="ixTcpParametersFull"> - <enableCongestionNotification type="bool">False</enableCongestionNotification> - <enableTimeStamp type="bool">True</enableTimeStamp> - <timeWaitRecycle type="bool">True</timeWaitRecycle> - <timeWaitReuse type="bool">False</timeWaitReuse> - <enableTxBwLimit type="bool">False</enableTxBwLimit> - <txBwLimitUnit type="int">0</txBwLimitUnit> - <txBwLimit type="int">1024</txBwLimit> - <enableRxBwLimit type="bool">False</enableRxBwLimit> - <rxBwLimitUnit type="int">0</rxBwLimitUnit> - <rxBwLimit type="int">1024</rxBwLimit> - <finTimeout type="int">60</finTimeout> - <keepAliveInterval type="int">75</keepAliveInterval> - <keepAliveProbes type="int">9</keepAliveProbes> - <keepAliveTime type="int">7200</keepAliveTime> - <synRetries type="int">5</synRetries> - <synAckRetries type="int">5</synAckRetries> - <retransmitRetries type="int">5</retransmitRetries> - <transmitBuffer type="int">8192</transmitBuffer> - <receiveBuffer type="int">8192</receiveBuffer> - <tcpSack type="bool">True</tcpSack> - <windowScaling type="bool">False</windowScaling> - <rtoMin type="int">1000</rtoMin> - <rtoMax type="int">60000</rtoMax> - </tcpParametersFull> - <tcpParametersFull ref="17"/> - </tcpParameters> - <impairment ver="[5, [1, [0, [0]]]]" type="ixImpairment"> - <enable type="bool">False</enable> - <addDelay type="bool">False</addDelay> - <addReorder type="bool">False</addReorder> - <addDrop type="bool">False</addDrop> - <addDuplicate type="bool">False</addDuplicate> - <randomizeSeed type="bool">False</randomizeSeed> - <delay type="int">1</delay> - <reorder type="int">1</reorder> - <reorderLength type="int">1</reorderLength> - <sourcePort type="int">0</sourcePort> - <destinationPort type="int">0</destinationPort> - <drop type="int">1</drop> - <duplicate type="int">1</duplicate> - <jitter type="int">0</jitter> - <gap type="int">1</gap> - <destinationIp type="str">any</destinationIp> - <typeOfService type="str">any</typeOfService> - <protocol type="str">any</protocol> - <addFragmentation type="bool">False</addFragmentation> - <fragmentationType type="str">FragmentationPercent</fragmentationType> - <fragmentPercent type="int">50</fragmentPercent> - <mtu type="int">1000</mtu> - <fragmentSequenceSkip type="int">1</fragmentSequenceSkip> - <fragmentSequenceLength type="int">1</fragmentSequenceLength> - <_seed type="int">1</_seed> - </impairment> - <_portGroupId type="str">e7fa1f9e-23d9-4742-96b2-6edce6c4424e</_portGroupId> - <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap"> - <externalLinks type="dict"/> - </_smExternalLinks> - <smVersion type="int">1</smVersion> - </network> - <activityParameters ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityParametersList" itemtype="ixActivityParameters"> - <item ver="[0, [19, [1, [1, [0, [0]]]]]]" type="ixActivity"> - <agent ref="18"/> - <protocolAndType type="str">VoIP Peer</protocolAndType> - <name type="str">REGISTERING</name> - <enable type="bool">True</enable> - <timeline ver="[2, [1, [1, [0, [0]]]]]" oid="20" type="ixTimeline"> - <name type="str">Timeline1</name> - <iterationTime type="int">{{registeringduration}}</iterationTime> - <totalTime type="int">{{registeringduration}}</totalTime> - <iterations type="int">1</iterations> - <standbyTime type="int">0</standbyTime> - <offlineTime type="int">10</offlineTime> - <sustainTime type="int">0</sustainTime> - <rampUpType type="int">0</rampUpType> - <rampUpValue type="int">{{registeringtotalcalls}}</rampUpValue> - <rampUpInterval type="int">{{registeringduration}}</rampUpInterval> - <rampUpTime type="int">{{registeringduration}}</rampUpTime> - <rampDownTime type="int">0</rampDownTime> - <rampDownValue type="int">0</rampDownValue> - <timelineType type="int">1</timelineType> - <advancedIteration ver="[0, [1, [0, [0]]]]" type="ixAdvancedIteration"> - <segmentList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTimelineSegmentList" itemtype="ixTimelineSegment"> - <item ver="[2, [0, [1, [0, [0]]]]]" type="ixLinearTimeSegment"> - <name type="str">Linear Segment 1</name> - <noiseAmplitudeScale type="int">0</noiseAmplitudeScale> - <segmentType type="int">1</segmentType> - <startObjectiveScale type="float">0.0</startObjectiveScale> - <endObjectiveScale type="float">1.0</endObjectiveScale> - <duration type="int">{{registeringduration}}</duration> - <objectID type="int">17</objectID> - </item> - </segmentList> - <maxscale type="int">20</maxscale> - <_apiUniqueId type="int">16159</_apiUniqueId> - </advancedIteration> - <objectID type="int">3</objectID> - </timeline> - <customParameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters"> - <enableDbgLog type="bool">False</enableDbgLog> - <dbgLogChannels type="str">1-5</dbgLogChannels> - <bhcaType type="int">0</bhcaType> - <talkTime type="int">10000</talkTime> - <channelsNo type="int">1</channelsNo> - <callSetupTime type="int">500</callSetupTime> - <callTeardownTime type="int">500</callTeardownTime> - <interCallDuration type="int">4000</interCallDuration> - <bhcaObjectiveValue type="int">80000</bhcaObjectiveValue> - <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked> - <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked> - <cpsOverwriteValue type="int">18</cpsOverwriteValue> - <cpsType type="int">0</cpsType> - <cpsTalkTime type="int">1500</cpsTalkTime> - <cpsChannelsNo type="int">5</cpsChannelsNo> - <cpsTotalChannelsNo type="int">2500</cpsTotalChannelsNo> - <cpsOverheadTime type="int">1500</cpsOverheadTime> - <cpsInterCallDuration type="int">2000</cpsInterCallDuration> - <cpsObjectiveValue type="int">100</cpsObjectiveValue> - <cpsRegisterTime type="int">40</cpsRegisterTime> - <cpsSplitTimeline type="int">0</cpsSplitTimeline> - <lpsType type="int">0</lpsType> - <lpsTalkTime type="int">800</lpsTalkTime> - <lpsChannelsNo type="int">2150</lpsChannelsNo> - <lpsOverheadTime type="int">1500</lpsOverheadTime> - <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration> - <lpsObjectiveValue type="int">100</lpsObjectiveValue> - <lpsActiveChannel type="int">0</lpsActiveChannel> - <activeUsersTalkTime type="int">750</activeUsersTalkTime> - <activeUsersNo type="int">86534</activeUsersNo> - <activeUsersChannel type="int">0</activeUsersChannel> - <activeUsersObjectiveValue type="int">100</activeUsersObjectiveValue> - </customParameters> - <role type="str">Peer</role> - <activeRole type="str">Both</activeRole> - <objectivePercent type="float">100.0</objectivePercent> - <objectiveType type="str">concurrentConnections</objectiveType> - <objectiveValue type="int">{{registeringtotalcalls}}</objectiveValue> - <userObjectiveType type="str">activeUsers</userObjectiveType> - <userObjectiveValue type="long">{{registeringtotalcalls}}</userObjectiveValue> - <constraintType type="str">SimulatedUserConstraint</constraintType> - <constraintValue type="int">86534</constraintValue> - <timerGranularity type="int">100</timerGranularity> - <enableConstraint type="bool">True</enableConstraint> - <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType> - <secondaryConstraintValue type="int">100</secondaryConstraintValue> - <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint> - <portMapPolicy type="str">protocolSpecific</portMapPolicy> - <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior> - <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior> - <userIpMapping type="str">1:1</userIpMapping> - <destinationIpMapping type="str">Consecutive</destinationIpMapping> - <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/> - <objectID type="int">2</objectID> - <_apiUniqueId type="int">15566</_apiUniqueId> - <resourceGuid type="str">58ff41761a9072107c63efca</resourceGuid> - <_objectiveValue type="int">{{registeringtotalcalls}}</_objectiveValue> - <timelineScale type="tuple"> - <item type="float">1.0</item> - </timelineScale> - </item> - <item ver="[0, [19, [1, [1, [0, [0]]]]]]" oid="24" type="ixActivity"> - <agent ref="19"/> - <protocolAndType type="str">VoIP Peer</protocolAndType> - <name type="str">CALLING</name> - <enable type="bool">True</enable> - <timeline ref="11"/> - <customParameters ver="[0, [0.1, [1, [0, [0]]]]]" type="#Plugins.agent.VoIP_Peer.VoIP_data$ixPropertyClass_ixCustomActivityParameters"> - <enableDbgLog type="bool">False</enableDbgLog> - <dbgLogChannels type="str">1-5</dbgLogChannels> - <bhcaType type="int">0</bhcaType> - <talkTime type="int">10000</talkTime> - <channelsNo type="int">1</channelsNo> - <callSetupTime type="int">500</callSetupTime> - <callTeardownTime type="int">500</callTeardownTime> - <interCallDuration type="int">4000</interCallDuration> - <bhcaObjectiveValue type="int">80000</bhcaObjectiveValue> - <cpsOverwriteValueChecked type="int">0</cpsOverwriteValueChecked> - <cpsTotalChannelsChecked type="int">0</cpsTotalChannelsChecked> - <cpsOverwriteValue type="int">18</cpsOverwriteValue> - <cpsType type="int">0</cpsType> - <cpsTalkTime type="int">30000</cpsTalkTime> - <cpsChannelsNo type="int">16750</cpsChannelsNo> - <cpsTotalChannelsNo type="int">33500</cpsTotalChannelsNo> - <cpsOverheadTime type="int">1500</cpsOverheadTime> - <cpsInterCallDuration type="int">2000</cpsInterCallDuration> - <cpsObjectiveValue type="int">100</cpsObjectiveValue> - <cpsRegisterTime type="int">40</cpsRegisterTime> - <cpsSplitTimeline type="int">0</cpsSplitTimeline> - <lpsType type="int">0</lpsType> - <lpsTalkTime type="int">800</lpsTalkTime> - <lpsChannelsNo type="int">2150</lpsChannelsNo> - <lpsOverheadTime type="int">1500</lpsOverheadTime> - <lpsInterLoopDuration type="int">2000</lpsInterLoopDuration> - <lpsObjectiveValue type="int">100</lpsObjectiveValue> - <lpsActiveChannel type="int">0</lpsActiveChannel> - <activeUsersTalkTime type="int">30000</activeUsersTalkTime> - <activeUsersNo type="int">{{activecalls}}</activeUsersNo> - <activeUsersChannel type="int">0</activeUsersChannel> - <activeUsersObjectiveValue type="int">100</activeUsersObjectiveValue> - </customParameters> - <role type="str">Peer</role> - <activeRole type="str">Both</activeRole> - <objectivePercent type="float">100.0</objectivePercent> - <objectiveType type="str">concurrentConnections</objectiveType> - <objectiveValue type="int">{{activecalls}}</objectiveValue> - <userObjectiveType type="str">activeUsers</userObjectiveType> - <userObjectiveValue type="long">{{activecalls}}</userObjectiveValue> - <constraintType type="str">SimulatedUserConstraint</constraintType> - <constraintValue type="int">{{activecalls}}</constraintValue> - <timerGranularity type="int">100</timerGranularity> - <enableConstraint type="bool">True</enableConstraint> - <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType> - <secondaryConstraintValue type="int">100</secondaryConstraintValue> - <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint> - <portMapPolicy type="str">protocolSpecific</portMapPolicy> - <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior> - <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior> - <userIpMapping type="str">1:1</userIpMapping> - <destinationIpMapping type="str">Consecutive</destinationIpMapping> - <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/> - <objectID type="int">6</objectID> - <_apiUniqueId type="int">16446</_apiUniqueId> - <resourceGuid type="str">58ff41761a9072107c63efca</resourceGuid> - <_objectiveValue type="int">{{activecalls}}</_objectiveValue> - <timelineScale type="tuple"> - <item type="float">1.0</item> - </timelineScale> - </item> - </activityParameters> - <timeline ref="20"/> - <communityCapture ver="[0, [1, [0, [0]]]]" type="ixViewCommunityCapture"> - <captureViewOptions ref="12"/> - <filter ver="[0, [1, [0, [0]]]]" type="ixViewFilter"> - <filterString type="str"></filterString> - </filter> - <portList ref="21"/> - <enable type="bool">False</enable> - <_apiUniqueId type="int">15466</_apiUniqueId> - </communityCapture> - <payload type="NoneType">None</payload> - <activityIpWiring ver="[0, [1, [0, [0]]]]" oid="22" type="ixRangeAgentEndpointWiring"> - <rangeAgentConnections type="list"/> - <_apiUniqueId type="int">15451</_apiUniqueId> - <rangeAgentDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item ref="15"/> - <item ver="[0, [1, [0, [0]]]]" type="ixRangeAgentWiring"> - <range ref="15"/> - <agentEndpointConnections type="list"/> - <agentConnectionsDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item ref="18"/> - <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring"> - <agent ref="18"/> - <endpoints type="list"/> - <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">SIP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">SIP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">RTP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">RTP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">T38</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">T38</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">MSRP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">MSRP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - </_dict> - </endpointsDict> - </item> - </item> - <item type="tuple"> - <item ref="19"/> - <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring"> - <agent ref="19"/> - <endpoints type="list"/> - <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict"> - <_dict type="list"> - <item type="tuple"> - <item type="str">SIP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">SIP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">RTP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">RTP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">T38</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">T38</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - <item type="tuple"> - <item type="str">MSRP</item> - <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint"> - <endpointName type="str">MSRP</endpointName> - <isAvailable type="bool">True</isAvailable> - </item> - </item> - </_dict> - </endpointsDict> - </item> - </item> - </_dict> - </agentConnectionsDict> - </item> - </item> - </_dict> - </rangeAgentDict> - </activityIpWiring> - <tcpAccelerationAllowedFlag type="bool">True</tcpAccelerationAllowedFlag> - <iterations type="int">1</iterations> - <standbyTime type="int">0</standbyTime> - <offlineTime type="int">10</offlineTime> - <sustainTime type="int">244522</sustainTime> - <iterationTime type="int">3549</iterationTime> - <totalTime type="int">3549</totalTime> - <portMapPolicy type="str">protocolSpecific</portMapPolicy> - <objectiveType type="str">n/a</objectiveType> - <objectiveValue type="int">{{registeringtotalcalls}}</objectiveValue> - <rampUpType type="int">0</rampUpType> - <rampUpValue type="int">5</rampUpValue> - <rampUpInterval type="int">1</rampUpInterval> - <rampUpTime type="int">17307</rampUpTime> - <rampDownTime type="int">20</rampDownTime> - <userObjectiveType type="str">activeUsers</userObjectiveType> - <userObjectiveValue type="long">{{registeringtotalcalls}}</userObjectiveValue> - <totalUserObjectiveValue type="long">{{registeringtotalcalls}}</totalUserObjectiveValue> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">15450</_apiUniqueId> - <isVisible type="bool">True</isVisible> - <activityIpWiring ref="22"/> - <_portOperationModesAllowed type="dict"> - <item> - <key type="int">0</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">1</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">2</key> - <value type="bool">False</value> - </item> - <item> - <key type="int">3</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">4</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">8</key> - <value type="bool">True</value> - </item> - </_portOperationModesAllowed> - <_tcpAccelerationAllowed type="dict"> - <item> - <key type="int">0</key> - <value type="bool">True</value> - </item> - <item> - <key type="int">1</key> - <value type="bool">False</value> - </item> - </_tcpAccelerationAllowed> - </item> - </elementList> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">15447</_apiUniqueId> - </item> - <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn"> - <name type="str">Terminate</name> - <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement"> - <item ref="23"/> - </elementList> - <objectID type="int">2</objectID> - <_apiUniqueId type="int">15449</_apiUniqueId> - </item> - </columnList> - <links ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityLinkList" itemtype="ixActivityLink"> - <item ver="[1, [0, [1, [0, [0]]]]]" type="ixActivityLink"> - <objectiveType type="str">concurrentConnections</objectiveType> - <objectiveValue type="int">{{activecalls}}</objectiveValue> - <portMapPolicy type="str">protocolSpecific</portMapPolicy> - <userObjectiveType type="str">activeUsers</userObjectiveType> - <userObjectiveValue type="long">{{activecalls}}</userObjectiveValue> - <timeline ref="11"/> - <constraintValue type="int">{{activecalls}}</constraintValue> - <enableConstraint type="bool">True</enableConstraint> - <name type="str">VoiceLink1</name> - <activityList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityListWeakrefSequenceContainer" itemtype="ixActivityParameters"> - <item ref="24"/> - <item ref="25"/> - </activityList> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">16586</_apiUniqueId> - </item> - </links> - <appMixList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixAppMixList" itemtype="ixAppMix"/> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">15446</_apiUniqueId> - </item> - </scenarioList> - <currentUniqueIDForAgent type="int">45</currentUniqueIDForAgent> - <enableNetworkDiagnostics type="bool">True</enableNetworkDiagnostics> - <showNetworkDiagnosticsFromApplyConfig type="bool">True</showNetworkDiagnosticsFromApplyConfig> - <showNetworkDiagnosticsAfterRunStops type="bool">True</showNetworkDiagnosticsAfterRunStops> - <resetNetworkDiagnosticsAtStartRun type="bool">True</resetNetworkDiagnosticsAtStartRun> - <enableNetworkDiagnosticsLogging type="bool">False</enableNetworkDiagnosticsLogging> - <enableTcpAdvancedStats type="bool">False</enableTcpAdvancedStats> - <enableFrameSizeDistributionStats type="bool">False</enableFrameSizeDistributionStats> - <isFrameSizeDistributionViewSupported type="bool">False</isFrameSizeDistributionViewSupported> - <statViewThroughputUnits type="str">Kbps</statViewThroughputUnits> - <totalUserObjectiveInfoList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixTotalUserObjectiveInfoList" itemtype="ixTotalUserObjectiveInfo"/> - <activitiesGroupedByObjective type="bool">False</activitiesGroupedByObjective> - <eventHandlerSettings ver="[0, [1, [0, [0]]]]" type="ixEventHandlerSettings"> - <disabledEventClasses type="str"></disabledEventClasses> - <disabledPorts type="str"></disabledPorts> - <_apiUniqueId type="int">15684</_apiUniqueId> - </eventHandlerSettings> - <allowMixedObjectiveTypes type="bool">False</allowMixedObjectiveTypes> - <networkProtocolOptions type="NoneType">None</networkProtocolOptions> - <seedForRandomBehavior type="int">0</seedForRandomBehavior> - <csvThroughputScalingFactor type="int">0</csvThroughputScalingFactor> - <reporterThroughputScalingFactor type="int">0</reporterThroughputScalingFactor> - <profileDirectory ver="[2, [1, [0, [0]]]]" type="ixProfileDirectory"> - <categoryList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileCategoryList" itemtype="ixProfileCategory"> - <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory"> - <name type="str">Playlist</name> - <categoryId type="str">playlist</categoryId> - <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.profile.Playlist.ixPropertyMap_PlaylistCategory$ixPropertyMap_PlaylistCategory"/> - <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <objectID type="int">0</objectID> - </item> - <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory"> - <name type="str">Random Data</name> - <categoryId type="str">rdge</categoryId> - <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.profile.RandomData.ixPropertyMap_RandomDataCategory$ixPropertyMap_RandomDataCategory"> - <startcore type="int">0</startcore> - <totalcores type="int">1</totalcores> - </pm> - <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <objectID type="int">1</objectID> - </item> - <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory"> - <name type="str">Real File</name> - <categoryId type="str">realfile</categoryId> - <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <pm type="NoneType">None</pm> - <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <objectID type="int">2</objectID> - </item> - <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory"> - <name type="str">Unified File System</name> - <categoryId type="str">ufs</categoryId> - <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <pm type="NoneType">None</pm> - <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/> - <objectID type="int">3</objectID> - </item> - </categoryList> - <_profileMru type="str"></_profileMru> - </profileDirectory> - <communityList type="NoneType">None</communityList> - <autoUpdateAppFlowsToLatest type="bool">True</autoUpdateAppFlowsToLatest> - <downgradeAppLibFlowsToLatestValidVersion type="bool">True</downgradeAppLibFlowsToLatestValidVersion> - <objectID type="int">0</objectID> - <_apiUniqueId type="int">15445</_apiUniqueId> - <lastStatViewerConfiguration type="str"></lastStatViewerConfiguration> - <statManagerOptions ver="[1, [1, [0, [0]]]]" type="ixStatManagerOptions"> - <pollingInterval type="int">2</pollingInterval> - <allowCsvLogging type="bool">True</allowCsvLogging> - <enableDataStore type="bool">False</enableDataStore> - <svConfiguration type="str">begin 666 <data> M>)S=G6MOXSBRAO^*D(,9S& GMJB[,ND,TD[2$W1NB-T]N]A>--0VDVC;EKR2 MG,L>G/]^*-E.1+)DUTQ$"LB'[C@65:5Z0Y;X4)?:_^UQ-C7N:9;':?)NA_3, MG=\.]H=%5'R.Z0/-7C9Y/<_LF3TKM'98 YJ7WY[%>6%\I$_O=J)Y$3_&42^_ M[\W+/?*")F/:J[7[(XOF;!/;>7!Y,3J^&!G]@_VKZ^,A^W@X.KV\$'__>GQT M.CI\?W9<;AA<GK\_O3@^>G:=/W_"'(#D_&#_)*/_6; V3\9]-%W0=SO63N4H MOS]+;V_CY';]_2A;T&K3*)[1X5,R?D_OHOLXS=8-S.>M>1'-YE<9'<?5@:VV MV]7VX]N,'4NIZNAI3M?;2+7MDJD\3:/)5986=%S4]GUV_G)<O\>3"4U*0_FZ MU4DTS9?-CI/HVY0>144T+-*,R@VN7L2I'X<#[;W1$SN@RT4Q7Q3/0IXOID4\ MGXJQ58V.AEN:G4>/9:_+V?$-%GF1SCZP/]G=<QMO[?,DGM*KJ'C>4GU_.*59 MD:]_&JQ+)_G>8QZ_V[DKBOE>O__P\-![L'MI=MNW3)/T_WY^-AS?T5FT&R?L MC\;$V'G>:[)]K\II?^WUB-Y$+*9*)_ZWJAF_>9"EJUZ04<I:,ZU'I>@'^X_Y M7EY9-V)V"!?TH?H[T&)U9&6HZT/$'.&R[2R?,"OO=A99LK*>[\[B,3N(]*;8 M':>S/=9N=]EJISH&.J4SFA1&$LTH?QC+5GNG^>J;=SM%U3M7WY]'<?(<3MES M*:UB/DPF'[)T,<^?6YZEXZALLG3(#H+UAL>R-RY_OTOC,35F<7(Y'B^RO!I@ ML^AQ_=LB^98ND@F=0,<+> 6=Y,O.2 $3IT<[1L':O=MAFZ9I<KLC'$L?V.DJ MRM@O?VG7"_9_;;>\R&+<CF4P?VG'P1T=?R]'V\L?K_K#59:&3RP[S'I_Q,DD M?<A[)VDVRWLO>_QB0 U^,3ZOSA-.KSQ+F+\8 ];G%QE]E]!%D4737XRKQ;=I M/&;)>I1^I\F[;[X?N6/7(Z'M4#,(:Y%$R=,R-HSNQ=U?TN RF[#SP<N><5)@ M=EMFR$EMQV]I.J51 NS<Y_I97^R%_1?CJZU5Q\>T7([D@_U)?'-SF^TM?T2S MOS+F5_LL36S;9^UH]YZP8764CA?E,1VO#TT>?,;J",N,)F\ES]TO2Q^J/T@E MW6J?NR@?W$7)+66"LBS-<FTUY$^/#LS]/OM_?SWF#G;)?O_YE_UR/!U4CO;[ MU>?]2L7*Y7Y_J>A+?SZP]ONUW_;+#G70+^VQG_O5057VEY]69\C)09GY]OOK MWYA9*;@_+X<%R$$0<A!!#E-28W4*P@E" $'6!@1A3"VZV( N%D(72]!%[B57 M:588@ZM/1ADKFQ7%8UZB\CC^K$*@S;IHKI[>Y "JV0C5;$$U2U+M!^,HSK\; MGXIX&O\W*F>KG&AEW']6-,AD73-+BV0N()F#D,S9*MDH+:*I<4YG:?;TT\?W M/[]:,-F@_G'I 7*Y"+G<K7(Q5J!MJB79JXNE9SCZ@%@>0BQOJUAEKCEC\&@< MWM\:/Q'C/$X6!7V]:(UVZ^+96L0+ /%\A'C^GQ3/7069MZU>W7!=/D>+?"$@ M7X"0+_BS?4^9?J1)0%>+@,0$% P1"H;;3Z;K0%]_#GVQ5%?(TZ,0-)<GF,D\ M$6?S\C3MS-JUJ^E4;MRDF3&8QB60E1.MUT_7-MKN8-I&0 I 88#( 40&@;,X M^5Y%2U_=W>JF],\]" 0%!$,%1,("4"9J#.>4OGY4UDWIGW40B ((!@.(R & M3"<9^S\WANR[%J9H-5OZI_X$FOL3S.2?B+/_S4(9UVT,/MF@_DD9@>;_! , M1"0 0++/T32>&*LXK^F8QO<MC,8&J_JG9 3B 8(! B(2 5:\=GK>)M,=3,P@ M,B 8-" B&P ROG\JVDIO=5,=S,X@ B 8!" B T RQ44M%1D_??PV;P$ &JS6 MQ?/U+,M"DW^"F?T3<?K?V,=:2W"BN;I<@1ZY(!*P,"1@2230T->XM--J?X,M MUT4,]8@(48"%H0 +00&C+$KR65P8A]F<A?R?!<U?G^%@H]R45P\:6.#U M0% M P0:"&'.IT]M*U>9Y'33=/D)8@4+PPH6@A56(ZO5+@?:Y)33 P\6! \6!AXL M!#SP4;;1X0"+G&IZ^,&"^,'"\(,E\<.V):,AS>YIIF;)B+?=P9*1!;&$A6$) M2[JZX+[=)2,+8@4+PPJ6=!T!E.EM+!E9$"M8&%:PI.L%LDQO:,G(AKC PG"! M)5T6V"C4VUDRLB$VL#%L8(ML $CVQI>,;(@); P3V"(38,5[BTM&-H0'-@8/ M;!$/ !G?S)*1#=X_A+J!2+J#")#I;2\9V1 0V!@@L*5[B9KZV!M:,K(A$K Q M)&!+]Q(U]+6WOV1D0Q1@8RC 1E# VUXRLB$TL#%H8"/0X.TN&=D0*]@85K 1 MK/"6EXP<"!YL##S8"'AXJTM&#L0/#H8?'.1=1J,[YNCV;KXHEBL\[2P6R5:[ MN"$<X@<'PP^.R ^.O$JYNG%*S<1NLW']2TD.Q! .AB$<D2&V2*EDWK+=@?YE M)P?B#0?#&X[(&X"DJS5:-;USLW']"U,.^!P#ZD$&D3ZV2*FD=VYWH'_ARH$( MQ<$0BK/]6L7G]/1J&,]?_W#6RE G#VDY$'XX&/QP1/QP (9;Y$_&[^DB,P;1 MM'SN)<H76?7486[\M K[YU>?J]?Z(;UQW=#4)#-$*@Z&5!R15$K=19E_'QR^ M?KEOK6)EK(.>"$&)@X$21X026*)!FQ(-NCC9NA!].!CZ<$3Z 9KN6M"IRI& M)F2:'X::!(1 Q,6 B"N"2*DH^+3@.M;6>IMH5O_0="$$<3$(XDH((LMV."Y* M1&U=-\EN!P,6 @X7 QRN!!RR<,/%>$SS_&:AH-.!MCMXM!?""Q>#%ZZ$%[* M?T194KXQJ'7U9,/ZY[XNA!,N!B=<"2=DZ4ZBF!UJ^\I)=O5?L'7!!Z113TB+ MT !ENV]IN8."="<9UG^1UH5HPL70A(N@B;,TG:N8G4AV^:F)IDP'$8*+(017 M) 17GO[*Z=RHHE9XOE@[Z&"Z I&$BR$)5R0)0$H^0[4L(VQ<_\3%@TC#Q9"& M*Y(&(*%P>FQ9PP;K^B<O'D0;'H8V/)$V !&%?-^RB W6]4]C/(@]/ Q[>")[ M ")R;-6RA*!M_=,9#V(0#\,@GL@@@("G24&S*CCC:)%5KP R?CJ\O_W9^.<L M_U=K6FYSHW^JXT%DXF'(Q)/(!%B+B:9J%F)$N_Q41U./A,C$PY"))Y))J:68 M%XN"SN95[BJ#;2\CBG8[>',31"8>ADP\D4P X08I2U3C]H63['8PG0%?XX1Z MCY/()8!PJTF;JH[79+Z#"0W$*!Z&43R140 9GR\:MBN?:+:#*0S$(QZ&1SR1 M1Z!\E^0/-&L_W0EF]4]<?(A!/ R#>"*#- ]:19VNP;K^:8H/,8B/81!?9!! MQ.-D%9IQFL1%S 1IX<&-E82@;?TWU/L0?_@8_O!%_M@H8'L/ODCZP?>(Z[FE MWH?HP\?0AR_2QT;Y!M6+E]7TOYIM_3?9^Q!G^!C.\$7. 2L;DB^H5G[YP_ MLOZ;ZWV(-'P,:?@(TJCN-VE7M;K)#FZH]R' \#& X2, 8WU!MMUY"F>T@YOI M?8@M? Q;^ BVN*;_5L%DHMD.;J7WP;?#HEX/BX*)29RI44XTW,$-]3Y$%#Z& M*'P$42S/>@]Q<6<<+HH[MBD>+Y?<RD<O6/3MG60QKCA]]:!' *&'CT$/'X$> MRZ#+XD'&IZ.KEK5\,<OIIH<V H@V @QM! C:J 4X&BC1K3++Z:8',@((,@(, M9 0(R*@'>#94HEMIEM--#UT$$%T$&+H($'11"_ \?F0)OYK3SM/L]<^S 1I* M+C@]]<!& ,%&@(&- 'E1HWHB0-65#=DX?WE#4Q*$H"/ 0$<@0D>P]?*&T<_I M6-4UCI5Q_1<Z HA# @R'!"*' !(*%R3:E1 VKO^21P!A28#!DD#$$D!"?F&S M705!V_HO=@00GP08/@E$/H&&,;>\WO(HAFSKO^P1@/4K4 4L1$@!!)36E]K5 ML,F\_LL@(<0B 89% I%% !E?%IS:U4^RJ__21PC!2(B!D5"$$3 #_EO9.02T MK?_21PA128BADE"D$E! ?B&E;0E!Z_HO@(00HH081 E%1(&F,EO73UJ>W6#] MZ;]0$D+L$F+8)139I5'H]>**"E$%V_HOEH00MX08;@D1W,*OLB@3\,5V!Y=/ M0@A;0@RVA!ALX=9;U"GX;+N#BRDA1"TAAEI"!+4TK[8H4Q/VT\'EEA#"F1"# M,Z'T!'K#TLXHGJE;VI&,\TL[FF9$$-*$&*0)1:0I585$'-)B,:^B57$?]287 M^I=YB D6Z$-5Z!/9!M!S%$V_*U,2-JY_G8>8< D_7 T_$70 %=?WP2A3LMF! M_D4?8H)U_$Q4(3]3I!ZH3RX?"BG#5?F\Q#8W^E>#B F6_C-1M?],Z6GXIM>K M*GBKC&B7/_'HH4AB@A4!351)0%.N\R$7-%V&N7Y!99LWT@&6NSC5@)4"352I M0%,N]]$D8.NW<6YZS:^N,PQ8,=!$E0PTI4?BH==>WL9YL<Q2*D9PHWU^).M9 MIB F6$+01-40-.4B@K*<+Q?QN, 57"04['<QJL%"@B:JDJ IEQ*4Q:P]UZY& MS68'78QTL."@B:HX:,HE!X'R&.OG(E1("1OO8!()UAVOQ$7(*!<?W#3$CZCJ M02YYZ&#N")<IQ]4IEPN5;Q[FJA3=Y$+_54724+ <5[%<+E;8.-15R=ED7O]U M1@(7-<=5-9?*FF^9'RF[?VJS$WZFI.=Z!(&KH./*H,MUT(D\96^8R:BZIPIR MTL&<":Z9CBN:+E=-!V1MFM*TJ^L6+QW,GN#*ZKC2ZG)M]8W]54A[JGHL[*:+ M&14(3;C"ZW+E]<U]5JFV6_UT,;L"(0I7CEVJQ[[M_%5=QU%\^A)]<)IJNA9, MX.+MN.KM<OEV(B\E2R&K6$C>[*2#LQ=<UAU7UUTN[ [(R@]+9<)N<]/!^0LL M 4]0->")5 0>R /#TROCG"6_Z%;)#+;)/#_Z=6D)XA6J%#R1:\%;0#T'%NVJ M$E)+A0OK.@J6NQCG(%2AZL$3N2#\-@'9MKS%17O0=A<C&B0H5'%X(E>'WR;B M>52,[U2I^&R\@]DG6"B>H"K%$[E4?*.,^9Q- ]LJ0\J+R)ON8(X)5HTGJ++Q M1*X;#TCX$F/+8UDVW,%J'5@KGJ"*Q1.I6OSV'JAF)$O6.UBK ZO)$U0Y>2+5 MDX>$/+WX?#HZ5G1JAHWK?S* @-7F":K</)'JS6-D;'E0-YG7_WP >O1$U1! M>B)5I,=(V?;@;K2O_QD E:J)ZA2]42J58\1\YH6JQM;%"K*.]'_9 !:]@3 M5!%[(E6QAV0]''Q4E#(!RQT\&4# \O4$5;^>2 7LMRK8<K8$;7?P= !J]L3 M5'E[(M6WWZIBVXD2-M[!LP $+'1/4)7NB53J?JN.2G+D!@\=O)")V"#?V"B^ ML3%\\_X?JB:5@.4.7KE$;!!Q;!3BV!C$X>)L.4."MCMX 1.Q0;ZQ47QC8_B& MB[3M# D;[^"%3,0& <=& 8Z- 1PNU*J\01)-IT]J)87\=/#:)N* S&.CF,?& M, \7M9+SSP8/';RXB3@@^#@H\'$PX$,>'U4M44*F.0TU48X#4HZ#HAP'0SE\ MH"V?@F#CW&JY)M9Q0-9Q4*SC8%B'#[7MC-E@G5-2$^\X(.\X*-YQ,+S#QZHD M46YRP6FJB7T<D'T<%/LX&/:QU&5*R#2GH2;:<4#:<5"TXV!HQU*9*6'CG(Z: MF,<!F<=!,8^#81Y+::9LL,XIJ8E[')!['!3W.!CNL=1GRDTN.$TU,9 #,I"# M8B 'PT"VNDP)F>8TU$0Z+D@Z#HIT' SIV"HS)6R<TU$3W[@@W[@HOG$Q?&,K MS90-UCDE-5&."U*.BZ(<%T,YMOI,N<D%_ZB*)DU!XG%1Q.-BB,=1ERDAT_PM MDYHT!%G'1;&.BV$=1V6FA(US.FKB&Q?D&Q?%-RZ&;QREF;+!.J>D)LIQ0<IQ M493C8BC'49\I-[G@--5$/"Y(/"Z*>%P,\;CJ,B5DFM-0$^NX(.NX*-9Q,:SC MJLR4L'%.1TU\XX)\XZ+XQL7PC:LT4S98YY341#D>2#DNBG)<#.6XZC/E)A>< MIIJ(QP.)QT,1CX<A'D]=IH1,<QIJ8AT/9!T/Q3H>AG4\E9D2-L[=?:Z);SR0 M;SP4WW@8OO&49LH&ZYR2FBC' RG'0U&.AZ$<3WVFW.2"TU03\7@@\7@HXO$P MQ#,XO!@<GQEJ;K^"C7,Z:N(=#^0=#\4['H9WQ%!;SI=-YCDM-7&.!W*.A^(< M#\,Y8K!MY\Q&^YR:FHC' XG'0Q&/AR$>,5HE>7.S$TY7303D@03DH0C(PQ#0 MY=7H]/)BJ"AU-ECGE-1$0#Y(0!Z*@#P, 4FQMIP\&^US:FIB'Q]D'Q_%/CZ& M?:1HVTZ?S0XX/35QD ]RD(_B(!_#05*X2A+H%B_<XZ2:R,@'R<A'D9&/(:/K MXP^GP]'QM:(4VF2>TU(3&_D@&_DH-O(Q;"0'V_:SXHT..#TU<9$/<I&/XB(? MPT5RN&VGT0T>.$4U$9(/$I*/(B0?]18#*5XEB72;&TY;3<3D@\3DHXC)QQ#3 MQ>7H].0?BO(H;)S341,K^2 K^2A6\C&L)(;:<@YM,L]IJ8F/?)"/?!0?^1@^ M$H-M.W\VVN?4U,1( <A(/HJ1? PCB=$JR9V;G7"Z:J*E *2E $5+ 8:6AI_> M#P?7I^]5/8'::)]34Q,K!2 K!2A6"E!O;I.C;3F%;O# O2M&$R,%(",%*$8* M4*]RD^-M_0U&&UQPFFIBI0!DI0#%2@'JS6YRP$K2Z58_G+J:R"D R2E D5. M(Z<3A4@/V.94U$1+ 4A+ 8J6 APMG2B%>= ZIZ0F-@I -@I0;!1@V$B(M7V, MA\US6FKBHP#DHP#%1P&&CX1@%0'\!A^<JII(*0!)*4"14H AI?/CX?#P@ZH9 M:(-U3DE-E!2"E!2@*"G 4)(4:\MYL]$^IZ8F-@I!-@I1;!1BV$B*MNW<V>R MTU,3'84@'84H.@HQ="2%JR1_;O'"O092$R6%("6%*$H*,91T>G%RJ2A]0J8Y M#35140A248BBHA!#17R@+2=.V#BGHR;^"4'^"5'\$V+XAP^U_3>2@M8Y)34Q M4 @R4(ABH!##0'RLBEY'VNR"TU03#84@#84H&@HQ-/3IZNA0V3N<8>.<CII( M* 1)*$214(@A(3'4EO-EDWE.2TW\$X+\$Z+X)\3PCQALVSFST3ZGIAX&LDR0 M@4(4 X48!A*C59(W-SOA=-5#0Y8)T5"E]E9=62N$KE?7ZM[D#-KF5-3#0)8) M,5"E+4)%# ,)D;:<-ANLUY4,]#"/94+,4^F+4!+#/$*L;2?-)O.<EGK8QS(A M]JD41FB)81\A6"4I<Z,/3E4])&29$ E56B-4Q9#0IXN/%Y=_7*B;)#79Y]34 M0T.6"=%0I3%"30P-2=&V/DUJ=,#IJ8>$+!,BH4IEA)XH$GH.5]$SKLT..#WU M$)%E0D14J8S0$T5$4KCJ.NC&YUT#/5QDF1 753HC%,5PT;*TU/HTP78VSO/; M]LK,-YGGM-1$102BHDIAA)88*BJ#/;U-TJPJ5KX*.L_+ZL2M"MKH@U-5$Q,1 MD(D(BHD(ZNZY>AG#RVS.;+7=/T7CG(Z:J(B 5$105$3P%4_764V-D)+UNI*A M)BHB(!41%!41D8J@.KRT&F\LW)N,YG>4%[$\F+\LHFR9?Y6<IED[ 5F(H%B( MB"QD >7B3Z*8':ZQ6<G7=,=F!W5!=75($((("H*("$&0G,/%>,PBO5E,%4JZ MV4E=5DW$3D :(B@:(B(-0;)>TS&-[Y7VTTTNZI+J&O@@$!$4$!$1B"!)#]D< M<#8OE&JZT0>73S6)"E(105$1$:D(.!\=9UF:J:@(+QOFST:Z] ,9B* 8B(@, M5"DJ"#C*XMM;FAG+>%OKAZ+9#LX\%H@\!(4\1$0>2+KKT57;LM5-=G!6L4"> ML5 \8XD\ TFV+B+5MFZ2W0[.'Q8(,18*8BP18L"A&L]HNBA:'ZJ"V0[.$A9( M+1:*6BR16N LQXALGF;MBR<9YM[1H4D^$%DL%+)8,K+(\I6 .XBF4^-DFCZT M+2%LG'M\3Y.,(*I8*%2Q9%2!9:R6J%L_W0*6N3M\-0D(0HF%@A)+AA)8P.%1 MZV==T2QW8X FZ4#XL%#P8<GPT2S=ARG[WABDR20N6E^<A1UP*XJ:Y 2QPT)A MAR5B1Y.<QX]%%HT+XW.4Q>71YRKZ9;,3;GE1DZP@C5@H&K$P-%*M\"N:(X*V MN4FV)C"Q03"Q4&!BB6 ",/$1G49/*IA8-LPSL:;IC@U2BHVB%%NBE%)1\6Z5 M-"^,HYAUDRIBXZ?#^]N?C7_.\G^U=[/*!A<=L+(-LHN-8A=;8A= TG,ZB:-5 MK*._JU!T@X<.2-H&B<9&$8TM$0U"T//H4;&@-0\=T+4-,HZ-8AQ;8AR,H'&B M6M 7#QTPMPW2CHVB'5NBG2V"7BL?\M?-0U[7:0FD'QM%/[9$/PA!U0[YZ^8A MKXG';9");!03V1(38015.N2OFX>\)CZW02JR451D2U34,'':O8K'WQ=SM5.G M9B<=L+L-4I&-HB);HB*<K.V/_<U..F!X!\0D&X5)MG3]!BEKZQE@LY,.&-X! MZ<E!T9.#H:?/\82FAA9Q,:ZZ('P'Q"D'A5,.!J>: V\]+V!<<1IK(BP')"P' M15@.AK : V__E(9QQ6FL";H<$+H<%'0Y&.A:!JX>O;;ZX=351& .2& .BL < M#($U1*TH12#7"W2M$CH@CCDH'',P. 9'K2HY8)>W-+&9 [*9@V(S!\-F<M1J M"&VK'TY=3:#F@*#FH$#-P8!:0]0:,L.&906BB=<<D-<<%*\Y&%Z#H]:1&3:L M@A%-V.:"V.:@L,T1L0VHMK7(BW1F5$XY(2OW@)(FH&3=2+^3"RXN2&$NBL)< MD<*:5'JE/H(R?VU>WS]*QXL9.[;C*2U_L&]6$2Y_1+.R#=-A5%IAGP=9FN>E ME=+:P?YU-(G3RIBP(6:VV#0XKDPVMAI,8^;T),UFBVDTI$41)[>Y<1]-%_3= MSO_^^#^/1[^R_PY__?$_B[3X]3/-RGNFE[_L+7^0GKO\\(O4N@QUU?:?+QO_ M]?+Q_UX^[AA]]H>@>7&]2,3C^'%:_/K;XVQJW"_]OUM[-I<?#)J,TPG;8[5A M4=SL$F_Y^;<?;XM?:T?&3*V\G"8WZ9!F<32-_QN5MV*\CVX-YB7)]Q[S>&7J MKBCF>_W^P\-#[\'NI=EMWS)-TO_[^=EP?$=GT2[K>T64C.GJ2-;[3Y#[+UOQ MQV@8Y5'.OA8K-5C'B\=763K/Q7;+EF4\94<NMY:?2?EEO_XMO,^ =>C;-'LJ M6WQ.XS%=)\[G_>LM9!N#F]N3>$K+,5 V&.Q]^<3&8?XERM-LDGY9=^S\R]>O MRP%3;KS,RD'[Y?+JXN2S]?4L2A*F_)?KXP]?!X=G9U^K[[]>7A]>?#C^>A_> M];+'F^IP!&=P1#1;1[P\AN= 7C;(.QXM*IV,?N/FWQ]6'7]#F^&V-N5A7'[[ M-QT7\3W--[7Z/;Z]F[)_16.KJ](5BXIEM G[+[Z):5:V=.W0_T9#?]>]\2>[ MCNW:N]]N'']WXMV8MN>0\8T75IHT&9!=L0Y8[UOL5]<A;F6DMDG>K^P*P].C M<N-PE^RZNQ;9M4V7>*YK.^XNL^'Y[)A,?]<F%H/AT#'-7>('KE?9KNT.'A,; M%&7&OTS*%I9)_%UFR3)'A.R9WIYM]P+'M<+0_9MI[9GF^G"YO1KLIO-YV<)@ M.6 OB:>K<5RF\M40;_B;+#/I>32^BQ.ZUN5X>'YXM'LXO+P^NMP]6W9DJ-T6 M<X>324;S:OB3T.H1+^B1'B'6RV[$[)D]EZ7BEV]6#=U>K=D-#<R]/6+>F'L. MI=_V?/-FCUB1_X,CM0EO[#W+GY ]SYUX>TY@^S\05VP5F1[=8WV-[OG^-[(7 M3NP??#[9]IL"D4,^?;R@Q4.:?5^?9EBKH&>7D1%OF=2@)AL,7=,IC?)*X=/' MLS2:&$PXTS@^Y(W5FFTP5LMS+!F79V:CS$BY\=-CX/W\Y?0QCKXLO7PICWI7 M]-*<NDX?KVEYCS3-:F'9/;^,W'975H F</KX=#X<1],J&F*N^K[PO;SC\+ZV M^>,W=JHI=^.^!<=+&90\(JJ=,2>PVHF.YN7<_7)>W139,";2Z93ESW**5C8X MHD7U).>RF_';&G<^HU&6T$EY\B_;W413]H>O&1"V-]HI;\9>SN% ,_SF1BLL M#Y<M2X6JAE6:J9D1MV\RM'J@;9,ML4FSN2PMTG$ZK>X'O(G&%+8(MFHT>ITN M"GI=S=DA:\)FR,QL7F:/T7-W$:6'MC?URXW];=DO)T])V6L_TB?@3,PU^5Q. M5*5&ST.O8;99MJ[FO?W!Y<7H^&+$\.+Z>,@^');%.,LM]=^_'A^=C@[?GQV7 M&P:7Y^]/+XX9T%33[.JK_/XRF3Y5OY/RB[,X^4XGS]O[+_NLGR9_^92#V\_8 M).%@O^K(1L+.5>]V*FL[SS/Q';+#;U_.]':,=(EL#..BZM'@,WI/IPSAEO%6 M>QSL#Y/9W&#ROMN)V-^!)=!>?M^;K^<F8]HK&ZSF*N4D>Z>,>Z54N6F0)C?Q M[2*K!*W30LXVCMG&ZN^Q^OT^RI;'N#R/E_NOSNA1-2>3S_03FH^SN.HAJXVU MZ3JSRDYI4W8^6T_YRK_VRE'=[X3>;]FAUJ)?/_+7]HUJ]S+.\@<;\^7?CO'I &_P,I\+)D end </svConfiguration> - <svRestConfiguration type="str"></svRestConfiguration> - </statManagerOptions> - <currentUniqueIDForAgent type="int">45</currentUniqueIDForAgent> - <_scenarioElementFactory ver="[0, [1, [0, [0]]]]" type="ixScenarioElementFactory"> - <singletonDict type="dict"/> - <referenceCountDict type="dict"> - <item> - <key type="str">qovCoprocessor</key> - <value type="int">0</value> - </item> - <item> - <key type="str">Impairment</key> - <value type="int">0</value> - </item> - <item> - <key type="str">asrCoprocessor</key> - <value type="int">0</value> - </item> - </referenceCountDict> - </_scenarioElementFactory> - </item> - </testList> -</root> diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst b/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst Binary files differdeleted file mode 100644 index a7bce95a0..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst +++ /dev/null diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst b/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst Binary files differdeleted file mode 100644 index 783918861..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst +++ /dev/null diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py b/functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py deleted file mode 100644 index 973e0264d..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 IXIA 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 httplib2 -import json -import logging - - -okStates = [200, 201, 202] -states = [ - 'Queued', - 'In Progress', - 'Manual Step Required', - 'Error', - 'Finished', - 'Aborted', - 'Retried', - 'IRebooting', - 'Force Continue', - 'Pending', - ] -notStartedState = 'Not_Started' -errorStates = ['Error', 'Aborted', 'Force Continue'] -finishedStates = ['Manual Step Required', 'Finished'] - -logger = logging.getLogger(__name__) - - -class TestFailedError(Exception): - pass - - -class ChassisRestAPI: - @staticmethod - def postWithPayload(loginUrl, payload=None): - urlHeadersJson = {'content-type': 'application/json'} - try: - h = httplib2.Http('.cache', - disable_ssl_certificate_validation=True) - if payload is None: - logger.debug('POST: ' + loginUrl) - (response, content) = h.request(loginUrl, 'POST', '', - urlHeadersJson) - logger.debug(content) - else: - logger.debug('POST: ' + loginUrl + ' <- Data: ' + str(payload)) - (response, content) = h.request(loginUrl, 'POST', - body=payload, - headers=urlHeadersJson) - logger.debug(response) - logger.debug(content) - except Exception, e: - raise Exception('Got an error code: ', e) - return content - - @staticmethod - def postWithPayloadAndHeaders(loginUrl, urlHeadersJson, - payload=None): - try: - h = httplib2.Http('.cache', - disable_ssl_certificate_validation=True) - if payload is None: - logger.debug('POST: ' + loginUrl) - (response, content) = h.request(loginUrl, 'POST', '', - urlHeadersJson) - else: - logger.debug('POST: ' + loginUrl + ' <- Data: ' + str(payload)) - (response, content) = h.request(loginUrl, 'POST', - body=payload, - headers=urlHeadersJson) - except Exception, e: - raise Exception('Got an error code: ', e) - return content - - @staticmethod - def postOperation(url, apiKey, payload=''): - urlHeadersJson = {'content-type': 'application/json', - 'X-Api-Key': '%s' % str(apiKey)} - try: - h = httplib2.Http('.cache', - disable_ssl_certificate_validation=True) - if payload is None: - logger.debug('POST: ' + url) - (response, content) = h.request(url, 'POST', - json.dumps(payload), - urlHeadersJson) - else: - logger.debug('POST: ' + url + ' <- Data: ' + str(payload)) - (response, content) = h.request(url, 'POST', - json.dumps(payload), - headers=urlHeadersJson) - except Exception, e: - raise Exception('Got an error code: ', e) - return content - - @staticmethod - def patch(url, payload, apiKey): - urlHeadersJson = {'content-type': 'application/json', - 'X-Api-Key': '%s' % str(apiKey)} - try: - h = httplib2.Http('.cache', - disable_ssl_certificate_validation=True) - logger.debug('PATCH: ' + url + ' <-- Attribute: ' + - str(payload)) - (response, content) = h.request(url, 'PATCH', - json.dumps(payload), - urlHeadersJson) - except Exception, e: - - # print (response, content) - - raise Exception('Got an error code: ', e) - return content - - @staticmethod - def delete(url, apiKey): - urlHeadersJson = {'content-type': 'application/json', - 'X-Api-Key': '%s' % str(apiKey)} - try: - h = httplib2.Http('.cache', - disable_ssl_certificate_validation=True) - (response, content) = h.request(url, 'DELETE', '', urlHeadersJson) - logger.debug('DELETE: ' + url) - except Exception, e: - raise Exception('Got an error code: ', e) - if response.status not in okStates: - raise TestFailedError(json.loads(content)['error']) - return json.loads(content) - - @staticmethod - def getWithHeaders(url, apiKey): - urlHeadersJson = {'content-type': 'application/json', - 'X-Api-Key': '%s' % str(apiKey)} - try: - h = httplib2.Http('.cache', - disable_ssl_certificate_validation=True) - logger.debug('GET: ' + url) - (response, content) = h.request(url, 'GET', '', urlHeadersJson) - except Exception, e: - raise Exception('Got an error code: ', e) - if response.status not in okStates: - raise TestFailedError(json.loads(content)['error']) - output = json.loads(content) - return output diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py b/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py deleted file mode 100644 index 50dfbc661..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 IXIA 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 requests -import sys -import time -import logging - -from functest.opnfv_tests.vnf.ims.ixia.utils import IxRestUtils - - -kActionStateFinished = 'finished' -kActionStatusSuccessful = 'Successful' -kActionStatusError = 'Error' -kTestStateUnconfigured = 'Unconfigured' - -logger = logging.getLogger(__name__) - - -def stripApiAndVersionFromURL(url): - - # remove the slash (if any) at the beginning of the url - - if url[0] == '/': - url = url[1:] - - urlElements = url.split('/') - if 'api' in url: - - # strip the api/v0 part of the url - - urlElements = urlElements[2:] - - return '/'.join(urlElements) - - -def waitForActionToFinish(connection, replyObj, actionUrl): - """ - This method waits for an action to finish executing. after a POST request - is sent in order to start an action, The HTTP reply will contain, - in the header, a 'location' field, that contains an URL. - The action URL contains the status of the action. we perform a GET on that - URL every 0.5 seconds until the action finishes with a success. - If the action fails, we will throw an error and - print the action's error message. - """ - - actionResultURL = replyObj.headers.get('location') - if actionResultURL: - actionResultURL = stripApiAndVersionFromURL(actionResultURL) - actionFinished = False - - while not actionFinished: - actionStatusObj = connection.httpGet(actionResultURL) - - if actionStatusObj.state == kActionStateFinished: - if actionStatusObj.status == kActionStatusSuccessful: - actionFinished = True - else: - errorMsg = "Error while executing action '%s'." \ - % actionUrl - - if actionStatusObj.status == kActionStatusError: - errorMsg += actionStatusObj.error - - print errorMsg - - sys.exit(1) - else: - time.sleep(0.1) - - -def performGenericOperation(connection, url, payloadDict): - """ - This will perform a generic operation on the given url, - it will wait for it to finish. - """ - - data = IxRestUtils.formatDictToJSONPayload(payloadDict) - reply = connection.httpPost(url=url, data=data) - - waitForActionToFinish(connection, reply, url) - - return reply - - -def performGenericPost(connection, listUrl, payloadDict): - """ - This will perform a generic POST method on a given url - """ - - data = IxRestUtils.formatDictToJSONPayload(payloadDict) - - reply = connection.httpPost(url=listUrl, data=data) - try: - newObjPath = reply.headers['location'] - except: - raise Exception('Location header is not present. \ - Please check if the action was created successfully.') - - newObjID = newObjPath.split('/')[-1] - return newObjID - - -def performGenericDelete(connection, listUrl, payloadDict): - """ - This will perform a generic DELETE method on a given url - """ - - data = IxRestUtils.formatDictToJSONPayload(payloadDict) - - reply = connection.httpDelete(url=listUrl, data=data) - return reply - - -def performGenericPatch(connection, url, payloadDict): - """ - This will perform a generic PATCH method on a given url - """ - - data = IxRestUtils.formatDictToJSONPayload(payloadDict) - - reply = connection.httpPatch(url=url, data=data) - return reply - - -def createSession(connection, ixLoadVersion): - """ - This method is used to create a new session. - It will return the url of the newly created session - """ - - sessionsUrl = 'sessions' - data = {'ixLoadVersion': ixLoadVersion} - - sessionId = performGenericPost(connection, sessionsUrl, data) - - newSessionUrl = '%s/%s' % (sessionsUrl, sessionId) - startSessionUrl = '%s/operations/start' % newSessionUrl - - # start the session - - performGenericOperation(connection, startSessionUrl, {}) - - logger.debug('Created session no %s' % sessionId) - - return newSessionUrl - - -def deleteSession(connection, sessionUrl): - """ - This method is used to delete an existing session. - """ - - deleteParams = {} - performGenericDelete(connection, sessionUrl, deleteParams) - - -def uploadFile(connection, url, fileName, uploadPath, overwrite=True): - headers = {'Content-Type': 'multipart/form-data'} - params = {'overwrite': overwrite, 'uploadPath': uploadPath} - - logger.debug('Uploading...') - try: - with open(fileName, 'rb') as f: - resp = requests.post(url, data=f, params=params, - headers=headers) - except requests.exceptions.ConnectionError, e: - raise Exception('Upload file failed. Received connection error. \ - One common cause for this error is the size of the \ - file to be uploaded.The web server sets a limit of 1GB\ - for the uploaded file size. \ - Received the following error: %s' % str(e)) - except IOError, e: - raise Exception('Upload file failed. Received IO error: %s' - % str(e)) - except Exception: - raise Exception('Upload file failed. Received the following error: %s' - % str(e)) - else: - logger.debug('Upload file finished.') - logger.debug('Response status code %s' % resp.status_code) - logger.debug('Response text %s' % resp.text) - - -def loadRepository(connection, sessionUrl, rxfFilePath): - """ - This method will perform a POST request to load a repository. - """ - - loadTestUrl = '%s/ixload/test/operations/loadTest' % sessionUrl - data = {'fullPath': rxfFilePath} - - performGenericOperation(connection, loadTestUrl, data) - - -def saveRxf(connection, sessionUrl, rxfFilePath): - """ - This method saves the current rxf to the disk of the machine on - which the IxLoad instance is running. - """ - - saveRxfUrl = '%s/ixload/test/operations/saveAs' % sessionUrl - rxfFilePath = rxfFilePath.replace('\\', '\\\\') - data = {'fullPath': rxfFilePath, 'overWrite': 1} - - performGenericOperation(connection, saveRxfUrl, data) - - -def runTest(connection, sessionUrl): - """ - This method is used to start the currently loaded test. - After starting the 'Start Test' action, wait for the action to complete. - """ - - startRunUrl = '%s/ixload/test/operations/runTest' % sessionUrl - data = {} - - performGenericOperation(connection, startRunUrl, data) - - -def getTestCurrentState(connection, sessionUrl): - """ - This method gets the test current state. - (for example - running, unconfigured, ..) - """ - - activeTestUrl = '%s/ixload/test/activeTest' % sessionUrl - testObj = connection.httpGet(activeTestUrl) - - return testObj.currentState - - -def getTestRunError(connection, sessionUrl): - """ - This method gets the error that appeared during the last test run. - If no error appeared (the test ran successfully), - the return value will be 'None'. - """ - - activeTestUrl = '%s/ixload/test/activeTest' % sessionUrl - testObj = connection.httpGet(activeTestUrl) - - return testObj.testRunError - - -def waitForTestToReachUnconfiguredState(connection, sessionUrl): - """ - This method waits for the current test to reach the 'Unconfigured' state. - """ - - while getTestCurrentState(connection, sessionUrl) \ - != kTestStateUnconfigured: - time.sleep(0.1) - - -def pollStats(connection, sessionUrl, watchedStatsDict, pollingInterval=4): - """ - This method is used to poll the stats. - Polling stats is per request but this method does a continuous poll. - """ - - statSourceList = watchedStatsDict.keys() - statsDict = {} - - collectedTimestamps = {} - testIsRunning = True - - # check stat sources - - for statSource in statSourceList[:]: - statSourceUrl = '%s/ixload/stats/%s/values' % (sessionUrl, statSource) - statSourceReply = connection.httpRequest('GET', statSourceUrl) - if statSourceReply.status_code != 200: - logger.debug("Warning - Stat source '%s' does not exist. \ - Will ignore it." % statSource) - statSourceList.remove(statSource) - - # check the test state, and poll stats while the test is still running - - while testIsRunning: - - # the polling interval is configurable. - # by default, it's set to 4 seconds - - time.sleep(pollingInterval) - - for statSource in statSourceList: - valuesUrl = '%s/ixload/stats/%s/values' % (sessionUrl, statSource) - - valuesObj = connection.httpGet(valuesUrl) - valuesDict = valuesObj.getOptions() - - # get just the new timestamps - that were not previously - # retrieved in another stats polling iteration - - newTimestamps = [int(timestamp) for timestamp in - valuesDict.keys() if timestamp - not in collectedTimestamps.get(statSource, - [])] - newTimestamps.sort() - - for timestamp in newTimestamps: - timeStampStr = str(timestamp) - - collectedTimestamps.setdefault( - statSource, []).append(timeStampStr) - - timestampDict = statsDict.setdefault( - statSource, {}).setdefault(timestamp, {}) - - # save the values for the current timestamp, - # and later print them - - logger.info(' -- ') - for (caption, value) in \ - valuesDict[timeStampStr].getOptions().items(): - if caption in watchedStatsDict[statSource]: - logger.info(' %s -> %s' % (caption, value)) - timestampDict[caption] = value - - testIsRunning = getTestCurrentState(connection, sessionUrl) \ - == 'Running' - - logger.debug('Stopped receiving stats.') - return timestampDict - - -def clearChassisList(connection, sessionUrl): - """ - This method is used to clear the chassis list. - After execution no chassis should be available in the chassisListself. - """ - - chassisListUrl = '%s/ixload/chassischain/chassisList' % sessionUrl - deleteParams = {} - performGenericDelete(connection, chassisListUrl, deleteParams) - - -def configureLicenseServer(connection, sessionUrl, licenseServerIp): - """ - This method is used to clear the chassis list. - After execution no chassis should be available in the chassisList. - """ - - chassisListUrl = '%s/ixload/preferences' % sessionUrl - patchParams = {'licenseServer': licenseServerIp} - performGenericPatch(connection, chassisListUrl, patchParams) - - -def addChassisList(connection, sessionUrl, chassisList): - """ - This method is used to add one or more chassis to the chassis list. - """ - - chassisListUrl = '%s/ixload/chassisChain/chassisList' % sessionUrl - - for chassisName in chassisList: - data = {'name': chassisName} - chassisId = performGenericPost(connection, chassisListUrl, data) - - # refresh the chassis - - refreshConnectionUrl = '%s/%s/operations/refreshConnection' \ - % (chassisListUrl, chassisId) - performGenericOperation(connection, refreshConnectionUrl, {}) - - -def assignPorts(connection, sessionUrl, portListPerCommunity): - """ - This method is used to assign ports from a connected chassis - to the required NetTraffics. - """ - - communtiyListUrl = '%s/ixload/test/activeTest/communityList' \ - % sessionUrl - - communityList = connection.httpGet(url=communtiyListUrl) - - for community in communityList: - portListForCommunity = portListPerCommunity.get(community.name) - - portListUrl = '%s/%s/network/portList' % (communtiyListUrl, - community.objectID) - - if portListForCommunity: - for portTuple in portListForCommunity: - (chassisId, cardId, portId) = portTuple - paramDict = {'chassisId': chassisId, 'cardId': cardId, - 'portId': portId} - - performGenericPost(connection, portListUrl, paramDict) diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py b/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py deleted file mode 100644 index 63db403b3..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 IXIA 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 - -from urlparse import urljoin -import requests - - -def getConnection(server, port): - """ - Gets a Connection instance, that will be used to - make the HTTP requests to the application - """ - connectionUrl = 'http://%s:%s/' % (server, port) - - conn = Connection(connectionUrl, 'v0') - return conn - - -def formatDictToJSONPayload(dictionary): - """ - Converts a given python dict instance to a string - JSON payload that can be sent to a REST API. - """ - jsonPayload = '{' - optionsList = [] - for (key, val) in dictionary.items(): - valStr = str(val) - if type(val) is str: - valStr = '"%s"' % val - if type(val) is bool: - valStr = valStr.lower() - optionsList.append('"%s":%s' % (key, valStr)) - - jsonPayload += ','.join(optionsList) - jsonPayload += '}' - - return jsonPayload - - -class Connection(object): - - """ - Class that executes the HTTP requests to the application instance. - It handles creating the HTTP session and executing HTTP methods. - """ - - kHeaderContentType = 'content-type' - kContentJson = 'application/json' - - def __init__(self, siteUrl, apiVersion): - self.httpSession = None - - self.url = Connection.urljoin(siteUrl, 'api') - self.url = Connection.urljoin(self.url, apiVersion) - - def _getHttpSession(self): - """ - This is a lazy initializer for the HTTP session. - It does not need to be active until it is required. - """ - - if self.httpSession is None: - self.httpSession = requests.Session() - return self.httpSession - - @classmethod - def urljoin(cls, base, end): - """ Join two URLs. If the second URL is absolute, the base is ignored. - - Use this instead of urlparse.urljoin directly so that we can customize - its behavior if necessary. - Currently differs in that it - 1. appends a / to base if not present. - 2. casts end to a str as a convenience - """ - - if base and not base.endswith('/'): - base = base + '/' - return urljoin(base, str(end)) - - def httpRequest(self, method, url='', data='', params={}, headers={}): - """ - Method for making a HTTP request. - The method type (GET, POST, PATCH, DELETE) will be sent as a parameter. - Along with the url and request data. The HTTP response is returned - """ - - headers[Connection.kHeaderContentType] = Connection.kContentJson - - absUrl = Connection.urljoin(self.url, url) - result = self._getHttpSession().request(method, - absUrl, - data=str(data), - params=params, - headers=headers) - return result - - def httpGet(self, url='', data='', params={}, headers={}): - """ - Method for calling HTTP GET. - This will return a WebObject that has the fields returned - in JSON format by the GET operation. - """ - - reply = self.httpRequest('GET', url, data, params, headers) - return _WebObject(reply.json()) - - def httpPost(self, url='', data='', params={}, headers={}): - """ - Method for calling HTTP POST. Will return the HTTP reply. - """ - - return self.httpRequest('POST', url, data, params, headers) - - def httpPatch(self, url='', data='', params={}, headers={}): - """ - Method for calling HTTP PATCH. Will return the HTTP reply. - """ - - return self.httpRequest('PATCH', url, data, params, headers) - - def httpDelete(self, url='', data='', params={}, headers={}): - """ - Method for calling HTTP DELETE. Will return the HTTP reply. - """ - - return self.httpRequest('DELETE', url, data, params, headers) - - -def _WebObject(value): - """ - Method used for creating a wrapper object corresponding to the JSON string - received on a GET request. - """ - - if isinstance(value, dict): - result = WebObject(**value) - elif isinstance(value, list): - result = WebList(entries=value) - else: - result = value - return result - - -class WebList(list): - - """ - Using this class a JSON list will be transformed - in a list of WebObject instances. - """ - - def __init__(self, entries=[]): - """ - Create a WebList from a list of items that - are processed by the _WebObject function - """ - - for item in entries: - self.append(_WebObject(item)) - - -class WebObject(object): - - """ - A WebObject instance will have its fields set to correspond to - the JSON format received on a GET request. - """ - - def __init__(self, **entries): - """ - Create a WebObject instance by providing a dict having a - property - value structure. - """ - - self.jsonOptions = {} - for (key, value) in entries.iteritems(): - webObj = _WebObject(value) - self.jsonOptions[key] = webObj - self.__dict__[key] = webObj - - def getOptions(self): - ''' - Get the JSON dictionary which represents the WebObject Instance - ''' - - return self.jsonOptions diff --git a/functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py b/functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py +++ /dev/null diff --git a/functest/opnfv_tests/vnf/ims/orchestra.yaml b/functest/opnfv_tests/vnf/ims/orchestra.yaml deleted file mode 100644 index f81f55fbe..000000000 --- a/functest/opnfv_tests/vnf/ims/orchestra.yaml +++ /dev/null @@ -1,68 +0,0 @@ ---- -tenant_images: - orchestrator: - ubuntu-14.04-server-cloudimg-amd64-disk1: - /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img - orchestra_openims: - openims: /home/opnfv/functest/images/img - orchestra_clearwaterims: - ubuntu-14.04-server-cloudimg-amd64-disk1: - /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img -mano: - name: OpenBaton - version: '3.2.0' - requirements: - flavor: - name: openbaton - ram_min: 4096 - disk: 5 - vcpus: 2 - image: 'ubuntu-14.04-server-cloudimg-amd64-disk1' - bootstrap: - url: http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap - config: - url: - http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap-config-file - gvnfm: - userdata: - url: - https://raw.githubusercontent.com/openbaton/generic-vnfm/3.2.0/src/main/resources/user-data.sh - credentials: - username: admin - password: openbaton - -orchestra_openims: - name: OpenIMS - descriptor: - url: - http://marketplace.openbaton.org:8080/api/v1/nsds/fokus/OpenImsCore/3.2.0/json - requirements: - flavor: - name: m1.small - ram_min: 2048 - disk: 5 - vcpus: 2 - test: - scscf: - ports: [3870, 6060] - pcscf: - ports: [4060] - icscf: - ports: [3869, 5060] - fhoss: - ports: [3868] - bind9: - ports: [] - -orchestra_clearwaterims: - name: Clearwater IMS - descriptor: - url: - http://marketplace.openbaton.org:8080/api/v1/nsds/fokus/ClearwaterIMS/3.2.0/json - requirements: - flavor: - name: m1.small - ram_min: 2048 - disk: 5 - vcpus: 2 - test: diff --git a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py deleted file mode 100644 index 3db53e35e..000000000 --- a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py +++ /dev/null @@ -1,667 +0,0 @@ -#!/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 - -"""Orchestra Clearwater IMS testcase implementation.""" - -import json -import logging -import os -import socket -import time -import pkg_resources -import yaml - -import functest.core.vnf as vnf -import functest.utils.openstack_utils as os_utils -from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.utils.constants import CONST - -from org.openbaton.cli.errors.errors import NfvoException -from org.openbaton.cli.agents.agents import MainAgent -from snaps.config.flavor import FlavorConfig -from snaps.config.image import ImageConfig -from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.config.security_group import ( - Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) -from snaps.config.vm_inst import VmInstanceConfig -from snaps.openstack.utils import keystone_utils -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.create_image import OpenStackImage -from snaps.openstack.create_instance import OpenStackVmInstance -from snaps.openstack.create_network import OpenStackNetwork -from snaps.openstack.create_router import OpenStackRouter -from snaps.openstack.create_security_group import OpenStackSecurityGroup - - -__author__ = "Pauls, Michael <michael.pauls@fokus.fraunhofer.de>" -# ---------------------------------------------------------- -# -# 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 - - -def servertest(host, port): - """Method to test that a server is reachable at IP:port""" - args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM) - for family, socktype, proto, canonname, sockaddr in args: - sock = socket.socket(family, socktype, proto) - try: - sock.connect(sockaddr) - except socket.error: - return False - else: - sock.close() - return True - - -def get_userdata(orchestrator=dict): - """Build userdata for Open Baton machine""" - userdata = "#!/bin/bash\n" - userdata += "echo \"Executing userdata...\"\n" - userdata += "set -x\n" - userdata += "set -e\n" - userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n" - userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n" - userdata += "echo \"Install curl...\"\n" - userdata += "apt-get install curl\n" - userdata += "echo \"Inject public key...\"\n" - userdata += ("echo \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuPXrV3" - "geeHc6QUdyUr/1Z+yQiqLcOskiEGBiXr4z76MK4abiFmDZ18OMQlc" - "fl0p3kS0WynVgyaOHwZkgy/DIoIplONVr2CKBKHtPK+Qcme2PVnCtv" - "EqItl/FcD+1h5XSQGoa+A1TSGgCod/DPo+pes0piLVXP8Ph6QS1k7S" - "ic7JDeRQ4oT1bXYpJ2eWBDMfxIWKZqcZRiGPgMIbJ1iEkxbpeaAd9O" - "4MiM9nGCPESmed+p54uYFjwEDlAJZShcAZziiZYAvMZhvAhe6USljc" - "7YAdalAnyD/jwCHuwIrUw/lxo7UdNCmaUxeobEYyyFA1YVXzpNFZya" - "XPGAAYIJwEq/ openbaton@opnfv\" >> /home/ubuntu/.ssh/aut" - "horized_keys\n") - userdata += "echo \"Download bootstrap...\"\n" - userdata += ("curl -s %s " - "> ./bootstrap\n" % orchestrator['bootstrap']['url']) - userdata += ("curl -s %s" "> ./config_file\n" % - orchestrator['bootstrap']['config']['url']) - userdata += ("echo \"Disable usage of mysql...\"\n") - userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n" - userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n" - % orchestrator['details']['fip'].ip) - userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip" - "=%s/g /config_file\n" % orchestrator['details']['fip'].ip) - userdata += "echo \"Set autostart of components to 'false'\"\n" - userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n" - userdata += "echo \"Execute bootstrap...\"\n" - bootstrap = "sh ./bootstrap release -configFile=./config_file" - userdata += bootstrap + "\n" - userdata += "echo \"Setting 'nfvo.plugin.timeout' to '300000'\"\n" - userdata += ("echo \"nfvo.plugin.timeout=600000\" >> " - "/etc/openbaton/openbaton-nfvo.properties\n") - userdata += ( - "wget %s -O /etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" % - orchestrator['gvnfm']['userdata']['url']) - userdata += "sed -i '113i"'\ \ \ \ '"sleep 60' " \ - "/etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" - userdata += ("sed -i s/nfvo.marketplace.port=8082/nfvo.marketplace." - "port=8080/g /etc/openbaton/openbaton-nfvo.properties\n") - userdata += "echo \"Starting NFVO\"\n" - userdata += "service openbaton-nfvo restart\n" - userdata += "echo \"Starting Generic VNFM\"\n" - userdata += "service openbaton-vnfm-generic restart\n" - userdata += "echo \"...end of userdata...\"\n" - return userdata - - -class ClearwaterImsVnf(vnf.VnfOnBoarding): - """Clearwater IMS VNF deployed with openBaton orchestrator""" - - # logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = "orchestra_clearwaterims" - super(ClearwaterImsVnf, self).__init__(**kwargs) - self.logger = logging.getLogger("functest.ci.run_tests.orchestra") - self.logger.info("kwargs %s", (kwargs)) - - self.case_dir = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/vnf/ims/') - self.data_dir = CONST.__getattribute__('dir_ims_data') - self.test_dir = CONST.__getattribute__('dir_repo_vims_test') - self.created_resources = [] - self.logger.info("%s VNF onboarding test starting", self.case_name) - - try: - self.config = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) - except BaseException: - raise Exception("Orchestra VNF config file not found") - - config_file = self.case_dir + self.config - - self.mano = dict( - get_config("mano", config_file), - details={} - ) - self.logger.debug("Orchestrator configuration %s", self.mano) - - self.details['orchestrator'] = dict( - name=self.mano['name'], - version=self.mano['version'], - status='ERROR', - result='' - ) - - self.vnf = dict( - get_config(self.case_name, config_file), - ) - self.logger.debug("VNF configuration: %s", self.vnf) - - self.details['vnf'] = dict( - name=self.vnf['name'], - ) - - self.details['test_vnf'] = dict( - name=self.case_name, - ) - - # Orchestra base Data directory creation - if not os.path.exists(self.data_dir): - os.makedirs(self.data_dir) - - self.images = get_config("tenant_images.orchestrator", config_file) - self.images.update( - get_config( - "tenant_images.%s" % - self.case_name, - config_file)) - self.snaps_creds = None - - def prepare(self): - """Prepare testscase (Additional pre-configuration steps).""" - super(ClearwaterImsVnf, self).prepare() - - self.logger.info("Additional pre-configuration steps") - - public_auth_url = keystone_utils.get_endpoint( - self.snaps_creds, 'identity') - - self.creds = { - "tenant": self.tenant_name, - "username": self.tenant_name, - "password": self.tenant_name, - "auth_url": public_auth_url - } - self.prepare_images() - self.prepare_flavor() - self.prepare_security_groups() - self.prepare_network() - self.prepare_floating_ip() - - def prepare_images(self): - """Upload images if they doen't exist yet""" - self.logger.info("Upload images if they doen't exist yet") - for image_name, image_file in self.images.iteritems(): - self.logger.info("image: %s, file: %s", image_name, image_file) - if image_file and image_name: - image = OpenStackImage( - self.snaps_creds, - ImageConfig(name=image_name, - image_user='cloud', - img_format='qcow2', - image_file=image_file, - public=True)) - image.create() - # self.created_resources.append(image); - - def prepare_security_groups(self): - """Create Open Baton security group if it doesn't exist yet""" - self.logger.info( - "Creating security group for Open Baton if not yet existing...") - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.ingress, - protocol=Protocol.tcp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.egress, - protocol=Protocol.tcp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.ingress, - protocol=Protocol.udp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.egress, - protocol=Protocol.udp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.ingress, - protocol=Protocol.icmp)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.egress, - protocol=Protocol.icmp)) - security_group = OpenStackSecurityGroup( - self.snaps_creds, - SecurityGroupConfig( - name="orchestra-sec-group-allowall", - rule_settings=sg_rules)) - - security_group_info = security_group.create() - self.created_resources.append(security_group) - self.mano['details']['sec_group'] = security_group_info.name - self.logger.info( - "Security group orchestra-sec-group-allowall prepared") - - def prepare_flavor(self): - """Create Open Baton flavor if it doesn't exist yet""" - self.logger.info( - "Create Flavor for Open Baton NFVO if not yet existing") - - flavor_settings = FlavorConfig( - name=self.mano['requirements']['flavor']['name'], - ram=self.mano['requirements']['flavor']['ram_min'], - disk=self.mano['requirements']['flavor']['disk'], - vcpus=self.mano['requirements']['flavor']['vcpus']) - flavor = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_info = flavor.create() - self.created_resources.append(flavor) - self.mano['details']['flavor'] = {} - self.mano['details']['flavor']['name'] = flavor_settings.name - self.mano['details']['flavor']['id'] = flavor_info.id - - def prepare_network(self): - """Create network/subnet/router if they doen't exist yet""" - self.logger.info( - "Creating network/subnet/router if they doen't exist yet...") - subnet_settings = SubnetConfig( - name='%s_subnet' % - self.case_name, - cidr="192.168.100.0/24") - network_settings = NetworkConfig( - name='%s_net' % - self.case_name, - subnet_settings=[subnet_settings]) - orchestra_network = OpenStackNetwork( - self.snaps_creds, network_settings) - orchestra_network_info = orchestra_network.create() - self.mano['details']['network'] = {} - self.mano['details']['network']['id'] = orchestra_network_info.id - self.mano['details']['network']['name'] = orchestra_network_info.name - self.mano['details']['external_net_name'] = snaps_utils.\ - get_ext_net_name(self.snaps_creds) - self.created_resources.append(orchestra_network) - orchestra_router = OpenStackRouter( - self.snaps_creds, - RouterConfig( - name='%s_router' % - self.case_name, - external_gateway=self.mano['details']['external_net_name'], - internal_subnets=[ - subnet_settings.name])) - orchestra_router.create() - self.created_resources.append(orchestra_router) - self.logger.info("Created network and router for Open Baton NFVO...") - - def prepare_floating_ip(self): - """Select/Create Floating IP if it doesn't exist yet""" - self.logger.info("Retrieving floating IP for Open Baton NFVO") - neutron_client = snaps_utils.neutron_utils.neutron_client( - self.snaps_creds) - # Finding Tenant ID to check to which tenant the Floating IP belongs - tenant_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(self.creds), - self.tenant_name) - # Use os_utils to retrieve complete information of Floating IPs - floating_ips = os_utils.get_floating_ips(neutron_client) - my_floating_ips = [] - # Filter Floating IPs with tenant id - for floating_ip in floating_ips: - if floating_ip.get('tenant_id') == tenant_id: - my_floating_ips.append(floating_ip.get('floating_ip_address')) - # Select if Floating IP exist else create new one - if len(my_floating_ips) >= 1: - # Get Floating IP object from snaps for clean up - snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips( - neutron_client) - for my_floating_ip in my_floating_ips: - for snaps_floating_ip in snaps_floating_ips: - if snaps_floating_ip.ip == my_floating_ip: - self.mano['details']['fip'] = snaps_floating_ip - self.logger.info( - "Selected floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - break - if self.mano['details']['fip'] is not None: - break - else: - self.logger.info("Creating floating IP for Open Baton NFVO") - self.mano['details']['fip'] = snaps_utils.neutron_utils.\ - create_floating_ip( - neutron_client, - self.mano['details']['external_net_name']) - self.logger.info( - "Created floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - - def get_vim_descriptor(self): - """"Create VIM descriptor to be used for onboarding""" - self.logger.info( - "Building VIM descriptor with PoP creds: %s", - self.creds) - # Depending on API version either tenant ID or project name must be - # used - if os_utils.is_keystone_v3(): - self.logger.info( - "Using v3 API of OpenStack... -> Using OS_PROJECT_ID") - project_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(), - self.creds.get("project_name")) - else: - self.logger.info( - "Using v2 API of OpenStack... -> Using OS_TENANT_NAME") - project_id = self.creds.get("tenant_name") - self.logger.debug("VIM project/tenant id: %s", project_id) - vim_json = { - "name": "vim-instance", - "authUrl": self.creds.get("auth_url"), - "tenant": project_id, - "username": self.creds.get("username"), - "password": self.creds.get("password"), - "securityGroups": [ - self.mano['details']['sec_group'] - ], - "type": "openstack", - "location": { - "name": "opnfv", - "latitude": "52.525876", - "longitude": "13.314400" - } - } - self.logger.info("Built VIM descriptor: %s", vim_json) - return vim_json - - def deploy_orchestrator(self): - self.logger.info("Deploying Open Baton...") - self.logger.info("Details: %s", self.mano['details']) - start_time = time.time() - - self.logger.info("Creating orchestra instance...") - userdata = get_userdata(self.mano) - self.logger.info("flavor: %s\n" - "image: %s\n" - "network_id: %s\n", - self.mano['details']['flavor']['name'], - self.mano['requirements']['image'], - self.mano['details']['network']['id']) - self.logger.debug("userdata: %s\n", userdata) - # setting up image - image_settings = ImageConfig( - name=self.mano['requirements']['image'], - image_user='ubuntu', - exists=True) - # setting up port - port_settings = PortConfig( - name='%s_port' % self.case_name, - network_name=self.mano['details']['network']['name']) - # build configuration of vm - orchestra_settings = VmInstanceConfig( - name=self.case_name, - flavor=self.mano['details']['flavor']['name'], - port_settings=[port_settings], - security_group_names=[self.mano['details']['sec_group']], - userdata=str(userdata)) - orchestra_vm = OpenStackVmInstance(self.snaps_creds, - orchestra_settings, - image_settings) - - orchestra_vm.create() - self.created_resources.append(orchestra_vm) - self.mano['details']['id'] = orchestra_vm.get_vm_info()['id'] - self.logger.info( - "Created orchestra instance: %s", - self.mano['details']['id']) - - self.logger.info("Associating floating ip: '%s' to VM '%s' ", - self.mano['details']['fip'].ip, - self.case_name) - nova_client = os_utils.get_nova_client() - if not os_utils.add_floating_ip( - nova_client, - self.mano['details']['id'], - self.mano['details']['fip'].ip): - duration = time.time() - start_time - self.details["orchestrator"].update( - status='FAIL', duration=duration) - self.logger.error("Cannot associate floating IP to VM.") - return False - - self.logger.info("Waiting for Open Baton NFVO to be up and running...") - timeout = 0 - while timeout < 20: - if servertest( - self.mano['details']['fip'].ip, - "8080"): - break - else: - self.logger.info( - "Open Baton NFVO is not started yet (%ss)", - (timeout * 60)) - time.sleep(60) - timeout += 1 - - if timeout >= 20: - duration = time.time() - start_time - self.details["orchestrator"].update( - status='FAIL', duration=duration) - self.logger.error("Open Baton is not started correctly") - return False - - self.logger.info("Waiting for all components to be up and running...") - time.sleep(60) - duration = time.time() - start_time - self.details["orchestrator"].update(status='PASS', duration=duration) - self.logger.info("Deploy Open Baton NFVO: OK") - return True - - def deploy_vnf(self): - start_time = time.time() - self.logger.info("Deploying %s...", self.vnf['name']) - - main_agent = MainAgent( - nfvo_ip=self.mano['details']['fip'].ip, - nfvo_port=8080, - https=False, - version=1, - username=self.mano['credentials']['username'], - password=self.mano['credentials']['password']) - - self.logger.info( - "Create %s Flavor if not existing", self.vnf['name']) - flavor_settings = FlavorConfig( - name=self.vnf['requirements']['flavor']['name'], - ram=self.vnf['requirements']['flavor']['ram_min'], - disk=self.vnf['requirements']['flavor']['disk'], - vcpus=self.vnf['requirements']['flavor']['vcpus']) - flavor = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_info = flavor.create() - self.logger.debug("Flavor id: %s", flavor_info.id) - - self.logger.info("Getting project 'default'...") - project_agent = main_agent.get_agent("project", "") - for project in json.loads(project_agent.find()): - if project.get("name") == "default": - self.mano['details']['project_id'] = project.get("id") - self.logger.info("Found project 'default': %s", project) - break - - vim_json = self.get_vim_descriptor() - self.logger.info("Registering VIM: %s", vim_json) - - main_agent.get_agent( - "vim", project_id=self.mano['details']['project_id']).create( - entity=json.dumps(vim_json)) - - market_agent = main_agent.get_agent( - "market", project_id=self.mano['details']['project_id']) - - try: - self.logger.info("sending: %s", self.vnf['descriptor']['url']) - nsd = market_agent.create(entity=self.vnf['descriptor']['url']) - if nsd.get('id') is None: - self.logger.error("NSD not onboarded correctly") - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - self.mano['details']['nsd_id'] = nsd.get('id') - self.logger.info("Onboarded NSD: " + nsd.get("name")) - - nsr_agent = main_agent.get_agent( - "nsr", project_id=self.mano['details']['project_id']) - - self.mano['details']['nsr'] = nsr_agent.create( - self.mano['details']['nsd_id']) - except NfvoException as exc: - self.logger.error(exc.message) - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - - if self.mano['details']['nsr'].get('code') is not None: - self.logger.error( - "%s cannot be deployed: %s -> %s", - self.vnf['name'], - self.mano['details']['nsr'].get('code'), - self.mano['details']['nsr'].get('message')) - self.logger.error("%s cannot be deployed", self.vnf['name']) - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - - timeout = 0 - self.logger.info("Waiting for NSR to go to ACTIVE...") - while self.mano['details']['nsr'].get("status") != 'ACTIVE' \ - and self.mano['details']['nsr'].get("status") != 'ERROR': - timeout += 1 - self.logger.info("NSR is not yet ACTIVE... (%ss)", 60 * timeout) - if timeout == 30: - self.logger.error("INACTIVE NSR after %s sec..", 60 * timeout) - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - time.sleep(60) - self.mano['details']['nsr'] = json.loads( - nsr_agent.find(self.mano['details']['nsr'].get('id'))) - - duration = time.time() - start_time - if self.mano['details']['nsr'].get("status") == 'ACTIVE': - self.details["vnf"].update(status='PASS', duration=duration) - self.logger.info("Sleep for 60s to ensure that all " - "services are up and running...") - time.sleep(60) - result = True - else: - self.details["vnf"].update(status='FAIL', duration=duration) - self.logger.error("NSR: %s", self.mano['details'].get('nsr')) - result = False - return result - - def test_vnf(self): - self.logger.info( - "Testing VNF Clearwater IMS is not yet implemented...") - start_time = time.time() - - duration = time.time() - start_time - self.details["test_vnf"].update(status='PASS', duration=duration) - self.logger.info("Test VNF: OK") - return True - - def clean(self): - self.logger.info("Cleaning %s...", self.case_name) - try: - main_agent = MainAgent( - nfvo_ip=self.mano['details']['fip'].ip, - nfvo_port=8080, - https=False, - version=1, - username=self.mano['credentials']['username'], - password=self.mano['credentials']['password']) - self.logger.info("Terminating %s...", self.vnf['name']) - if (self.mano['details'].get('nsr')): - main_agent.get_agent( - "nsr", - project_id=self.mano['details']['project_id']).delete( - self.mano['details']['nsr'].get('id')) - self.logger.info("Sleeping 60 seconds...") - time.sleep(60) - else: - self.logger.info("No need to terminate the VNF...") - # os_utils.delete_instance(nova_client=os_utils.get_nova_client(), - # instance_id=self.mano_instance_id) - except (NfvoException, KeyError) as exc: - self.logger.error('Unexpected error cleaning - %s', exc) - - try: - neutron_client = os_utils.get_neutron_client(self.creds) - self.logger.info("Deleting Open Baton Port...") - port = snaps_utils.neutron_utils.get_port( - neutron_client, - port_name='%s_port' % self.case_name) - snaps_utils.neutron_utils.delete_port(neutron_client, port) - time.sleep(10) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - try: - self.logger.info("Deleting Open Baton Floating IP...") - snaps_utils.neutron_utils.delete_floating_ip( - neutron_client, self.mano['details']['fip']) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - - for resource in reversed(self.created_resources): - try: - self.logger.info("Cleaning %s", str(resource)) - resource.clean() - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - super(ClearwaterImsVnf, self).clean() diff --git a/functest/opnfv_tests/vnf/ims/orchestra_openims.py b/functest/opnfv_tests/vnf/ims/orchestra_openims.py deleted file mode 100644 index d609a0fba..000000000 --- a/functest/opnfv_tests/vnf/ims/orchestra_openims.py +++ /dev/null @@ -1,690 +0,0 @@ -#!/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 - -"""Orchestra OpenIMS testcase implementation.""" - -import json -import logging -import os -import socket -import time -import pkg_resources -import yaml - -import functest.core.vnf as vnf -import functest.utils.openstack_utils as os_utils -from functest.utils.constants import CONST - -from org.openbaton.cli.errors.errors import NfvoException -from org.openbaton.cli.agents.agents import MainAgent -from snaps.config.flavor import FlavorConfig -from snaps.config.image import ImageConfig -from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.config.security_group import ( - Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) -from snaps.config.vm_inst import VmInstanceConfig -from snaps.openstack.utils import keystone_utils -from snaps.openstack.create_image import OpenStackImage -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.create_security_group import OpenStackSecurityGroup -from snaps.openstack.create_network import OpenStackNetwork -from snaps.openstack.create_router import OpenStackRouter -from snaps.openstack.create_instance import OpenStackVmInstance - -from functest.opnfv_tests.openstack.snaps import snaps_utils - - -__author__ = "Pauls, Michael <michael.pauls@fokus.fraunhofer.de>" -# ---------------------------------------------------------- -# -# 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 - - -def servertest(host, port): - """Method to test that a server is reachable at IP:port""" - args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM) - for family, socktype, proto, canonname, sockaddr in args: - sock = socket.socket(family, socktype, proto) - try: - sock.connect(sockaddr) - except socket.error: - return False - else: - sock.close() - return True - - -def get_userdata(orchestrator=dict): - """Build userdata for Open Baton machine""" - userdata = "#!/bin/bash\n" - userdata += "echo \"Executing userdata...\"\n" - userdata += "set -x\n" - userdata += "set -e\n" - userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n" - userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n" - userdata += "echo \"Install curl...\"\n" - userdata += "apt-get install curl\n" - userdata += "echo \"Inject public key...\"\n" - userdata += ("echo \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuPXrV3" - "geeHc6QUdyUr/1Z+yQiqLcOskiEGBiXr4z76MK4abiFmDZ18OMQlc" - "fl0p3kS0WynVgyaOHwZkgy/DIoIplONVr2CKBKHtPK+Qcme2PVnCtv" - "EqItl/FcD+1h5XSQGoa+A1TSGgCod/DPo+pes0piLVXP8Ph6QS1k7S" - "ic7JDeRQ4oT1bXYpJ2eWBDMfxIWKZqcZRiGPgMIbJ1iEkxbpeaAd9O" - "4MiM9nGCPESmed+p54uYFjwEDlAJZShcAZziiZYAvMZhvAhe6USljc" - "7YAdalAnyD/jwCHuwIrUw/lxo7UdNCmaUxeobEYyyFA1YVXzpNFZya" - "XPGAAYIJwEq/ openbaton@opnfv\" >> /home/ubuntu/.ssh/aut" - "horized_keys\n") - userdata += "echo \"Download bootstrap...\"\n" - userdata += ("curl -s %s " - "> ./bootstrap\n" % orchestrator['bootstrap']['url']) - userdata += ("curl -s %s" "> ./config_file\n" % - orchestrator['bootstrap']['config']['url']) - userdata += ("echo \"Disable usage of mysql...\"\n") - userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n" - userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n" - % orchestrator['details']['fip'].ip) - userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip" - "=%s/g /config_file\n" % orchestrator['details']['fip'].ip) - userdata += "echo \"Set autostart of components to 'false'\"\n" - userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n" - userdata += "echo \"Execute bootstrap...\"\n" - bootstrap = "sh ./bootstrap release -configFile=./config_file" - userdata += bootstrap + "\n" - userdata += "echo \"Setting 'nfvo.plugin.timeout' to '300000'\"\n" - userdata += ("echo \"nfvo.plugin.timeout=600000\" >> " - "/etc/openbaton/openbaton-nfvo.properties\n") - userdata += ( - "wget %s -O /etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" % - orchestrator['gvnfm']['userdata']['url']) - userdata += "sed -i '113i"'\ \ \ \ '"sleep 60' " \ - "/etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" - userdata += ("sed -i s/nfvo.marketplace.port=8082/nfvo.marketplace." - "port=8080/g /etc/openbaton/openbaton-nfvo.properties\n") - userdata += "echo \"Starting NFVO\"\n" - userdata += "service openbaton-nfvo restart\n" - userdata += "echo \"Starting Generic VNFM\"\n" - userdata += "service openbaton-vnfm-generic restart\n" - userdata += "echo \"...end of userdata...\"\n" - return userdata - - -class OpenImsVnf(vnf.VnfOnBoarding): - """OpenIMS VNF deployed with openBaton orchestrator""" - - # logger = logging.getLogger(__name__) - - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = "orchestra_openims" - super(OpenImsVnf, self).__init__(**kwargs) - self.logger = logging.getLogger("functest.ci.run_tests.orchestra") - self.logger.info("kwargs %s", (kwargs)) - - self.case_dir = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/vnf/ims/') - self.data_dir = CONST.__getattribute__('dir_ims_data') - self.test_dir = CONST.__getattribute__('dir_repo_vims_test') - self.created_resources = [] - self.logger.info("%s VNF onboarding test starting", self.case_name) - - try: - self.config = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) - except BaseException: - raise Exception("Orchestra VNF config file not found") - config_file = self.case_dir + self.config - - self.mano = dict( - get_config("mano", config_file), - details={} - ) - self.logger.debug("Orchestrator configuration %s", self.mano) - - self.details['orchestrator'] = dict( - name=self.mano['name'], - version=self.mano['version'], - status='ERROR', - result='' - ) - - self.vnf = dict( - get_config(self.case_name, config_file), - ) - self.logger.debug("VNF configuration: %s", self.vnf) - - self.details['vnf'] = dict( - name=self.vnf['name'], - ) - - self.details['test_vnf'] = dict( - name=self.case_name, - ) - - # Orchestra base Data directory creation - if not os.path.exists(self.data_dir): - os.makedirs(self.data_dir) - - self.images = get_config("tenant_images.orchestrator", config_file) - self.images.update(get_config("tenant_images.%s" % - self.case_name, config_file)) - - def prepare(self): - """Prepare testscase (Additional pre-configuration steps).""" - super(OpenImsVnf, self).prepare() - - public_auth_url = keystone_utils.get_endpoint( - self.snaps_creds, 'identity') - - self.logger.info("Additional pre-configuration steps") - self.creds = { - "tenant": self.tenant_name, - "username": self.tenant_name, - "password": self.tenant_name, - "auth_url": public_auth_url - } - self.prepare_images() - self.prepare_flavor() - self.prepare_security_groups() - self.prepare_network() - self.prepare_floating_ip() - - def prepare_images(self): - """Upload images if they doen't exist yet""" - self.logger.info("Upload images if they doen't exist yet") - for image_name, image_file in self.images.iteritems(): - self.logger.info("image: %s, file: %s", image_name, image_file) - if image_file and image_name: - image = OpenStackImage( - self.snaps_creds, - ImageConfig(name=image_name, - image_user='cloud', - img_format='qcow2', - image_file=image_file, - public=True)) - image.create() - # self.created_resources.append(image); - - def prepare_security_groups(self): - """Create Open Baton security group if it doesn't exist yet""" - self.logger.info( - "Creating security group for Open Baton if not yet existing...") - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.ingress, - protocol=Protocol.tcp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.egress, - protocol=Protocol.tcp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.ingress, - protocol=Protocol.udp, - port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.egress, - protocol=Protocol.udp, - port_range_min=1, - port_range_max=65535)) - security_group = OpenStackSecurityGroup( - self.snaps_creds, - SecurityGroupConfig( - name="orchestra-sec-group-allowall", - rule_settings=sg_rules)) - - security_group_info = security_group.create() - self.created_resources.append(security_group) - self.mano['details']['sec_group'] = security_group_info.name - self.logger.info( - "Security group orchestra-sec-group-allowall prepared") - - def prepare_flavor(self): - """Create Open Baton flavor if it doesn't exist yet""" - self.logger.info( - "Create Flavor for Open Baton NFVO if not yet existing") - - flavor_settings = FlavorConfig( - name=self.mano['requirements']['flavor']['name'], - ram=self.mano['requirements']['flavor']['ram_min'], - disk=self.mano['requirements']['flavor']['disk'], - vcpus=self.mano['requirements']['flavor']['vcpus']) - flavor = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_info = flavor.create() - self.created_resources.append(flavor) - self.mano['details']['flavor'] = {} - self.mano['details']['flavor']['name'] = flavor_settings.name - self.mano['details']['flavor']['id'] = flavor_info.id - - def prepare_network(self): - """Create network/subnet/router if they doen't exist yet""" - self.logger.info( - "Creating network/subnet/router if they doen't exist yet...") - subnet_settings = SubnetConfig( - name='%s_subnet' % - self.case_name, - cidr="192.168.100.0/24") - network_settings = NetworkConfig( - name='%s_net' % - self.case_name, - subnet_settings=[subnet_settings]) - orchestra_network = OpenStackNetwork( - self.snaps_creds, network_settings) - orchestra_network_info = orchestra_network.create() - self.mano['details']['network'] = {} - self.mano['details']['network']['id'] = orchestra_network_info.id - self.mano['details']['network']['name'] = orchestra_network_info.name - self.mano['details']['external_net_name'] = \ - snaps_utils.get_ext_net_name(self.snaps_creds) - self.created_resources.append(orchestra_network) - orchestra_router = OpenStackRouter( - self.snaps_creds, - RouterConfig( - name='%s_router' % - self.case_name, - external_gateway=self.mano['details']['external_net_name'], - internal_subnets=[ - subnet_settings.name])) - orchestra_router.create() - self.created_resources.append(orchestra_router) - self.logger.info("Created network and router for Open Baton NFVO...") - - def prepare_floating_ip(self): - """Select/Create Floating IP if it doesn't exist yet""" - self.logger.info("Retrieving floating IP for Open Baton NFVO") - neutron_client = snaps_utils.neutron_utils.neutron_client( - self.snaps_creds) - # Finding Tenant ID to check to which tenant the Floating IP belongs - tenant_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(self.creds), - self.tenant_name) - # Use os_utils to retrieve complete information of Floating IPs - floating_ips = os_utils.get_floating_ips(neutron_client) - my_floating_ips = [] - # Filter Floating IPs with tenant id - for floating_ip in floating_ips: - # self.logger.info("Floating IP: %s", floating_ip) - if floating_ip.get('tenant_id') == tenant_id: - my_floating_ips.append(floating_ip.get('floating_ip_address')) - # Select if Floating IP exist else create new one - if len(my_floating_ips) >= 1: - # Get Floating IP object from snaps for clean up - snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips( - neutron_client) - for my_floating_ip in my_floating_ips: - for snaps_floating_ip in snaps_floating_ips: - if snaps_floating_ip.ip == my_floating_ip: - self.mano['details']['fip'] = snaps_floating_ip - self.logger.info( - "Selected floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - break - if self.mano['details']['fip'] is not None: - break - else: - self.logger.info("Creating floating IP for Open Baton NFVO") - self.mano['details']['fip'] = ( - snaps_utils.neutron_utils. create_floating_ip( - neutron_client, self.mano['details']['external_net_name'])) - self.logger.info( - "Created floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - - def get_vim_descriptor(self): - """"Create VIM descriptor to be used for onboarding""" - self.logger.info( - "Building VIM descriptor with PoP creds: %s", - self.creds) - # Depending on API version either tenant ID or project name must be - # used - if os_utils.is_keystone_v3(): - self.logger.info( - "Using v3 API of OpenStack... -> Using OS_PROJECT_ID") - project_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(), - self.creds.get("project_name")) - else: - self.logger.info( - "Using v2 API of OpenStack... -> Using OS_TENANT_NAME") - project_id = self.creds.get("tenant_name") - self.logger.debug("VIM project/tenant id: %s", project_id) - vim_json = { - "name": "vim-instance", - "authUrl": self.creds.get("auth_url"), - "tenant": project_id, - "username": self.creds.get("username"), - "password": self.creds.get("password"), - "securityGroups": [ - self.mano['details']['sec_group'] - ], - "type": "openstack", - "location": { - "name": "opnfv", - "latitude": "52.525876", - "longitude": "13.314400" - } - } - self.logger.info("Built VIM descriptor: %s", vim_json) - return vim_json - - def deploy_orchestrator(self): - self.logger.info("Deploying Open Baton...") - self.logger.info("Details: %s", self.mano['details']) - start_time = time.time() - - self.logger.info("Creating orchestra instance...") - userdata = get_userdata(self.mano) - self.logger.info("flavor: %s\n" - "image: %s\n" - "network_id: %s\n", - self.mano['details']['flavor']['name'], - self.mano['requirements']['image'], - self.mano['details']['network']['id']) - self.logger.debug("userdata: %s\n", userdata) - # setting up image - image_settings = ImageConfig( - name=self.mano['requirements']['image'], - image_user='ubuntu', - exists=True) - # setting up port - port_settings = PortConfig( - name='%s_port' % self.case_name, - network_name=self.mano['details']['network']['name']) - # build configuration of vm - orchestra_settings = VmInstanceConfig( - name=self.case_name, - flavor=self.mano['details']['flavor']['name'], - port_settings=[port_settings], - security_group_names=[self.mano['details']['sec_group']], - userdata=str(userdata)) - orchestra_vm = OpenStackVmInstance(self.snaps_creds, - orchestra_settings, - image_settings) - - orchestra_vm.create() - self.created_resources.append(orchestra_vm) - self.mano['details']['id'] = orchestra_vm.get_vm_info()['id'] - self.logger.info( - "Created orchestra instance: %s", - self.mano['details']['id']) - - self.logger.info("Associating floating ip: '%s' to VM '%s' ", - self.mano['details']['fip'].ip, - self.case_name) - nova_client = os_utils.get_nova_client() - if not os_utils.add_floating_ip( - nova_client, - self.mano['details']['id'], - self.mano['details']['fip'].ip): - duration = time.time() - start_time - self.details["orchestrator"].update( - status='FAIL', duration=duration) - self.logger.error("Cannot associate floating IP to VM.") - return False - - self.logger.info("Waiting for Open Baton NFVO to be up and running...") - timeout = 0 - while timeout < 20: - if servertest( - self.mano['details']['fip'].ip, - "8080"): - break - else: - self.logger.info("Open Baton NFVO is not started yet (%ss)", - (timeout * 60)) - time.sleep(60) - timeout += 1 - - if timeout >= 20: - duration = time.time() - start_time - self.details["orchestrator"].update( - status='FAIL', duration=duration) - self.logger.error("Open Baton is not started correctly") - return False - - self.logger.info("Waiting for all components to be up and running...") - time.sleep(60) - duration = time.time() - start_time - self.details["orchestrator"].update(status='PASS', duration=duration) - self.logger.info("Deploy Open Baton NFVO: OK") - return True - - def deploy_vnf(self): - start_time = time.time() - self.logger.info("Deploying %s...", self.vnf['name']) - - main_agent = MainAgent( - nfvo_ip=self.mano['details']['fip'].ip, - nfvo_port=8080, - https=False, - version=1, - username=self.mano['credentials']['username'], - password=self.mano['credentials']['password']) - - self.logger.info( - "Create %s Flavor if not existing", self.vnf['name']) - flavor_settings = FlavorConfig( - name=self.vnf['requirements']['flavor']['name'], - ram=self.vnf['requirements']['flavor']['ram_min'], - disk=self.vnf['requirements']['flavor']['disk'], - vcpus=self.vnf['requirements']['flavor']['vcpus']) - flavor = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_info = flavor.create() - self.logger.debug("Flavor id: %s", flavor_info.id) - - self.logger.info("Getting project 'default'...") - project_agent = main_agent.get_agent("project", "") - for project in json.loads(project_agent.find()): - if project.get("name") == "default": - self.mano['details']['project_id'] = project.get("id") - self.logger.info("Found project 'default': %s", project) - break - - vim_json = self.get_vim_descriptor() - self.logger.info("Registering VIM: %s", vim_json) - - main_agent.get_agent( - "vim", project_id=self.mano['details']['project_id']).create( - entity=json.dumps(vim_json)) - - market_agent = main_agent.get_agent( - "market", project_id=self.mano['details']['project_id']) - - try: - self.logger.info("sending: %s", self.vnf['descriptor']['url']) - nsd = market_agent.create(entity=self.vnf['descriptor']['url']) - if nsd.get('id') is None: - self.logger.error("NSD not onboarded correctly") - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - self.mano['details']['nsd_id'] = nsd.get('id') - self.logger.info("Onboarded NSD: " + nsd.get("name")) - - nsr_agent = main_agent.get_agent( - "nsr", project_id=self.mano['details']['project_id']) - - self.mano['details']['nsr'] = nsr_agent.create( - self.mano['details']['nsd_id']) - except NfvoException as exc: - self.logger.error(exc.message) - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - - if self.mano['details']['nsr'].get('code') is not None: - self.logger.error( - "%s cannot be deployed: %s -> %s", - self.vnf['name'], - self.mano['details']['nsr'].get('code'), - self.mano['details']['nsr'].get('message')) - self.logger.error("%s cannot be deployed", self.vnf['name']) - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - - timeout = 0 - self.logger.info("Waiting for NSR to go to ACTIVE...") - while self.mano['details']['nsr'].get("status") != 'ACTIVE' \ - and self.mano['details']['nsr'].get("status") != 'ERROR': - timeout += 1 - self.logger.info("NSR is not yet ACTIVE... (%ss)", 60 * timeout) - if timeout == 30: - self.logger.error("INACTIVE NSR after %s sec..", 60 * timeout) - duration = time.time() - start_time - self.details["vnf"].update(status='FAIL', duration=duration) - return False - time.sleep(60) - self.mano['details']['nsr'] = json.loads( - nsr_agent.find(self.mano['details']['nsr'].get('id'))) - - duration = time.time() - start_time - if self.mano['details']['nsr'].get("status") == 'ACTIVE': - self.details["vnf"].update(status='PASS', duration=duration) - self.logger.info("Sleep for 60s to ensure that all " - "services are up and running...") - time.sleep(60) - result = True - else: - self.details["vnf"].update(status='FAIL', duration=duration) - self.logger.error("NSR: %s", self.mano['details'].get('nsr')) - result = False - return result - - def test_vnf(self): - self.logger.info("Testing VNF OpenIMS...") - start_time = time.time() - self.logger.info( - "Testing if %s works properly...", - self.mano['details']['nsr'].get('name')) - for vnfr in self.mano['details']['nsr'].get('vnfr'): - self.logger.info( - "Checking ports %s of VNF %s", - self.vnf['test'][vnfr.get('name')]['ports'], - vnfr.get('name')) - for vdu in vnfr.get('vdu'): - for vnfci in vdu.get('vnfc_instance'): - self.logger.debug( - "Checking ports of VNFC instance %s", - vnfci.get('hostname')) - for floating_ip in vnfci.get('floatingIps'): - self.logger.debug( - "Testing %s:%s", - vnfci.get('hostname'), - floating_ip.get('ip')) - for port in self.vnf['test'][vnfr.get( - 'name')]['ports']: - if servertest(floating_ip.get('ip'), port): - self.logger.info( - "VNFC instance %s is reachable at %s:%s", - vnfci.get('hostname'), - floating_ip.get('ip'), - port) - else: - self.logger.error( - "VNFC instance %s is not reachable " - "at %s:%s", - vnfci.get('hostname'), - floating_ip.get('ip'), - port) - duration = time.time() - start_time - self.details["test_vnf"].update( - status='FAIL', duration=duration, esult=( - "Port %s of server %s -> %s is " - "not reachable", - port, - vnfci.get('hostname'), - floating_ip.get('ip'))) - self.logger.error("Test VNF: ERROR") - return False - duration = time.time() - start_time - self.details["test_vnf"].update(status='PASS', duration=duration) - self.logger.info("Test VNF: OK") - return True - - def clean(self): - self.logger.info("Cleaning %s...", self.case_name) - try: - main_agent = MainAgent( - nfvo_ip=self.mano['details']['fip'].ip, - nfvo_port=8080, - https=False, - version=1, - username=self.mano['credentials']['username'], - password=self.mano['credentials']['password']) - self.logger.info("Terminating %s...", self.vnf['name']) - if (self.mano['details'].get('nsr')): - main_agent.get_agent( - "nsr", - project_id=self.mano['details']['project_id']).\ - delete(self.mano['details']['nsr'].get('id')) - self.logger.info("Sleeping 60 seconds...") - time.sleep(60) - else: - self.logger.info("No need to terminate the VNF...") - except (NfvoException, KeyError) as exc: - self.logger.error('Unexpected error cleaning - %s', exc) - - try: - neutron_client = os_utils.get_neutron_client(self.creds) - self.logger.info("Deleting Open Baton Port...") - port = snaps_utils.neutron_utils.get_port( - neutron_client, - port_name='%s_port' % self.case_name) - snaps_utils.neutron_utils.delete_port(neutron_client, port) - time.sleep(10) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - try: - self.logger.info("Deleting Open Baton Floating IP...") - snaps_utils.neutron_utils.delete_floating_ip( - neutron_client, self.mano['details']['fip']) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - - for resource in reversed(self.created_resources): - try: - self.logger.info("Cleaning %s", str(resource)) - resource.clean() - except Exception as exc: - self.logger.error('Unexpected error cleaning - %s', exc) - super(OpenImsVnf, self).clean() diff --git a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py index f2cd63fb2..32d675347 100644 --- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py +++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py @@ -7,352 +7,197 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """vrouter testcase implementation.""" import logging import os import time -from cloudify_rest_client import CloudifyClient -from cloudify_rest_client.executions import Execution -from scp import SCPClient -import yaml +import pkg_resources -from functest.opnfv_tests.openstack.snaps import snaps_utils -import functest.opnfv_tests.vnf.router.vrouter_base as vrouter_base +from functest.core import cloudify +from functest.opnfv_tests.vnf.router import vrouter_base from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf -from functest.utils.constants import CONST +from functest.utils import config +from functest.utils import env +from functest.utils import functest_utils -from git import Repo -from snaps.config.flavor import FlavorConfig -from snaps.config.image import ImageConfig -from snaps.config.keypair import KeypairConfig -from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.config.security_group import ( - Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) -from snaps.config.vm_inst import FloatingIpConfig, VmInstanceConfig +__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>" -from snaps.openstack.create_flavor import OpenStackFlavor -from snaps.openstack.create_image import OpenStackImage -from snaps.openstack.create_instance import OpenStackVmInstance -from snaps.openstack.create_keypairs import OpenStackKeypair -from snaps.openstack.create_network import OpenStackNetwork -from snaps.openstack.create_security_group import OpenStackSecurityGroup -from snaps.openstack.create_router import OpenStackRouter -import snaps.openstack.utils.glance_utils as glance_utils -from snaps.openstack.utils import keystone_utils +class CloudifyVrouter(cloudify.Cloudify): + # pylint: disable=too-many-instance-attributes + """vrouter testcase deployed with Cloudify Orchestrator.""" + __logger = logging.getLogger(__name__) -__author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>" + filename_alt = '/home/opnfv/functest/images/vyos-1.1.8-amd64.qcow2' + flavor_alt_ram = 1024 + flavor_alt_vcpus = 1 + flavor_alt_disk = 3 -class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase): - """vrouter testcase deployed with Cloudify Orchestrator.""" + check_console_loop = 12 - __logger = logging.getLogger(__name__) - name = __name__ + cop_yaml = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/" + "releases/download/2.14.7/plugin.yaml") + cop_wgn = ("https://github.com/cloudify-cosmo/cloudify-openstack-plugin/" + "releases/download/2.14.7/cloudify_openstack_plugin-2.14.7-py27" + "-none-linux_x86_64-centos-Core.wgn") def __init__(self, **kwargs): if "case_name" not in kwargs: kwargs["case_name"] = "vyos_vrouter" - super(CloudifyVrouter, self).__init__(**kwargs) + super().__init__(**kwargs) # Retrieve the configuration try: - self.config = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) - except Exception: - raise Exception("VNF config file not found") - - self.snaps_creds = '' - self.created_object = [] - - self.cfy_manager_ip = '' - self.util_info = {} - self.deployment_name = '' + self.config = getattr( + 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/router') config_file = os.path.join(self.case_dir, self.config) self.orchestrator = dict( - requirements=get_config("orchestrator.requirements", config_file), + requirements=functest_utils.get_parameter_from_yaml( + "orchestrator.requirements", config_file), ) self.details['orchestrator'] = dict( - name=get_config("orchestrator.name", config_file), - version=get_config("orchestrator.version", config_file), + name=functest_utils.get_parameter_from_yaml( + "orchestrator.name", config_file), + version=functest_utils.get_parameter_from_yaml( + "orchestrator.version", config_file), status='ERROR', result='' ) self.__logger.debug("Orchestrator configuration %s", self.orchestrator) - self.__logger.debug("name = %s", self.name) + self.__logger.debug("name = %s", __name__) self.vnf = dict( - descriptor=get_config("vnf.descriptor", config_file), - inputs=get_config("vnf.inputs", config_file), - requirements=get_config("vnf.requirements", config_file) + descriptor=functest_utils.get_parameter_from_yaml( + "vnf.descriptor", config_file), + inputs=functest_utils.get_parameter_from_yaml( + "vnf.inputs", config_file), + requirements=functest_utils.get_parameter_from_yaml( + "vnf.requirements", 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.util = Utilvnf() + self.util.set_credentials(self.cloud) + credentials = {"cloud": self.cloud} + self.util_info = {"credentials": credentials, + "vnf_data_dir": self.util.vnf_data_dir} self.details['test_vnf'] = dict( - name=get_config("vnf_test_suite.name", config_file), - version=get_config("vnf_test_suite.version", config_file) + name=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.name", config_file), + version=functest_utils.get_parameter_from_yaml( + "vnf_test_suite.version", config_file) ) - self.images = get_config("tenant_images", config_file) + self.images = functest_utils.get_parameter_from_yaml( + "tenant_images", config_file) self.__logger.info("Images needed for vrouter: %s", self.images) - def prepare(self): - super(CloudifyVrouter, self).prepare() - - self.__logger.info("Additional pre-configuration steps") + self.image_alt = None + self.flavor_alt = None - self.util.set_credentials(self.snaps_creds) + def check_requirements(self): + if env.get('NEW_USER_ROLE').lower() == "admin": + self.__logger.warning( + "Defining NEW_USER_ROLE=admin will easily break the testcase " + "because Cloudify doesn't manage tenancy (e.g. subnet " + "overlapping)") - # needs some images - self.__logger.info("Upload some OS images if it doesn't exist") - for image_name, image_file in self.images.iteritems(): - self.__logger.info("image: %s, file: %s", image_name, image_file) - if image_file and image_name: - image_creator = OpenStackImage( - self.snaps_creds, - ImageConfig(name=image_name, - image_user='cloud', - img_format='qcow2', - image_file=image_file)) - image_creator.create() - self.created_object.append(image_creator) - - def deploy_orchestrator(self): + def execute(self): + # pylint: disable=too-many-locals,too-many-statements """ Deploy Cloudify Manager. network, security group, fip, VM creation """ # network creation - + super().execute() start_time = time.time() - self.__logger.info("Creating keypair ...") - kp_file = os.path.join(self.data_dir, "cloudify_vrouter.pem") - keypair_settings = KeypairConfig(name='cloudify_vrouter_kp', - private_filepath=kp_file) - keypair_creator = OpenStackKeypair(self.snaps_creds, keypair_settings) - keypair_creator.create() - self.created_object.append(keypair_creator) - - self.__logger.info("Creating full network ...") - subnet_settings = SubnetConfig(name='cloudify_vrouter_subnet', - cidr='10.67.79.0/24') - network_settings = NetworkConfig(name='cloudify_vrouter_network', - subnet_settings=[subnet_settings]) - network_creator = OpenStackNetwork(self.snaps_creds, network_settings) - network_creator.create() - self.created_object.append(network_creator) - ext_net_name = snaps_utils.get_ext_net_name(self.snaps_creds) - router_creator = OpenStackRouter( - self.snaps_creds, - RouterConfig( - name='cloudify_vrouter_router', - external_gateway=ext_net_name, - internal_subnets=[subnet_settings.name])) - router_creator.create() - self.created_object.append(router_creator) - - # security group creation - self.__logger.info("Creating security group for cloudify manager vm") - sg_rules = list() - sg_rules.append( - SecurityGroupRuleConfig(sec_grp_name="sg-cloudify-manager", - direction=Direction.ingress, - protocol=Protocol.tcp, port_range_min=1, - port_range_max=65535)) - sg_rules.append( - SecurityGroupRuleConfig(sec_grp_name="sg-cloudify-manager", - direction=Direction.ingress, - protocol=Protocol.udp, port_range_min=1, - port_range_max=65535)) - - security_group_creator = OpenStackSecurityGroup( - self.snaps_creds, - SecurityGroupConfig( - name="sg-cloudify-manager", - rule_settings=sg_rules)) - - security_group_creator.create() - self.created_object.append(security_group_creator) - - # orchestrator VM flavor - self.__logger.info("Get or create flavor for cloudify manager vm ...") - - flavor_settings = FlavorConfig( - name=self.orchestrator['requirements']['flavor']['name'], - ram=self.orchestrator['requirements']['flavor']['ram_min'], - disk=50, - vcpus=2) - flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor_creator.create() - self.created_object.append(flavor_creator) - image_settings = ImageConfig( - name=self.orchestrator['requirements']['os_image'], - image_user='centos', - exists=True) - - port_settings = PortConfig(name='cloudify_manager_port', - network_name=network_settings.name) - - manager_settings = VmInstanceConfig( - name='cloudify_manager', - flavor=flavor_settings.name, - port_settings=[port_settings], - security_group_names=[ - security_group_creator.sec_grp_settings.name], - floating_ip_settings=[FloatingIpConfig( - name='cloudify_manager_fip', - port_name=port_settings.name, - router_name=router_creator.router_settings.name)]) - - manager_creator = OpenStackVmInstance(self.snaps_creds, - manager_settings, - image_settings, - keypair_settings) - - self.__logger.info("Creating cloudify manager VM") - manager_creator.create() - self.created_object.append(manager_creator) - - public_auth_url = keystone_utils.get_endpoint( - self.snaps_creds, 'identity') - - self.__logger.info("Set creds for cloudify manager") - cfy_creds = dict(keystone_username=self.tenant_name, - keystone_password=self.tenant_name, - keystone_tenant_name=self.tenant_name, - keystone_url=public_auth_url) - - cfy_client = CloudifyClient(host=manager_creator.get_floating_ip().ip, - username='admin', - password='admin', - tenant='default_tenant') - - self.orchestrator['object'] = cfy_client - - self.cfy_manager_ip = manager_creator.get_floating_ip().ip - - self.__logger.info("Attemps running status of the Manager") - cfy_status = None - retry = 10 - while str(cfy_status) != 'running' and retry: - try: - cfy_status = cfy_client.manager.get_status()['status'] - self.__logger.debug("The current manager status is %s", - cfy_status) - except Exception: # pylint: disable=broad-except - self.__logger.warning("Cloudify Manager isn't " + - "up and running. Retrying ...") - retry = retry - 1 - time.sleep(30) - - if str(cfy_status) == 'running': - self.__logger.info("Cloudify Manager is up and running") - else: - raise Exception("Cloudify Manager isn't up and running") + self.put_private_key() + self.upload_cfy_plugins(self.cop_yaml, self.cop_wgn) - self.__logger.info("Put OpenStack creds in manager") - secrets_list = cfy_client.secrets.list() - for k, val in cfy_creds.iteritems(): - if not any(d.get('key', None) == k for d in secrets_list): - cfy_client.secrets.create(k, val) - else: - cfy_client.secrets.update(k, val) + self.image_alt = self.publish_image_alt() + self.flavor_alt = self.create_flavor_alt() duration = time.time() - start_time - - self.__logger.info("Put private keypair in manager") - if manager_creator.vm_ssh_active(block=True): - ssh = manager_creator.ssh_client() - scp = SCPClient(ssh.get_transport(), socket_timeout=15.0) - scp.put(kp_file, '~/') - cmd = "sudo cp ~/cloudify_vrouter.pem /etc/cloudify/" - run_blocking_ssh_command(ssh, cmd) - cmd = "sudo chmod 444 /etc/cloudify/cloudify_vrouter.pem" - run_blocking_ssh_command(ssh, cmd) - cmd = "sudo yum install -y gcc python-devel" - run_blocking_ssh_command( - ssh, cmd, "Unable to install packages on manager") - self.details['orchestrator'].update(status='PASS', duration=duration) - self.vnf['inputs'].update(dict(external_network_name=ext_net_name)) - - return True + self.vnf['inputs'].update(dict( + external_network_name=self.ext_net.name)) + self.vnf['inputs'].update(dict( + target_vnf_image_id=self.image_alt.id)) + self.vnf['inputs'].update(dict( + reference_vnf_image_id=self.image_alt.id)) + self.vnf['inputs'].update(dict( + target_vnf_flavor_id=self.flavor_alt.id)) + self.vnf['inputs'].update(dict( + reference_vnf_flavor_id=self.flavor_alt.id)) + self.vnf['inputs'].update(dict( + keystone_username=self.project.user.name)) + self.vnf['inputs'].update(dict( + keystone_password=self.project.password)) + self.vnf['inputs'].update(dict( + keystone_tenant_name=self.project.project.name)) + self.vnf['inputs'].update(dict( + keystone_user_domain_name=os.environ.get( + 'OS_USER_DOMAIN_NAME', 'Default'))) + self.vnf['inputs'].update(dict( + keystone_project_domain_name=os.environ.get( + 'OS_PROJECT_DOMAIN_NAME', 'Default'))) + self.vnf['inputs'].update(dict( + region=os.environ.get('OS_REGION_NAME', 'RegionOne'))) + self.vnf['inputs'].update(dict( + keystone_url=self.get_public_auth_url(self.orig_cloud))) + + if self.deploy_vnf() and self.test_vnf(): + self.result = 100 + return 0 + self.result = 1/3 * 100 + return 1 def deploy_vnf(self): start_time = time.time() - self.__logger.info("Upload VNFD") - cfy_client = self.orchestrator['object'] descriptor = self.vnf['descriptor'] - self.deployment_name = descriptor.get('name') - - vrouter_blueprint_dir = os.path.join(self.data_dir, - self.util.blueprint_dir) - if not os.path.exists(vrouter_blueprint_dir): - Repo.clone_from(descriptor.get('url'), - vrouter_blueprint_dir, - branch=descriptor.get('version')) - - cfy_client.blueprints.upload(vrouter_blueprint_dir + - self.util.blueprint_file_name, - descriptor.get('name')) - - self.__logger.info("Get or create flavor for vrouter") - flavor_settings = FlavorConfig( - name=self.vnf['requirements']['flavor']['name'], - ram=self.vnf['requirements']['flavor']['ram_min'], - disk=25, - vcpus=1) - flavor_creator = OpenStackFlavor(self.snaps_creds, flavor_settings) - flavor = flavor_creator.create() - self.created_object.append(flavor_creator) - - # set image name - glance = glance_utils.glance_client(self.snaps_creds) - image = glance_utils.get_image(glance, - "vyos1.1.7") - self.vnf['inputs'].update(dict(target_vnf_image_id=image.id)) - self.vnf['inputs'].update(dict(reference_vnf_image_id=image.id)) - - # set flavor id - self.vnf['inputs'].update(dict(target_vnf_flavor_id=flavor.id)) - self.vnf['inputs'].update(dict(reference_vnf_flavor_id=flavor.id)) - - self.vnf['inputs'].update(dict(keystone_username=self.tenant_name)) - self.vnf['inputs'].update(dict(keystone_password=self.tenant_name)) - self.vnf['inputs'].update(dict(keystone_tenant_name=self.tenant_name)) - self.vnf['inputs'].update( - dict(keystone_url=keystone_utils.get_endpoint( - self.snaps_creds, 'identity'))) + self.util_info["cfy"] = self.cfy_client + self.util_info["cfy_manager_ip"] = self.fip.floating_ip_address + self.util_info["deployment_name"] = descriptor.get('name') + + self.cfy_client.blueprints.upload( + descriptor.get('file_name'), descriptor.get('name')) self.__logger.info("Create VNF Instance") - cfy_client.deployments.create(descriptor.get('name'), - descriptor.get('name'), - self.vnf.get('inputs')) + self.cfy_client.deployments.create( + descriptor.get('name'), descriptor.get('name'), + self.vnf.get('inputs')) - wait_for_execution(cfy_client, - get_execution_id( - cfy_client, descriptor.get('name')), - self.__logger, - timeout=7200) + cloudify.wait_for_execution( + self.cfy_client, cloudify.get_execution_id( + self.cfy_client, descriptor.get('name')), + self.__logger, timeout=7200) self.__logger.info("Start the VNF Instance deployment") - execution = cfy_client.executions.start(descriptor.get('name'), - 'install') + execution = self.cfy_client.executions.start( + descriptor.get('name'), 'install') # Show execution log - execution = wait_for_execution(cfy_client, execution, self.__logger) + execution = cloudify.wait_for_execution( + self.cfy_client, execution, self.__logger) duration = time.time() - start_time @@ -366,171 +211,24 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase): return result def test_vnf(self): - cfy_client = self.orchestrator['object'] - credentials = {"snaps_creds": self.snaps_creds, - "username": self.snaps_creds.username, - "password": self.snaps_creds.password, - "auth_url": self.snaps_creds.auth_url, - "tenant_name": self.snaps_creds.project_name} - - self.util_info = {"credentials": credentials, - "cfy": cfy_client, - "vnf_data_dir": self.util.vnf_data_dir} - start_time = time.time() - - result, test_result_data = super(CloudifyVrouter, self).test_vnf() - + testing = vrouter_base.VrouterOnBoardingBase(self.util, self.util_info) + result, test_result_data = testing.test_vnf() duration = time.time() - start_time - if result: - self.details['test_vnf'].update(status='PASS', - result='OK', - full_result=test_result_data, - duration=duration) + self.details['test_vnf'].update( + status='PASS', result='OK', full_result=test_result_data, + duration=duration) else: - self.details['test_vnf'].update(status='FAIL', - result='NG', - full_result=test_result_data, - duration=duration) - + self.details['test_vnf'].update( + status='FAIL', result='NG', full_result=test_result_data, + duration=duration) return True def clean(self): - try: - cfy_client = self.orchestrator['object'] - dep_name = self.vnf['descriptor'].get('name') - # kill existing execution - self.__logger.info('Deleting the current deployment') - exec_list = cfy_client.executions.list(dep_name) - for execution in exec_list: - if execution['status'] == "started": - try: - cfy_client.executions.cancel(execution['id'], - force=True) - except: # pylint: disable=broad-except - self.__logger.warn("Can't cancel the current exec") - - execution = cfy_client.executions.start( - dep_name, - 'uninstall', - parameters=dict(ignore_failure=True)) - - wait_for_execution(cfy_client, execution, self.__logger) - cfy_client.deployments.delete(self.vnf['descriptor'].get('name')) - cfy_client.blueprints.delete(self.vnf['descriptor'].get('name')) - except: # pylint: disable=broad-except - self.__logger.warn("Some issue during the undeployment ..") - self.__logger.warn("Tenant clean continue ..") - - self.__logger.info('Remove the cloudify manager OS object ..') - for creator in reversed(self.created_object): - try: - creator.clean() - except Exception as exc: - self.logger.error('Unexpected error cleaning - %s', exc) - - super(CloudifyVrouter, self).clean() - - def run(self, **kwargs): - """Execute CloudifyVrouter test case.""" - return super(CloudifyVrouter, self).run(**kwargs) - - def get_vnf_info_list(self, target_vnf_name): - return self.util.get_vnf_info_list(self.cfy_manager_ip, - self.deployment_name, - target_vnf_name) - - -# ---------------------------------------------------------- -# -# 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 - - -def wait_for_execution(client, execution, logger, timeout=7200, ): - """Wait for a workflow execution on Cloudify Manager.""" - # if execution already ended - return without waiting - if execution.status in Execution.END_STATES: - return execution - - if timeout is not None: - deadline = time.time() + timeout - - # Poll for execution status and execution logs, until execution ends - # and we receive an event of type in WORKFLOW_END_TYPES - offset = 0 - batch_size = 50 - event_list = [] - execution_ended = False - while True: - event_list = client.events.list( - execution_id=execution.id, - _offset=offset, - _size=batch_size, - include_logs=False, - sort='@timestamp').items - - offset = offset + len(event_list) - for event in event_list: - logger.debug(event.get('message')) - - if timeout is not None: - if time.time() > deadline: - raise RuntimeError( - 'execution of operation {0} for deployment {1} ' - 'timed out'.format(execution.workflow_id, - execution.deployment_id)) - else: - # update the remaining timeout - timeout = deadline - time.time() - - if not execution_ended: - execution = client.executions.get(execution.id) - execution_ended = execution.status in Execution.END_STATES - - if execution_ended: - break - - time.sleep(5) - - return execution - - -def get_execution_id(client, deployment_id): - """ - Get the execution id of a env preparation. - network, security group, fip, VM creation - """ - executions = client.executions.list(deployment_id=deployment_id) - for execution in executions: - if execution.workflow_id == 'create_deployment_environment': - return execution - raise RuntimeError('Failed to get create_deployment_environment ' - 'workflow execution.' - 'Available executions: {0}'.format(executions)) - - -def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"): - """Command to run ssh command with the exit status.""" - (_, stdout, _) = ssh.exec_command(cmd) - if stdout.channel.recv_exit_status() != 0: - raise Exception(error_msg) + self.kill_existing_execution(self.vnf['descriptor'].get('name')) + if self.image_alt: + self.cloud.delete_image(self.image_alt) + if self.flavor_alt: + self.orig_cloud.delete_flavor(self.flavor_alt.id) + super().clean() diff --git a/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml b/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml index 58bdb66a3..2d98dffa5 100644 --- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml +++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml @@ -3,27 +3,25 @@ tenant_images: cloudify_manager_4.0: /home/opnfv/functest/images/cloudify-manager-premium-4.0.1.qcow2 vyos1.1.7: /home/opnfv/functest/images/vyos-1.1.7.img -test_data: - url: 'https://github.com/oolorg/opnfv-vnf-data.git' - branch: 'master' orchestrator: name: cloudify version: '4.0' requirements: flavor: - name: m1.medium + name: cloudify.medium ram_min: 4096 os_image: 'cloudify_manager_4.0' vnf: name: vyos1.1.7 version: '1.1.7' descriptor: - url: https://github.com/oolorg/opnfv-vnf-vyos-blueprint/ + file_name: + /src/opnfv-vnf-vyos-blueprint/function-test-openstack-blueprint.yaml name: vrouter-opnfv - version: 'master' + version: fraser requirements: flavor: - name: m1.medium + name: cloudify.medium ram_min: 2048 inputs: external_network_name: admin_floating_net diff --git a/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py b/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py index d023d4796..9eb3c5d69 100644 --- a/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py +++ b/functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py @@ -7,9 +7,12 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """vrouter function test execution module""" import logging +import os import time import yaml @@ -18,7 +21,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.vnf_controller import ( VnfController) -class FunctionTestExec(object): +class FunctionTestExec(): """vrouter function test execution class""" logger = logging.getLogger(__name__) @@ -29,17 +32,16 @@ class FunctionTestExec(object): credentials = util_info["credentials"] self.vnf_ctrl = VnfController(util_info) - test_cmd_map_file = open(self.util.vnf_data_dir + - self.util.opnfv_vnf_data_dir + - self.util.command_template_dir + - self.util.test_cmd_map_yaml_file, - 'r') - self.test_cmd_map_yaml = yaml.safe_load(test_cmd_map_file) - test_cmd_map_file.close() + with open( + os.path.join( + self.util.vnf_data_dir, self.util.command_template_dir, + self.util.test_cmd_map_yaml_file), + 'r', encoding='utf-8') as test_cmd_map_file: + self.test_cmd_map_yaml = yaml.safe_load(test_cmd_map_file) - self.util.set_credentials(credentials["snaps_creds"]) + self.util.set_credentials(credentials["cloud"]) - with open(self.util.test_env_config_yaml) as file_fd: + with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd: test_env_config_yaml = yaml.safe_load(file_fd) file_fd.close() diff --git a/functest/opnfv_tests/vnf/router/utilvnf.py b/functest/opnfv_tests/vnf/router/utilvnf.py index 9d196836e..111f20c1a 100644 --- a/functest/opnfv_tests/vnf/router/utilvnf.py +++ b/functest/opnfv_tests/vnf/router/utilvnf.py @@ -7,20 +7,17 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """ Utility module of vrouter testcase """ import json import logging import os -import pkg_resources import requests import yaml -from functest.utils.constants import CONST -from git import Repo -from requests.auth import HTTPBasicAuth -from snaps.openstack.utils import nova_utils - +from functest.utils import config RESULT_SPRIT_INDEX = { "transfer": 8, @@ -46,25 +43,19 @@ NUMBER_OF_DIGITS_FOR_AVG_JITTER = 3 NUMBER_OF_DIGITS_FOR_AVG_PKT_LOSS = 1 -class Utilvnf(object): +class Utilvnf(): # pylint: disable=too-many-instance-attributes """ Utility class of vrouter testcase """ logger = logging.getLogger(__name__) def __init__(self): - self.snaps_creds = "" - - data_dir = data_dir = CONST.__getattribute__('dir_router_data') - - self.vnf_data_dir = data_dir - self.opnfv_vnf_data_dir = "opnfv-vnf-data/" + self.vnf_data_dir = getattr(config.CONF, 'dir_router_data') self.command_template_dir = "command_template/" self.test_scenario_yaml = "test_scenario.yaml" test_env_config_yaml_file = "test_env_config.yaml" self.test_cmd_map_yaml_file = "test_cmd_map.yaml" self.test_env_config_yaml = os.path.join( self.vnf_data_dir, - self.opnfv_vnf_data_dir, test_env_config_yaml_file) self.blueprint_dir = "opnfv-vnf-vyos-blueprint/" @@ -73,29 +64,7 @@ class Utilvnf(object): if not os.path.exists(self.vnf_data_dir): os.makedirs(self.vnf_data_dir) - case_dir = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/vnf/router') - - config_file_name = CONST.__getattribute__( - 'vnf_{}_config'.format("vyos_vrouter")) - - config_file = os.path.join(case_dir, config_file_name) - - with open(config_file) as file_fd: - vrouter_config_yaml = yaml.safe_load(file_fd) - file_fd.close() - - test_data = vrouter_config_yaml.get("test_data") - - self.logger.debug("Downloading the test data.") - vrouter_data_path = self.vnf_data_dir + self.opnfv_vnf_data_dir - - if not os.path.exists(vrouter_data_path): - Repo.clone_from(test_data['url'], - vrouter_data_path, - branch=test_data['branch']) - - with open(self.test_env_config_yaml) as file_fd: + with open(self.test_env_config_yaml, encoding='utf-8') as file_fd: test_env_config_yaml = yaml.safe_load(file_fd) file_fd.close() @@ -107,77 +76,32 @@ class Utilvnf(object): self.test_result_json_file = "test_result.json" if os.path.isfile(self.test_result_json_file): os.remove(self.test_result_json_file) - self.logger.debug("removed %s" % self.test_result_json_file) - - def get_nova_client(self): - nova_client = nova_utils.nova_client(self.snaps_creds) + self.logger.debug("removed %s", self.test_result_json_file) - return nova_client + self.cloud = None - def set_credentials(self, snaps_creds): - self.snaps_creds = snaps_creds + def set_credentials(self, cloud): + self.cloud = cloud def get_address(self, server_name, network_name): - nova_client = self.get_nova_client() - servers_list = nova_client.servers.list() - server = None - - for server in servers_list: - if server.name == server_name: - break - + server = self.cloud.get_server(server_name) address = server.addresses[ - network_name][NOVA_CILENT_NETWORK_INFO_INDEX]["addr"] + network_name][NOVA_CILENT_NETWORK_INFO_INDEX]["addr"] return address def get_mac_address(self, server_name, network_name): - nova_client = self.get_nova_client() - servers_list = nova_client.servers.list() - server = None - - for server in servers_list: - if server.name == server_name: - break - + server = self.cloud.get_server(server_name) mac_address = server.addresses[network_name][ - NOVA_CILENT_NETWORK_INFO_INDEX][ - "OS-EXT-IPS-MAC:mac_addr"] + NOVA_CILENT_NETWORK_INFO_INDEX]["OS-EXT-IPS-MAC:mac_addr"] return mac_address - def reboot_vm(self, server_name): - nova_client = self.get_nova_client() - servers_list = nova_client.servers.list() - server = None - - for server in servers_list: - if server.name == server_name: - break - - server.reboot() - - return - - def delete_vm(self, server_name): - nova_client = self.get_nova_client() - servers_list = nova_client.servers.list() - server = None - - for server in servers_list: - if server.name == server_name: - nova_client.servers.delete(server) - break - - return - def get_blueprint_outputs(self, cfy_manager_ip, deployment_name): - url = "http://%s/deployments/%s/outputs" % ( - cfy_manager_ip, deployment_name) - + url = f"http://{cfy_manager_ip}/deployments/{deployment_name}/outputs" response = requests.get( url, - auth=HTTPBasicAuth('admin', 'admin'), + auth=requests.auth.HTTPBasicAuth('admin', 'admin'), headers={'Tenant': 'default_tenant'}) resp_data = response.json() @@ -203,15 +127,10 @@ class Utilvnf(object): network_list.append(networks[network_name]) return network_list - def request_vnf_reboot(self, vnf_info_list): - for vnf in vnf_info_list: - self.logger.debug("reboot the " + vnf["vnf_name"]) - self.reboot_vm(vnf["vnf_name"]) - def request_vm_delete(self, vnf_info_list): for vnf in vnf_info_list: - self.logger.debug("delete the " + vnf["vnf_name"]) - self.delete_vm(vnf["vnf_name"]) + self.logger.debug("delete the %s", vnf["vnf_name"]) + self.cloud.delete_server(vnf["vnf_name"]) def get_vnf_info_list(self, cfy_manager_ip, topology_deploy_name, target_vnf_name): @@ -226,12 +145,9 @@ class Utilvnf(object): vnf["user"] = self.image["user"] vnf["pass"] = self.image["pass"] - if vnf_name == target_vnf_name: - vnf["target_vnf_flag"] = True - else: - vnf["target_vnf_flag"] = False + vnf["target_vnf_flag"] = bool(vnf_name == target_vnf_name) - self.logger.debug("vnf name : " + vnf_name) + self.logger.debug("vnf name : %s", vnf_name) self.logger.debug(vnf_name + " floating ip address : " + vnf["floating_ip"]) @@ -251,14 +167,16 @@ class Utilvnf(object): return vnf_info_list - def get_target_vnf(self, vnf_info_list): + @staticmethod + def get_target_vnf(vnf_info_list): for vnf in vnf_info_list: if vnf["target_vnf_flag"]: return vnf return None - def get_reference_vnf_list(self, vnf_info_list): + @staticmethod + def get_reference_vnf_list(vnf_info_list): reference_vnf_list = [] for vnf in vnf_info_list: if not vnf["target_vnf_flag"]: @@ -266,14 +184,16 @@ class Utilvnf(object): return reference_vnf_list - def get_vnf_info(self, vnf_info_list, vnf_name): + @staticmethod + def get_vnf_info(vnf_info_list, vnf_name): for vnf in vnf_info_list: if vnf["vnf_name"] == vnf_name: return vnf return None - def convert_functional_test_result(self, result_data_list): + @staticmethod + def convert_functional_test_result(result_data_list): result = {} for result_data in result_data_list: test_kind = result_data["test_kind"] @@ -290,34 +210,38 @@ class Utilvnf(object): def write_result_data(self, result_data): test_result = [] if not os.path.isfile(self.test_result_json_file): - file_fd = open(self.test_result_json_file, "w") - file_fd.close() + with open( + self.test_result_json_file, "w", + encoding="utf-8") as file_fd: + pass else: - file_fd = open(self.test_result_json_file, "r") - test_result = json.load(file_fd) - file_fd.close() + with open( + self.test_result_json_file, "r", + encoding="utf-8") as file_fd: + test_result = json.load(file_fd) test_result.append(result_data) - file_fd = open(self.test_result_json_file, "w") - json.dump(test_result, file_fd) - file_fd.close() + with open( + self.test_result_json_file, "w", + encoding="utf-8") as file_fd: + json.dump(test_result, file_fd) def output_test_result_json(self): if os.path.isfile(self.test_result_json_file): - file_fd = open(self.test_result_json_file, "r") - test_result = json.load(file_fd) - file_fd.close() + with open( + self.test_result_json_file, "r", + encoding="utf-8") as file_fd: + test_result = json.load(file_fd) output_json_data = json.dumps(test_result, sort_keys=True, indent=4) - self.logger.debug("test_result %s" % output_json_data) + self.logger.debug("test_result %s", output_json_data) else: - self.logger.debug("Not found %s" % self.test_result_json_file) + self.logger.debug("Not found %s", self.test_result_json_file) - def get_test_scenario(self, file_path): - test_scenario_file = open(file_path, - 'r') - test_scenario_yaml = yaml.safe_load(test_scenario_file) - test_scenario_file.close() + @staticmethod + def get_test_scenario(file_path): + with open(file_path, "r", encoding="utf-8") as test_scenario_file: + test_scenario_yaml = yaml.safe_load(test_scenario_file) return test_scenario_yaml["test_scenario_list"] diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py index 198a5ffc9..d3a216ed0 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/checker.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/checker.py @@ -7,6 +7,8 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """vrouter test result check module""" import json @@ -16,7 +18,7 @@ import re from jinja2 import Environment, FileSystemLoader -class Checker(object): +class Checker(): """vrouter test result check class""" logger = logging.getLogger(__name__) @@ -24,7 +26,8 @@ class Checker(object): def __init__(self): self.logger.debug("init checker") - def load_check_rule(self, rule_file_dir, rule_file_name, parameter): + @staticmethod + def load_check_rule(rule_file_dir, rule_file_name, parameter): loader = FileSystemLoader(rule_file_dir, encoding='utf8') env = Environment(loader=loader) @@ -33,7 +36,8 @@ class Checker(object): check_rule_data = json.loads(check_rule) return check_rule_data - def regexp_information(self, response, rules): + @staticmethod + def regexp_information(response, rules): status = False result_data = {} diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py index 98cb14cc0..a86a16485 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py @@ -7,13 +7,15 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """command generator module for vrouter testing""" import logging from jinja2 import Environment, FileSystemLoader -class CommandGenerator(object): +class CommandGenerator(): """command generator class for vrouter testing""" logger = logging.getLogger(__name__) @@ -21,12 +23,16 @@ class CommandGenerator(object): def __init__(self): self.logger.debug("init command generator") - def load_template(self, template_dir, template): + @staticmethod + def load_template(template_dir, template): + # pylint disable=missing-docstring loader = FileSystemLoader(template_dir, encoding='utf8') env = Environment(loader=loader) return env.get_template(template) - def command_create(self, template, parameter): + @staticmethod + def command_create(template, parameter): + # pylint disable=missing-docstring commands = template.render(parameter) return commands.split('\n') diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py index c85a57351..269f6526b 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py @@ -10,10 +10,11 @@ """ssh client module for vrouter testing""" import logging -import paramiko import time import yaml +import paramiko + from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf RECEIVE_ROOP_WAIT = 1 @@ -23,7 +24,7 @@ DEFAULT_CONNECT_RETRY_COUNT = 10 DEFAULT_SEND_TIMEOUT = 10 -class SshClient(object): +class SshClient(): # pylint: disable=too-many-instance-attributes """ssh client class for vrouter testing""" logger = logging.getLogger(__name__) @@ -42,7 +43,7 @@ class SshClient(object): self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.util = Utilvnf() - with open(self.util.test_env_config_yaml) as file_fd: + with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd: test_env_config_yaml = yaml.safe_load(file_fd) file_fd.close() @@ -51,6 +52,7 @@ class SshClient(object): def connect(self, time_out=DEFAULT_CONNECT_TIMEOUT, retrycount=DEFAULT_CONNECT_RETRY_COUNT): + # pylint: disable=missing-docstring while retrycount > 0: try: self.logger.info("SSH connect to %s.", self.ip_address) @@ -72,15 +74,14 @@ class SshClient(object): self.shell.recv(self.ssh_revieve_buff) break - except: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except self.logger.info("SSH timeout for %s...", self.ip_address) time.sleep(time_out) retrycount -= 1 if retrycount == 0: - self.logger.error("Cannot establish connection to IP '%s'. " + - "Aborting", - self.ip_address) + self.logger.warning( + "Cannot establish connection to IP '%s'", self.ip_address) self.connected = False return self.connected @@ -88,13 +89,14 @@ class SshClient(object): return self.connected def send(self, cmd, prompt, timeout=DEFAULT_SEND_TIMEOUT): + # pylint: disable=missing-docstring if self.connected is True: self.shell.settimeout(timeout) self.logger.debug("Commandset : '%s'", cmd) try: self.shell.send(cmd + '\n') - except: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except self.logger.error("ssh send timeout : Command : '%s'", cmd) return None @@ -103,27 +105,28 @@ class SshClient(object): time.sleep(RECEIVE_ROOP_WAIT) try: res = self.shell.recv(self.ssh_revieve_buff) - except: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except self.logger.error("ssh receive timeout : Command : '%s'", cmd) break - res_buff += res + res_buff += res.decode("utf-8") self.logger.debug("Response : '%s'", res_buff) return res_buff - else: - self.logger.error("Cannot connected to IP '%s'.", self.ip_address) - return None + self.logger.error("Cannot connected to IP '%s'.", self.ip_address) + return None def close(self): + # pylint: disable=missing-docstring if self.connected is True: self.ssh.close() - def error_check(response, err_strs=["error", - "warn", - "unknown command", - "already exist"]): + @staticmethod + def error_check(response, err_strs=None): + # pylint: disable=missing-docstring + if err_strs is None: + err_strs = ["error", "warn", "unknown command", "already exist"] for err in err_strs: if err in response: return False diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py index d1c2e3242..2210b3909 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py @@ -7,6 +7,8 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """vm controll module""" import logging @@ -21,7 +23,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.ssh_client import ( SshClient) -class VmController(object): +class VmController(): """vm controll class""" logger = logging.getLogger(__name__) @@ -32,14 +34,12 @@ class VmController(object): credentials = util_info["credentials"] self.util = Utilvnf() - self.util.set_credentials(credentials["snaps_creds"]) + self.util.set_credentials(credentials["cloud"]) - with open(self.util.test_env_config_yaml) as file_fd: + with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd: test_env_config_yaml = yaml.safe_load(file_fd) file_fd.close() - self.reboot_wait = test_env_config_yaml.get("general").get( - "reboot_wait") self.command_wait = test_env_config_yaml.get("general").get( "command_wait") self.ssh_connect_timeout = test_env_config_yaml.get("general").get( @@ -83,13 +83,10 @@ class VmController(object): result = ssh.connect(self.ssh_connect_timeout, self.ssh_connect_retry_count) if not result: - self.logger.debug("try to vm reboot.") - self.util.reboot_vm(vm_info["vnf_name"]) - time.sleep(self.reboot_wait) - result = ssh.connect(self.ssh_connect_timeout, - self.ssh_connect_retry_count) - if not result: - return None + self.logger.error( + "Cannot establish connection to IP '%s'. Aborting!", + ssh.ip_address) + return None (result, _) = self.command_create_and_execute( ssh, @@ -104,10 +101,8 @@ class VmController(object): def command_create_and_execute(self, ssh, test_cmd_file_path, cmd_input_param, prompt_file_path): - prompt_file = open(prompt_file_path, - 'r') - prompt = yaml.safe_load(prompt_file) - prompt_file.close() + with open(prompt_file_path, 'r', encoding='utf-8') as prompt_file: + prompt = yaml.safe_load(prompt_file) config_mode_prompt = prompt["config_mode"] commands = self.command_gen_from_template(test_cmd_file_path, @@ -119,11 +114,11 @@ class VmController(object): def command_list_execute(self, ssh, command_list, prompt): res_data_list = [] for command in command_list: - self.logger.debug("Command : " + command) + self.logger.debug("Command : %s", command) (res, res_data) = self.command_execute(ssh, command, prompt) - self.logger.debug("Response : " + res_data) + self.logger.debug("Response : %s", res_data) res_data_list.append(res_data) if not res: return res, res_data_list @@ -135,7 +130,7 @@ class VmController(object): def command_execute(self, ssh, command, prompt): res_data = ssh.send(command, prompt) if res_data is None: - self.logger.info("retry send command : " + command) + self.logger.info("retry send command : %s", command) res_data = ssh.send(command, prompt) if not ssh.error_check(res_data): diff --git a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py index 814e9e333..46584456f 100644 --- a/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py +++ b/functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py @@ -7,14 +7,17 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """vrouter controll module""" import logging import os -import prettytable import time import yaml +import prettytable + from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf from functest.opnfv_tests.vnf.router.vnf_controller.checker import Checker from functest.opnfv_tests.vnf.router.vnf_controller.ssh_client import ( @@ -23,7 +26,7 @@ from functest.opnfv_tests.vnf.router.vnf_controller.vm_controller import ( VmController) -class VnfController(object): +class VnfController(): """vrouter controll class""" logger = logging.getLogger(__name__) @@ -33,7 +36,7 @@ class VnfController(object): self.util = Utilvnf() self.vm_controller = VmController(util_info) - with open(self.util.test_env_config_yaml) as file_fd: + with open(self.util.test_env_config_yaml, encoding='utf-8') as file_fd: test_env_config_yaml = yaml.safe_load(file_fd) file_fd.close() @@ -45,10 +48,10 @@ class VnfController(object): def config_vnf(self, source_vnf, destination_vnf, test_cmd_file_path, parameter_file_path, prompt_file_path): - parameter_file = open(parameter_file_path, - 'r') - cmd_input_param = yaml.safe_load(parameter_file) - parameter_file.close() + # pylint: disable=too-many-arguments + with open( + parameter_file_path, 'r', encoding='utf-8') as parameter_file: + cmd_input_param = yaml.safe_load(parameter_file) cmd_input_param["macaddress"] = source_vnf["data_plane_network_mac"] cmd_input_param["source_ip"] = source_vnf["data_plane_network_ip"] @@ -63,22 +66,20 @@ class VnfController(object): def result_check(self, target_vnf, reference_vnf, check_rule_file_path_list, parameter_file_path, prompt_file_path): + # pylint: disable=too-many-arguments,too-many-locals res_dict_data_list = [] - parameter_file = open(parameter_file_path, - 'r') - cmd_input_param = yaml.safe_load(parameter_file) - parameter_file.close() + with open( + parameter_file_path, 'r', encoding='utf-8') as parameter_file: + cmd_input_param = yaml.safe_load(parameter_file) cmd_input_param["source_ip"] = target_vnf["data_plane_network_ip"] cmd_input_param["destination_ip"] = reference_vnf[ "data_plane_network_ip"] - prompt_file = open(prompt_file_path, - 'r') - prompt = yaml.safe_load(prompt_file) - prompt_file.close() + with open(prompt_file_path, 'r', encoding='utf-8') as prompt_file: + prompt = yaml.safe_load(prompt_file) terminal_mode_prompt = prompt["terminal_mode"] ssh = SshClient(target_vnf["floating_ip"], @@ -93,8 +94,8 @@ class VnfController(object): checker = Checker() res_table = prettytable.PrettyTable( - header_style='upper', padding_width=5, - field_names=['test item', 'result']) + header_style='upper', padding_width=5, + field_names=['test item', 'result']) status = True res_data_list = [] diff --git a/functest/opnfv_tests/vnf/router/vrouter_base.py b/functest/opnfv_tests/vnf/router/vrouter_base.py index a534f1f2f..932770b9c 100644 --- a/functest/opnfv_tests/vnf/router/vrouter_base.py +++ b/functest/opnfv_tests/vnf/router/vrouter_base.py @@ -7,46 +7,34 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + """vrouter testing base class module""" import datetime import json import logging import os -import pkg_resources import time -import functest.core.vnf as vnf -from functest.utils.constants import CONST +import pkg_resources + from functest.opnfv_tests.vnf.router.test_controller import function_test_exec -from functest.opnfv_tests.vnf.router.utilvnf import Utilvnf __author__ = "Shuya Nakama <shuya.nakama@okinawaopenlabs.org>" -REBOOT_WAIT = 30 - -class VrouterOnBoardingBase(vnf.VnfOnBoarding): +class VrouterOnBoardingBase(): """vrouter testing base class""" - def __init__(self, **kwargs): + def __init__(self, util, util_info): self.logger = logging.getLogger(__name__) - super(VrouterOnBoardingBase, self).__init__(**kwargs) self.case_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/vnf/router') - self.data_dir = CONST.__getattribute__('dir_router_data') - self.result_dir = os.path.join(CONST.__getattribute__('dir_results'), - self.case_name) - self.util = Utilvnf() - self.util_info = {} - + self.util = util + self.util_info = util_info self.vnf_list = [] - if not os.path.exists(self.data_dir): - os.makedirs(self.data_dir) - if not os.path.exists(self.result_dir): - os.makedirs(self.result_dir) - def test_vnf(self): """vrouter test execution""" result = False @@ -62,12 +50,11 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding): test_list = function_test["test_list"] target_vnf_name = function_test["target_vnf_name"] for test_info in test_list: - self.logger.info(test_info["protocol"] + " " + - test_info["test_kind"] + - " test.") + self.logger.info( + "%s %s test.", test_info["protocol"], + test_info["test_kind"]) (result, result_data) = self.function_test_vrouter( - target_vnf_name, - test_info) + target_vnf_name, test_info) test_result_data_list.append(result_data) if not result: break @@ -87,10 +74,6 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding): vnf_info_list = self.get_vnf_info_list(target_vnf_name) self.vnf_list = vnf_info_list - self.logger.debug("request vnf's reboot.") - self.util.request_vnf_reboot(vnf_info_list) - time.sleep(REBOOT_WAIT) - target_vnf = self.util.get_target_vnf(vnf_info_list) reference_vnf_list = self.util.get_reference_vnf_list(vnf_info_list) @@ -115,5 +98,7 @@ class VrouterOnBoardingBase(vnf.VnfOnBoarding): return result, test_result_data def get_vnf_info_list(self, target_vnf_name): - vnf_info_list = [] - return vnf_info_list + return self.util.get_vnf_info_list( + self.util_info["cfy_manager_ip"], + self.util_info["deployment_name"], + target_vnf_name) diff --git a/functest/tests/unit/ci/__init__.py b/functest/tests/unit/ci/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/ci/__init__.py +++ /dev/null diff --git a/functest/tests/unit/ci/test_check_deployment.py b/functest/tests/unit/ci/test_check_deployment.py deleted file mode 100644 index fc6368e5a..000000000 --- a/functest/tests/unit/ci/test_check_deployment.py +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Ericsson 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 logging -import mock -import unittest - -from functest.ci import check_deployment - -__author__ = "Jose Lausuch <jose.lausuch@ericsson.com>" - - -class CheckDeploymentTesting(unittest.TestCase): - """The super class which testing classes could inherit.""" - # pylint: disable=missing-docstring - - logging.disable(logging.CRITICAL) - - def setUp(self): - self.client_test = mock.Mock() - self.deployment = check_deployment.CheckDeployment() - self.service_test = 'compute' - self.rc_file = self.deployment.rc_file - self.endpoint_test = 'http://192.168.0.6:5000/v3' - creds_attr = {'auth_url': self.endpoint_test, - 'proxy_settings': ''} - proxy_attr = {'host': '192.168.0.1', 'port': '5000'} - proxy_settings = mock.Mock() - proxy_settings.configure_mock(**proxy_attr) - self.os_creds = mock.Mock() - self.os_creds.configure_mock(**creds_attr) - self.os_creds.proxy_settings = proxy_settings - self.deployment.os_creds = self.os_creds - - def test_check_rc(self): - with mock.patch('functest.ci.check_deployment.os.path.isfile', - returns=True) as m, \ - mock.patch('six.moves.builtins.open', - mock.mock_open(read_data='OS_AUTH_URL')): - self.deployment.check_rc() - self.assertTrue(m.called) - - def test_check_rc_missing_file(self): - with mock.patch('functest.ci.check_deployment.os.path.isfile', - return_value=False), \ - self.assertRaises(Exception) as context: - msg = 'RC file {} does not exist!'.format(self.rc_file) - self.deployment.check_rc(self.rc_file) - self.assertTrue(msg in context) - - def test_check_rc_missing_os_auth(self): - with mock.patch('six.moves.builtins.open', - mock.mock_open(read_data='test')), \ - self.assertRaises(Exception) as context: - msg = 'OS_AUTH_URL not defined in {}.'.format(self.rc_file) - self.assertTrue(msg in context) - - def test_check_auth_endpoint(self): - with mock.patch('functest.ci.check_deployment.verify_connectivity', - return_value=True) as m,\ - mock.patch('functest.ci.check_deployment.get_auth_token', - return_value='gAAAAABaOhXGS') as mock_token: - self.deployment.check_auth_endpoint() - self.assertTrue(m.called) - self.assertTrue(mock_token.called) - - def test_check_auth_endpoint_not_reachable(self): - with mock.patch('functest.ci.check_deployment.verify_connectivity', - return_value=False) as m, \ - self.assertRaises(Exception) as context: - endpoint = self.os_creds.auth_url - self.deployment.check_auth_endpoint() - msg = "OS_AUTH_URL {} is not reachable.".format(endpoint) - self.assertTrue(m.called) - self.assertTrue(msg in context) - - def test_check_public_endpoint(self): - with mock.patch('functest.ci.check_deployment.verify_connectivity', - return_value=True) as m, \ - mock.patch('functest.ci.check_deployment.keystone_utils.' - 'get_endpoint') as n: - self.deployment.check_public_endpoint() - self.assertTrue(m.called) - self.assertTrue(n.called) - - def test_check_public_endpoint_not_reachable(self): - with mock.patch('functest.ci.check_deployment.verify_connectivity', - return_value=False) as m, \ - mock.patch('functest.ci.check_deployment.keystone_utils.' - 'get_endpoint', - return_value=self.endpoint_test) as n, \ - self.assertRaises(Exception) as context: - self.deployment.check_public_endpoint() - msg = ("Public endpoint {} is not reachable." - .format(self.mock_endpoint)) - self.assertTrue(m.called) - self.assertTrue(n.called) - self.assertTrue(msg in context) - - def test_check_service_endpoint(self): - with mock.patch('functest.ci.check_deployment.verify_connectivity', - return_value=True) as m, \ - mock.patch('functest.ci.check_deployment.keystone_utils.' - 'get_endpoint') as n: - self.deployment.check_service_endpoint(self.service_test) - self.assertTrue(m.called) - self.assertTrue(n.called) - - def test_check_service_endpoint_not_reachable(self): - with mock.patch('functest.ci.check_deployment.verify_connectivity', - return_value=False) as m, \ - mock.patch('functest.ci.check_deployment.keystone_utils.' - 'get_endpoint', - return_value=self.endpoint_test) as n, \ - self.assertRaises(Exception) as context: - self.deployment.check_service_endpoint(self.service_test) - msg = "{} endpoint {} is not reachable.".format(self.service_test, - self.endpoint_test) - self.assertTrue(m.called) - self.assertTrue(n.called) - self.assertTrue(msg in context) - - def test_check_nova(self): - with mock.patch('functest.ci.check_deployment.nova_utils.nova_client', - return_value=self.client_test) as m: - self.deployment.check_nova() - self.assertTrue(m.called) - - def test_check_nova_fail(self): - with mock.patch('functest.ci.check_deployment.nova_utils.nova_client', - return_value=self.client_test) as m, \ - mock.patch.object(self.client_test, 'servers.list', - side_effect=Exception): - self.deployment.check_nova() - self.assertTrue(m.called) - self.assertRaises(Exception) - - def test_check_neutron(self): - with mock.patch('functest.ci.check_deployment.neutron_utils.' - 'neutron_client', return_value=self.client_test) as m: - self.deployment.check_neutron() - self.assertTrue(m.called) - - def test_check_neutron_fail(self): - with mock.patch('functest.ci.check_deployment.neutron_utils.' - 'neutron_client', - return_value=self.client_test) as m, \ - mock.patch.object(self.client_test, 'list_networks', - side_effect=Exception), \ - self.assertRaises(Exception): - self.deployment.check_neutron() - self.assertRaises(Exception) - self.assertTrue(m.called) - - def test_check_glance(self): - with mock.patch('functest.ci.check_deployment.glance_utils.' - 'glance_client', return_value=self.client_test) as m: - self.deployment.check_glance() - self.assertTrue(m.called) - - def test_check_glance_fail(self): - with mock.patch('functest.ci.check_deployment.glance_utils.' - 'glance_client', return_value=self.client_test) as m, \ - mock.patch.object(self.client_test, 'images.list', - side_effect=Exception): - self.deployment.check_glance() - self.assertRaises(Exception) - self.assertTrue(m.called) - - @mock.patch('functest.ci.check_deployment.LOGGER.info') - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name') - def test_check_extnet(self, mock_getext, mock_loginfo): - test_network = 'ext-net' - mock_getext.return_value = test_network - self.deployment.check_ext_net() - self.assertTrue(mock_getext.called) - mock_loginfo.assert_called_once_with( - "External network found: %s", test_network) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='') - def test_check_extnet_None(self, mock_getext): - with self.assertRaises(Exception) as context: - self.deployment.check_ext_net() - self.assertTrue(mock_getext.called) - msg = 'ERROR: No external networks in the deployment.' - self.assertTrue(msg in context) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/ci/test_run_tests.py b/functest/tests/unit/ci/test_run_tests.py deleted file mode 100644 index 93cbfccdf..000000000 --- a/functest/tests/unit/ci/test_run_tests.py +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/env python - -# 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 logging -import unittest - -import mock - -from functest.ci import run_tests -from functest.utils.constants import CONST -from functest.core.testcase import TestCase - - -class FakeModule(TestCase): - - def run(self): - return TestCase.EX_OK - - def push_to_db(self): - return TestCase.EX_OK - - def is_successful(self): - return TestCase.EX_OK - - -class RunTestsTesting(unittest.TestCase): - - def setUp(self): - self.runner = run_tests.Runner() - mock_test_case = mock.Mock() - mock_test_case.is_successful.return_value = TestCase.EX_OK - self.runner.executed_test_cases['test1'] = mock_test_case - self.runner.executed_test_cases['test2'] = mock_test_case - self.sep = 'test_sep' - self.creds = {'OS_AUTH_URL': 'http://test_ip:test_port/v2.0', - 'OS_USERNAME': 'test_os_username', - 'OS_TENANT_NAME': 'test_tenant', - 'OS_PASSWORD': 'test_password'} - self.test = {'test_name': 'test_name'} - self.tier = mock.Mock() - test1 = mock.Mock() - test1.get_name.return_value = 'test1' - test2 = mock.Mock() - test2.get_name.return_value = 'test2' - attrs = {'get_name.return_value': 'test_tier', - 'get_tests.return_value': [test1, test2], - 'get_ci_loop.return_value': 'test_ci_loop', - 'get_test_names.return_value': ['test1', 'test2']} - self.tier.configure_mock(**attrs) - - self.tiers = mock.Mock() - attrs = {'get_tiers.return_value': [self.tier]} - self.tiers.configure_mock(**attrs) - - self.run_tests_parser = run_tests.RunTestsParser() - - @mock.patch('functest.ci.run_tests.LOGGER.error') - def test_source_rc_file_missing_file(self, mock_logger_error): - with mock.patch('functest.ci.run_tests.os.path.isfile', - return_value=False), \ - self.assertRaises(Exception): - self.runner.source_rc_file() - - @mock.patch('functest.ci.run_tests.LOGGER.debug') - @mock.patch('functest.ci.run_tests.os.path.isfile', - return_value=True) - def test_source_rc_file_default(self, *args): - with mock.patch('functest.ci.run_tests.os_utils.source_credentials', - return_value=self.creds): - self.runner.source_rc_file() - - def test_get_run_dict_if_defined_default(self): - mock_obj = mock.Mock() - with mock.patch('functest.ci.run_tests.' - 'ft_utils.get_dict_by_test', - return_value={'run': mock_obj}): - self.assertEqual(self.runner.get_run_dict('test_name'), - mock_obj) - - @mock.patch('functest.ci.run_tests.LOGGER.error') - def test_get_run_dict_if_defined_missing_config_option(self, - mock_logger_error): - with mock.patch('functest.ci.run_tests.' - 'ft_utils.get_dict_by_test', - return_value=None): - testname = 'test_name' - self.assertEqual(self.runner.get_run_dict(testname), - None) - mock_logger_error.assert_called_once_with( - "Cannot get %s's config options", testname) - - with mock.patch('functest.ci.run_tests.' - 'ft_utils.get_dict_by_test', - return_value={}): - testname = 'test_name' - self.assertEqual(self.runner.get_run_dict(testname), - None) - - @mock.patch('functest.ci.run_tests.LOGGER.exception') - def test_get_run_dict_if_defined_exception(self, - mock_logger_except): - with mock.patch('functest.ci.run_tests.' - 'ft_utils.get_dict_by_test', - side_effect=Exception): - testname = 'test_name' - self.assertEqual(self.runner.get_run_dict(testname), - None) - mock_logger_except.assert_called_once_with( - "Cannot get %s's config options", testname) - - def test_run_tests_import_test_class_exception(self): - mock_test = mock.Mock() - args = {'get_name.return_value': 'test_name', - 'needs_clean.return_value': False} - mock_test.configure_mock(**args) - with mock.patch('functest.ci.run_tests.Runner.source_rc_file'), \ - mock.patch('functest.ci.run_tests.Runner.get_run_dict', - return_value=None), \ - self.assertRaises(Exception) as context: - self.runner(mock_test, 'tier_name') - msg = "Cannot import the class for the test case." - self.assertTrue(msg in context) - - @mock.patch('functest.ci.run_tests.Runner.source_rc_file') - @mock.patch('importlib.import_module', name="module", - return_value=mock.Mock(test_class=mock.Mock( - side_effect=FakeModule))) - @mock.patch('functest.utils.functest_utils.get_dict_by_test') - def test_run_tests_default(self, *args): - mock_test = mock.Mock() - kwargs = {'get_name.return_value': 'test_name', - 'needs_clean.return_value': True} - mock_test.configure_mock(**kwargs) - test_run_dict = {'module': 'test_module', - 'class': 'test_class'} - with mock.patch('functest.ci.run_tests.Runner.get_run_dict', - return_value=test_run_dict): - self.runner.clean_flag = True - self.runner.run_test(mock_test) - self.assertEqual(self.runner.overall_result, - run_tests.Result.EX_OK) - - @mock.patch('functest.ci.run_tests.Runner.run_test', - return_value=TestCase.EX_OK) - def test_run_tier_default(self, *mock_methods): - self.assertEqual(self.runner.run_tier(self.tier), - run_tests.Result.EX_OK) - mock_methods[0].assert_called_with(mock.ANY) - - @mock.patch('functest.ci.run_tests.LOGGER.info') - def test_run_tier_missing_test(self, mock_logger_info): - self.tier.get_tests.return_value = None - self.assertEqual(self.runner.run_tier(self.tier), - run_tests.Result.EX_ERROR) - self.assertTrue(mock_logger_info.called) - - @mock.patch('functest.ci.run_tests.LOGGER.info') - @mock.patch('functest.ci.run_tests.Runner.run_tier') - @mock.patch('functest.ci.run_tests.Runner.summary') - def test_run_all_default(self, *mock_methods): - CONST.__setattr__('CI_LOOP', 'test_ci_loop') - self.runner.run_all() - mock_methods[1].assert_not_called() - self.assertTrue(mock_methods[2].called) - - @mock.patch('functest.ci.run_tests.LOGGER.info') - @mock.patch('functest.ci.run_tests.Runner.summary') - def test_run_all_missing_tier(self, *mock_methods): - CONST.__setattr__('CI_LOOP', 'loop_re_not_available') - self.runner.run_all() - self.assertTrue(mock_methods[1].called) - - @mock.patch('functest.ci.run_tests.Runner.source_rc_file', - side_effect=Exception) - @mock.patch('functest.ci.run_tests.Runner.summary') - def test_main_failed(self, *mock_methods): - kwargs = {'test': 'test_name', 'noclean': True, 'report': True} - args = {'get_tier.return_value': False, - 'get_test.return_value': False} - self.runner._tiers = mock.Mock() - self.runner._tiers.configure_mock(**args) - self.assertEqual(self.runner.main(**kwargs), - run_tests.Result.EX_ERROR) - mock_methods[1].assert_called_once_with() - - @mock.patch('functest.ci.run_tests.Runner.source_rc_file') - @mock.patch('functest.ci.run_tests.Runner.run_test', - return_value=TestCase.EX_OK) - @mock.patch('functest.ci.run_tests.Runner.summary') - def test_main_tier(self, *mock_methods): - mock_tier = mock.Mock() - test_mock = mock.Mock() - test_mock.get_name.return_value = 'test1' - args = {'get_name.return_value': 'tier_name', - 'get_tests.return_value': [test_mock]} - mock_tier.configure_mock(**args) - kwargs = {'test': 'tier_name', 'noclean': True, 'report': True} - args = {'get_tier.return_value': mock_tier, - 'get_test.return_value': None} - self.runner._tiers = mock.Mock() - self.runner._tiers.configure_mock(**args) - self.assertEqual(self.runner.main(**kwargs), - run_tests.Result.EX_OK) - mock_methods[1].assert_called() - - @mock.patch('functest.ci.run_tests.Runner.source_rc_file') - @mock.patch('functest.ci.run_tests.Runner.run_test', - return_value=TestCase.EX_OK) - def test_main_test(self, *mock_methods): - kwargs = {'test': 'test_name', 'noclean': True, 'report': True} - args = {'get_tier.return_value': None, - 'get_test.return_value': 'test_name'} - self.runner._tiers = mock.Mock() - self.runner._tiers.configure_mock(**args) - self.assertEqual(self.runner.main(**kwargs), - run_tests.Result.EX_OK) - mock_methods[0].assert_called_once_with('test_name') - - @mock.patch('functest.ci.run_tests.Runner.source_rc_file') - @mock.patch('functest.ci.run_tests.Runner.run_all') - @mock.patch('functest.ci.run_tests.Runner.summary') - def test_main_all_tier(self, *mock_methods): - kwargs = {'test': 'all', 'noclean': True, 'report': True} - args = {'get_tier.return_value': None, - 'get_test.return_value': None} - self.runner._tiers = mock.Mock() - self.runner._tiers.configure_mock(**args) - self.assertEqual(self.runner.main(**kwargs), - run_tests.Result.EX_OK) - mock_methods[1].assert_called_once_with() - - @mock.patch('functest.ci.run_tests.Runner.source_rc_file') - @mock.patch('functest.ci.run_tests.Runner.summary') - def test_main_any_tier_test_ko(self, *mock_methods): - kwargs = {'test': 'any', 'noclean': True, 'report': True} - args = {'get_tier.return_value': None, - 'get_test.return_value': None} - self.runner._tiers = mock.Mock() - self.runner._tiers.configure_mock(**args) - self.assertEqual(self.runner.main(**kwargs), - run_tests.Result.EX_ERROR) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/ci/test_tier_builder.py b/functest/tests/unit/ci/test_tier_builder.py deleted file mode 100644 index d832ca3f0..000000000 --- a/functest/tests/unit/ci/test_tier_builder.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python - -# 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 - -# pylint: disable=missing-docstring - -import logging -import unittest - -import mock - -from functest.ci import tier_builder - - -class TierBuilderTesting(unittest.TestCase): - - def setUp(self): - self.dependency = {'installer': 'test_installer', - 'scenario': 'test_scenario'} - - self.testcase = {'dependencies': self.dependency, - 'enabled': 'true', - 'case_name': 'test_name', - 'criteria': 'test_criteria', - 'blocking': 'test_blocking', - 'description': 'test_desc', - 'project_name': 'project_name'} - - self.dic_tier = {'name': 'test_tier', - 'order': 'test_order', - 'ci_loop': 'test_ci_loop', - 'description': 'test_desc', - 'testcases': [self.testcase]} - - self.mock_yaml = mock.Mock() - attrs = {'get.return_value': [self.dic_tier]} - self.mock_yaml.configure_mock(**attrs) - - with mock.patch('functest.ci.tier_builder.yaml.safe_load', - return_value=self.mock_yaml), \ - mock.patch('six.moves.builtins.open', mock.mock_open()): - self.tierbuilder = tier_builder.TierBuilder('test_installer', - 'test_scenario', - 'testcases_file') - self.tier_obj = self.tierbuilder.tier_objects[0] - - def test_get_tiers(self): - self.assertEqual(self.tierbuilder.get_tiers(), - [self.tier_obj]) - - def test_get_tier_names(self): - self.assertEqual(self.tierbuilder.get_tier_names(), - ['test_tier']) - - def test_get_tier_present_tier(self): - self.assertEqual(self.tierbuilder.get_tier('test_tier'), - self.tier_obj) - - def test_get_tier_missing_tier(self): - self.assertEqual(self.tierbuilder.get_tier('test_tier2'), - None) - - def test_get_test_present_test(self): - self.assertEqual(self.tierbuilder.get_test('test_name'), - self.tier_obj.get_test('test_name')) - - def test_get_test_missing_test(self): - self.assertEqual(self.tierbuilder.get_test('test_name2'), - None) - - def test_get_tests_present_tier(self): - self.assertEqual(self.tierbuilder.get_tests('test_tier'), - self.tier_obj.tests_array) - - def test_get_tests_missing_tier(self): - self.assertEqual(self.tierbuilder.get_tests('test_tier2'), - None) - - def test_get_tier_name_ok(self): - self.assertEqual(self.tierbuilder.get_tier_name('test_name'), - 'test_tier') - - def test_get_tier_name_ko(self): - self.assertEqual(self.tierbuilder.get_tier_name('test_name2'), None) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/ci/test_tier_handler.py b/functest/tests/unit/ci/test_tier_handler.py deleted file mode 100644 index 871220db3..000000000 --- a/functest/tests/unit/ci/test_tier_handler.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python - -# 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 - -# pylint: disable=missing-docstring - -import logging -import unittest - -import mock - -from functest.ci import tier_handler - - -class TierHandlerTesting(unittest.TestCase): - - def setUp(self): - self.test = mock.Mock() - attrs = {'get_name.return_value': 'test_name'} - self.test.configure_mock(**attrs) - - self.mock_depend = mock.Mock() - attrs = {'get_scenario.return_value': 'test_scenario', - 'get_installer.return_value': 'test_installer'} - self.mock_depend.configure_mock(**attrs) - - self.tier = tier_handler.Tier('test_tier', - 'test_order', - 'test_ci_loop', - description='test_desc') - self.testcase = tier_handler.TestCase('test_name', - 'true', - self.mock_depend, - 'test_criteria', - 'test_blocking', - description='test_desc') - - self.dependency = tier_handler.Dependency('test_installer', - 'test_scenario') - - self.testcase.str = self.testcase.__str__() - self.dependency.str = self.dependency.__str__() - self.tier.str = self.tier.__str__() - - def test_split_text(self): - test_str = 'this is for testing' - self.assertEqual(tier_handler.split_text(test_str, 10), - ['this is ', 'for ', 'testing ']) - - def test_add_test(self): - self.tier.add_test(self.test) - self.assertEqual(self.tier.tests_array, - [self.test]) - - def test_get_tests(self): - self.tier.tests_array = [self.test] - self.assertEqual(self.tier.get_tests(), - [self.test]) - - def test_get_test_names(self): - self.tier.tests_array = [self.test] - self.assertEqual(self.tier.get_test_names(), - ['test_name']) - - def test_get_test(self): - self.tier.tests_array = [self.test] - with mock.patch.object(self.tier, 'is_test', - return_value=True): - self.assertEqual(self.tier.get_test('test_name'), - self.test) - - def test_get_test_missing_test(self): - self.tier.tests_array = [self.test] - with mock.patch.object(self.tier, 'is_test', - return_value=False): - self.assertEqual(self.tier.get_test('test_name'), - None) - - def test_get_name(self): - self.assertEqual(self.tier.get_name(), - 'test_tier') - - def test_get_order(self): - self.assertEqual(self.tier.get_order(), - 'test_order') - - def test_get_ci_loop(self): - self.assertEqual(self.tier.get_ci_loop(), - 'test_ci_loop') - - def test_testcase_is_none_in_item(self): - self.assertEqual(tier_handler.TestCase.is_none("item"), - False) - - def test_testcase_is_none_no_item(self): - self.assertEqual(tier_handler.TestCase.is_none(None), - True) - - def test_testcase_is_compatible(self): - self.assertEqual(self.testcase.is_compatible('test_installer', - 'test_scenario'), - True) - - def test_testcase_is_compatible_2(self): - self.assertEqual(self.testcase.is_compatible('missing_installer', - 'test_scenario'), - False) - self.assertEqual(self.testcase.is_compatible('test_installer', - 'missing_scenario'), - False) - - def test_testcase_get_name(self): - self.assertEqual(self.tier.get_name(), - 'test_tier') - - def test_testcase_is_enabled(self): - self.assertEqual(self.testcase.is_enabled(), - 'true') - - def test_testcase_get_criteria(self): - self.assertEqual(self.tier.get_order(), - 'test_order') - - def test_testcase_is_blocking(self): - self.assertEqual(self.tier.get_ci_loop(), - 'test_ci_loop') - - def test_dependency_get_installer(self): - self.assertEqual(self.dependency.get_installer(), - 'test_installer') - - def test_dependency_get_scenario(self): - self.assertEqual(self.dependency.get_scenario(), - 'test_scenario') - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/cli/__init__.py b/functest/tests/unit/cli/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/cli/__init__.py +++ /dev/null diff --git a/functest/tests/unit/cli/commands/__init__.py b/functest/tests/unit/cli/commands/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/cli/commands/__init__.py +++ /dev/null diff --git a/functest/tests/unit/cli/commands/test_cli_env.py b/functest/tests/unit/cli/commands/test_cli_env.py deleted file mode 100644 index d865d3803..000000000 --- a/functest/tests/unit/cli/commands/test_cli_env.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python - -# 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 logging -import unittest - -import mock - -from functest.cli.commands import cli_env -from functest.utils.constants import CONST -from functest.tests.unit import test_utils - - -class CliEnvTesting(unittest.TestCase): - - def setUp(self): - self.cli_environ = cli_env.CliEnv() - - def _test_show_missing_env_var(self, var, *args): - if var == 'INSTALLER_TYPE': - CONST.__setattr__('INSTALLER_TYPE', None) - reg_string = "| INSTALLER: Unknown, \S+\s*|" - elif var == 'INSTALLER_IP': - CONST.__setattr__('INSTALLER_IP', None) - reg_string = "| INSTALLER: \S+, Unknown\s*|" - elif var == 'SCENARIO': - CONST.__setattr__('DEPLOY_SCENARIO', None) - reg_string = "| SCENARIO: Unknown\s*|" - elif var == 'NODE': - CONST.__setattr__('NODE_NAME', None) - reg_string = "| POD: Unknown\s*|" - elif var == 'BUILD_TAG': - CONST.__setattr__('BUILD_TAG', None) - reg_string = "| BUILD TAG: None|" - elif var == 'DEBUG': - CONST.__setattr__('CI_DEBUG', None) - reg_string = "| DEBUG FLAG: false\s*|" - - with mock.patch('functest.cli.commands.cli_env.click.echo') \ - as mock_click_echo: - self.cli_environ.show() - mock_click_echo.assert_called_with(test_utils. - RegexMatch(reg_string)) - - def test_show_missing_ci_installer_type(self, *args): - self._test_show_missing_env_var('INSTALLER_TYPE', *args) - - def test_show_missing_ci_installer_ip(self, *args): - self._test_show_missing_env_var('INSTALLER_IP', *args) - - def test_show_missing_ci_scenario(self, *args): - self._test_show_missing_env_var('SCENARIO', *args) - - def test_show_missing_ci_node(self, *args): - self._test_show_missing_env_var('NODE', *args) - - def test_show_missing_ci_build_tag(self, *args): - self._test_show_missing_env_var('BUILD_TAG', *args) - - def test_show_missing_ci_debug(self, *args): - self._test_show_missing_env_var('DEBUG', *args) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/cli/commands/test_cli_os.py b/functest/tests/unit/cli/commands/test_cli_os.py deleted file mode 100644 index b827e87ca..000000000 --- a/functest/tests/unit/cli/commands/test_cli_os.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.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 logging -import unittest -import os - -import mock - -from functest.cli.commands import cli_os - - -class CliOpenStackTesting(unittest.TestCase): - - def setUp(self): - self.endpoint_ip = 'test_ip' - self.os_auth_url = 'http://test_ip:test_port/v2.0' - self.installer_type = 'test_installer_type' - self.installer_ip = 'test_installer_ip' - self.openstack_creds = 'test_openstack_creds' - self.snapshot_file = 'test_snapshot_file' - self.cli_os = cli_os.CliOpenStack() - - def test_ping_endpoint_default(self): - self.cli_os.os_auth_url = self.os_auth_url - self.cli_os.endpoint_ip = self.endpoint_ip - with mock.patch('functest.cli.commands.cli_os.os.system', - return_value=0): - self.assertEqual(self.cli_os.ping_endpoint(), 0) - - @mock.patch('functest.cli.commands.cli_os.exit', side_effect=Exception) - @mock.patch('functest.cli.commands.cli_os.click.echo') - def test_ping_endpoint_missing_auth_url(self, mock_click_echo, - mock_exit): - with self.assertRaises(Exception): - self.cli_os.os_auth_url = None - self.cli_os.ping_endpoint() - mock_click_echo.assert_called_once_with("Source the OpenStack " - "credentials first '. " - "$creds'") - - @mock.patch('functest.cli.commands.cli_os.exit') - @mock.patch('functest.cli.commands.cli_os.click.echo') - def test_ping_endpoint_os_system_fails(self, mock_click_echo, - mock_exit): - self.cli_os.os_auth_url = self.os_auth_url - self.cli_os.endpoint_ip = self.endpoint_ip - with mock.patch('functest.cli.commands.cli_os.os.system', - return_value=1): - self.cli_os.ping_endpoint() - mock_click_echo.assert_called_once_with("Cannot talk to the " - "endpoint %s\n" % - self.endpoint_ip) - mock_exit.assert_called_once_with(0) - - def test_check(self): - with mock.patch.object(self.cli_os, 'ping_endpoint'), \ - mock.patch('functest.cli.commands.cli_os.check_deployment.' - 'CheckDeployment') as mock_check_deployment: - self.cli_os.check() - self.assertTrue(mock_check_deployment.called) - - @mock.patch('functest.cli.commands.cli_os.click.echo') - def test_show_credentials(self, mock_click_echo): - key = 'OS_KEY' - value = 'OS_VALUE' - with mock.patch.dict(os.environ, {key: value}): - self.cli_os.show_credentials() - mock_click_echo.assert_any_call("{}={}".format(key, value)) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/cli/commands/test_cli_testcase.py b/functest/tests/unit/cli/commands/test_cli_testcase.py deleted file mode 100644 index f3648eb05..000000000 --- a/functest/tests/unit/cli/commands/test_cli_testcase.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python - -# 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 logging -import unittest - -import mock - -from functest.cli.commands import cli_testcase - - -class CliTestCasesTesting(unittest.TestCase): - - def setUp(self): - self.testname = 'testname' - with mock.patch('functest.cli.commands.cli_testcase.tb'): - self.cli_tests = cli_testcase.CliTestcase() - - @mock.patch('functest.cli.commands.cli_testcase.vacation.main') - def test_run_vacation(self, mock_method): - self.cli_tests.run('vacation') - self.assertTrue(mock_method.called) - - @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command') - def test_run_default(self, mock_ft_utils): - cmd = "run_tests -n -r -t {}".format(self.testname) - self.cli_tests.run(self.testname, noclean=True, report=True) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command') - def test_run_noclean_missing_report(self, mock_ft_utils): - cmd = "run_tests -n -t {}".format(self.testname) - self.cli_tests.run(self.testname, noclean=True, report=False) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command') - def test_run_report_missing_noclean(self, mock_ft_utils): - cmd = "run_tests -r -t {}".format(self.testname) - self.cli_tests.run(self.testname, noclean=False, report=True) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_testcase.ft_utils.execute_command') - def test_run_missing_noclean_report(self, mock_ft_utils): - cmd = "run_tests -t {}".format(self.testname) - self.cli_tests.run(self.testname, noclean=False, report=False) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_testcase.click.echo') - def test_list(self, mock_click_echo): - with mock.patch.object(self.cli_tests.tiers, 'get_tiers', - return_value=[]): - self.cli_tests.list() - mock_click_echo.assert_called_with("") - - @mock.patch('functest.cli.commands.cli_testcase.click.echo') - def test_show_default_desc_none(self, mock_click_echo): - with mock.patch.object(self.cli_tests.tiers, 'get_test', - return_value=None): - self.cli_tests.show(self.testname) - mock_click_echo.assert_any_call("The test case '%s' " - "does not exist or is" - " not supported." - % self.testname) - - @mock.patch('functest.cli.commands.cli_testcase.click.echo') - def test_show_default(self, mock_click_echo): - mock_obj = mock.Mock() - with mock.patch.object(self.cli_tests.tiers, 'get_test', - return_value=mock_obj): - self.cli_tests.show(self.testname) - mock_click_echo.assert_called_with(mock_obj) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/cli/commands/test_cli_tier.py b/functest/tests/unit/cli/commands/test_cli_tier.py deleted file mode 100644 index a76d12049..000000000 --- a/functest/tests/unit/cli/commands/test_cli_tier.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python - -# 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 logging -import unittest - -import mock - -from functest.cli.commands import cli_tier - - -class CliTierTesting(unittest.TestCase): - - def setUp(self): - self.tiername = 'tiername' - self.testnames = 'testnames' - with mock.patch('functest.cli.commands.cli_tier.tb'): - self.cli_tier = cli_tier.CliTier() - - @mock.patch('functest.cli.commands.cli_tier.click.echo') - def test_list(self, mock_click_echo): - with mock.patch.object(self.cli_tier.tiers, 'get_tiers', - return_value=[]): - self.cli_tier.list() - mock_click_echo.assert_called_with("") - - @mock.patch('functest.cli.commands.cli_tier.click.echo') - def test_show_default(self, mock_click_echo): - with mock.patch.object(self.cli_tier.tiers, 'get_tier', - return_value=self.tiername): - self.cli_tier.show(self.tiername) - mock_click_echo.assert_called_with(self.tiername) - - @mock.patch('functest.cli.commands.cli_tier.click.echo') - def test_show_missing_tier(self, mock_click_echo): - with mock.patch.object(self.cli_tier.tiers, 'get_tier', - return_value=None), \ - mock.patch.object(self.cli_tier.tiers, 'get_tier_names', - return_value='tiernames'): - self.cli_tier.show(self.tiername) - mock_click_echo.assert_called_with("The tier with name '%s' does " - "not exist. Available tiers are" - ":\n %s\n" % (self.tiername, - 'tiernames')) - - @mock.patch('functest.cli.commands.cli_tier.click.echo') - def test_gettests_default(self, mock_click_echo): - mock_obj = mock.Mock() - attrs = {'get_test_names.return_value': self.testnames} - mock_obj.configure_mock(**attrs) - - with mock.patch.object(self.cli_tier.tiers, 'get_tier', - return_value=mock_obj): - self.cli_tier.gettests(self.tiername) - mock_click_echo.assert_called_with("Test cases in tier " - "'%s':\n %s\n" % (self.tiername, - self.testnames - )) - - @mock.patch('functest.cli.commands.cli_tier.click.echo') - def test_gettests_missing_tier(self, mock_click_echo): - with mock.patch.object(self.cli_tier.tiers, 'get_tier', - return_value=None), \ - mock.patch.object(self.cli_tier.tiers, 'get_tier_names', - return_value='tiernames'): - self.cli_tier.gettests(self.tiername) - mock_click_echo.assert_called_with("The tier with name '%s' does " - "not exist. Available tiers are" - ":\n %s\n" % (self.tiername, - 'tiernames')) - - @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command') - def test_run_default(self, mock_ft_utils): - cmd = "run_tests -n -r -t {}".format(self.tiername) - self.cli_tier.run(self.tiername, noclean=True, report=True) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command') - def test_run_report_missing_noclean(self, mock_ft_utils): - cmd = "run_tests -r -t {}".format(self.tiername) - self.cli_tier.run(self.tiername, noclean=False, report=True) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command') - def test_run_noclean_missing_report(self, mock_ft_utils): - cmd = "run_tests -n -t {}".format(self.tiername) - self.cli_tier.run(self.tiername, noclean=True, report=False) - mock_ft_utils.assert_called_with(cmd) - - @mock.patch('functest.cli.commands.cli_tier.ft_utils.execute_command') - def test_run_missing_noclean_report(self, mock_ft_utils): - cmd = "run_tests -t {}".format(self.tiername) - self.cli_tier.run(self.tiername, noclean=False, report=False) - mock_ft_utils.assert_called_with(cmd) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/cli/test_cli_base.py b/functest/tests/unit/cli/test_cli_base.py deleted file mode 100644 index bc2ca903e..000000000 --- a/functest/tests/unit/cli/test_cli_base.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/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 logging -import unittest - -import mock -from click.testing import CliRunner - -with mock.patch('functest.cli.commands.cli_testcase.CliTestcase.__init__', - mock.Mock(return_value=None)), \ - mock.patch('functest.cli.commands.cli_tier.CliTier.__init__', - mock.Mock(return_value=None)): - from functest.cli import cli_base - - -class CliBaseTesting(unittest.TestCase): - - def setUp(self): - self.runner = CliRunner() - self._openstack = cli_base._openstack - self._env = cli_base._env - self._testcase = cli_base._testcase - self._tier = cli_base._tier - - def test_os_check(self): - with mock.patch.object(self._openstack, 'check') as mock_method: - result = self.runner.invoke(cli_base.os_check) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_os_show_credentials(self): - with mock.patch.object(self._openstack, 'show_credentials') \ - as mock_method: - result = self.runner.invoke(cli_base.os_show_credentials) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_env_show(self): - with mock.patch.object(self._env, 'show') as mock_method: - result = self.runner.invoke(cli_base.env_show) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_testcase_list(self): - with mock.patch.object(self._testcase, 'list') as mock_method: - result = self.runner.invoke(cli_base.testcase_list) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_testcase_show(self): - with mock.patch.object(self._testcase, 'show') as mock_method: - result = self.runner.invoke(cli_base.testcase_show, ['testname']) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_testcase_run(self): - with mock.patch.object(self._testcase, 'run') as mock_method: - result = self.runner.invoke(cli_base.testcase_run, - ['testname', '--noclean']) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_tier_list(self): - with mock.patch.object(self._tier, 'list') as mock_method: - result = self.runner.invoke(cli_base.tier_list) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_tier_show(self): - with mock.patch.object(self._tier, 'show') as mock_method: - result = self.runner.invoke(cli_base.tier_show, ['tiername']) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_tier_gettests(self): - with mock.patch.object(self._tier, 'gettests') as mock_method: - result = self.runner.invoke(cli_base.tier_gettests, ['tiername']) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - def test_tier_run(self): - with mock.patch.object(self._tier, 'run') as mock_method: - result = self.runner.invoke(cli_base.tier_run, - ['tiername', '--noclean']) - self.assertEqual(result.exit_code, 0) - self.assertTrue(mock_method.called) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/core/__init__.py b/functest/tests/unit/core/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/core/__init__.py +++ /dev/null diff --git a/functest/tests/unit/core/test_feature.py b/functest/tests/unit/core/test_feature.py deleted file mode 100644 index 8c73bb5d5..000000000 --- a/functest/tests/unit/core/test_feature.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 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 - -# pylint: disable=missing-docstring - -import logging -import unittest - -import mock - -from functest.core import feature -from functest.core import testcase - - -class FeatureTestingBase(unittest.TestCase): - - _case_name = "foo" - _project_name = "bar" - _repo = "dir_repo_bar" - _cmd = "run_bar_tests.py" - _output_file = '/home/opnfv/functest/results/foo.log' - feature = None - - @mock.patch('time.time', side_effect=[1, 2]) - def _test_run(self, status, mock_method=None): - self.assertEqual(self.feature.run(cmd=self._cmd), status) - if status == testcase.TestCase.EX_OK: - self.assertEqual(self.feature.result, 100) - else: - self.assertEqual(self.feature.result, 0) - mock_method.assert_has_calls([mock.call(), mock.call()]) - self.assertEqual(self.feature.start_time, 1) - self.assertEqual(self.feature.stop_time, 2) - - def test_logger_module_ko(self): - with mock.patch('six.moves.builtins.open'): - self.feature = feature.Feature( - project_name=self._project_name, case_name=self._case_name) - self.assertEqual(self.feature.logger.name, self._case_name) - - def test_logger_module(self): - with mock.patch('six.moves.builtins.open'): - self.feature = feature.Feature( - project_name=self._project_name, case_name=self._case_name, - run={'module': 'bar'}) - self.assertEqual(self.feature.logger.name, 'bar') - - -class FeatureTesting(FeatureTestingBase): - - def setUp(self): - with mock.patch('six.moves.builtins.open'): - self.feature = feature.Feature( - project_name=self._project_name, case_name=self._case_name) - - def test_run_exc(self): - # pylint: disable=bad-continuation - with mock.patch.object( - self.feature, 'execute', - side_effect=Exception) as mock_method: - self._test_run(testcase.TestCase.EX_RUN_ERROR) - mock_method.assert_called_once_with(cmd=self._cmd) - - def test_run(self): - self._test_run(testcase.TestCase.EX_RUN_ERROR) - - -class BashFeatureTesting(FeatureTestingBase): - - def setUp(self): - with mock.patch('six.moves.builtins.open'): - self.feature = feature.BashFeature( - project_name=self._project_name, case_name=self._case_name) - - @mock.patch('subprocess.Popen') - def test_run_no_cmd(self, mock_subproc): - self.assertEqual( - self.feature.run(), testcase.TestCase.EX_RUN_ERROR) - mock_subproc.assert_not_called() - - @mock.patch('subprocess.Popen') - def test_run_ko(self, mock_subproc): - with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen: - mock_obj = mock.Mock() - attrs = {'wait.return_value': 1} - mock_obj.configure_mock(**attrs) - - mock_subproc.return_value = mock_obj - self._test_run(testcase.TestCase.EX_RUN_ERROR) - mopen.assert_called_once_with(self._output_file, "w+") - - @mock.patch('subprocess.Popen') - def test_run(self, mock_subproc): - with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen: - mock_obj = mock.Mock() - attrs = {'wait.return_value': 0} - mock_obj.configure_mock(**attrs) - - mock_subproc.return_value = mock_obj - self._test_run(testcase.TestCase.EX_OK) - mopen.assert_called_once_with(self._output_file, "w+") - - -if __name__ == "__main__": - # logging must be disabled else it calls time.time() - # what will break these unit tests. - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/core/test_robotframework.py b/functest/tests/unit/core/test_robotframework.py deleted file mode 100644 index 38e9039b2..000000000 --- a/functest/tests/unit/core/test_robotframework.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 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 - -"""Define the classes required to fully cover robot.""" - -import errno -import logging -import os -import unittest - -import mock -from robot.errors import DataError, RobotError -from robot.result import model -from robot.utils.robottime import timestamp_to_secs - -from functest.core import robotframework - -__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" - - -class ResultVisitorTesting(unittest.TestCase): - - """The class testing ResultVisitor.""" - # pylint: disable=missing-docstring - - def setUp(self): - self.visitor = robotframework.ResultVisitor() - - def test_empty(self): - self.assertFalse(self.visitor.get_data()) - - def test_ok(self): - data = {'name': 'foo', - 'parent': 'bar', - 'status': 'PASS', - 'starttime': "20161216 16:00:00.000", - 'endtime': "20161216 16:00:01.000", - 'elapsedtime': 1000, - 'text': 'Hello, World!', - 'critical': True} - test = model.TestCase( - name=data['name'], status=data['status'], message=data['text'], - starttime=data['starttime'], endtime=data['endtime']) - test.parent = mock.Mock() - config = {'name': data['parent'], - 'criticality.test_is_critical.return_value': data[ - 'critical']} - test.parent.configure_mock(**config) - self.visitor.visit_test(test) - self.assertEqual(self.visitor.get_data(), [data]) - - -class ParseResultTesting(unittest.TestCase): - - """The class testing RobotFramework.parse_results().""" - # pylint: disable=missing-docstring - - _config = {'name': 'dummy', 'starttime': '20161216 16:00:00.000', - 'endtime': '20161216 16:00:01.000'} - - def setUp(self): - self.test = robotframework.RobotFramework( - case_name='robot', project_name='functest') - - @mock.patch('robot.api.ExecutionResult', side_effect=DataError) - def test_raises_exc(self, mock_method): - with self.assertRaises(DataError): - self.test.parse_results() - mock_method.assert_called_once_with( - os.path.join(self.test.res_dir, 'output.xml')) - - def _test_result(self, config, result): - suite = mock.Mock() - suite.configure_mock(**config) - with mock.patch('robot.api.ExecutionResult', - return_value=mock.Mock(suite=suite)): - self.test.parse_results() - self.assertEqual(self.test.result, result) - self.assertEqual(self.test.start_time, - timestamp_to_secs(config['starttime'])) - self.assertEqual(self.test.stop_time, - timestamp_to_secs(config['endtime'])) - self.assertEqual(self.test.details, - {'description': config['name'], 'tests': []}) - - def test_null_passed(self): - self._config.update({'statistics.critical.passed': 0, - 'statistics.critical.total': 20}) - self._test_result(self._config, 0) - - def test_no_test(self): - self._config.update({'statistics.critical.passed': 20, - 'statistics.critical.total': 0}) - self._test_result(self._config, 0) - - def test_half_success(self): - self._config.update({'statistics.critical.passed': 10, - 'statistics.critical.total': 20}) - self._test_result(self._config, 50) - - def test_success(self): - self._config.update({'statistics.critical.passed': 20, - 'statistics.critical.total': 20}) - self._test_result(self._config, 100) - - -class RunTesting(unittest.TestCase): - - """The class testing RobotFramework.run().""" - # pylint: disable=missing-docstring - - suites = ["foo"] - variable = [] - - def setUp(self): - self.test = robotframework.RobotFramework( - case_name='robot', project_name='functest') - - def test_exc_key_error(self): - self.assertEqual(self.test.run(), self.test.EX_RUN_ERROR) - - @mock.patch('robot.run') - def _test_makedirs_exc(self, *args): - with mock.patch.object(self.test, 'parse_results') as mock_method: - self.assertEqual( - self.test.run(suites=self.suites, variable=self.variable), - self.test.EX_RUN_ERROR) - args[0].assert_not_called() - mock_method.asser_not_called() - - @mock.patch('os.makedirs', side_effect=Exception) - def test_makedirs_exc(self, *args): - self._test_makedirs_exc() - args[0].assert_called_once_with(self.test.res_dir) - - @mock.patch('os.makedirs', side_effect=OSError) - def test_makedirs_oserror(self, *args): - self._test_makedirs_exc() - args[0].assert_called_once_with(self.test.res_dir) - - @mock.patch('robot.run') - def _test_makedirs(self, *args): - with mock.patch.object(self.test, 'parse_results') as mock_method: - self.assertEqual( - self.test.run(suites=self.suites, variable=self.variable), - self.test.EX_OK) - args[0].assert_called_once_with( - *self.suites, log='NONE', output=self.test.xml_file, - report='NONE', stdout=mock.ANY, variable=self.variable) - mock_method.assert_called_once_with() - - @mock.patch('os.makedirs', side_effect=OSError(errno.EEXIST, '')) - def test_makedirs_oserror17(self, *args): - self._test_makedirs() - args[0].assert_called_once_with(self.test.res_dir) - - @mock.patch('os.makedirs') - def test_makedirs(self, *args): - self._test_makedirs() - args[0].assert_called_once_with(self.test.res_dir) - - @mock.patch('robot.run') - def _test_parse_results(self, status, *args): - self.assertEqual( - self.test.run(suites=self.suites, variable=self.variable), status) - args[0].assert_called_once_with( - *self.suites, log='NONE', output=self.test.xml_file, - report='NONE', stdout=mock.ANY, variable=self.variable) - - def test_parse_results_exc(self): - with mock.patch.object(self.test, 'parse_results', - side_effect=Exception) as mock_method: - self._test_parse_results(self.test.EX_RUN_ERROR) - mock_method.assert_called_once_with() - - def test_parse_results_robot_error(self): - with mock.patch.object(self.test, 'parse_results', - side_effect=RobotError('foo')) as mock_method: - self._test_parse_results(self.test.EX_RUN_ERROR) - mock_method.assert_called_once_with() - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/core/test_testcase.py b/functest/tests/unit/core/test_testcase.py deleted file mode 100644 index 73ed3470a..000000000 --- a/functest/tests/unit/core/test_testcase.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/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 - -"""Define the class required to fully cover testcase.""" - -import logging -import unittest - -from functest.core import testcase - -import mock - - -__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" - - -class TestCaseTesting(unittest.TestCase): - """The class testing TestCase.""" - - # pylint: disable=missing-docstring,too-many-public-methods - - _case_name = "base" - _project_name = "functest" - _published_result = "PASS" - - def setUp(self): - self.test = testcase.TestCase(case_name=self._case_name, - project_name=self._project_name) - self.test.start_time = "1" - self.test.stop_time = "2" - self.test.result = 100 - self.test.details = {"Hello": "World"} - - def test_run_unimplemented(self): - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) - - @mock.patch('functest.utils.functest_utils.push_results_to_db', - return_value=False) - def _test_missing_attribute(self, mock_function=None): - self.assertEqual(self.test.push_to_db(), - testcase.TestCase.EX_PUSH_TO_DB_ERROR) - mock_function.assert_not_called() - - def test_missing_project_name(self): - self.test.project_name = None - self._test_missing_attribute() - - def test_missing_case_name(self): - self.test.case_name = None - self._test_missing_attribute() - - def test_missing_start_time(self): - self.test.start_time = None - self._test_missing_attribute() - - def test_missing_stop_time(self): - self.test.stop_time = None - self._test_missing_attribute() - - @mock.patch('functest.utils.functest_utils.push_results_to_db', - return_value=True) - def test_missing_details(self, mock_function=None): - self.test.details = None - self.assertEqual(self.test.push_to_db(), - testcase.TestCase.EX_OK) - mock_function.assert_called_once_with( - self._project_name, self._case_name, self.test.start_time, - self.test.stop_time, self._published_result, self.test.details) - - @mock.patch('functest.utils.functest_utils.push_results_to_db', - return_value=False) - def test_push_to_db_failed(self, mock_function=None): - self.assertEqual(self.test.push_to_db(), - testcase.TestCase.EX_PUSH_TO_DB_ERROR) - mock_function.assert_called_once_with( - self._project_name, self._case_name, self.test.start_time, - self.test.stop_time, self._published_result, self.test.details) - - @mock.patch('functest.utils.functest_utils.push_results_to_db', - return_value=True) - def test_push_to_db(self, mock_function=None): - self.assertEqual(self.test.push_to_db(), - testcase.TestCase.EX_OK) - mock_function.assert_called_once_with( - self._project_name, self._case_name, self.test.start_time, - self.test.stop_time, self._published_result, self.test.details) - - @mock.patch('functest.utils.functest_utils.push_results_to_db', - return_value=True) - def test_push_to_db_res_ko(self, mock_function=None): - self.test.result = 0 - self.assertEqual(self.test.push_to_db(), - testcase.TestCase.EX_OK) - mock_function.assert_called_once_with( - self._project_name, self._case_name, self.test.start_time, - self.test.stop_time, 'FAIL', self.test.details) - - @mock.patch('functest.utils.functest_utils.push_results_to_db', - return_value=True) - def test_push_to_db_both_ko(self, mock_function=None): - self.test.result = 0 - self.test.criteria = 0 - self.assertEqual(self.test.push_to_db(), - testcase.TestCase.EX_OK) - mock_function.assert_called_once_with( - self._project_name, self._case_name, self.test.start_time, - self.test.stop_time, 'FAIL', self.test.details) - - def test_check_criteria_missing(self): - self.test.criteria = None - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_check_result_missing(self): - self.test.result = None - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_check_result_failed(self): - # Backward compatibility - # It must be removed as soon as TestCase subclasses - # stop setting result = 'PASS' or 'FAIL'. - self.test.result = 'FAIL' - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_check_result_pass(self): - # Backward compatibility - # It must be removed as soon as TestCase subclasses - # stop setting result = 'PASS' or 'FAIL'. - self.test.result = 'PASS' - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_OK) - - def test_check_result_lt(self): - self.test.result = 50 - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_check_result_eq(self): - self.test.result = 100 - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_OK) - - def test_check_result_gt(self): - self.test.criteria = 50 - self.test.result = 100 - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_OK) - - def test_check_result_zero(self): - self.test.criteria = 0 - self.test.result = 0 - self.assertEqual(self.test.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_get_duration_start_ko(self): - self.test.start_time = None - self.assertEqual(self.test.get_duration(), "XX:XX") - self.test.start_time = 0 - self.assertEqual(self.test.get_duration(), "XX:XX") - - def test_get_duration_end_ko(self): - self.test.stop_time = None - self.assertEqual(self.test.get_duration(), "XX:XX") - self.test.stop_time = 0 - self.assertEqual(self.test.get_duration(), "XX:XX") - - def test_get_invalid_duration(self): - self.test.start_time = 2 - self.test.stop_time = 1 - self.assertEqual(self.test.get_duration(), "XX:XX") - - def test_get_zero_duration(self): - self.test.start_time = 2 - self.test.stop_time = 2 - self.assertEqual(self.test.get_duration(), "00:00") - - def test_get_duration(self): - self.test.start_time = 1 - self.test.stop_time = 180 - self.assertEqual(self.test.get_duration(), "02:59") - - def test_str_project_name_ko(self): - self.test.project_name = None - self.assertIn("<functest.core.testcase.TestCase object at", - str(self.test)) - - def test_str_case_name_ko(self): - self.test.case_name = None - self.assertIn("<functest.core.testcase.TestCase object at", - str(self.test)) - - def test_str_pass(self): - duration = '01:01' - with mock.patch.object(self.test, 'get_duration', - return_value=duration), \ - mock.patch.object(self.test, 'is_successful', - return_value=testcase.TestCase.EX_OK): - message = str(self.test) - self.assertIn(self._project_name, message) - self.assertIn(self._case_name, message) - self.assertIn(duration, message) - self.assertIn('PASS', message) - - def test_str_fail(self): - duration = '00:59' - with mock.patch.object(self.test, 'get_duration', - return_value=duration), \ - mock.patch.object( - self.test, 'is_successful', - return_value=testcase.TestCase.EX_TESTCASE_FAILED): - message = str(self.test) - self.assertIn(self._project_name, message) - self.assertIn(self._case_name, message) - self.assertIn(duration, message) - self.assertIn('FAIL', message) - - def test_clean(self): - self.assertEqual(self.test.clean(), None) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/core/test_unit.py b/functest/tests/unit/core/test_unit.py deleted file mode 100644 index ca73de672..000000000 --- a/functest/tests/unit/core/test_unit.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python - -# 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 - -# pylint: disable=missing-docstring - -import logging -import unittest - -import mock - -from functest.core import unit -from functest.core import testcase - - -class PyTestSuiteRunnerTesting(unittest.TestCase): - - def setUp(self): - self.psrunner = unit.Suite() - self.psrunner.suite = "foo" - - @mock.patch('unittest.TestLoader') - def _test_run(self, mock_class=None, result=mock.Mock(), - status=testcase.TestCase.EX_OK): - with mock.patch('functest.core.unit.unittest.TextTestRunner.run', - return_value=result): - self.assertEqual(self.psrunner.run(), status) - mock_class.assert_not_called() - - def test_check_suite_null(self): - self.assertEqual(unit.Suite().suite, None) - self.psrunner.suite = None - self._test_run(result=mock.Mock(), - status=testcase.TestCase.EX_RUN_ERROR) - - def test_run_no_ut(self): - mock_result = mock.Mock(testsRun=0, errors=[], failures=[]) - self._test_run(result=mock_result, - status=testcase.TestCase.EX_RUN_ERROR) - self.assertEqual(self.psrunner.result, 0) - self.assertEqual(self.psrunner.details, - {'errors': 0, 'failures': 0, 'stream': '', - 'testsRun': 0}) - self.assertEqual(self.psrunner.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_run_result_ko(self): - self.psrunner.criteria = 100 - mock_result = mock.Mock(testsRun=50, errors=[('test1', 'error_msg1')], - failures=[('test2', 'failure_msg1')]) - self._test_run(result=mock_result) - self.assertEqual(self.psrunner.result, 96) - self.assertEqual(self.psrunner.details, - {'errors': 1, 'failures': 1, 'stream': '', - 'testsRun': 50}) - self.assertEqual(self.psrunner.is_successful(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_run_result_ok(self): - mock_result = mock.Mock(testsRun=50, errors=[], - failures=[]) - self._test_run(result=mock_result) - self.assertEqual(self.psrunner.result, 100) - self.assertEqual(self.psrunner.details, - {'errors': 0, 'failures': 0, 'stream': '', - 'testsRun': 50}) - self.assertEqual(self.psrunner.is_successful(), - testcase.TestCase.EX_OK) - - @mock.patch('unittest.TestLoader') - def test_run_name_exc(self, mock_class=None): - mock_obj = mock.Mock(side_effect=ImportError) - mock_class.side_effect = mock_obj - self.assertEqual(self.psrunner.run(name='foo'), - testcase.TestCase.EX_RUN_ERROR) - mock_class.assert_called_once_with() - mock_obj.assert_called_once_with() - - @mock.patch('unittest.TestLoader') - def test_run_name(self, mock_class=None): - mock_result = mock.Mock(testsRun=50, errors=[], - failures=[]) - mock_obj = mock.Mock() - mock_class.side_effect = mock_obj - with mock.patch('functest.core.unit.unittest.TextTestRunner.run', - return_value=mock_result): - self.assertEqual(self.psrunner.run(name='foo'), - testcase.TestCase.EX_OK) - mock_class.assert_called_once_with() - mock_obj.assert_called_once_with() - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/core/test_vnf.py b/functest/tests/unit/core/test_vnf.py deleted file mode 100644 index e0eee1a19..000000000 --- a/functest/tests/unit/core/test_vnf.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/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 - -# pylint: disable=missing-docstring - -import logging -import unittest - -import mock - -from functest.core import vnf -from functest.core import testcase -from functest.utils import constants - -from snaps.openstack.os_credentials import OSCreds - - -class VnfBaseTesting(unittest.TestCase): - """The class testing VNF.""" - # pylint: disable=missing-docstring,too-many-public-methods - - tenant_name = 'test_tenant_name' - tenant_description = 'description' - - def setUp(self): - constants.CONST.__setattr__("vnf_foo_tenant_name", self.tenant_name) - constants.CONST.__setattr__( - "vnf_foo_tenant_description", self.tenant_description) - self.test = vnf.VnfOnBoarding(project='functest', case_name='foo') - - def test_run_deploy_orch_exc(self): - with mock.patch.object(self.test, 'prepare'), \ - mock.patch.object(self.test, 'deploy_orchestrator', - side_effect=Exception) as mock_method, \ - mock.patch.object(self.test, 'deploy_vnf', - return_value=True), \ - mock.patch.object(self.test, 'test_vnf', - return_value=True): - self.assertEqual(self.test.run(), - testcase.TestCase.EX_TESTCASE_FAILED) - mock_method.assert_called_with() - - def test_run_deploy_vnf_exc(self): - with mock.patch.object(self.test, 'prepare'),\ - mock.patch.object(self.test, 'deploy_orchestrator', - return_value=True), \ - mock.patch.object(self.test, 'deploy_vnf', - side_effect=Exception) as mock_method: - self.assertEqual(self.test.run(), - testcase.TestCase.EX_TESTCASE_FAILED) - mock_method.assert_called_with() - - def test_run_test_vnf_exc(self): - with mock.patch.object(self.test, 'prepare'),\ - mock.patch.object(self.test, 'deploy_orchestrator', - return_value=True), \ - mock.patch.object(self.test, 'deploy_vnf', return_value=True), \ - mock.patch.object(self.test, 'test_vnf', - side_effect=Exception) as mock_method: - self.assertEqual(self.test.run(), - testcase.TestCase.EX_TESTCASE_FAILED) - mock_method.assert_called_with() - - def test_run_deploy_orch_ko(self): - with mock.patch.object(self.test, 'prepare'),\ - mock.patch.object(self.test, 'deploy_orchestrator', - return_value=False), \ - mock.patch.object(self.test, 'deploy_vnf', - return_value=True), \ - mock.patch.object(self.test, 'test_vnf', - return_value=True): - self.assertEqual(self.test.run(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_run_vnf_deploy_ko(self): - with mock.patch.object(self.test, 'prepare'),\ - mock.patch.object(self.test, 'deploy_orchestrator', - return_value=True), \ - mock.patch.object(self.test, 'deploy_vnf', - return_value=False), \ - mock.patch.object(self.test, 'test_vnf', - return_value=True): - self.assertEqual(self.test.run(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_run_vnf_test_ko(self): - with mock.patch.object(self.test, 'prepare'),\ - mock.patch.object(self.test, 'deploy_orchestrator', - return_value=True), \ - mock.patch.object(self.test, 'deploy_vnf', - return_value=True), \ - mock.patch.object(self.test, 'test_vnf', - return_value=False): - self.assertEqual(self.test.run(), - testcase.TestCase.EX_TESTCASE_FAILED) - - def test_run_default(self): - with mock.patch.object(self.test, 'prepare'),\ - mock.patch.object(self.test, 'deploy_orchestrator', - return_value=True), \ - mock.patch.object(self.test, 'deploy_vnf', - return_value=True), \ - mock.patch.object(self.test, 'test_vnf', - return_value=True): - self.assertEqual(self.test.run(), testcase.TestCase.EX_OK) - - @mock.patch('functest.core.vnf.OpenStackUser') - @mock.patch('functest.core.vnf.OpenStackProject') - @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials', - side_effect=Exception) - def test_prepare_exc1(self, *args): - with self.assertRaises(Exception): - self.test.prepare() - args[0].assert_called_with( - os_env_file=constants.CONST.__getattribute__('openstack_creds')) - args[1].assert_not_called() - args[2].assert_not_called() - - @mock.patch('functest.core.vnf.OpenStackUser') - @mock.patch('functest.core.vnf.OpenStackProject', side_effect=Exception) - @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials') - def test_prepare_exc2(self, *args): - with self.assertRaises(Exception): - self.test.prepare() - args[0].assert_called_with( - os_env_file=constants.CONST.__getattribute__('openstack_creds')) - args[1].assert_called_with(mock.ANY, mock.ANY) - args[2].assert_not_called() - - @mock.patch('functest.core.vnf.OpenStackUser', side_effect=Exception) - @mock.patch('functest.core.vnf.OpenStackProject') - @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials') - def test_prepare_exc3(self, *args): - with self.assertRaises(Exception): - self.test.prepare() - args[0].assert_called_with( - os_env_file=constants.CONST.__getattribute__('openstack_creds')) - args[1].assert_called_with(mock.ANY, mock.ANY) - args[2].assert_called_with(mock.ANY, mock.ANY) - - @mock.patch('functest.core.vnf.OpenStackUser') - @mock.patch('functest.core.vnf.OpenStackProject') - @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials') - def test_prepare_default(self, *args): - self.assertEqual(self.test.prepare(), testcase.TestCase.EX_OK) - args[0].assert_called_with( - os_env_file=constants.CONST.__getattribute__('openstack_creds')) - args[1].assert_called_with(mock.ANY, mock.ANY) - args[2].assert_called_with(mock.ANY, mock.ANY) - - def test_deploy_vnf_unimplemented(self): - with self.assertRaises(vnf.VnfDeploymentException): - self.test.deploy_vnf() - - def test_test_vnf_unimplemented(self): - with self.assertRaises(vnf.VnfTestException): - self.test.test_vnf() - - def test_deploy_orch_unimplemented(self): - self.assertTrue(self.test.deploy_orchestrator()) - - @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials', - return_value=OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar'), - side_effect=Exception) - def test_prepare_keystone_client_ko(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.test.prepare() - args[0].assert_called_once() - - def test_vnf_clean_exc(self): - obj = mock.Mock() - obj.clean.side_effect = Exception - self.test.created_object = [obj] - self.test.clean() - obj.clean.assert_called_with() - - def test_vnf_clean(self): - obj = mock.Mock() - self.test.created_object = [obj] - self.test.clean() - obj.clean.assert_called_with() - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/energy/__init__.py b/functest/tests/unit/energy/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/energy/__init__.py +++ /dev/null diff --git a/functest/tests/unit/energy/test_functest_energy.py b/functest/tests/unit/energy/test_functest_energy.py deleted file mode 100644 index f0711ca0c..000000000 --- a/functest/tests/unit/energy/test_functest_energy.py +++ /dev/null @@ -1,385 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 -*- - -# Copyright (c) 2017 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 - -"""Unitary test for energy module.""" -# pylint: disable=unused-argument -import logging -import requests -import unittest - -import mock - -from functest.energy.energy import EnergyRecorder -import functest.energy.energy as energy -from functest.utils.constants import CONST - -CASE_NAME = "UNIT_TEST_CASE" -STEP_NAME = "UNIT_TEST_STEP" - -PREVIOUS_SCENARIO = "previous_scenario" -PREVIOUS_STEP = "previous_step" - - -class MockHttpResponse(object): # pylint: disable=too-few-public-methods - """Mock response for Energy recorder API.""" - - def __init__(self, text, status_code): - """Create an instance of MockHttpResponse.""" - self.text = text - self.status_code = status_code - - -API_OK = MockHttpResponse( - '{"status": "OK"}', - 200 -) -API_KO = MockHttpResponse( - '{"message": "API-KO"}', - 500 -) - -RECORDER_OK = MockHttpResponse( - '{"environment": "UNIT_TEST",' - ' "step": "string",' - ' "scenario": "' + CASE_NAME + '"}', - 200 -) -RECORDER_KO = MockHttpResponse( - '{"message": "An unhandled API exception occurred (MOCK)"}', - 500 -) -RECORDER_NOT_FOUND = MockHttpResponse( - '{"message": "Recorder not found (MOCK)"}', - 404 -) - - -def config_loader_mock(config_key): - """Return mocked config values.""" - if config_key == "energy_recorder.api_url": - return "http://pod-uri:8888" - elif config_key == "energy_recorder.api_user": - return "user" - elif config_key == "energy_recorder.api_password": - return "password" - - -def config_loader_mock_no_creds(config_key): - """Return mocked config values.""" - if config_key == "energy_recorder.api_url": - return "http://pod-uri:8888" - elif config_key == "energy_recorder.api_user": - return "" - elif config_key == "energy_recorder.api_password": - return "" - - -# pylint: disable=too-many-public-methods -class EnergyRecorderTest(unittest.TestCase): - """Energy module unitary test suite.""" - - case_name = CASE_NAME - request_headers = {'content-type': 'application/json'} - returned_value_to_preserve = "value" - exception_message_to_preserve = "exception_message" - - @mock.patch('functest.energy.energy.requests.post', - return_value=RECORDER_OK) - def test_start(self, post_mock=None, get_mock=None): - """EnergyRecorder.start method (regular case).""" - self.test_load_config() - self.assertTrue(EnergyRecorder.start(self.case_name)) - post_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - data=mock.ANY, - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.requests.post', - side_effect=Exception("Internal execution error (MOCK)")) - def test_start_error(self, post_mock=None): - """EnergyRecorder.start method (error in method).""" - self.test_load_config() - self.assertFalse(EnergyRecorder.start(self.case_name)) - post_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - data=mock.ANY, - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.EnergyRecorder.load_config', - side_effect=Exception("Internal execution error (MOCK)")) - def test_start_exception(self, conf_loader_mock=None): - """EnergyRecorder.start test with exception during execution.""" - start_status = EnergyRecorder.start(CASE_NAME) - self.assertFalse(start_status) - - @mock.patch('functest.energy.energy.requests.post', - return_value=RECORDER_KO) - def test_start_api_error(self, post_mock=None): - """EnergyRecorder.start method (API error).""" - self.test_load_config() - self.assertFalse(EnergyRecorder.start(self.case_name)) - post_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - data=mock.ANY, - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.requests.post', - return_value=RECORDER_OK) - def test_set_step(self, post_mock=None): - """EnergyRecorder.set_step method (regular case).""" - self.test_load_config() - self.assertTrue(EnergyRecorder.set_step(STEP_NAME)) - post_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"] + "/step", - auth=EnergyRecorder.energy_recorder_api["auth"], - data=mock.ANY, - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.requests.post', - return_value=RECORDER_KO) - def test_set_step_api_error(self, post_mock=None): - """EnergyRecorder.set_step method (API error).""" - self.test_load_config() - self.assertFalse(EnergyRecorder.set_step(STEP_NAME)) - post_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"] + "/step", - auth=EnergyRecorder.energy_recorder_api["auth"], - data=mock.ANY, - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.requests.post', - side_effect=Exception("Internal execution error (MOCK)")) - def test_set_step_error(self, post_mock=None): - """EnergyRecorder.set_step method (method error).""" - self.test_load_config() - self.assertFalse(EnergyRecorder.set_step(STEP_NAME)) - post_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"] + "/step", - auth=EnergyRecorder.energy_recorder_api["auth"], - data=mock.ANY, - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.EnergyRecorder.load_config', - side_effect=requests.exceptions.ConnectionError()) - def test_set_step_connection_error(self, conf_loader_mock=None): - """EnergyRecorder.start test with exception during execution.""" - step_status = EnergyRecorder.set_step(STEP_NAME) - self.assertFalse(step_status) - - @mock.patch('functest.energy.energy.requests.delete', - return_value=RECORDER_OK) - def test_stop(self, delete_mock=None): - """EnergyRecorder.stop method (regular case).""" - self.test_load_config() - self.assertTrue(EnergyRecorder.stop()) - delete_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.requests.delete', - return_value=RECORDER_KO) - def test_stop_api_error(self, delete_mock=None): - """EnergyRecorder.stop method (API Error).""" - self.test_load_config() - self.assertFalse(EnergyRecorder.stop()) - delete_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @mock.patch('functest.energy.energy.requests.delete', - side_effect=Exception("Internal execution error (MOCK)")) - def test_stop_error(self, delete_mock=None): - """EnergyRecorder.stop method (method error).""" - self.test_load_config() - self.assertFalse(EnergyRecorder.stop()) - delete_mock.assert_called_once_with( - EnergyRecorder.energy_recorder_api["uri"], - auth=EnergyRecorder.energy_recorder_api["auth"], - headers=self.request_headers, - timeout=EnergyRecorder.CONNECTION_TIMEOUT - ) - - @energy.enable_recording - def __decorated_method(self): - """Call with to energy recorder decorators.""" - return self.returned_value_to_preserve - - @energy.enable_recording - def __decorated_method_with_ex(self): - """Call with to energy recorder decorators.""" - raise Exception(self.exception_message_to_preserve) - - @mock.patch("functest.energy.energy.EnergyRecorder.get_current_scenario", - return_value=None) - @mock.patch("functest.energy.energy.EnergyRecorder") - def test_decorators(self, - recorder_mock=None, - cur_scenario_mock=None): - """Test energy module decorators.""" - self.__decorated_method() - calls = [mock.call.start(self.case_name), - mock.call.stop()] - recorder_mock.assert_has_calls(calls) - - @mock.patch("functest.energy.energy.EnergyRecorder.get_current_scenario", - return_value={"scenario": PREVIOUS_SCENARIO, - "step": PREVIOUS_STEP}) - @mock.patch("functest.energy.energy.EnergyRecorder") - @mock.patch("functest.utils.functest_utils.get_functest_config", - side_effect=config_loader_mock) - def test_decorators_with_previous(self, - loader_mock=None, - recorder_mock=None, - cur_scenario_mock=None): - """Test energy module decorators.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - self.__decorated_method() - calls = [mock.call.start(self.case_name), - mock.call.submit_scenario(PREVIOUS_SCENARIO, - PREVIOUS_STEP)] - recorder_mock.assert_has_calls(calls, True) - - def test_decorator_preserve_return(self): - """Test that decorator preserve method returned value.""" - self.test_load_config() - self.assertTrue( - self.__decorated_method() == self.returned_value_to_preserve - ) - - @mock.patch( - "functest.energy.energy.finish_session") - def test_decorator_preserve_ex(self, finish_mock=None): - """Test that decorator preserve method exceptions.""" - self.test_load_config() - with self.assertRaises(Exception) as context: - self.__decorated_method_with_ex() - self.assertTrue( - self.exception_message_to_preserve in str(context.exception) - ) - self.assertTrue(finish_mock.called) - - @mock.patch("functest.utils.functest_utils.get_functest_config", - side_effect=config_loader_mock) - @mock.patch("functest.energy.energy.requests.get", - return_value=API_OK) - def test_load_config(self, loader_mock=None, get_mock=None): - """Test load config.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - EnergyRecorder.energy_recorder_api = None - EnergyRecorder.load_config() - - self.assertEquals( - EnergyRecorder.energy_recorder_api["auth"], - ("user", "password") - ) - self.assertEquals( - EnergyRecorder.energy_recorder_api["uri"], - "http://pod-uri:8888/recorders/environment/MOCK_POD" - ) - - @mock.patch("functest.utils.functest_utils.get_functest_config", - side_effect=config_loader_mock_no_creds) - @mock.patch("functest.energy.energy.requests.get", - return_value=API_OK) - def test_load_config_no_creds(self, loader_mock=None, get_mock=None): - """Test load config without creds.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - EnergyRecorder.energy_recorder_api = None - EnergyRecorder.load_config() - self.assertEquals(EnergyRecorder.energy_recorder_api["auth"], None) - self.assertEquals( - EnergyRecorder.energy_recorder_api["uri"], - "http://pod-uri:8888/recorders/environment/MOCK_POD" - ) - - @mock.patch("functest.utils.functest_utils.get_functest_config", - return_value=None) - @mock.patch("functest.energy.energy.requests.get", - return_value=API_OK) - def test_load_config_ex(self, loader_mock=None, get_mock=None): - """Test load config with exception.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - with self.assertRaises(AssertionError): - EnergyRecorder.energy_recorder_api = None - EnergyRecorder.load_config() - self.assertEquals(EnergyRecorder.energy_recorder_api, None) - - @mock.patch("functest.utils.functest_utils.get_functest_config", - side_effect=config_loader_mock) - @mock.patch("functest.energy.energy.requests.get", - return_value=API_KO) - def test_load_config_api_ko(self, loader_mock=None, get_mock=None): - """Test load config with API unavailable.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - EnergyRecorder.energy_recorder_api = None - EnergyRecorder.load_config() - self.assertEquals(EnergyRecorder.energy_recorder_api["available"], - False) - - @mock.patch("functest.utils.functest_utils.get_functest_config", - return_value=None) - @mock.patch('functest.energy.energy.requests.get', - return_value=RECORDER_OK) - def test_get_current_scenario(self, loader_mock=None, get_mock=None): - """Test get_current_scenario.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - self.test_load_config() - scenario = EnergyRecorder.get_current_scenario() - self.assertTrue(scenario is not None) - - @mock.patch('functest.energy.energy.requests.get', - return_value=RECORDER_NOT_FOUND) - def test_current_scenario_not_found(self, get_mock=None): - """Test get current scenario not existing.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - self.test_load_config() - scenario = EnergyRecorder.get_current_scenario() - self.assertTrue(scenario is None) - - @mock.patch('functest.energy.energy.requests.get', - return_value=RECORDER_KO) - def test_current_scenario_api_error(self, get_mock=None): - """Test get current scenario with API error.""" - CONST.__setattr__('NODE_NAME', 'MOCK_POD') - self.test_load_config() - scenario = EnergyRecorder.get_current_scenario() - self.assertTrue(scenario is None) - - @mock.patch('functest.energy.energy.EnergyRecorder.load_config', - side_effect=Exception("Internal execution error (MOCK)")) - def test_current_scenario_exception(self, get_mock=None): - """Test get current scenario with exception.""" - scenario = EnergyRecorder.get_current_scenario() - self.assertTrue(scenario is None) - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/odl/test_odl.py b/functest/tests/unit/odl/test_odl.py index 1a3f79503..c675c2988 100644 --- a/functest/tests/unit/odl/test_odl.py +++ b/functest/tests/unit/odl/test_odl.py @@ -13,13 +13,13 @@ import logging import os import unittest -from keystoneauth1.exceptions import auth_plugins import mock +import munch from robot.errors import RobotError import six from six.moves import urllib +from xtesting.core import testcase -from functest.core import testcase from functest.opnfv_tests.sdn.odl import odl __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" @@ -33,9 +33,10 @@ class ODLTesting(unittest.TestCase): logging.disable(logging.CRITICAL) _keystone_ip = "127.0.0.1" - _neutron_url = "http://127.0.0.2:9696" + _neutron_url = "https://127.0.0.1:9696" + _neutron_id = "dummy" _sdn_controller_ip = "127.0.0.3" - _os_auth_url = "http://{}:5000/v3".format(_keystone_ip) + _os_auth_url = f"http://{_keystone_ip}:5000/v3" _os_projectname = "admin" _os_username = "admin" _os_password = "admin" @@ -45,9 +46,10 @@ class ODLTesting(unittest.TestCase): _odl_password = "admin" _os_userdomainname = 'Default' _os_projectdomainname = 'Default' + _os_interface = "public" def setUp(self): - for var in ("INSTALLER_TYPE", "SDN_CONTROLLER", "SDN_CONTROLLER_IP"): + for var in ("SDN_CONTROLLER", "SDN_CONTROLLER_IP"): if var in os.environ: del os.environ[var] os.environ["OS_AUTH_URL"] = self._os_auth_url @@ -57,11 +59,11 @@ class ODLTesting(unittest.TestCase): os.environ["OS_PROJECT_NAME"] = self._os_projectname os.environ["OS_PROJECT_DOMAIN_NAME"] = self._os_projectdomainname os.environ["OS_PASSWORD"] = self._os_password + os.environ["OS_INTERFACE"] = self._os_interface self.test = odl.ODLTests(case_name='odl', project_name='functest') self.defaultargs = {'odlusername': self._odl_username, 'odlpassword': self._odl_password, - 'neutronurl': "http://{}:9696".format( - self._keystone_ip), + 'neutronurl': f"http://{self._keystone_ip}:9696", 'osauthurl': self._os_auth_url, 'osusername': self._os_username, 'osuserdomainname': self._os_userdomainname, @@ -102,7 +104,7 @@ class ODLRobotTesting(ODLTesting): mock_method.assert_called_once_with( os.path.join(odl.ODLTests.odl_test_repo, 'csit/variables/Variables.robot'), inplace=True) - self.assertEqual(args[0].getvalue(), "{}\n".format(msg2)) + self.assertEqual(args[0].getvalue(), f"{msg2}\n") def test_set_vars_auth_default(self): self._test_set_vars( @@ -153,31 +155,30 @@ class ODLMainTesting(ODLTesting): def _test_run_suites(self, status, *args): kwargs = self._get_run_suites_kwargs() self.assertEqual(self.test.run_suites(**kwargs), status) - if len(args) > 0: + if args: args[0].assert_called_once_with(self.test.odl_variables_file) if len(args) > 1: variable = [ - 'KEYSTONEURL:{}://{}'.format( - urllib.parse.urlparse(self._os_auth_url).scheme, - urllib.parse.urlparse(self._os_auth_url).netloc), - 'NEUTRONURL:{}'.format(self._neutron_url), - 'OS_AUTH_URL:"{}"'.format(self._os_auth_url), - 'OSUSERNAME:"{}"'.format(self._os_username), - 'OSUSERDOMAINNAME:"{}"'.format(self._os_userdomainname), - 'OSTENANTNAME:"{}"'.format(self._os_projectname), - 'OSPROJECTDOMAINNAME:"{}"'.format(self._os_projectdomainname), - 'OSPASSWORD:"{}"'.format(self._os_password), - 'ODL_SYSTEM_IP:{}'.format(self._sdn_controller_ip), - 'PORT:{}'.format(self._odl_webport), - 'RESTCONFPORT:{}'.format(self._odl_restconfport)] + ('KEYSTONEURL:' + f'{urllib.parse.urlparse(self._os_auth_url).scheme}://' + f'{urllib.parse.urlparse(self._os_auth_url).netloc}'), + f'NEUTRONURL:{self._neutron_url}', + f'OS_AUTH_URL:"{self._os_auth_url}"', + f'OSUSERNAME:"{self._os_username}"', + f'OSUSERDOMAINNAME:"{self._os_userdomainname}"', + f'OSTENANTNAME:"{self._os_projectname}"', + f'OSPROJECTDOMAINNAME:"{self._os_projectdomainname}"', + f'OSPASSWORD:"{self._os_password}"', + f'ODL_SYSTEM_IP:{self._sdn_controller_ip}', + f'PORT:{self._odl_webport}', + f'RESTCONFPORT:{self._odl_restconfport}'] args[1].assert_called_once_with( - odl.ODLTests.basic_suite_dir, - odl.ODLTests.neutron_suite_dir, + odl.ODLTests.basic_suite_dir, odl.ODLTests.neutron_suite_dir, + include=[], log='NONE', output=os.path.join(self.test.res_dir, 'output.xml'), - report='NONE', - stdout=mock.ANY, - variable=variable) + report='NONE', stdout=mock.ANY, variable=variable, + variablefile=[]) def _test_no_keyword(self, key): kwargs = self._get_run_suites_kwargs(key) @@ -223,6 +224,7 @@ class ODLMainTesting(ODLTesting): self._odl_username, self._odl_password) args[0].assert_called_once_with(self.test.odl_variables_file) + @mock.patch('os.makedirs') @mock.patch('robot.run', side_effect=RobotError) @mock.patch('os.path.isfile', return_value=True) def test_run_ko(self, *args): @@ -231,6 +233,7 @@ class ODLMainTesting(ODLTesting): self.assertRaises(RobotError): self._test_run_suites(testcase.TestCase.EX_RUN_ERROR, *args) + @mock.patch('os.makedirs') @mock.patch('robot.run') @mock.patch('os.path.isfile', return_value=True) def test_parse_results_ko(self, *args): @@ -240,97 +243,214 @@ class ODLMainTesting(ODLTesting): side_effect=RobotError): self._test_run_suites(testcase.TestCase.EX_RUN_ERROR, *args) + @mock.patch('os.makedirs') + @mock.patch('robot.run') + @mock.patch('os.path.isfile', return_value=True) + def test_generate_report_ko(self, *args): + with mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'), \ + mock.patch.object(self.test, 'generate_report', + return_value=1): + self._test_run_suites(testcase.TestCase.EX_OK, *args) + + @mock.patch('os.makedirs') + @mock.patch('robot.run') + @mock.patch('os.path.isfile', return_value=True) + def test_generate_report_exc(self, *args): + with mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'), \ + mock.patch.object(self.test, 'generate_report', + side_effect=Exception): + self._test_run_suites(testcase.TestCase.EX_RUN_ERROR, *args) + + @mock.patch('os.makedirs') @mock.patch('robot.run') @mock.patch('os.path.isfile', return_value=True) def test_ok(self, *args): with mock.patch.object(self.test, 'set_robotframework_vars', return_value=True), \ - mock.patch.object(self.test, 'parse_results'): + mock.patch.object(self.test, 'parse_results'), \ + mock.patch.object(self.test, 'generate_report', + return_value=0): self._test_run_suites(testcase.TestCase.EX_OK, *args) + @mock.patch('os.makedirs') @mock.patch('robot.run') @mock.patch('os.path.isfile', return_value=False) def test_ok_no_creds(self, *args): with mock.patch.object(self.test, 'set_robotframework_vars', return_value=True) as mock_method, \ - mock.patch.object(self.test, 'parse_results'): + mock.patch.object(self.test, 'parse_results'), \ + mock.patch.object(self.test, 'generate_report', + return_value=0): self._test_run_suites(testcase.TestCase.EX_OK, *args) mock_method.assert_not_called() + @mock.patch('os.makedirs') @mock.patch('robot.run', return_value=1) @mock.patch('os.path.isfile', return_value=True) def test_testcases_in_failure(self, *args): with mock.patch.object(self.test, 'set_robotframework_vars', return_value=True), \ - mock.patch.object(self.test, 'parse_results'): + mock.patch.object(self.test, 'parse_results'), \ + mock.patch.object(self.test, 'generate_report', + return_value=0): self._test_run_suites(testcase.TestCase.EX_OK, *args) class ODLRunTesting(ODLTesting): - """The class testing ODLTests.run().""" - # pylint: disable=missing-docstring - - def _test_no_env_var(self, var): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - del os.environ[var] - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) - + # pylint: disable=too-many-public-methods,missing-docstring + + @mock.patch('os_client_config.make_shade', side_effect=Exception) + def test_no_cloud(self, *args): + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].assert_called_once_with() + + @mock.patch('os_client_config.make_shade') + def test_no_service1(self, *args): + args[0].return_value.search_services.return_value = None + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_not_called() + + @mock.patch('os_client_config.make_shade') + def test_no_service2(self, *args): + args[0].return_value.search_services.return_value = [] + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_not_called() + + @mock.patch('os_client_config.make_shade') + def test_no_service3(self, *args): + args[0].return_value.search_services.return_value = [ + munch.Munch()] + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_not_called() + + @mock.patch('os_client_config.make_shade') + def test_no_endpoint1(self, *args): + args[0].return_value.search_services.return_value = [ + munch.Munch(id=self._neutron_id)] + args[0].return_value.search_endpoints.return_value = None + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_called_once_with( + filters={'interface': self._os_interface, + 'service_id': self._neutron_id}) + + @mock.patch('os_client_config.make_shade') + def test_no_endpoint2(self, *args): + args[0].return_value.search_services.return_value = [ + munch.Munch(id=self._neutron_id)] + args[0].return_value.search_endpoints.return_value = [] + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_called_once_with( + filters={'interface': self._os_interface, + 'service_id': self._neutron_id}) + + @mock.patch('os_client_config.make_shade') + def test_no_endpoint3(self, *args): + args[0].return_value.search_services.return_value = [ + munch.Munch(id=self._neutron_id)] + args[0].return_value.search_endpoints.return_value = [munch.Munch()] + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_called_once_with( + filters={'interface': self._os_interface, + 'service_id': self._neutron_id}) + + @mock.patch('os_client_config.make_shade') + def test_endpoint_interface(self, *args): + args[0].return_value.search_services.return_value = [ + munch.Munch(id=self._neutron_id)] + args[0].return_value.search_endpoints.return_value = [munch.Munch()] + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_called_once_with( + filters={'interface': self._os_interface, + 'service_id': self._neutron_id}) + + @mock.patch('os_client_config.make_shade') + def _test_no_env_var(self, var, *args): + del os.environ[var] + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].assert_called_once_with() + + @mock.patch('os_client_config.make_shade') + def _test_missing_value(self, *args): + self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) + args[0].assert_called_once_with() + + @mock.patch('os_client_config.make_shade') def _test_run(self, status=testcase.TestCase.EX_OK, - exception=None, **kwargs): + exception=None, *args, **kwargs): + # pylint: disable=keyword-arg-before-vararg + args[0].return_value.search_services.return_value = [ + munch.Munch(id=self._neutron_id)] + args[0].return_value.search_endpoints.return_value = [ + munch.Munch(url=self._neutron_url)] odlip = kwargs['odlip'] if 'odlip' in kwargs else '127.0.0.3' odlwebport = kwargs['odlwebport'] if 'odlwebport' in kwargs else '8080' odlrestconfport = (kwargs['odlrestconfport'] if 'odlrestconfport' in kwargs else '8181') - - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - if exception: - self.test.run_suites = mock.Mock(side_effect=exception) - else: - self.test.run_suites = mock.Mock(return_value=status) - self.assertEqual(self.test.run(), status) - self.test.run_suites.assert_called_once_with( - odl.ODLTests.default_suites, - neutronurl=self._neutron_url, - odlip=odlip, odlpassword=self._odl_password, - odlrestconfport=odlrestconfport, - odlusername=self._odl_username, odlwebport=odlwebport, - osauthurl=self._os_auth_url, - ospassword=self._os_password, - osprojectname=self._os_projectname, - osusername=self._os_username, - osprojectdomainname=self._os_projectdomainname, - osuserdomainname=self._os_userdomainname) - + if exception: + self.test.run_suites = mock.Mock(side_effect=exception) + else: + self.test.run_suites = mock.Mock(return_value=status) + self.assertEqual(self.test.run(), status) + self.test.run_suites.assert_called_once_with( + odl.ODLTests.default_suites, neutronurl=self._neutron_url, + odlip=odlip, odlpassword=self._odl_password, + odlrestconfport=odlrestconfport, odlusername=self._odl_username, + odlwebport=odlwebport, osauthurl=self._os_auth_url, + ospassword=self._os_password, osprojectname=self._os_projectname, + osusername=self._os_username, + osprojectdomainname=self._os_projectdomainname, + osuserdomainname=self._os_userdomainname) + args[0].assert_called_once_with() + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_called_once_with( + filters={ + 'interface': os.environ.get( + "OS_INTERFACE", "public").replace('URL', ''), + 'service_id': self._neutron_id}) + + @mock.patch('os_client_config.make_shade') def _test_multiple_suites(self, suites, - status=testcase.TestCase.EX_OK, **kwargs): + status=testcase.TestCase.EX_OK, *args, **kwargs): + # pylint: disable=keyword-arg-before-vararg + args[0].return_value.search_endpoints.return_value = [ + munch.Munch(url=self._neutron_url)] + args[0].return_value.search_services.return_value = [ + munch.Munch(id=self._neutron_id)] odlip = kwargs['odlip'] if 'odlip' in kwargs else '127.0.0.3' odlwebport = kwargs['odlwebport'] if 'odlwebport' in kwargs else '8080' odlrestconfport = (kwargs['odlrestconfport'] if 'odlrestconfport' in kwargs else '8181') - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - self.test.run_suites = mock.Mock(return_value=status) - self.assertEqual(self.test.run(suites=suites), status) - self.test.run_suites.assert_called_once_with( - suites, - neutronurl=self._neutron_url, - odlip=odlip, odlpassword=self._odl_password, - odlrestconfport=odlrestconfport, - odlusername=self._odl_username, odlwebport=odlwebport, - osauthurl=self._os_auth_url, - ospassword=self._os_password, - osprojectname=self._os_projectname, - osusername=self._os_username, - osprojectdomainname=self._os_projectdomainname, - osuserdomainname=self._os_userdomainname) + self.test.run_suites = mock.Mock(return_value=status) + self.assertEqual(self.test.run(suites=suites), status) + self.test.run_suites.assert_called_once_with( + suites, neutronurl=self._neutron_url, odlip=odlip, + odlpassword=self._odl_password, odlrestconfport=odlrestconfport, + odlusername=self._odl_username, odlwebport=odlwebport, + osauthurl=self._os_auth_url, ospassword=self._os_password, + osprojectname=self._os_projectname, osusername=self._os_username, + osprojectdomainname=self._os_projectdomainname, + osuserdomainname=self._os_userdomainname) + args[0].assert_called_once_with() + args[0].return_value.search_services.assert_called_once_with('neutron') + args[0].return_value.search_endpoints.assert_called_once_with( + filters={'interface': os.environ.get("OS_INTERFACE", "public"), + 'service_id': self._neutron_id}) def test_exc(self): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - side_effect=auth_plugins.MissingAuthPlugin()): + with mock.patch('os_client_config.make_shade', + side_effect=Exception()): self.assertEqual(self.test.run(), testcase.TestCase.EX_RUN_ERROR) @@ -348,105 +468,69 @@ class ODLRunTesting(ODLTesting): def test_run_suites_false(self): os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - self._test_run(testcase.TestCase.EX_RUN_ERROR, + self._test_run(testcase.TestCase.EX_RUN_ERROR, None, odlip=self._sdn_controller_ip, odlwebport=self._odl_webport) def test_run_suites_exc(self): with self.assertRaises(Exception): os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - self._test_run(status=testcase.TestCase.EX_RUN_ERROR, - exception=Exception(), + self._test_run(testcase.TestCase.EX_RUN_ERROR, + Exception(), odlip=self._sdn_controller_ip, odlwebport=self._odl_webport) def test_no_sdn_controller_ip(self): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) + self._test_missing_value() def test_without_installer_type(self): os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - self._test_run(testcase.TestCase.EX_OK, + self._test_run(testcase.TestCase.EX_OK, None, odlip=self._sdn_controller_ip, odlwebport=self._odl_webport) - def test_suites(self): + def test_without_os_interface(self): + del os.environ["OS_INTERFACE"] os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - self._test_multiple_suites( - [odl.ODLTests.basic_suite_dir], - testcase.TestCase.EX_OK, - odlip=self._sdn_controller_ip, - odlwebport=self._odl_webport) + self._test_run(testcase.TestCase.EX_OK, None, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) - def test_fuel(self): - os.environ["INSTALLER_TYPE"] = "fuel" - self._test_run(testcase.TestCase.EX_OK, - odlip=urllib.parse.urlparse(self._neutron_url).hostname, - odlwebport='8181', - odlrestconfport='8282') - - def test_apex_no_controller_ip(self): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - os.environ["INSTALLER_TYPE"] = "apex" - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) + def test_os_interface_public(self): + os.environ["OS_INTERFACE"] = "public" + os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip + self._test_run(testcase.TestCase.EX_OK, None, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) - def test_apex(self): + def test_os_interface_publicurl(self): + os.environ["OS_INTERFACE"] = "publicURL" os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - os.environ["INSTALLER_TYPE"] = "apex" - self._test_run(testcase.TestCase.EX_OK, - odlip=self._sdn_controller_ip, odlwebport='8081', - odlrestconfport='8081') - - def test_netvirt_no_controller_ip(self): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - os.environ["INSTALLER_TYPE"] = "netvirt" - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) + self._test_run(testcase.TestCase.EX_OK, None, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) - def test_netvirt(self): + def test_os_interface_internal(self): + os.environ["OS_INTERFACE"] = "internal" os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - os.environ["INSTALLER_TYPE"] = "netvirt" - self._test_run(testcase.TestCase.EX_OK, - odlip=self._sdn_controller_ip, odlwebport='8081', - odlrestconfport='8081') - - def test_joid_no_controller_ip(self): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - os.environ["INSTALLER_TYPE"] = "joid" - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) + self._test_run(testcase.TestCase.EX_OK, None, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) - def test_joid(self): - os.environ["SDN_CONTROLLER"] = self._sdn_controller_ip - os.environ["INSTALLER_TYPE"] = "joid" - self._test_run(testcase.TestCase.EX_OK, - odlip=self._sdn_controller_ip, odlwebport='8080') - - def test_compass(self): - os.environ["INSTALLER_TYPE"] = "compass" - self._test_run(testcase.TestCase.EX_OK, - odlip=urllib.parse.urlparse(self._neutron_url).hostname, - odlrestconfport='8080') - - def test_daisy_no_controller_ip(self): - with mock.patch('functest.utils.openstack_utils.get_endpoint', - return_value=ODLTesting._neutron_url): - os.environ["INSTALLER_TYPE"] = "daisy" - self.assertEqual(self.test.run(), - testcase.TestCase.EX_RUN_ERROR) + def test_os_interface_admin(self): + os.environ["OS_INTERFACE"] = "admin" + os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip + self._test_run(testcase.TestCase.EX_OK, None, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) - def test_daisy(self): + def test_suites(self): os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip - os.environ["INSTALLER_TYPE"] = "daisy" - self._test_run(testcase.TestCase.EX_OK, - odlip=self._sdn_controller_ip, odlwebport='8181', - odlrestconfport='8087') + self._test_multiple_suites( + [odl.ODLTests.basic_suite_dir], + testcase.TestCase.EX_OK, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) class ODLArgParserTesting(ODLTesting): @@ -456,7 +540,7 @@ class ODLArgParserTesting(ODLTesting): def setUp(self): self.parser = odl.ODLParser() - super(ODLArgParserTesting, self).setUp() + super().setUp() def test_default(self): self.assertEqual(self.parser.parse_args(), self.defaultargs) @@ -466,8 +550,8 @@ class ODLArgParserTesting(ODLTesting): self.defaultargs['odlip'] = self._sdn_controller_ip self.assertEqual( self.parser.parse_args( - ["--neutronurl={}".format(self._neutron_url), - "--odlip={}".format(self._sdn_controller_ip)]), + [f"--neutronurl={self._neutron_url}", + f"--odlip={self._sdn_controller_ip}"]), self.defaultargs) @mock.patch('sys.stderr', new_callable=six.StringIO) @@ -480,7 +564,7 @@ class ODLArgParserTesting(ODLTesting): def _test_arg(self, arg, value): self.defaultargs[arg] = value self.assertEqual( - self.parser.parse_args(["--{}={}".format(arg, value)]), + self.parser.parse_args([f"--{arg}={value}"]), self.defaultargs) def test_odlusername(self): @@ -521,7 +605,7 @@ class ODLArgParserTesting(ODLTesting): def test_pushtodb(self): self.defaultargs['pushtodb'] = True - self.assertEqual(self.parser.parse_args(["--{}".format('pushtodb')]), + self.assertEqual(self.parser.parse_args(["--pushtodb"]), self.defaultargs) def test_multiple_args(self): @@ -529,8 +613,8 @@ class ODLArgParserTesting(ODLTesting): self.defaultargs['odlip'] = self._sdn_controller_ip self.assertEqual( self.parser.parse_args( - ["--neutronurl={}".format(self._neutron_url), - "--odlip={}".format(self._sdn_controller_ip)]), + [f"--neutronurl={self._neutron_url}", + f"--odlip={self._sdn_controller_ip}"]), self.defaultargs) diff --git a/functest/cli/__init__.py b/functest/tests/unit/openstack/cinder/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/cli/__init__.py +++ b/functest/tests/unit/openstack/cinder/__init__.py diff --git a/functest/tests/unit/openstack/cinder/test_cinder.py b/functest/tests/unit/openstack/cinder/test_cinder.py new file mode 100644 index 000000000..d3c9cabb6 --- /dev/null +++ b/functest/tests/unit/openstack/cinder/test_cinder.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 Enea AB 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 + +# pylint: disable=missing-docstring + + +import logging +import unittest + +import pkg_resources +import mock +import munch +import shade + +from functest.opnfv_tests.openstack.cinder import cinder_test +from functest.utils import config +from functest.utils import env + + +class CinderTesting(unittest.TestCase): + + def setUp(self): + with mock.patch('functest.core.singlevm.SingleVm2.__init__'): + self.cinder = cinder_test.CinderCheck() + self.cinder.cloud = mock.Mock() + self.cinder.case_name = 'cinder' + self.cinder.guid = '1' + + @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.' + 'CinderCheck.connect') + @mock.patch('functest.core.singlevm.SingleVm2.prepare', + side_effect=Exception) + def test_prepare_exc1(self, *args): + self.cinder.cloud.boot_vm = mock.Mock() + with self.assertRaises(Exception): + self.cinder.prepare() + args[0].assert_called_once_with() + args[1].assert_not_called() + self.cinder.cloud.boot_vm.assert_not_called() + self.cinder.cloud.create_volume.assert_not_called() + + @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.' + 'CinderCheck.connect') + @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.' + 'CinderCheck.boot_vm', + side_effect=Exception) + @mock.patch('functest.core.singlevm.SingleVm2.prepare') + def test_prepare_exc2(self, *args): + self.cinder.sec = munch.Munch(id='foo') + self.cinder.keypair = munch.Munch(id='foo') + self.cinder.volume_timeout = munch.Munch(id='foo') + with self.assertRaises(Exception): + self.cinder.prepare() + args[0].assert_called_with() + args[1].assert_called_once_with( + f'{self.cinder.case_name}-vm2_{self.cinder.guid}', + security_groups=[self.cinder.sec.id], + key_name=self.cinder.keypair.id) + self.cinder.cloud.create_volume.assert_not_called() + args[2].assert_not_called() + + @mock.patch('functest.opnfv_tests.openstack.cinder.cinder_test.' + 'CinderCheck.boot_vm', return_value=munch.Munch(id='vm2')) + @mock.patch('functest.core.singlevm.SingleVm2.prepare') + def test_prepare(self, *args): + self.cinder.sec = munch.Munch(id='foo') + self.cinder.keypair = munch.Munch(id='foo') + self.cinder.ext_net = mock.Mock(id='foo') + self.cinder.ssh2 = mock.Mock() + self.cinder.fip2 = munch.Munch(id='fip2') + self.cinder.connect = mock.Mock( + return_value=(self.cinder.fip2, self.cinder.ssh2)) + self.cinder.cloud.create_volume = mock.Mock( + return_value=munch.Munch()) + self.cinder.prepare() + args[0].assert_called_once_with() + args[1].assert_called_once_with( + f'{self.cinder.case_name}-vm2_{self.cinder.guid}', + security_groups=[self.cinder.sec.id], + key_name=self.cinder.keypair.id) + self.cinder.connect.assert_called_once_with(args[1].return_value) + self.cinder.cloud.create_volume.assert_called_once_with( + name=f'{self.cinder.case_name}-volume_{self.cinder.guid}', + size='2', timeout=self.cinder.volume_timeout, wait=True) + + @mock.patch('scp.SCPClient.put') + def test_write(self, *args): + # pylint: disable=protected-access + self.cinder.ssh = mock.Mock() + self.cinder.sshvm = mock.Mock(id='foo') + self.cinder.volume = mock.Mock(id='volume') + stdout = mock.Mock() + stdout.channel.recv_exit_status.return_value = 0 + self.cinder.ssh.exec_command.return_value = (None, stdout, mock.Mock()) + self.assertEqual(self.cinder._write_data(), 0) + self.cinder.ssh.exec_command.assert_called_once_with( + f"sh ~/write_data.sh {env.get('VOLUME_DEVICE_NAME')}") + self.cinder.cloud.attach_volume.assert_called_once_with( + self.cinder.sshvm, self.cinder.volume, + timeout=self.cinder.volume_timeout) + self.cinder.cloud.detach_volume.assert_called_once_with( + self.cinder.sshvm, self.cinder.volume, + timeout=self.cinder.volume_timeout) + args[0].assert_called_once_with( + pkg_resources.resource_filename( + 'functest.opnfv_tests.openstack.cinder', 'write_data.sh'), + remote_path="~/") + + @mock.patch('scp.SCPClient.put', side_effect=Exception) + def test_write_exc1(self, *args): + # pylint: disable=protected-access + self.cinder.ssh = mock.Mock() + self.cinder.sshvm = mock.Mock(id='foo') + self.cinder.cloud.attach_volume = mock.Mock() + self.assertEqual( + self.cinder._write_data(), self.cinder.EX_RUN_ERROR) + args[0].assert_called_once_with( + pkg_resources.resource_filename( + 'functest.opnfv_tests.openstack.cinder', 'write_data.sh'), + remote_path="~/") + + @mock.patch('scp.SCPClient.put') + def test_read(self, *args): + # pylint: disable=protected-access + self.cinder.ssh2 = mock.Mock() + self.cinder.vm2 = mock.Mock(id='foo') + self.cinder.volume = mock.Mock(id='volume') + stdout = mock.Mock() + self.cinder.ssh2.exec_command.return_value = ( + None, stdout, mock.Mock()) + stdout.channel.recv_exit_status.return_value = 0 + self.assertEqual(self.cinder._read_data(), 0) + self.cinder.ssh2.exec_command.assert_called_once_with( + f"sh ~/read_data.sh {env.get('VOLUME_DEVICE_NAME')}") + self.cinder.cloud.attach_volume.assert_called_once_with( + self.cinder.vm2, self.cinder.volume, + timeout=self.cinder.volume_timeout) + self.cinder.cloud.detach_volume.assert_called_once_with( + self.cinder.vm2, self.cinder.volume, + timeout=self.cinder.volume_timeout) + args[0].assert_called_once_with( + pkg_resources.resource_filename( + 'functest.opnfv_tests.openstack.cinder', 'read_data.sh'), + remote_path="~/") + + @mock.patch('scp.SCPClient.put', side_effect=Exception) + def test_read_exc1(self, *args): + # pylint: disable=protected-access + self.cinder.ssh = mock.Mock() + self.cinder.ssh2 = mock.Mock() + self.cinder.sshvm = mock.Mock(id='foo') + self.cinder.cloud.attach_volume = mock.Mock() + self.assertEqual( + self.cinder._read_data(), self.cinder.EX_RUN_ERROR) + args[0].assert_called_once_with( + pkg_resources.resource_filename( + 'functest.opnfv_tests.openstack.cinder', 'read_data.sh'), + remote_path="~/") + + def test_execute_exc1(self): + # pylint: disable=protected-access + self.cinder._write_data = mock.Mock(side_effect=Exception) + self.cinder._read_data = mock.Mock() + with self.assertRaises(Exception): + self.cinder.execute() + self.cinder._write_data.assert_called_once_with() + self.cinder._read_data.assert_not_called() + + def test_execute_exc2(self): + # pylint: disable=protected-access + self.cinder._write_data = mock.Mock(return_value=0) + self.cinder._read_data = mock.Mock(side_effect=Exception) + with self.assertRaises(Exception): + self.cinder.execute() + self.cinder._write_data.assert_called_once_with() + self.cinder._read_data.assert_called_once_with() + + def test_execute_res1(self): + # pylint: disable=protected-access + self.cinder._write_data = mock.Mock(return_value=1) + self.cinder._read_data = mock.Mock() + self.assertEqual(self.cinder.execute(), 1) + self.cinder._write_data.assert_called_once_with() + self.cinder._read_data.assert_not_called() + + def test_execute_res2(self): + # pylint: disable=protected-access + self.cinder._write_data = mock.Mock(return_value=0) + self.cinder._read_data = mock.Mock(return_value=1) + self.assertEqual(self.cinder.execute(), 1) + self.cinder._write_data.assert_called_once_with() + self.cinder._read_data.assert_called_once_with() + + def test_execute_res3(self): + # pylint: disable=protected-access + self.cinder._write_data = mock.Mock(return_value=0) + self.cinder._read_data = mock.Mock(return_value=0) + self.assertEqual(self.cinder.execute(), 0) + self.cinder._write_data.assert_called_once_with() + self.cinder._read_data.assert_called_once_with() + + def test_clean_exc1(self): + self.cinder.cloud = None + with self.assertRaises(AssertionError): + self.cinder.clean() + + @mock.patch('functest.core.singlevm.SingleVm2.clean') + def test_clean_exc2(self, *args): + self.cinder.vm2 = munch.Munch(id='vm2') + self.cinder.cloud.delete_server = mock.Mock( + side_effect=shade.OpenStackCloudException("Foo")) + with self.assertRaises(shade.OpenStackCloudException): + self.cinder.clean() + self.cinder.cloud.delete_server.assert_called_once_with( + self.cinder.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + self.cinder.cloud.delete_floating_ip.assert_not_called() + self.cinder.cloud.delete_volume.assert_not_called() + args[0].assert_not_called() + + @mock.patch('functest.core.singlevm.SingleVm2.clean', + side_effect=Exception) + def test_clean_exc3(self, mock_clean): + self.cinder.vm2 = munch.Munch(id='vm2') + self.cinder.volume = munch.Munch(id='volume') + self.cinder.fip2 = munch.Munch(id='fip2') + with self.assertRaises(Exception): + self.cinder.clean() + self.cinder.cloud.delete_server.assert_called_once_with( + self.cinder.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + self.cinder.cloud.delete_floating_ip.assert_called_once_with( + self.cinder.fip2.id) + self.cinder.cloud.delete_volume.assert_called_once_with( + self.cinder.volume.id) + mock_clean.prepare() + + @mock.patch('functest.core.singlevm.SingleVm2.clean') + def test_clean(self, *args): + self.cinder.vm2 = munch.Munch(id='vm2') + self.cinder.volume = munch.Munch(id='volume') + self.cinder.fip2 = munch.Munch(id='fip2') + self.cinder.clean() + self.cinder.cloud.delete_server.assert_called_once_with( + self.cinder.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + self.cinder.cloud.delete_floating_ip.assert_called_once_with( + self.cinder.fip2.id) + self.cinder.cloud.delete_volume.assert_called_once_with( + self.cinder.volume.id) + args[0].assert_called_once_with() + + @mock.patch('functest.core.singlevm.SingleVm2.clean') + def test_clean2(self, *args): + self.cinder.clean() + self.cinder.cloud.delete_server.assert_not_called() + self.cinder.cloud.delete_floating_ip.assert_not_called() + self.cinder.cloud.delete_volume.assert_not_called() + args[0].assert_called_once_with() + + +if __name__ == '__main__': + logging.disable(logging.CRITICAL) + unittest.main(verbosity=2) diff --git a/functest/tests/unit/openstack/rally/test_rally.py b/functest/tests/unit/openstack/rally/test_rally.py index 450eb85bc..f3c2e7cf6 100644 --- a/functest/tests/unit/openstack/rally/test_rally.py +++ b/functest/tests/unit/openstack/rally/test_rally.py @@ -5,46 +5,52 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring,protected-access,invalid-name + import json import logging import os +import subprocess import unittest import mock +import munch +from xtesting.core import testcase -from functest.core import testcase from functest.opnfv_tests.openstack.rally import rally -from functest.utils.constants import CONST - -from snaps.openstack.os_credentials import OSCreds +from functest.utils import config class OSRallyTesting(unittest.TestCase): + # pylint: disable=too-many-public-methods def setUp(self): - os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - with mock.patch('snaps.openstack.tests.openstack_tests.' - 'get_credentials', return_value=os_creds) as m: + with mock.patch('os_client_config.get_config') as mock_get_config, \ + mock.patch('shade.OpenStackCloud') as mock_shade, \ + mock.patch('functest.core.tenantnetwork.NewProject') \ + as mock_new_project: self.rally_base = rally.RallyBase() - self.polling_iter = 2 - self.assertTrue(m.called) + self.rally_base.image = munch.Munch(name='foo') + self.rally_base.flavor = munch.Munch(name='foo') + self.rally_base.flavor_alt = munch.Munch(name='bar') + self.assertTrue(mock_get_config.called) + self.assertTrue(mock_shade.called) + self.assertTrue(mock_new_project.called) def test_build_task_args_missing_floating_network(self): - CONST.__setattr__('OS_AUTH_URL', None) - self.rally_base.ext_net_name = '' - task_args = self.rally_base._build_task_args('test_file_name') + os.environ['OS_AUTH_URL'] = '' + self.rally_base.ext_net = None + task_args = self.rally_base.build_task_args('test_name') self.assertEqual(task_args['floating_network'], '') def test_build_task_args_missing_net_id(self): - CONST.__setattr__('OS_AUTH_URL', None) - self.rally_base.priv_net_id = '' - task_args = self.rally_base._build_task_args('test_file_name') + os.environ['OS_AUTH_URL'] = '' + self.rally_base.network = None + task_args = self.rally_base.build_task_args('test_name') self.assertEqual(task_args['netid'], '') @staticmethod def check_scenario_file(value): - yaml_file = 'opnfv-{}.yaml'.format('test_file_name') + yaml_file = 'opnfv-test_file_name.yaml' if yaml_file in value: return False return True @@ -58,126 +64,128 @@ class OSRallyTesting(unittest.TestCase): @staticmethod def check_temp_dir(value): - yaml_file = 'opnfv-{}.yaml'.format('test_file_name') + yaml_file = 'opnfv-test_file_name.yaml' if yaml_file in value: return True return False + @mock.patch('functest.opnfv_tests.openstack.rally.rally.' + 'RallyBase.get_verifier_deployment_id', return_value='foo') + @mock.patch('subprocess.check_output') + def test_create_rally_deployment(self, mock_exec, mock_get_id): + # pylint: disable=unused-argument + self.assertEqual(rally.RallyBase.create_rally_deployment(), 'foo') + calls = [ + mock.call(['rally', 'deployment', 'destroy', '--deployment', + str(getattr(config.CONF, 'rally_deployment_name'))]), + mock.call().decode("utf-8"), + mock.call(['rally', 'deployment', 'create', '--fromenv', '--name', + str(getattr(config.CONF, 'rally_deployment_name'))], + env=None), + mock.call().decode("utf-8"), + mock.call(['rally', 'deployment', 'check']), + mock.call().decode("utf-8")] + mock_exec.assert_has_calls(calls) + @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists') @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_apply_blacklist') + 'apply_blacklist') def test_prepare_test_list_missing_temp_dir( self, mock_method, mock_os_makedirs, mock_path_exists): mock_path_exists.side_effect = self.check_temp_dir - yaml_file = 'opnfv-{}.yaml'.format('test_file_name') - ret_val = os.path.join(self.rally_base.TEMP_DIR, yaml_file) + yaml_file = 'opnfv-test_file_name.yaml' + ret_val = os.path.join(self.rally_base.temp_dir, yaml_file) self.assertEqual(self.rally_base._prepare_test_list('test_file_name'), ret_val) mock_path_exists.assert_called() mock_method.assert_called() mock_os_makedirs.assert_called() - def test_get_task_id_default(self): - cmd_raw = 'Task 1: started' - self.assertEqual(self.rally_base.get_task_id(cmd_raw), - '1') + @mock.patch('subprocess.check_output', return_value=b'1\n') + def test_get_task_id_default(self, *args): + tag = 'nova' + self.assertEqual(self.rally_base.get_task_id(tag), '1') + args[0].assert_called_with( + ['rally', 'task', 'list', '--tag', tag, '--uuids-only']) - def test_get_task_id_missing_id(self): - cmd_raw = '' - self.assertEqual(self.rally_base.get_task_id(cmd_raw), - None) + @mock.patch('subprocess.check_output', return_value=b'\n') + def test_get_task_id_missing_id(self, *args): + tag = 'nova' + self.assertEqual(self.rally_base.get_task_id(tag), '') + args[0].assert_called_with( + ['rally', 'task', 'list', '--tag', tag, '--uuids-only']) def test_task_succeed_fail(self): - json_raw = json.dumps([None]) + json_raw = json.dumps({}) self.assertEqual(self.rally_base.task_succeed(json_raw), False) - json_raw = json.dumps([{'result': [{'error': ['test_error']}]}]) + json_raw = json.dumps({'tasks': [{'status': 'crashed'}]}) self.assertEqual(self.rally_base.task_succeed(json_raw), False) def test_task_succeed_success(self): - json_raw = json.dumps('') + json_raw = json.dumps({'tasks': [{'status': 'finished', + 'pass_sla': True}]}) self.assertEqual(self.rally_base.task_succeed(json_raw), True) - def polling(self): - if self.polling_iter == 0: - return "something" - self.polling_iter -= 1 - return None - - def test_get_cmd_output(self): - proc = mock.Mock() - attrs = {'poll.side_effect': self.polling, - 'stdout.readline.return_value': 'line'} - proc.configure_mock(**attrs) - self.assertEqual(self.rally_base.get_cmd_output(proc), - 'lineline') - - @mock.patch('__builtin__.open', mock.mock_open()) + @mock.patch('six.moves.builtins.open', mock.mock_open()) @mock.patch('functest.opnfv_tests.openstack.rally.rally.yaml.safe_load', return_value={'scenario': [ {'scenarios': ['test_scenario'], - 'installers': ['test_installer'], 'tests': ['test']}, {'scenarios': ['other_scenario'], - 'installers': ['test_installer'], 'tests': ['other_test']}]}) def test_excl_scenario_default(self, mock_func): - CONST.__setattr__('INSTALLER_TYPE', 'test_installer') - CONST.__setattr__('DEPLOY_SCENARIO', 'test_scenario') + os.environ['INSTALLER_TYPE'] = 'test_installer' + os.environ['DEPLOY_SCENARIO'] = 'test_scenario' self.assertEqual(self.rally_base.excl_scenario(), ['test']) mock_func.assert_called() - @mock.patch('__builtin__.open', mock.mock_open()) + @mock.patch('six.moves.builtins.open', mock.mock_open()) @mock.patch('functest.opnfv_tests.openstack.rally.rally.yaml.safe_load', return_value={'scenario': [ {'scenarios': ['^os-[^-]+-featT-modeT$'], - 'installers': ['test_installer'], 'tests': ['test1']}, {'scenarios': ['^os-ctrlT-[^-]+-modeT$'], - 'installers': ['test_installer'], 'tests': ['test2']}, {'scenarios': ['^os-ctrlT-featT-[^-]+$'], - 'installers': ['test_installer'], 'tests': ['test3']}, {'scenarios': ['^os-'], - 'installers': ['test_installer'], 'tests': ['test4']}, {'scenarios': ['other_scenario'], - 'installers': ['test_installer'], 'tests': ['test0a']}, {'scenarios': [''], # empty scenario - 'installers': ['test_installer'], 'tests': ['test0b']}]}) def test_excl_scenario_regex(self, mock_func): - CONST.__setattr__('INSTALLER_TYPE', 'test_installer') - CONST.__setattr__('DEPLOY_SCENARIO', 'os-ctrlT-featT-modeT') + os.environ['DEPLOY_SCENARIO'] = 'os-ctrlT-featT-modeT' self.assertEqual(self.rally_base.excl_scenario(), ['test1', 'test2', 'test3', 'test4']) mock_func.assert_called() - @mock.patch('__builtin__.open', side_effect=Exception) + @mock.patch('six.moves.builtins.open', side_effect=Exception) def test_excl_scenario_exception(self, mock_open): self.assertEqual(self.rally_base.excl_scenario(), []) mock_open.assert_called() - @mock.patch('__builtin__.open', mock.mock_open()) + @mock.patch('six.moves.builtins.open', mock.mock_open()) @mock.patch('functest.opnfv_tests.openstack.rally.rally.yaml.safe_load', return_value={'functionality': [ {'functions': ['no_migration'], 'tests': ['test']}]}) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' '_migration_supported', return_value=False) - def test_excl_func_default(self, mock_func, mock_yaml_load): - CONST.__setattr__('INSTALLER_TYPE', 'test_installer') - CONST.__setattr__('DEPLOY_SCENARIO', 'test_scenario') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + '_network_trunk_supported', return_value=False) + def test_excl_func_default(self, mock_trunk, mock_func, mock_yaml_load): + os.environ['DEPLOY_SCENARIO'] = 'test_scenario' self.assertEqual(self.rally_base.excl_func(), ['test']) mock_func.assert_called() + mock_trunk.assert_called() mock_yaml_load.assert_called() - @mock.patch('__builtin__.open', side_effect=Exception) + @mock.patch('six.moves.builtins.open', side_effect=Exception) def test_excl_func_exception(self, mock_open): self.assertEqual(self.rally_base.excl_func(), []) mock_open.assert_called() @@ -200,61 +208,51 @@ class OSRallyTesting(unittest.TestCase): return_value=False) def test_run_task_missing_task_file(self, mock_path_exists): with self.assertRaises(Exception): - self.rally_base._run_task('test_name') + self.rally_base.prepare_run() mock_path_exists.assert_called() - @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists', - return_value=True) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' '_prepare_test_list', return_value='test_file_name') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'file_is_empty', return_value=True) @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info') - def test_run_task_no_tests_for_scenario(self, mock_logger_info, - mock_file_empty, mock_prep_list, - mock_path_exists): - self.rally_base._run_task('test_name') + def test_prepare_task_no_tests_for_scenario( + self, mock_logger_info, mock_file_empty, mock_prep_list): + self.rally_base.prepare_task('test_name') mock_logger_info.assert_any_call('No tests for scenario \"%s\"', 'test_name') mock_file_empty.assert_called() mock_prep_list.assert_called() - mock_path_exists.assert_called() @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' '_prepare_test_list', return_value='test_file_name') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'file_is_empty', return_value=False) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_build_task_args', return_value={}) - @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_get_output') + 'build_task_args', return_value={}) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'get_task_id', return_value=None) - @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - 'get_cmd_output', return_value='') @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists', return_value=True) @mock.patch('functest.opnfv_tests.openstack.rally.rally.subprocess.Popen') @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.error') def test_run_task_taskid_missing(self, mock_logger_error, *args): - self.rally_base._run_task('test_name') - text = 'Failed to retrieve task_id, validating task...' + # pylint: disable=unused-argument + with self.assertRaises(Exception): + self.rally_base.run_task('test_name') + text = 'Failed to retrieve task_id' mock_logger_error.assert_any_call(text) - @mock.patch('__builtin__.open', mock.mock_open()) + @mock.patch('six.moves.builtins.open', mock.mock_open()) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' '_prepare_test_list', return_value='test_file_name') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'file_is_empty', return_value=False) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_build_task_args', return_value={}) - @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_get_output') + 'build_task_args', return_value={}) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'get_task_id', return_value='1') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - 'get_cmd_output', return_value='') - @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'task_succeed', return_value=True) @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists', return_value=True) @@ -262,174 +260,207 @@ class OSRallyTesting(unittest.TestCase): @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs') @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info') @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.error') - def test_run_task_default(self, mock_logger_error, mock_logger_info, - *args): - self.rally_base._run_task('test_name') - text = 'Test scenario: "test_name" OK.\n' - mock_logger_info.assert_any_call(text) - mock_logger_error.assert_not_called() - - def test_prepare_env_testname_invalid(self): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test' - with self.assertRaises(Exception): - self.rally_base._prepare_env() - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt') - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='test_net_name') - @mock.patch('snaps.openstack.utils.deploy_utils.create_image', - return_value=None) - def test_prepare_env_image_missing( - self, mock_get_img, mock_get_net, mock_get_comp_cnt): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test1' - with self.assertRaises(Exception): - self.rally_base._prepare_env() - mock_get_img.assert_called() - mock_get_net.assert_called() - mock_get_comp_cnt.assert_called() - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt') - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='test_net_name') - @mock.patch('snaps.openstack.utils.deploy_utils.create_image') - @mock.patch('snaps.openstack.utils.deploy_utils.create_network', - return_value=None) - def test_prepare_env_network_creation_failed( - self, mock_create_net, mock_get_img, mock_get_net, - mock_get_comp_cnt): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test1' - with self.assertRaises(Exception): - self.rally_base._prepare_env() - mock_create_net.assert_called() - mock_get_img.assert_called() - mock_get_net.assert_called() - mock_get_comp_cnt.assert_called() - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt') - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='test_net_name') - @mock.patch('snaps.openstack.utils.deploy_utils.create_image') - @mock.patch('snaps.openstack.utils.deploy_utils.create_network') - @mock.patch('snaps.openstack.utils.deploy_utils.create_router', - return_value=None) - def test_prepare_env_router_creation_failed( - self, mock_create_router, mock_create_net, mock_get_img, - mock_get_net, mock_get_comp_cnt): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test1' - with self.assertRaises(Exception): - self.rally_base._prepare_env() - mock_create_net.assert_called() - mock_get_img.assert_called() - mock_get_net.assert_called() - mock_create_router.assert_called() - mock_get_comp_cnt.assert_called() - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt') - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='test_net_name') - @mock.patch('snaps.openstack.utils.deploy_utils.create_image') - @mock.patch('snaps.openstack.utils.deploy_utils.create_network') - @mock.patch('snaps.openstack.utils.deploy_utils.create_router') - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create', - return_value=None) - def test_prepare_env_flavor_creation_failed( - self, mock_create_flavor, mock_create_router, mock_create_net, - mock_get_img, mock_get_net, mock_get_comp_cnt): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test1' - with self.assertRaises(Exception): - self.rally_base._prepare_env() - mock_create_net.assert_called() - mock_get_img.assert_called() - mock_get_net.assert_called() - mock_create_router.assert_called() - mock_get_comp_cnt.assert_called() - mock_create_flavor.assert_called_once() - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt') - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='test_net_name') - @mock.patch('snaps.openstack.utils.deploy_utils.create_image') - @mock.patch('snaps.openstack.utils.deploy_utils.create_network') - @mock.patch('snaps.openstack.utils.deploy_utils.create_router') - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create', - side_effect=[mock.Mock, None]) - def test_prepare_env_flavor_alt_creation_failed( - self, mock_create_flavor, mock_create_router, mock_create_net, - mock_get_img, mock_get_net, mock_get_comp_cnt): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test1' + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + '_save_results') + def test_run_task_default(self, mock_save_res, *args): + # pylint: disable=unused-argument + self.rally_base.run_task('test_name') + mock_save_res.assert_called() + + @mock.patch('six.moves.builtins.open', mock.mock_open()) + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'task_succeed', return_value=True) + @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists', + return_value=True) + @mock.patch('subprocess.check_output') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.makedirs') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.info') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.LOGGER.debug') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + '_append_summary') + def test_save_results(self, mock_summary, *args): + # pylint: disable=unused-argument + self.rally_base._save_results('test_name', '1234') + mock_summary.assert_called() + + def test_prepare_run_testname_invalid(self): + self.rally_base.stests = ['test1', 'test2'] with self.assertRaises(Exception): - self.rally_base._prepare_env() - mock_create_net.assert_called() - mock_get_img.assert_called() - mock_get_net.assert_called() - mock_create_router.assert_called() - mock_get_comp_cnt.assert_called() - self.assertEqual(mock_create_flavor.call_count, 2) - - @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_run_task') - def test_run_tests_all(self, mock_run_task): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'all' - self.rally_base._run_tests() + self.rally_base.prepare_run(tests=['test']) + + @mock.patch('functest.opnfv_tests.openstack.rally.rally.os.path.exists') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.copyfile') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.copytree') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.shutil.rmtree') + def test_prepare_run_flavor_alt_creation_failed(self, *args): + # pylint: disable=unused-argument + self.rally_base.stests = ['test1', 'test2'] + with mock.patch.object(self.rally_base, 'count_hypervisors') \ + as mock_list_hyperv, \ + mock.patch.object(self.rally_base, 'create_flavor_alt', + side_effect=Exception) \ + as mock_create_flavor: + with self.assertRaises(Exception): + self.rally_base.prepare_run(tests=['test1']) + mock_list_hyperv.assert_called_once() + mock_create_flavor.assert_called_once() + + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'prepare_task', return_value=True) + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'run_task') + def test_run_tests_all(self, mock_run_task, mock_prepare_task): + self.rally_base.tests = ['test1', 'test2'] + self.rally_base.run_tests() + mock_prepare_task.assert_any_call('test1') + mock_prepare_task.assert_any_call('test2') mock_run_task.assert_any_call('test1') mock_run_task.assert_any_call('test2') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_run_task') - def test_run_tests_default(self, mock_run_task): - self.rally_base.TESTS = ['test1', 'test2'] - self.rally_base.test_name = 'test1' - self.rally_base._run_tests() + 'prepare_task', return_value=True) + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'run_task') + def test_run_tests_default(self, mock_run_task, mock_prepare_task): + self.rally_base.tests = ['test1', 'test2'] + self.rally_base.run_tests() + mock_prepare_task.assert_any_call('test1') + mock_prepare_task.assert_any_call('test2') mock_run_task.assert_any_call('test1') + mock_run_task.assert_any_call('test2') - def test_clean_up_default(self): - creator1 = mock.Mock() - creator2 = mock.Mock() - self.rally_base.creators = [creator1, creator2] - self.rally_base._clean_up() - self.assertTrue(creator1.clean.called) - self.assertTrue(creator2.clean.called) + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'clean_rally_logs') + def test_clean_up_default(self, *args): + with mock.patch.object(self.rally_base.orig_cloud, + 'delete_flavor') as mock_delete_flavor: + self.rally_base.flavor_alt = mock.Mock() + self.rally_base.clean() + self.assertEqual(mock_delete_flavor.call_count, 1) + args[0].assert_called_once_with() - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'update_rally_logs') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'create_rally_deployment') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_prepare_env') + 'prepare_run') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_run_tests') + 'run_tests') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' '_generate_report') @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_clean_up') + 'export_task') def test_run_default(self, *args): self.assertEqual(self.rally_base.run(), testcase.TestCase.EX_OK) - map(lambda m: m.assert_called(), args) + for func in args: + func.assert_called() - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'update_rally_logs') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'create_rally_deployment', side_effect=Exception) - def test_run_exception_create_rally_dep(self, mock_create_rally_dep): + def test_run_exception_create_rally_dep(self, *args): self.assertEqual(self.rally_base.run(), testcase.TestCase.EX_RUN_ERROR) - mock_create_rally_dep.assert_called() + args[0].assert_called() + args[1].assert_called_once_with(self.rally_base.res_dir) @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' - '_prepare_env', side_effect=Exception) - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'update_rally_logs') + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' 'create_rally_deployment', return_value=mock.Mock()) - def test_run_exception_prepare_env(self, mock_create_rally_dep, - mock_prep_env): + @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.' + 'prepare_run', side_effect=Exception) + def test_run_exception_prepare_run(self, mock_prep_env, *args): + # pylint: disable=unused-argument self.assertEqual(self.rally_base.run(), testcase.TestCase.EX_RUN_ERROR) mock_prep_env.assert_called() + args[1].assert_called_once_with(self.rally_base.res_dir) + + def test_append_summary(self): + json_dict = { + 'tasks': [{ + 'subtasks': [{ + 'title': 'sub_task', + 'workloads': [{ + 'full_duration': 1.23, + 'data': [{ + 'error': [] + }] + }, { + 'full_duration': 2.78, + 'data': [{ + 'error': ['err'] + }] + }] + }] + }] + } + self.rally_base._append_summary(json.dumps(json_dict), "foo_test") + self.assertEqual(self.rally_base.summary[0]['test_name'], "foo_test") + self.assertEqual(self.rally_base.summary[0]['overall_duration'], 4.01) + self.assertEqual(self.rally_base.summary[0]['nb_tests'], 2) + self.assertEqual(self.rally_base.summary[0]['nb_success'], 1) + self.assertEqual(self.rally_base.summary[0]['success'], []) + self.assertEqual(self.rally_base.summary[0]['failures'], ['sub_task']) + + def test_is_successful_false(self): + with mock.patch('six.moves.builtins.super') as mock_super: + self.rally_base.summary = [{"task_status": True}, + {"task_status": False}] + self.assertEqual(self.rally_base.is_successful(), + testcase.TestCase.EX_TESTCASE_FAILED) + mock_super(rally.RallyBase, self).is_successful.assert_not_called() + + def test_is_successful_true(self): + with mock.patch('six.moves.builtins.super') as mock_super: + mock_super(rally.RallyBase, self).is_successful.return_value = 424 + self.rally_base.summary = [{"task_status": True}, + {"task_status": True}] + self.assertEqual(self.rally_base.is_successful(), 424) + mock_super(rally.RallyBase, self).is_successful.assert_called() + + @mock.patch('subprocess.check_output', + side_effect=subprocess.CalledProcessError('', '')) + def test_export_task_ko(self, *args): + file_name = (f"{self.rally_base.results_dir}/" + f"{self.rally_base.case_name}.html") + with self.assertRaises(subprocess.CalledProcessError): + self.rally_base.export_task(file_name) + cmd = ["rally", "task", "export", "--type", "html", "--deployment", + str(getattr(config.CONF, 'rally_deployment_name')), + "--to", file_name] + args[0].assert_called_with(cmd, stderr=subprocess.STDOUT) + + @mock.patch('subprocess.check_output', return_value=b'') + def test_export_task(self, *args): + file_name = (f"{self.rally_base.results_dir}/" + f"{self.rally_base.case_name}.html") + self.assertEqual(self.rally_base.export_task(file_name), None) + cmd = ["rally", "task", "export", "--type", "html", "--deployment", + str(getattr(config.CONF, 'rally_deployment_name')), + "--to", file_name] + args[0].assert_called_with(cmd, stderr=subprocess.STDOUT) + + @mock.patch('subprocess.check_output', + side_effect=subprocess.CalledProcessError('', '')) + def test_verify_report_ko(self, *args): + file_name = (f"{self.rally_base.results_dir}/" + f"{self.rally_base.case_name}.html") + with self.assertRaises(subprocess.CalledProcessError): + self.rally_base.verify_report(file_name, "1") + cmd = ["rally", "verify", "report", "--type", "html", "--uuid", "1", + "--to", file_name] + args[0].assert_called_with(cmd, stderr=subprocess.STDOUT) + + @mock.patch('subprocess.check_output', return_value=b'') + def test_verify_report(self, *args): + file_name = (f"{self.rally_base.results_dir}/" + f"{self.rally_base.case_name}.html") + self.assertEqual(self.rally_base.verify_report(file_name, "1"), None) + cmd = ["rally", "verify", "report", "--type", "html", "--uuid", "1", + "--to", file_name] + args[0].assert_called_with(cmd, stderr=subprocess.STDOUT) if __name__ == "__main__": diff --git a/functest/tests/unit/openstack/refstack_client/__init__.py b/functest/tests/unit/openstack/refstack_client/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/openstack/refstack_client/__init__.py +++ /dev/null diff --git a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py b/functest/tests/unit/openstack/refstack_client/test_refstack_client.py deleted file mode 100644 index 61e950a6b..000000000 --- a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 - -# pylint: disable=missing-docstring - -import logging -import mock -import pkg_resources -import unittest - -from functest.core import testcase -from functest.opnfv_tests.openstack.refstack_client.refstack_client import \ - RefstackClient, RefstackClientParser -from functest.utils.constants import CONST - -from snaps.openstack.os_credentials import OSCreds - -__author__ = ("Matthew Li <matthew.lijun@huawei.com>," - "Linda Wang <wangwulin@huawei.com>") - - -class OSRefstackClientTesting(unittest.TestCase): - """The class testing RefstackClient """ - # pylint: disable=missing-docstring, too-many-public-methods - - _config = pkg_resources.resource_filename( - 'functest', - 'opnfv_tests/openstack/refstack_client/refstack_tempest.conf') - _testlist = pkg_resources.resource_filename( - 'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt') - - def setUp(self): - self.default_args = {'config': self._config, - 'testlist': self._testlist} - CONST.__setattr__('OS_AUTH_URL', 'https://ip:5000/v3') - CONST.__setattr__('OS_INSECURE', 'true') - self.case_name = 'refstack_defcore' - self.result = 0 - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - self.details = {"tests": 3, - "failures": 1, - "success": ['tempest.api.compute [18.464988s]'], - "errors": ['tempest.api.volume [0.230334s]'], - "skipped": ['tempest.api.network [1.265828s]']} - - @mock.patch('functest.opnfv_tests.openstack.refstack_client.tempest_conf.' - 'TempestConf', return_value=mock.Mock()) - def _create_client(self, *args): - with mock.patch('snaps.openstack.tests.openstack_tests.' - 'get_credentials', return_value=self.os_creds): - return RefstackClient() - - def test_run_defcore_insecure(self): - insecure = '-k' - config = 'tempest.conf' - testlist = 'testlist' - client = self._create_client() - with mock.patch('functest.opnfv_tests.openstack.refstack_client.' - 'refstack_client.ft_utils.execute_command') as m_cmd: - cmd = ("refstack-client test {0} -c {1} -v --test-list {2}" - .format(insecure, config, testlist)) - client.run_defcore(config, testlist) - m_cmd.assert_any_call(cmd) - - def test_run_defcore(self): - CONST.__setattr__('OS_AUTH_URL', 'http://ip:5000/v3') - insecure = '' - config = 'tempest.conf' - testlist = 'testlist' - client = self._create_client() - with mock.patch('functest.opnfv_tests.openstack.refstack_client.' - 'refstack_client.ft_utils.execute_command') as m_cmd: - cmd = ("refstack-client test {0} -c {1} -v --test-list {2}" - .format(insecure, config, testlist)) - client.run_defcore(config, testlist) - m_cmd.assert_any_call(cmd) - - @mock.patch('functest.opnfv_tests.openstack.refstack_client.' - 'refstack_client.LOGGER.info') - @mock.patch('__builtin__.open', side_effect=Exception) - def test_parse_refstack_result_fail(self, *args): - self._create_client().parse_refstack_result() - args[1].assert_called_once_with( - "Testcase %s success_rate is %s%%", - self.case_name, self.result) - - def test_parse_refstack_result_ok(self): - log_file = (''' - {0} tempest.api.compute [18.464988s] ... ok - {0} tempest.api.volume [0.230334s] ... FAILED - {0} tempest.api.network [1.265828s] ... SKIPPED: - Ran: 3 tests in 1259.0000 sec. - - Passed: 1 - - Skipped: 1 - - Failed: 1 - ''') - client = self._create_client() - with mock.patch('__builtin__.open', - mock.mock_open(read_data=log_file)): - client.parse_refstack_result() - self.assertEqual(client.details, self.details) - - def _get_main_kwargs(self, key=None): - kwargs = {'config': self._config, - 'testlist': self._testlist} - if key: - del kwargs[key] - return kwargs - - def _test_main_missing_keyword(self, key): - kwargs = self._get_main_kwargs(key) - client = self._create_client() - self.assertEqual(client.main(**kwargs), - testcase.TestCase.EX_RUN_ERROR) - - def test_main_missing_conf(self): - self._test_main_missing_keyword('config') - - def test_main_missing_testlist(self): - self._test_main_missing_keyword('testlist') - - def _test_argparser(self, arg, value): - self.default_args[arg] = value - parser = RefstackClientParser() - self.assertEqual(parser.parse_args(["--{}={}".format(arg, value)]), - self.default_args) - - def test_argparser_conf(self): - self._test_argparser('config', self._config) - - def test_argparser_testlist(self): - self._test_argparser('testlist', self._testlist) - - def test_argparser_multiple_args(self): - self.default_args['config'] = self._config - self.default_args['testlist'] = self._testlist - parser = RefstackClientParser() - self.assertEqual(parser.parse_args( - ["--config={}".format(self._config), - "--testlist={}".format(self._testlist) - ]), self.default_args) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/openstack/snaps/__init__.py b/functest/tests/unit/openstack/snaps/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/functest/tests/unit/openstack/snaps/__init__.py +++ /dev/null diff --git a/functest/tests/unit/openstack/snaps/test_snaps.py b/functest/tests/unit/openstack/snaps/test_snaps.py deleted file mode 100644 index 83d6341f7..000000000 --- a/functest/tests/unit/openstack/snaps/test_snaps.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. 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 mock -import os -import unittest - -from snaps.openstack.os_credentials import OSCreds - -from functest.core.testcase import TestCase -from functest.opnfv_tests.openstack.snaps import (connection_check, api_check, - health_check, smoke) - - -class ConnectionCheckTesting(unittest.TestCase): - """ - Ensures the VPingUserdata class can run in Functest. This test does not - actually connect with an OpenStack pod. - """ - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - self.connection_check = connection_check.ConnectionCheck( - os_creds=self.os_creds, ext_net_name='foo') - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_client_tests') - def test_run_success(self, add_os_client_tests): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = [] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.connection_check.run()) - self.assertEquals(TestCase.EX_OK, - self.connection_check.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_client_tests') - def test_run_1_of_100_failures(self, add_os_client_tests): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.connection_check.run()) - self.assertEquals(TestCase.EX_TESTCASE_FAILED, - self.connection_check.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_client_tests') - def test_run_1_of_100_failures_within_criteria(self, add_os_client_tests): - self.connection_check.criteria = 90 - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.connection_check.run()) - self.assertEquals(TestCase.EX_OK, - self.connection_check.is_successful()) - - -class APICheckTesting(unittest.TestCase): - """ - Ensures the VPingUserdata class can run in Functest. This test does not - actually connect with an OpenStack pod. - """ - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - self.api_check = api_check.ApiCheck( - os_creds=self.os_creds, ext_net_name='foo') - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_api_tests') - def test_run_success(self, add_tests): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = [] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.api_check.run()) - self.assertEquals(TestCase.EX_OK, - self.api_check.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_api_tests') - def test_run_1_of_100_failures(self, add_tests): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.api_check.run()) - self.assertEquals(TestCase.EX_TESTCASE_FAILED, - self.api_check.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_api_tests') - def test_run_1_of_100_failures_within_criteria(self, add_tests): - self.api_check.criteria = 90 - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.api_check.run()) - self.assertEquals(TestCase.EX_OK, - self.api_check.is_successful()) - - -class HealthCheckTesting(unittest.TestCase): - """ - Ensures the VPingUserdata class can run in Functest. This test does not - actually connect with an OpenStack pod. - """ - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - self.health_check = health_check.HealthCheck( - os_creds=self.os_creds, ext_net_name='foo') - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_client_tests') - def test_run_success(self, add_tests): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = [] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.health_check.run()) - self.assertEquals(TestCase.EX_OK, - self.health_check.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_client_tests') - def test_run_1_of_100_failures(self, add_tests): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.health_check.run()) - self.assertEquals(TestCase.EX_TESTCASE_FAILED, - self.health_check.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_client_tests') - def test_run_1_of_100_failures_within_criteria(self, add_tests): - self.health_check.criteria = 90 - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.health_check.run()) - self.assertEquals(TestCase.EX_OK, - self.health_check.is_successful()) - - -class SmokeTesting(unittest.TestCase): - """ - Ensures the VPingUserdata class can run in Functest. This test does not - actually connect with an OpenStack pod. - """ - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - self.smoke = smoke.SnapsSmoke( - os_creds=self.os_creds, ext_net_name='foo') - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_integration_tests') - @mock.patch('os.path.join', return_value=os.getcwd()) - def test_run_success(self, add_tests, cwd): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = [] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.smoke.run()) - self.assertEquals(TestCase.EX_OK, - self.smoke.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_integration_tests') - @mock.patch('os.path.join', return_value=os.getcwd()) - def test_run_1_of_100_failures(self, add_tests, cwd): - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.smoke.run()) - self.assertEquals(TestCase.EX_TESTCASE_FAILED, - self.smoke.is_successful()) - - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_suite_builder.' - 'add_openstack_integration_tests') - @mock.patch('os.path.join', return_value=os.getcwd()) - def test_run_1_of_100_failures_within_criteria(self, add_tests, cwd): - self.smoke.criteria = 90 - result = mock.MagicMock(name='unittest.TextTestResult') - result.testsRun = 100 - result.failures = ['foo'] - result.errors = [] - with mock.patch('unittest.TextTestRunner.run', return_value=result): - self.assertEquals(TestCase.EX_OK, self.smoke.run()) - self.assertEquals(TestCase.EX_OK, - self.smoke.is_successful()) diff --git a/functest/tests/unit/openstack/tempest/test_conf_utils.py b/functest/tests/unit/openstack/tempest/test_conf_utils.py deleted file mode 100644 index 7eeffdd67..000000000 --- a/functest/tests/unit/openstack/tempest/test_conf_utils.py +++ /dev/null @@ -1,340 +0,0 @@ -#!/usr/bin/env python - -# 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 logging -import unittest - -import mock - -from functest.opnfv_tests.openstack.tempest import tempest, conf_utils -from functest.utils.constants import CONST -from snaps.openstack.os_credentials import OSCreds - - -class OSTempestConfUtilsTesting(unittest.TestCase): - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - @mock.patch('snaps.openstack.utils.deploy_utils.create_project', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_user', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_network', - return_value=None) - @mock.patch('snaps.openstack.utils.deploy_utils.create_image', - return_value=mock.Mock()) - def test_create_tempest_resources_missing_network_dic(self, *mock_args): - tempest_resources = tempest.TempestResourcesManager(os_creds={}) - with self.assertRaises(Exception) as context: - tempest_resources.create() - msg = 'Failed to create private network' - self.assertTrue(msg in context.exception) - - @mock.patch('snaps.openstack.utils.deploy_utils.create_project', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_user', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_network', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_image', - return_value=None) - def test_create_tempest_resources_missing_image(self, *mock_args): - tempest_resources = tempest.TempestResourcesManager(os_creds={}) - - with self.assertRaises(Exception) as context: - tempest_resources.create() - msg = 'Failed to create image' - self.assertTrue(msg in context.exception, msg=str(context.exception)) - - @mock.patch('snaps.openstack.utils.deploy_utils.create_project', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_user', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_network', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.utils.deploy_utils.create_image', - return_value=mock.Mock()) - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create', - return_value=None) - def test_create_tempest_resources_missing_flavor(self, *mock_args): - tempest_resources = tempest.TempestResourcesManager( - os_creds=self.os_creds) - - CONST.__setattr__('tempest_use_custom_flavors', 'True') - with self.assertRaises(Exception) as context: - tempest_resources.create() - msg = 'Failed to create flavor' - self.assertTrue(msg in context.exception, msg=str(context.exception)) - - CONST.__setattr__('tempest_use_custom_flavors', 'False') - with self.assertRaises(Exception) as context: - tempest_resources.create(use_custom_flavors=True) - msg = 'Failed to create flavor' - self.assertTrue(msg in context.exception, msg=str(context.exception)) - - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils' - '.logger.info') - @mock.patch('functest.utils.functest_utils.execute_command_raise') - @mock.patch('functest.utils.functest_utils.execute_command') - def test_create_rally_deployment(self, mock_exec, mock_exec_raise, - mock_logger_info): - - conf_utils.create_rally_deployment() - - cmd = "rally deployment destroy opnfv-rally" - error_msg = "Deployment %s does not exist." % \ - CONST.__getattribute__('rally_deployment_name') - mock_logger_info.assert_any_call("Creating Rally environment...") - mock_exec.assert_any_call(cmd, error_msg=error_msg, verbose=False) - - cmd = "rally deployment create --fromenv --name=" - cmd += CONST.__getattribute__('rally_deployment_name') - error_msg = "Problem while creating Rally deployment" - mock_exec_raise.assert_any_call(cmd, error_msg=error_msg) - - cmd = "rally deployment check" - error_msg = ("OpenStack not responding or " - "faulty Rally deployment.") - mock_exec_raise.assert_any_call(cmd, error_msg=error_msg) - - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils' - '.logger.debug') - def test_create_verifier(self, mock_logger_debug): - mock_popen = mock.Mock() - attrs = {'poll.return_value': None, - 'stdout.readline.return_value': '0'} - mock_popen.configure_mock(**attrs) - - CONST.__setattr__('tempest_verifier_name', 'test_veifier_name') - with mock.patch('functest.utils.functest_utils.execute_command_raise', - side_effect=Exception), \ - self.assertRaises(Exception): - conf_utils.create_verifier() - mock_logger_debug.assert_any_call("Tempest test_veifier_name" - " does not exist") - - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'create_verifier', return_value=mock.Mock()) - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'create_rally_deployment', return_value=mock.Mock()) - def test_get_verifier_id_missing_verifier(self, mock_rally, mock_tempest): - CONST.__setattr__('tempest_verifier_name', 'test_verifier_name') - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.subprocess.Popen') as mock_popen, \ - self.assertRaises(Exception): - mock_stdout = mock.Mock() - attrs = {'stdout.readline.return_value': ''} - mock_stdout.configure_mock(**attrs) - mock_popen.return_value = mock_stdout - conf_utils.get_verifier_id() - - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'create_verifier', return_value=mock.Mock()) - @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'create_rally_deployment', return_value=mock.Mock()) - def test_get_verifier_id_default(self, mock_rally, mock_tempest): - CONST.__setattr__('tempest_verifier_name', 'test_verifier_name') - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.subprocess.Popen') as mock_popen: - mock_stdout = mock.Mock() - attrs = {'stdout.readline.return_value': 'test_deploy_id'} - mock_stdout.configure_mock(**attrs) - mock_popen.return_value = mock_stdout - - self.assertEqual(conf_utils.get_verifier_id(), - 'test_deploy_id') - - def test_get_verifier_deployment_id_missing_rally(self): - CONST.__setattr__('tempest_verifier_name', 'test_deploy_name') - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.subprocess.Popen') as mock_popen, \ - self.assertRaises(Exception): - mock_stdout = mock.Mock() - attrs = {'stdout.readline.return_value': ''} - mock_stdout.configure_mock(**attrs) - mock_popen.return_value = mock_stdout - conf_utils.get_verifier_deployment_id(), - - def test_get_verifier_deployment_id_default(self): - CONST.__setattr__('tempest_verifier_name', 'test_deploy_name') - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.subprocess.Popen') as mock_popen: - mock_stdout = mock.Mock() - attrs = {'stdout.readline.return_value': 'test_deploy_id'} - mock_stdout.configure_mock(**attrs) - mock_popen.return_value = mock_stdout - - self.assertEqual(conf_utils.get_verifier_deployment_id(), - 'test_deploy_id') - - def test_get_verifier_repo_dir_default(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.path.join', - return_value='test_verifier_repo_dir'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.get_verifier_id') as m: - self.assertEqual(conf_utils.get_verifier_repo_dir(''), - 'test_verifier_repo_dir') - self.assertTrue(m.called) - - def test_get_verifier_deployment_dir_default(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.path.join', - return_value='test_verifier_repo_dir'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.get_verifier_id') as m1, \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.get_verifier_deployment_id') as m2: - self.assertEqual(conf_utils.get_verifier_deployment_dir('', ''), - 'test_verifier_repo_dir') - self.assertTrue(m1.called) - self.assertTrue(m2.called) - - def test_backup_tempest_config_default(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.path.exists', - return_value=False), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.makedirs') as m1, \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.shutil.copyfile') as m2: - conf_utils.backup_tempest_config('test_conf_file') - self.assertTrue(m1.called) - self.assertTrue(m2.called) - - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.path.exists', - return_value=True), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.shutil.copyfile') as m2: - conf_utils.backup_tempest_config('test_conf_file') - self.assertTrue(m2.called) - - def test_configure_tempest_default(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.configure_verifier', - return_value='test_conf_file'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.configure_tempest_update_params') as m1: - conf_utils.configure_tempest('test_dep_dir') - self.assertTrue(m1.called) - - def test_configure_tempest_defcore_default(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.configure_verifier', - return_value='test_conf_file'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.configure_tempest_update_params'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ConfigParser.RawConfigParser.' - 'set') as mset, \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ConfigParser.RawConfigParser.' - 'read') as mread, \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ConfigParser.RawConfigParser.' - 'write') as mwrite, \ - mock.patch('__builtin__.open', mock.mock_open()), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.generate_test_accounts_file'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.shutil.copyfile'): - conf_utils.configure_tempest_defcore( - 'test_dep_dir', 'test_image_id', 'test_flavor_id', - 'test_image_alt_id', 'test_flavor_alt_id', 'test_tenant_id') - mset.assert_any_call('compute', 'image_ref', 'test_image_id') - mset.assert_any_call('compute', 'image_ref_alt', - 'test_image_alt_id') - mset.assert_any_call('compute', 'flavor_ref', 'test_flavor_id') - mset.assert_any_call('compute', 'flavor_ref_alt', - 'test_flavor_alt_id') - self.assertTrue(mread.called) - self.assertTrue(mwrite.called) - - def test_generate_test_accounts_file_default(self): - with mock.patch("__builtin__.open", mock.mock_open()), \ - mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'yaml.dump') as mock_dump: - conf_utils.generate_test_accounts_file('test_tenant_id') - self.assertTrue(mock_dump.called) - - def _test_missing_param(self, params, image_id, flavor_id): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ConfigParser.RawConfigParser.' - 'set') as mset, \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ConfigParser.RawConfigParser.' - 'read') as mread, \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ConfigParser.RawConfigParser.' - 'write') as mwrite, \ - mock.patch('__builtin__.open', mock.mock_open()), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.backup_tempest_config'), \ - mock.patch('functest.utils.functest_utils.yaml.safe_load', - return_value={'validation': {'ssh_timeout': 300}}): - CONST.__setattr__('OS_ENDPOINT_TYPE', None) - conf_utils.configure_tempest_update_params( - 'test_conf_file', image_id=image_id, flavor_id=flavor_id) - mset.assert_any_call(params[0], params[1], params[2]) - self.assertTrue(mread.called) - self.assertTrue(mwrite.called) - - def test_configure_tempest_update_params_missing_image_id(self): - self._test_missing_param(('compute', 'image_ref', - 'test_image_id'), 'test_image_id', - None) - - def test_configure_tempest_update_params_missing_image_id_alt(self): - conf_utils.IMAGE_ID_ALT = 'test_image_id_alt' - self._test_missing_param(('compute', 'image_ref_alt', - 'test_image_id_alt'), None, None) - - def test_configure_tempest_update_params_missing_flavor_id(self): - CONST.__setattr__('tempest_use_custom_flavors', 'True') - self._test_missing_param(('compute', 'flavor_ref', - 'test_flavor_id'), None, - 'test_flavor_id') - - def test_configure_tempest_update_params_missing_flavor_id_alt(self): - CONST.__setattr__('tempest_use_custom_flavors', 'True') - conf_utils.FLAVOR_ID_ALT = 'test_flavor_id_alt' - self._test_missing_param(('compute', 'flavor_ref_alt', - 'test_flavor_id_alt'), None, - None) - - def test_configure_verifier_missing_temp_conf_file(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.path.isfile', - return_value=False), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ft_utils.execute_command') as mexe, \ - self.assertRaises(Exception) as context: - conf_utils.configure_verifier('test_dep_dir') - mexe.assert_any_call("rally verify configure-verifier") - msg = ("Tempest configuration file 'test_dep_dir/tempest.conf'" - " NOT found.") - self.assertTrue(msg in context) - - def test_configure_verifier_default(self): - with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.os.path.isfile', - return_value=True), \ - mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.ft_utils.execute_command') as mexe: - self.assertEqual(conf_utils.configure_verifier('test_dep_dir'), - 'test_dep_dir/tempest.conf') - mexe.assert_any_call("rally verify configure-verifier " - "--reconfigure") - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/openstack/tempest/test_tempest.py b/functest/tests/unit/openstack/tempest/test_tempest.py index 6fe103f18..efc4393c8 100644 --- a/functest/tests/unit/openstack/tempest/test_tempest.py +++ b/functest/tests/unit/openstack/tempest/test_tempest.py @@ -5,164 +5,185 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + import logging +import os import unittest import mock +from xtesting.core import testcase -from functest.core import testcase +from functest.opnfv_tests.openstack.rally import rally from functest.opnfv_tests.openstack.tempest import tempest -from functest.opnfv_tests.openstack.tempest import conf_utils -from functest.utils.constants import CONST - -from snaps.openstack.os_credentials import OSCreds +from functest.utils import config class OSTempestTesting(unittest.TestCase): + # pylint: disable=too-many-public-methods def setUp(self): - os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'conf_utils.get_verifier_id', - return_value='test_deploy_id'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'conf_utils.get_verifier_deployment_id', - return_value='test_deploy_id'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'conf_utils.get_verifier_repo_dir', - return_value='test_verifier_repo_dir'), \ - mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'conf_utils.get_verifier_deployment_dir', - return_value='test_verifier_deploy_dir'), \ - mock.patch('snaps.openstack.tests.openstack_tests.get_credentials', - return_value=os_creds): + with mock.patch('os_client_config.get_config'), \ + mock.patch('shade.OpenStackCloud'), \ + mock.patch('functest.core.tenantnetwork.NewProject'), \ + mock.patch('functest.opnfv_tests.openstack.rally.rally.' + 'RallyBase.create_rally_deployment'), \ + mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'TempestCommon.create_verifier'), \ + mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'TempestCommon.get_verifier_id', + return_value='test_deploy_id'), \ + mock.patch('functest.opnfv_tests.openstack.rally.rally.' + 'RallyBase.get_verifier_deployment_id', + return_value='test_deploy_id'), \ + mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'TempestCommon.get_verifier_repo_dir', + return_value='test_verifier_repo_dir'), \ + mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'TempestCommon.get_verifier_deployment_dir', + return_value='test_verifier_deploy_dir'), \ + mock.patch('os_client_config.make_shade'): self.tempestcommon = tempest.TempestCommon() - self.tempestsmoke_serial = tempest.TempestSmokeSerial() - self.tempestsmoke_parallel = tempest.TempestSmokeParallel() - self.tempestfull_parallel = tempest.TempestFullParallel() - self.tempestcustom = tempest.TempestCustom() - self.tempestdefcore = tempest.TempestDefcore() - - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.debug') - def test_generate_test_list_defcore_mode(self, mock_logger_debug): - self.tempestcommon.MODE = 'defcore' - with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'shutil.copyfile') as m: - self.tempestcommon.generate_test_list('test_verifier_repo_dir') - self.assertTrue(m.called) - - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.error') - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.debug') - def test_generate_test_list_custom_mode_missing_file(self, - mock_logger_debug, - mock_logger_error): - self.tempestcommon.MODE = 'custom' + + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.error') + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.debug') + def test_gen_tl_cm_missing_file(self, mock_logger_debug, + mock_logger_error): + # pylint: disable=unused-argument + self.tempestcommon.mode = 'custom' with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'os.path.isfile', return_value=False), \ self.assertRaises(Exception) as context: msg = "Tempest test list file %s NOT found." - self.tempestcommon.generate_test_list('test_verifier_repo_dir') - self.assertTrue((msg % conf_utils.TEMPEST_CUSTOM) in context) + self.tempestcommon.generate_test_list() + self.assertTrue( + (msg % self.tempestcommon.tempest_custom) in context.exception) - def test_generate_test_list_custom_mode_default(self): - self.tempestcommon.MODE = 'custom' + @mock.patch('subprocess.check_output') + @mock.patch('os.remove') + def test_gen_tl_cm_default(self, *args): + self.tempestcommon.mode = 'custom' with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'shutil.copyfile') as m, \ + 'shutil.copyfile') as mock_copyfile, \ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'os.path.isfile', return_value=True): - self.tempestcommon.generate_test_list('test_verifier_repo_dir') - self.assertTrue(m.called) - - def _test_generate_test_list_mode_default(self, mode): - self.tempestcommon.MODE = mode - if self.tempestcommon.MODE == 'smoke': - testr_mode = "smoke" - elif self.tempestcommon.MODE == 'full': - testr_mode = "" + self.tempestcommon.generate_test_list() + self.assertTrue(mock_copyfile.called) + args[0].assert_called_once_with('/etc/tempest.conf') + + @mock.patch('os.remove') + @mock.patch('shutil.copyfile') + @mock.patch('subprocess.check_output') + def _test_gen_tl_mode_default(self, mode, *args): + if mode == 'smoke': + testr_mode = r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$' + elif mode == 'full': + testr_mode = r'^tempest\.' else: - testr_mode = 'tempest.api.' + self.tempestcommon.MODE - conf_utils.TEMPEST_RAW_LIST = 'raw_list' + testr_mode = self.tempestcommon.mode verifier_repo_dir = 'test_verifier_repo_dir' - with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'ft_utils.execute_command') as m: - cmd = ("cd {0};" - "testr list-tests {1} > {2};" - "cd -;".format(verifier_repo_dir, - testr_mode, - conf_utils.TEMPEST_RAW_LIST)) - self.tempestcommon.generate_test_list('test_verifier_repo_dir') - m.assert_any_call(cmd) - - def test_generate_test_list_smoke_mode(self): - self._test_generate_test_list_mode_default('smoke') - - def test_generate_test_list_full_mode(self): - self._test_generate_test_list_mode_default('full') - - def test_parse_verifier_result_missing_verification_uuid(self): - self.tempestcommon.VERIFICATION_ID = None + self.tempestcommon.verifier_repo_dir = verifier_repo_dir + cmd = (f"(cd {verifier_repo_dir}; stestr list '{testr_mode}' > " + f"{self.tempestcommon.list} 2>/dev/null)") + self.tempestcommon.generate_test_list(mode=testr_mode) + args[0].assert_called_once_with(cmd, shell=True) + args[2].assert_called_once_with('/etc/tempest.conf') + + def test_gen_tl_smoke_mode(self): + self._test_gen_tl_mode_default('smoke') + + def test_gen_tl_full_mode(self): + self._test_gen_tl_mode_default('full') + + def test_verif_res_missing_verif_id(self): + self.tempestcommon.verification_id = None with self.assertRaises(Exception): self.tempestcommon.parse_verifier_result() - def test_apply_tempest_blacklist_no_blacklist(self): - with mock.patch('__builtin__.open', mock.mock_open()) as m, \ + def test_backup_config_default(self): + with mock.patch('os.path.exists', return_value=False), \ + mock.patch('os.makedirs') as mock_makedirs, \ + mock.patch('shutil.copyfile') as mock_copyfile: + self.tempestcommon.backup_tempest_config( + 'test_conf_file', res_dir='test_dir') + self.assertTrue(mock_makedirs.called) + self.assertTrue(mock_copyfile.called) + + with mock.patch('os.path.exists', return_value=True), \ + mock.patch('shutil.copyfile') as mock_copyfile: + self.tempestcommon.backup_tempest_config( + 'test_conf_file', res_dir='test_dir') + self.assertTrue(mock_copyfile.called) + + @mock.patch("os.rename") + @mock.patch("os.remove") + @mock.patch("os.path.exists", return_value=True) + def test_apply_missing_blacklist(self, *args): + with mock.patch('six.moves.builtins.open', + mock.mock_open()) as mock_open, \ mock.patch.object(self.tempestcommon, 'read_file', return_value=['test1', 'test2']): - conf_utils.TEMPEST_BLACKLIST = Exception - CONST.__setattr__('INSTALLER_TYPE', 'installer_type') - CONST.__setattr__('DEPLOY_SCENARIO', 'deploy_scenario') - self.tempestcommon.apply_tempest_blacklist() - obj = m() + self.tempestcommon.tempest_blacklist = Exception + os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario' + self.tempestcommon.apply_tempest_blacklist( + self.tempestcommon.tempest_blacklist) + obj = mock_open() obj.write.assert_any_call('test1\n') obj.write.assert_any_call('test2\n') + args[0].assert_called_once_with(self.tempestcommon.raw_list) + args[1].assert_called_once_with(self.tempestcommon.raw_list) + args[2].assert_called_once_with( + self.tempestcommon.list, self.tempestcommon.raw_list) - def test_apply_tempest_blacklist_default(self): + @mock.patch("os.rename") + @mock.patch("os.remove") + @mock.patch("os.path.exists", return_value=True) + def test_apply_blacklist_default(self, *args): item_dict = {'scenarios': ['deploy_scenario'], - 'installers': ['installer_type'], 'tests': ['test2']} - with mock.patch('__builtin__.open', mock.mock_open()) as m, \ + with mock.patch('six.moves.builtins.open', + mock.mock_open()) as mock_open, \ mock.patch.object(self.tempestcommon, 'read_file', return_value=['test1', 'test2']), \ mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'yaml.safe_load', return_value=item_dict): - CONST.__setattr__('INSTALLER_TYPE', 'installer_type') - CONST.__setattr__('DEPLOY_SCENARIO', 'deploy_scenario') - self.tempestcommon.apply_tempest_blacklist() - obj = m() + os.environ['DEPLOY_SCENARIO'] = 'deploy_scenario' + self.tempestcommon.apply_tempest_blacklist( + self.tempestcommon.tempest_blacklist) + obj = mock_open() obj.write.assert_any_call('test1\n') self.assertFalse(obj.write.assert_any_call('test2\n')) + args[0].assert_called_once_with(self.tempestcommon.raw_list) + args[1].assert_called_once_with(self.tempestcommon.raw_list) + args[2].assert_called_once_with( + self.tempestcommon.list, self.tempestcommon.raw_list) - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.logger.info') - def test_run_verifier_tests_default(self, mock_logger_info): - with mock.patch('__builtin__.open', mock.mock_open()), \ - mock.patch('__builtin__.iter', return_value=['\} tempest\.']), \ - mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'subprocess.Popen'): - conf_utils.TEMPEST_LIST = 'test_tempest_list' - cmd_line = ("rally verify start --load-list " - "test_tempest_list --detailed") + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'subprocess.Popen') + @mock.patch('six.moves.builtins.open', mock.mock_open()) + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.info') + def test_run_verifier_tests_default(self, *args): + self.tempestcommon.tempest_list = 'test_tempest_list' + cmd = ["rally", "verify", "start", "--load-list", + self.tempestcommon.tempest_list] + with self.assertRaises(Exception): self.tempestcommon.run_verifier_tests() - mock_logger_info. \ - assert_any_call("Starting Tempest test suite: '%s'." - % cmd_line) + args[0].assert_any_call("Starting Tempest test suite: '%s'.", cmd) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'os.path.exists', return_value=False) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs', side_effect=Exception) def test_run_makedirs_ko(self, *args): + # pylint: disable=unused-argument self.assertEqual(self.tempestcommon.run(), testcase.TestCase.EX_RUN_ERROR) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'os.path.exists', return_value=False) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'TempestResourcesManager.create', side_effect=Exception) - def test_run_tempest_create_resources_ko(self, *args): + def test_run_create_resources_ko(self, *args): + # pylint: disable=unused-argument self.assertEqual(self.tempestcommon.run(), testcase.TestCase.EX_RUN_ERROR) @@ -170,23 +191,9 @@ class OSTempestTesting(unittest.TestCase): 'os.path.exists', return_value=False) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'TempestResourcesManager.create', return_value={}) - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt', side_effect=Exception) - def test_run_get_active_compute_cnt_ko(self, *args): - self.assertEqual(self.tempestcommon.run(), - testcase.TestCase.EX_RUN_ERROR) - - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'os.path.exists', return_value=False) - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'TempestResourcesManager.create', return_value={}) - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt', return_value=2) - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'conf_utils.configure_tempest', side_effect=Exception) + 'TempestCommon.configure', side_effect=Exception) def test_run_configure_tempest_ko(self, *args): + # pylint: disable=unused-argument self.assertEqual(self.tempestcommon.run(), testcase.TestCase.EX_RUN_ERROR) @@ -194,27 +201,24 @@ class OSTempestTesting(unittest.TestCase): 'os.path.exists', return_value=False) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'TempestResourcesManager.create', return_value={}) - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_active_compute_cnt', return_value=2) - @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' - 'conf_utils.configure_tempest') + 'TempestCommon.configure') def _test_run(self, status, *args): + # pylint: disable=unused-argument self.assertEqual(self.tempestcommon.run(), status) - def test_run_missing_generate_test_list(self): + def test_run_missing_gen_test_list(self): with mock.patch.object(self.tempestcommon, 'generate_test_list', side_effect=Exception): self._test_run(testcase.TestCase.EX_RUN_ERROR) - def test_run_apply_tempest_blacklist_ko(self): + def test_run_apply_blacklist_ko(self): with mock.patch.object(self.tempestcommon, 'generate_test_list'), \ - mock.patch.object(self.tempestcommon, - 'apply_tempest_blacklist', - side_effect=Exception()): + mock.patch.object(self.tempestcommon, + 'apply_tempest_blacklist', + side_effect=Exception()): self._test_run(testcase.TestCase.EX_RUN_ERROR) - def test_run_verifier_tests_ko(self, *args): + def test_run_verifier_tests_ko(self): with mock.patch.object(self.tempestcommon, 'generate_test_list'), \ mock.patch.object(self.tempestcommon, 'apply_tempest_blacklist'), \ @@ -224,7 +228,7 @@ class OSTempestTesting(unittest.TestCase): side_effect=Exception): self._test_run(testcase.TestCase.EX_RUN_ERROR) - def test_run_parse_verifier_result_ko(self, *args): + def test_run_verif_result_ko(self): with mock.patch.object(self.tempestcommon, 'generate_test_list'), \ mock.patch.object(self.tempestcommon, 'apply_tempest_blacklist'), \ @@ -233,13 +237,155 @@ class OSTempestTesting(unittest.TestCase): side_effect=Exception): self._test_run(testcase.TestCase.EX_RUN_ERROR) + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.TempestCommon.' + 'run', return_value=testcase.TestCase.EX_OK) def test_run(self, *args): - with mock.patch.object(self.tempestcommon, 'generate_test_list'), \ + with mock.patch.object(self.tempestcommon, 'update_rally_regex'), \ + mock.patch.object(self.tempestcommon, 'generate_test_list'), \ mock.patch.object(self.tempestcommon, 'apply_tempest_blacklist'), \ mock.patch.object(self.tempestcommon, 'run_verifier_tests'), \ - mock.patch.object(self.tempestcommon, 'parse_verifier_result'): + mock.patch.object(self.tempestcommon, + 'parse_verifier_result'): self._test_run(testcase.TestCase.EX_OK) + args[0].assert_called_once_with() + + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.debug') + def test_create_verifier(self, mock_logger_debug): + mock_popen = mock.Mock() + attrs = {'poll.return_value': None, + 'stdout.readline.return_value': '0'} + mock_popen.configure_mock(**attrs) + + setattr(config.CONF, 'tempest_verifier_name', 'test_verifier_name') + with mock.patch('subprocess.Popen', side_effect=Exception), \ + self.assertRaises(Exception): + self.tempestcommon.create_verifier() + mock_logger_debug.assert_any_call("Tempest test_verifier_name" + " does not exist") + + def test_get_verifier_id_default(self): + setattr(config.CONF, 'tempest_verifier_name', 'test_verifier_name') + + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'tempest.subprocess.Popen') as mock_popen: + attrs = {'return_value.__enter__.return_value.' + 'stdout.readline.return_value': b'test_deploy_id'} + mock_popen.configure_mock(**attrs) + + self.assertEqual(self.tempestcommon.get_verifier_id(), + 'test_deploy_id') + + def test_get_depl_id_default(self): + setattr(config.CONF, 'tempest_verifier_name', 'test_deploy_name') + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'tempest.subprocess.Popen') as mock_popen: + attrs = {'return_value.__enter__.return_value.' + 'stdout.readline.return_value': b'test_deploy_id'} + mock_popen.configure_mock(**attrs) + + self.assertEqual(rally.RallyBase.get_verifier_deployment_id(), + 'test_deploy_id') + + def test_get_verif_repo_dir_default(self): + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'tempest.os.path.join', + return_value='test_verifier_repo_dir'): + self.assertEqual(self.tempestcommon.get_verifier_repo_dir(''), + 'test_verifier_repo_dir') + + def test_get_depl_dir_default(self): + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'tempest.os.path.join', + return_value='test_verifier_repo_dir'): + self.assertEqual( + self.tempestcommon.get_verifier_deployment_dir('', ''), + 'test_verifier_repo_dir') + + def _test_missing_param(self, params, image_id, flavor_id, alt=False): + with mock.patch('six.moves.configparser.RawConfigParser.' + 'set') as mset, \ + mock.patch('six.moves.configparser.RawConfigParser.' + 'read') as mread, \ + mock.patch('six.moves.configparser.RawConfigParser.' + 'write') as mwrite, \ + mock.patch('six.moves.builtins.open', mock.mock_open()), \ + mock.patch('functest.utils.functest_utils.yaml.safe_load', + return_value={'validation': {'ssh_timeout': 300}}): + os.environ['OS_INTERFACE'] = '' + if not alt: + self.tempestcommon.configure_tempest_update_params( + 'test_conf_file', image_id=image_id, + flavor_id=flavor_id) + mset.assert_any_call(params[0], params[1], params[2]) + else: + self.tempestcommon.configure_tempest_update_params( + 'test_conf_file', image_alt_id=image_id, + flavor_alt_id=flavor_id) + mset.assert_any_call(params[0], params[1], params[2]) + self.assertTrue(mread.called) + self.assertTrue(mwrite.called) + + def test_upd_missing_image_id(self): + self._test_missing_param(('compute', 'image_ref', 'test_image_id'), + 'test_image_id', None) + + def test_upd_missing_image_id_alt(self): + self._test_missing_param( + ('compute', 'image_ref_alt', 'test_image_id_alt'), + 'test_image_id_alt', None, alt=True) + + def test_upd_missing_flavor_id(self): + self._test_missing_param(('compute', 'flavor_ref', 'test_flavor_id'), + None, 'test_flavor_id') + + def test_upd_missing_flavor_id_alt(self): + self._test_missing_param( + ('compute', 'flavor_ref_alt', 'test_flavor_id_alt'), + None, 'test_flavor_id_alt', alt=True) + + def test_verif_missing_conf_file(self): + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'tempest.os.path.isfile', + return_value=False), \ + mock.patch('subprocess.check_output') as mexe, \ + self.assertRaises(Exception) as context: + self.tempestcommon.configure_verifier('test_dep_dir') + mexe.assert_called_once_with("rally verify configure-verifier") + msg = ("Tempest configuration file 'test_dep_dir/tempest.conf'" + " NOT found.") + self.assertTrue(msg in context.exception) + + def test_configure_verifier_default(self): + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'tempest.os.path.isfile', + return_value=True), \ + mock.patch('subprocess.check_output') as mexe: + self.assertEqual( + self.tempestcommon.configure_verifier('test_dep_dir'), + 'test_dep_dir/tempest.conf') + mexe.assert_called_once_with( + ['rally', 'verify', 'configure-verifier', '--reconfigure', + '--id', str(getattr(config.CONF, 'tempest_verifier_name'))]) + + def test_is_successful_false(self): + with mock.patch('six.moves.builtins.super') as mock_super: + self.tempestcommon.deny_skipping = True + self.tempestcommon.details = {"skipped_number": 2} + self.assertEqual(self.tempestcommon.is_successful(), + testcase.TestCase.EX_TESTCASE_FAILED) + mock_super(tempest.TempestCommon, + self).is_successful.assert_not_called() + + def test_is_successful_true(self): + with mock.patch('six.moves.builtins.super') as mock_super: + self.tempestcommon.deny_skipping = False + self.tempestcommon.details = {"skipped_number": 2} + mock_super(tempest.TempestCommon, + self).is_successful.return_value = 567 + self.assertEqual(self.tempestcommon.is_successful(), 567) + mock_super(tempest.TempestCommon, + self).is_successful.assert_called() if __name__ == "__main__": diff --git a/functest/cli/commands/__init__.py b/functest/tests/unit/openstack/vmtp/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/cli/commands/__init__.py +++ b/functest/tests/unit/openstack/vmtp/__init__.py diff --git a/functest/tests/unit/openstack/vmtp/test_vmtp.py b/functest/tests/unit/openstack/vmtp/test_vmtp.py new file mode 100644 index 000000000..850273476 --- /dev/null +++ b/functest/tests/unit/openstack/vmtp/test_vmtp.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +import logging +import unittest + +import mock +import munch +import shade + +from functest.opnfv_tests.openstack.vmtp import vmtp + + +class VmtpInitTesting(unittest.TestCase): + + def _test_exc_init(self): + testcase = vmtp.Vmtp() + self.assertEqual(testcase.case_name, "vmtp") + self.assertEqual(testcase.result, 0) + for func in ['generate_keys', 'write_config', 'run_vmtp']: + with self.assertRaises(AssertionError): + getattr(testcase, func)() + self.assertEqual(testcase.run(), testcase.EX_RUN_ERROR) + self.assertEqual(testcase.clean(), None) + + @mock.patch('os_client_config.get_config', side_effect=Exception) + def test_init1(self, *args): + self._test_exc_init() + args[0].assert_called_once_with() + + @mock.patch('os_client_config.get_config') + @mock.patch('shade.OpenStackCloud', side_effect=Exception) + def test_init2(self, *args): + self._test_exc_init() + args[0].assert_called_once_with(cloud_config=mock.ANY) + args[1].assert_called_once_with() + + @mock.patch('os_client_config.get_config') + @mock.patch('shade.OpenStackCloud') + def test_case_name(self, *args): + testcase = vmtp.Vmtp(case_name="foo") + self.assertEqual(testcase.case_name, "foo") + args[0].assert_called_once_with(cloud_config=mock.ANY) + args[1].assert_called_once_with() + + +class VmtpTesting(unittest.TestCase): + + def setUp(self): + with mock.patch('os_client_config.get_config'), \ + mock.patch('shade.OpenStackCloud'): + self.testcase = vmtp.Vmtp() + self.testcase.cloud = mock.Mock() + self.testcase.cloud.create_keypair.return_value = munch.Munch( + private_key="priv", public_key="pub", id="id") + + @mock.patch('six.moves.builtins.open') + def test_generate_keys1(self, *args): + self.testcase.generate_keys() + self.testcase.cloud.create_keypair.assert_called_once_with( + f'vmtp_{self.testcase.guid}') + self.testcase.cloud.delete_keypair.assert_called_once_with('id') + calls = [mock.call( + self.testcase.privkey_filename, 'w', encoding='utf-8'), + mock.call( + self.testcase.pubkey_filename, 'w', encoding='utf-8')] + args[0].assert_has_calls(calls, any_order=True) + + @mock.patch('six.moves.builtins.open') + def test_generate_keys2(self, *args): + with mock.patch.object( + self.testcase.cloud, "create_keypair", + side_effect=shade.OpenStackCloudException(None)) as mock_obj, \ + self.assertRaises(shade.OpenStackCloudException): + self.testcase.generate_keys() + mock_obj.assert_called_once_with(f'vmtp_{self.testcase.guid}') + args[0].assert_not_called() + + +if __name__ == "__main__": + logging.disable(logging.CRITICAL) + unittest.main(verbosity=2) diff --git a/functest/energy/__init__.py b/functest/tests/unit/openstack/vping/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/energy/__init__.py +++ b/functest/tests/unit/openstack/vping/__init__.py diff --git a/functest/tests/unit/openstack/vping/test_vping.py b/functest/tests/unit/openstack/vping/test_vping.py deleted file mode 100644 index dbfb679f2..000000000 --- a/functest/tests/unit/openstack/vping/test_vping.py +++ /dev/null @@ -1,159 +0,0 @@ -# Copyright (c) 2017 Cable Television Laboratories, Inc. 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 unittest - -import mock - -from snaps.config.keypair import KeypairConfig -from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig -from snaps.config.router import RouterConfig -from snaps.config.security_group import SecurityGroupConfig -from snaps.config.vm_inst import VmInstanceConfig - -from snaps.openstack.create_image import OpenStackImage -from snaps.openstack.create_instance import OpenStackVmInstance -from snaps.openstack.create_keypairs import OpenStackKeypair -from snaps.openstack.create_network import OpenStackNetwork -from snaps.openstack.create_router import OpenStackRouter -from snaps.openstack.create_security_group import OpenStackSecurityGroup - -from snaps.openstack.os_credentials import OSCreds - -from functest.core.testcase import TestCase -from functest.opnfv_tests.openstack.vping import vping_userdata, vping_ssh - - -class VPingUserdataTesting(unittest.TestCase): - """ - Ensures the VPingUserdata class can run in Functest. This test does not - actually connect with an OpenStack pod. - """ - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - self.vping_userdata = vping_userdata.VPingUserdata( - os_creds=self.os_creds) - - @mock.patch('snaps.openstack.utils.deploy_utils.create_vm_instance') - @mock.patch('functest.opnfv_tests.openstack.vping.vping_base.os.' - 'path.exists', return_value=True) - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create', - return_value=None) - @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.' - 'get_port_ip', return_value='10.0.0.1') - @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.' - 'vm_active', return_value=True) - def test_vping_userdata(self, deploy_vm, path_exists, create_flavor, - get_port_ip, vm_active): - with mock.patch('snaps.openstack.utils.deploy_utils.create_image', - return_value=OpenStackImage(self.os_creds, None)), \ - mock.patch('snaps.openstack.utils.deploy_utils.create_network', - return_value=OpenStackNetwork( - self.os_creds, NetworkConfig(name='foo'))), \ - mock.patch('snaps.openstack.utils.deploy_utils.' - 'create_vm_instance', - return_value=OpenStackVmInstance( - self.os_creds, - VmInstanceConfig( - name='foo', flavor='bar', - port_settings=[PortConfig( - name='foo', network_name='bar')]), - None)), \ - mock.patch('snaps.openstack.create_instance.' - 'OpenStackVmInstance.get_console_output', - return_value='vPing OK'): - self.assertEquals(TestCase.EX_OK, self.vping_userdata.run()) - - -class VPingSSHTesting(unittest.TestCase): - """ - Ensures the VPingUserdata class can run in Functest. This test does not - actually connect with an OpenStack pod. - """ - - def setUp(self): - self.os_creds = OSCreds( - username='user', password='pass', - auth_url='http://foo.com:5000/v3', project_name='bar') - - self.vping_ssh = vping_ssh.VPingSSH( - os_creds=self.os_creds) - - @mock.patch('snaps.openstack.utils.deploy_utils.create_vm_instance') - @mock.patch('functest.opnfv_tests.openstack.vping.vping_base.os.' - 'path.exists', return_value=True) - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create', - return_value=None) - @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.' - 'get_port_ip', return_value='10.0.0.1') - @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.' - 'vm_active', return_value=True) - @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.' - 'vm_ssh_active', return_value=True) - @mock.patch('snaps.openstack.create_instance.OpenStackVmInstance.' - 'ssh_client', return_value=True) - @mock.patch('scp.SCPClient') - @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.' - 'VPingSSH._transfer_ping_script', return_value=True) - @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.' - 'VPingSSH._do_vping_ssh', return_value=TestCase.EX_OK) - @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'get_ext_net_name', return_value='foo') - def test_vping_ssh(self, create_vm, path_exists, - flavor_create, get_port_ip, vm_active, ssh_active, - ssh_client, scp_client, trans_script, do_vping_ssh, - ext_net_name): - os_vm_inst = mock.MagicMock(name='get_console_output') - os_vm_inst.get_console_output.return_value = 'vPing OK' - ssh_client = mock.MagicMock(name='get_transport') - ssh_client.get_transport.return_value = None - scp_client = mock.MagicMock(name='put') - scp_client.put.return_value = None - - with mock.patch('snaps.openstack.utils.deploy_utils.create_image', - return_value=OpenStackImage(self.os_creds, None)), \ - mock.patch('snaps.openstack.utils.deploy_utils.create_network', - return_value=OpenStackNetwork( - self.os_creds, - NetworkConfig( - name='foo', - subnet_settings=[ - SubnetConfig( - name='bar', - cidr='10.0.0.1/24')]))), \ - mock.patch('snaps.openstack.utils.deploy_utils.' - 'create_vm_instance', - return_value=OpenStackVmInstance( - self.os_creds, - VmInstanceConfig( - name='foo', flavor='bar', - port_settings=[PortConfig( - name='foo', network_name='bar')]), - None)), \ - mock.patch('snaps.openstack.utils.deploy_utils.create_keypair', - return_value=OpenStackKeypair( - self.os_creds, KeypairConfig(name='foo'))), \ - mock.patch('snaps.openstack.utils.deploy_utils.create_router', - return_value=OpenStackRouter( - self.os_creds, RouterConfig(name='foo'))), \ - mock.patch('snaps.openstack.utils.deploy_utils.' - 'create_security_group', - return_value=OpenStackSecurityGroup( - self.os_creds, - SecurityGroupConfig(name='foo'))), \ - mock.patch('snaps.openstack.create_instance.' - 'OpenStackVmInstance.' - 'get_vm_inst', return_value=os_vm_inst), \ - mock.patch('snaps.openstack.create_instance.' - 'OpenStackVmInstance.' - 'ssh_client', return_value=ssh_client): - self.assertEquals(TestCase.EX_OK, self.vping_ssh.run()) diff --git a/functest/tests/unit/openstack/vping/test_vping_ssh.py b/functest/tests/unit/openstack/vping/test_vping_ssh.py new file mode 100644 index 000000000..a07148aab --- /dev/null +++ b/functest/tests/unit/openstack/vping/test_vping_ssh.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +import logging +import unittest + +from paramiko import ssh_exception +import mock +import munch +import shade + +from functest.opnfv_tests.openstack.vping import vping_ssh +from functest.utils import config + + +class VpingSSHTesting(unittest.TestCase): + + def setUp(self): + with mock.patch('functest.core.singlevm.SingleVm2.__init__'): + self.vping = vping_ssh.VPingSSH() + self.vping.cloud = mock.Mock() + self.vping.case_name = 'vping' + self.vping.guid = '1' + + @mock.patch('functest.core.singlevm.SingleVm2.prepare', + side_effect=Exception) + def test_prepare_exc1(self, *args): + with self.assertRaises(Exception): + self.vping.prepare() + args[0].assert_called_once_with() + + @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'boot_vm', + side_effect=Exception) + @mock.patch('functest.core.singlevm.SingleVm2.prepare') + def test_prepare_exc2(self, *args): + self.vping.sec = munch.Munch(id='foo') + with self.assertRaises(Exception): + self.vping.prepare() + args[0].assert_called_once_with() + args[1].assert_called_once_with( + f'{self.vping.case_name}-vm2_{self.vping.guid}', + security_groups=[self.vping.sec.id]) + + @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'boot_vm') + @mock.patch('functest.core.singlevm.SingleVm2.prepare') + def test_prepare(self, *args): + self.vping.sec = munch.Munch(id='foo') + self.vping.prepare() + args[0].assert_called_once_with() + args[1].assert_called_once_with( + f'{self.vping.case_name}-vm2_{self.vping.guid}', + security_groups=[self.vping.sec.id]) + + @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'check_regex_in_console', return_value=True) + def test_execute_exc(self, *args): + self.vping.vm2 = munch.Munch(private_v4='127.0.0.1', name='foo') + self.vping.ssh = mock.Mock() + self.vping.ssh.exec_command.side_effect = ssh_exception.SSHException + with self.assertRaises(ssh_exception.SSHException): + self.vping.execute() + self.vping.ssh.exec_command.assert_called_once_with( + f'ping -c 1 {self.vping.vm2.private_v4}') + args[0].assert_called_once_with('foo') + + @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'check_regex_in_console', return_value=False) + def test_execute_exc2(self, *args): + self.vping.vm2 = munch.Munch(private_v4='127.0.0.1', name='foo') + self.vping.ssh = mock.Mock() + self.vping.execute() + self.vping.ssh.exec_command.assert_not_called() + args[0].assert_called_once_with('foo') + + def _test_execute(self, ret=0): + self.vping.vm2 = munch.Munch(private_v4='127.0.0.1', name='foo') + self.vping.ssh = mock.Mock() + stdout = mock.Mock() + stdout.channel.recv_exit_status.return_value = ret + self.vping.ssh.exec_command.return_value = (None, stdout, mock.Mock()) + with mock.patch( + 'functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'check_regex_in_console', return_value=True) as mock_check: + self.assertEqual(self.vping.execute(), ret) + mock_check.assert_called_once_with('foo') + self.vping.ssh.exec_command.assert_called_once_with( + f'ping -c 1 {self.vping.vm2.private_v4}') + + def test_execute1(self): + self._test_execute() + + def test_execute2(self): + self._test_execute(1) + + def test_clean_exc1(self): + self.vping.cloud = None + with self.assertRaises(AssertionError): + self.vping.clean() + + def test_clean_exc2(self): + self.vping.vm2 = munch.Munch(id='vm2') + mdelete_server = self.vping.cloud.delete_server + mdelete_server.side_effect = shade.OpenStackCloudException(None) + with self.assertRaises(shade.OpenStackCloudException): + self.vping.clean() + + @mock.patch('functest.core.singlevm.SingleVm2.clean', + side_effect=Exception) + def test_clean_exc3(self, *args): + self.vping.vm2 = munch.Munch(id='vm2') + with self.assertRaises(Exception): + self.vping.clean() + self.vping.cloud.delete_server.assert_called_once_with( + self.vping.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + args[0].assert_called_once_with() + + @mock.patch('functest.core.singlevm.SingleVm2.clean') + def test_clean1(self, *args): + self.vping.vm2 = None + self.vping.clean() + self.vping.cloud.delete_server.assert_not_called() + args[0].assert_called_once_with() + + @mock.patch('functest.core.singlevm.SingleVm2.clean') + def test_clean2(self, *args): + self.vping.vm2 = munch.Munch(id='vm2') + self.vping.clean() + self.vping.cloud.delete_server.assert_called_once_with( + self.vping.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + args[0].assert_called_once_with() + + +if __name__ == '__main__': + logging.disable(logging.CRITICAL) + unittest.main(verbosity=2) diff --git a/functest/tests/unit/test_utils.py b/functest/tests/unit/test_utils.py deleted file mode 100644 index 159047649..000000000 --- a/functest/tests/unit/test_utils.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python - -# 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 re - - -class RegexMatch(object): - def __init__(self, msg): - self.msg = msg - - def __eq__(self, other): - match = re.search(self.msg, other) - if match: - return True - return False - - -class SubstrMatch(object): - def __init__(self, msg): - self.msg = msg - - def __eq__(self, other): - if self.msg in other: - return True - return False diff --git a/functest/tests/unit/utils/test_decorators.py b/functest/tests/unit/utils/test_decorators.py deleted file mode 100644 index 82291fa2d..000000000 --- a/functest/tests/unit/utils/test_decorators.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 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 - -"""Define the class required to fully cover decorators.""" - -from datetime import datetime -import errno -import json -import logging -import os -import unittest - -import mock - -from functest.utils import decorators -from functest.utils import functest_utils -from functest.utils.constants import CONST - -__author__ = "Cedric Ollivier <cedric.ollivier@orange.com>" - -VERSION = 'master' -DIR = '/dev' -FILE = '{}/null'.format(DIR) -URL = 'file://{}'.format(FILE) - - -class DecoratorsTesting(unittest.TestCase): - # pylint: disable=missing-docstring - - _case_name = 'base' - _project_name = 'functest' - _start_time = 1.0 - _stop_time = 2.0 - _result = 'PASS' - _build_tag = VERSION - _node_name = 'bar' - _deploy_scenario = 'foo' - _installer_type = 'debian' - - def setUp(self): - os.environ['INSTALLER_TYPE'] = self._installer_type - os.environ['DEPLOY_SCENARIO'] = self._deploy_scenario - os.environ['NODE_NAME'] = self._node_name - os.environ['BUILD_TAG'] = self._build_tag - - def test_wraps(self): - self.assertEqual(functest_utils.push_results_to_db.__name__, - "push_results_to_db") - - def _get_json(self): - stop_time = datetime.fromtimestamp(self._stop_time).strftime( - '%Y-%m-%d %H:%M:%S') - start_time = datetime.fromtimestamp(self._start_time).strftime( - '%Y-%m-%d %H:%M:%S') - data = {'project_name': self._project_name, - 'stop_date': stop_time, 'start_date': start_time, - 'case_name': self._case_name, 'build_tag': self._build_tag, - 'pod_name': self._node_name, 'installer': self._installer_type, - 'scenario': self._deploy_scenario, 'version': VERSION, - 'details': {}, 'criteria': self._result} - return json.dumps(data, sort_keys=True) - - @mock.patch('{}.get_version'.format(functest_utils.__name__), - return_value=VERSION) - @mock.patch('requests.post') - def test_http_shema(self, *args): - CONST.__setattr__('results_test_db_url', 'http://127.0.0.1') - self.assertTrue(functest_utils.push_results_to_db( - self._project_name, self._case_name, self._start_time, - self._stop_time, self._result, {})) - args[1].assert_called_once_with() - args[0].assert_called_once_with( - 'http://127.0.0.1', data=self._get_json(), - headers={'Content-Type': 'application/json'}) - - def test_wrong_shema(self): - CONST.__setattr__('results_test_db_url', '/dev/null') - self.assertFalse(functest_utils.push_results_to_db( - self._project_name, self._case_name, self._start_time, - self._stop_time, self._result, {})) - - @mock.patch('{}.get_version'.format(functest_utils.__name__), - return_value=VERSION) - def _test_dump(self, *args): - CONST.__setattr__('results_test_db_url', URL) - with mock.patch.object(decorators, 'open', mock.mock_open(), - create=True) as mock_open: - self.assertTrue(functest_utils.push_results_to_db( - self._project_name, self._case_name, self._start_time, - self._stop_time, self._result, {})) - mock_open.assert_called_once_with(FILE, 'a') - handle = mock_open() - call_args, _ = handle.write.call_args - self.assertIn('POST', call_args[0]) - self.assertIn(self._get_json(), call_args[0]) - args[0].assert_called_once_with() - - @mock.patch('os.makedirs') - def test_default_dump(self, mock_method=None): - self._test_dump() - mock_method.assert_called_once_with(DIR) - - @mock.patch('os.makedirs', side_effect=OSError(errno.EEXIST, '')) - def test_makedirs_dir_exists(self, mock_method=None): - self._test_dump() - mock_method.assert_called_once_with(DIR) - - @mock.patch('os.makedirs', side_effect=OSError) - def test_makedirs_exc(self, *args): - CONST.__setattr__('results_test_db_url', URL) - self.assertFalse( - functest_utils.push_results_to_db( - self._project_name, self._case_name, self._start_time, - self._stop_time, self._result, {})) - args[0].assert_called_once_with(DIR) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/utils/test_env.py b/functest/tests/unit/utils/test_env.py new file mode 100644 index 000000000..49d2d974c --- /dev/null +++ b/functest/tests/unit/utils/test_env.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +import logging +import os +import unittest + +from six.moves import reload_module + +from functest.utils import env + + +class EnvTesting(unittest.TestCase): + # pylint: disable=missing-docstring + + def setUp(self): + os.environ['FOO'] = 'foo' + os.environ['BUILD_TAG'] = 'master' + os.environ['CI_LOOP'] = 'weekly' + + def test_get_unset_unknown_env(self): + del os.environ['FOO'] + self.assertEqual(env.get('FOO'), None) + + def test_get_unknown_env(self): + self.assertEqual(env.get('FOO'), 'foo') + reload_module(env) + + def test_get_unset_env(self): + del os.environ['CI_LOOP'] + self.assertEqual( + env.get('CI_LOOP'), env.INPUTS['CI_LOOP']) + + def test_get_env(self): + self.assertEqual( + env.get('CI_LOOP'), 'weekly') + + def test_get_unset_env2(self): + del os.environ['BUILD_TAG'] + self.assertEqual( + env.get('BUILD_TAG'), env.INPUTS['BUILD_TAG']) + + def test_get_env2(self): + self.assertEqual(env.get('BUILD_TAG'), 'master') + + +if __name__ == "__main__": + logging.disable(logging.CRITICAL) + unittest.main(verbosity=2) diff --git a/functest/tests/unit/utils/test_functest_utils.py b/functest/tests/unit/utils/test_functest_utils.py index 7a77d25b9..4b642ff9d 100644 --- a/functest/tests/unit/utils/test_functest_utils.py +++ b/functest/tests/unit/utils/test_functest_utils.py @@ -7,22 +7,24 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + import logging -import pkg_resources -import os import time import unittest import mock -import requests -from six.moves import urllib +import pkg_resources +import six -from functest.tests.unit import test_utils from functest.utils import functest_utils -from functest.utils.constants import CONST class FunctestUtilsTesting(unittest.TestCase): + # pylint: disable=too-many-instance-attributes,too-many-public-methods + + readline = 0 + test_ip = ['10.1.23.4', '10.1.14.15', '10.1.16.15'] def setUp(self): self.url = 'http://www.opnfv.org/' @@ -53,8 +55,6 @@ class FunctestUtilsTesting(unittest.TestCase): self.cmd = 'test_cmd' self.output_file = 'test_output_file' self.testname = 'testname' - self.testcase_dict = {'case_name': 'testname', - 'criteria': self.criteria} self.parameter = 'general.openstack.image_name' self.config_yaml = pkg_resources.resource_filename( 'functest', 'ci/config_functest.yaml') @@ -63,56 +63,6 @@ class FunctestUtilsTesting(unittest.TestCase): self.file_yaml = {'general': {'openstack': {'image_name': 'test_image_name'}}} - @mock.patch('six.moves.urllib.request.urlopen', - side_effect=urllib.error.URLError('no host given')) - def test_check_internet_connectivity_failed(self, mock_method): - self.assertFalse(functest_utils.check_internet_connectivity()) - mock_method.assert_called_once_with(self.url, timeout=self.timeout) - - @mock.patch('six.moves.urllib.request.urlopen') - def test_check_internet_connectivity_default(self, mock_method): - self.assertTrue(functest_utils.check_internet_connectivity()) - mock_method.assert_called_once_with(self.url, timeout=self.timeout) - - @mock.patch('six.moves.urllib.request.urlopen') - def test_check_internet_connectivity_debian(self, mock_method): - self.url = "https://www.debian.org/" - self.assertTrue(functest_utils.check_internet_connectivity(self.url)) - mock_method.assert_called_once_with(self.url, timeout=self.timeout) - - @mock.patch('six.moves.urllib.request.urlopen', - side_effect=urllib.error.URLError('no host given')) - def test_download_url_failed(self, mock_url): - self.assertFalse(functest_utils.download_url(self.url, self.dest_path)) - - @mock.patch('six.moves.urllib.request.urlopen') - def test_download_url_default(self, mock_url): - with mock.patch("six.moves.builtins.open", mock.mock_open()) as m, \ - mock.patch('functest.utils.functest_utils.shutil.copyfileobj')\ - as mock_sh: - name = self.url.rsplit('/')[-1] - dest = self.dest_path + "/" + name - self.assertTrue(functest_utils.download_url(self.url, - self.dest_path)) - m.assert_called_once_with(dest, 'wb') - self.assertTrue(mock_sh.called) - - def test_get_version_daily_job(self): - CONST.__setattr__('BUILD_TAG', self.build_tag) - self.assertEqual(functest_utils.get_version(), self.version) - - def test_get_version_weekly_job(self): - CONST.__setattr__('BUILD_TAG', self.build_tag_week) - self.assertEqual(functest_utils.get_version(), self.version) - - def test_get_version_with_dummy_build_tag(self): - CONST.__setattr__('BUILD_TAG', 'whatever') - self.assertEqual(functest_utils.get_version(), 'unknown') - - def test_get_version_unknown(self): - CONST.__setattr__('BUILD_TAG', 'unknown_build_tag') - self.assertEqual(functest_utils.get_version(), "unknown") - def _get_env_dict(self, var): dic = {'INSTALLER_TYPE': self.installer, 'DEPLOY_SCENARIO': self.scenario, @@ -121,87 +71,6 @@ class FunctestUtilsTesting(unittest.TestCase): dic.pop(var, None) return dic - def _test_push_results_to_db_missing_env(self, env_var): - dic = self._get_env_dict(env_var) - CONST.__setattr__('results_test_db_url', self.db_url) - with mock.patch.dict(os.environ, - dic, - clear=True), \ - mock.patch('functest.utils.functest_utils.logger.error') \ - as mock_logger_error: - functest_utils.push_results_to_db(self.project, self.case_name, - self.start_date, self.stop_date, - self.result, self.details) - mock_logger_error.assert_called_once_with("Please set env var: " + - str("\'" + env_var + - "\'")) - - def test_push_results_to_db_missing_installer(self): - self._test_push_results_to_db_missing_env('INSTALLER_TYPE') - - def test_push_results_to_db_missing_scenario(self): - self._test_push_results_to_db_missing_env('DEPLOY_SCENARIO') - - def test_push_results_to_db_missing_nodename(self): - self._test_push_results_to_db_missing_env('NODE_NAME') - - def test_push_results_to_db_missing_buildtag(self): - self._test_push_results_to_db_missing_env('BUILD_TAG') - - def test_push_results_to_db_request_post_failed(self): - dic = self._get_env_dict(None) - CONST.__setattr__('results_test_db_url', self.db_url) - with mock.patch.dict(os.environ, - dic, - clear=True), \ - mock.patch('functest.utils.functest_utils.logger.error') \ - as mock_logger_error, \ - mock.patch('functest.utils.functest_utils.requests.post', - side_effect=requests.RequestException): - self.assertFalse(functest_utils. - push_results_to_db(self.project, self.case_name, - self.start_date, - self.stop_date, - self.result, self.details)) - mock_logger_error.assert_called_once_with(test_utils. - RegexMatch("Pushing " - "Result to" - " DB" - "(\S+\s*) " - "failed:")) - - def test_push_results_to_db_request_post_exception(self): - dic = self._get_env_dict(None) - CONST.__setattr__('results_test_db_url', self.db_url) - with mock.patch.dict(os.environ, - dic, - clear=True), \ - mock.patch('functest.utils.functest_utils.logger.error') \ - as mock_logger_error, \ - mock.patch('functest.utils.functest_utils.requests.post', - side_effect=Exception): - self.assertFalse(functest_utils. - push_results_to_db(self.project, self.case_name, - self.start_date, - self.stop_date, - self.result, self.details)) - self.assertTrue(mock_logger_error.called) - - def test_push_results_to_db_default(self): - dic = self._get_env_dict(None) - CONST.__setattr__('results_test_db_url', self.db_url) - with mock.patch.dict(os.environ, - dic, - clear=True), \ - mock.patch('functest.utils.functest_utils.requests.post'): - self.assertTrue(functest_utils. - push_results_to_db(self.project, self.case_name, - self.start_date, - self.stop_date, - self.result, self.details)) - readline = 0 - test_ip = ['10.1.23.4', '10.1.14.15', '10.1.16.15'] - @staticmethod def readline_side(): if FunctestUtilsTesting.readline == \ @@ -210,173 +79,96 @@ class FunctestUtilsTesting(unittest.TestCase): FunctestUtilsTesting.readline += 1 return FunctestUtilsTesting.test_ip[FunctestUtilsTesting.readline] - # TODO: get_resolvconf_ns - @mock.patch('functest.utils.functest_utils.dns.resolver.Resolver') - def test_get_resolvconf_ns_default(self, mock_dns_resolve): - attrs = {'query.return_value': ["test"]} - mock_dns_resolve.configure_mock(**attrs) - - m = mock.Mock() - attrs = {'readline.side_effect': self.readline_side} - m.configure_mock(**attrs) - - with mock.patch("six.moves.builtins.open") as mo: - mo.return_value = m - self.assertEqual(functest_utils.get_resolvconf_ns(), - self.test_ip[1:]) - - def _get_environ(self, var): + def _get_environ(self, var, *args): # pylint: disable=unused-argument if var == 'INSTALLER_TYPE': return self.installer - elif var == 'DEPLOY_SCENARIO': + if var == 'DEPLOY_SCENARIO': return self.scenario return var - def test_get_ci_envvars_default(self): - with mock.patch('os.environ.get', - side_effect=self._get_environ): - dic = {"installer": self.installer, - "scenario": self.scenario} - self.assertDictEqual(functest_utils.get_ci_envvars(), dic) - - def cmd_readline(self): + @staticmethod + def cmd_readline(): return 'test_value\n' - @mock.patch('functest.utils.functest_utils.logger.error') - @mock.patch('functest.utils.functest_utils.logger.info') - def test_execute_command_args_present_with_error(self, mock_logger_info, - mock_logger_error): + @mock.patch('functest.utils.functest_utils.LOGGER.error') + @mock.patch('functest.utils.functest_utils.LOGGER.info') + def test_exec_cmd_args_present_ko(self, mock_logger_info, + mock_logger_error): with mock.patch('functest.utils.functest_utils.subprocess.Popen') \ as mock_subproc_open, \ mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen: - - FunctestUtilsTesting.readline = 0 - - mock_obj = mock.Mock() - attrs = {'readline.side_effect': self.cmd_readline()} - mock_obj.configure_mock(**attrs) - - mock_obj2 = mock.Mock() - attrs = {'stdout': mock_obj, 'wait.return_value': 1} - mock_obj2.configure_mock(**attrs) - - mock_subproc_open.return_value = mock_obj2 - - resp = functest_utils.execute_command(self.cmd, info=True, - error_msg=self.error_msg, - verbose=True, - output_file=self.output_file) + stream = six.BytesIO() + stream.write(self.cmd_readline().encode("utf-8")) + attrs = { + 'return_value.__enter__.return_value.stdout': stream, + 'return_value.__enter__.return_value.wait.return_value': 1} + mock_subproc_open.configure_mock(**attrs) + resp = functest_utils.execute_command( + self.cmd, info=True, error_msg=self.error_msg, verbose=True, + output_file=self.output_file) self.assertEqual(resp, 1) - msg_exec = ("Executing command: '%s'" % self.cmd) + msg_exec = f"Executing command: '{self.cmd}'" mock_logger_info.assert_called_once_with(msg_exec) - mopen.assert_called_once_with(self.output_file, "w") + mopen.assert_called_once_with( + self.output_file, "w", encoding='utf-8') mock_logger_error.assert_called_once_with(self.error_msg) - @mock.patch('functest.utils.functest_utils.logger.info') - def test_execute_command_args_present_with_success(self, mock_logger_info, - ): + @mock.patch('functest.utils.functest_utils.LOGGER.info') + def test_exec_cmd_args_present_ok(self, mock_logger_info): with mock.patch('functest.utils.functest_utils.subprocess.Popen') \ as mock_subproc_open, \ mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen: - - FunctestUtilsTesting.readline = 0 - - mock_obj = mock.Mock() - attrs = {'readline.side_effect': self.cmd_readline()} - mock_obj.configure_mock(**attrs) - - mock_obj2 = mock.Mock() - attrs = {'stdout': mock_obj, 'wait.return_value': 0} - mock_obj2.configure_mock(**attrs) - - mock_subproc_open.return_value = mock_obj2 - - resp = functest_utils.execute_command(self.cmd, info=True, - error_msg=self.error_msg, - verbose=True, - output_file=self.output_file) + stream = six.BytesIO() + stream.write(self.cmd_readline().encode("utf-8")) + attrs = { + 'return_value.__enter__.return_value.stdout': stream, + 'return_value.__enter__.return_value.wait.return_value': 0} + mock_subproc_open.configure_mock(**attrs) + resp = functest_utils.execute_command( + self.cmd, info=True, error_msg=self.error_msg, verbose=True, + output_file=self.output_file) self.assertEqual(resp, 0) - msg_exec = ("Executing command: '%s'" % self.cmd) + msg_exec = (f"Executing command: '{self.cmd}'") mock_logger_info.assert_called_once_with(msg_exec) - mopen.assert_called_once_with(self.output_file, "w") + mopen.assert_called_once_with( + self.output_file, "w", encoding='utf-8') @mock.patch('sys.stdout') - def test_execute_command_args_missing_with_success(self, stdout=None): + def test_exec_cmd_args_missing_ok(self, stdout=None): + # pylint: disable=unused-argument with mock.patch('functest.utils.functest_utils.subprocess.Popen') \ as mock_subproc_open: - - FunctestUtilsTesting.readline = 2 - - mock_obj = mock.Mock() - attrs = {'readline.side_effect': self.cmd_readline()} - mock_obj.configure_mock(**attrs) - - mock_obj2 = mock.Mock() - attrs = {'stdout': mock_obj, 'wait.return_value': 0} - mock_obj2.configure_mock(**attrs) - - mock_subproc_open.return_value = mock_obj2 - - resp = functest_utils.execute_command(self.cmd, info=False, - error_msg="", - verbose=False, - output_file=None) + stream = six.BytesIO() + stream.write(self.cmd_readline().encode("utf-8")) + attrs = { + 'return_value.__enter__.return_value.stdout': stream, + 'return_value.__enter__.return_value.wait.return_value': 0} + mock_subproc_open.configure_mock(**attrs) + resp = functest_utils.execute_command( + self.cmd, info=False, error_msg="", verbose=False, + output_file=None) self.assertEqual(resp, 0) @mock.patch('sys.stdout') - def test_execute_command_args_missing_with_error(self, stdout=None): + def test_exec_cmd_args_missing_ko(self, stdout=None): + # pylint: disable=unused-argument with mock.patch('functest.utils.functest_utils.subprocess.Popen') \ as mock_subproc_open: - - FunctestUtilsTesting.readline = 2 - mock_obj = mock.Mock() - attrs = {'readline.side_effect': self.cmd_readline()} - mock_obj.configure_mock(**attrs) - - mock_obj2 = mock.Mock() - attrs = {'stdout': mock_obj, 'wait.return_value': 1} - mock_obj2.configure_mock(**attrs) - - mock_subproc_open.return_value = mock_obj2 - - resp = functest_utils.execute_command(self.cmd, info=False, - error_msg="", - verbose=False, - output_file=None) + attrs = {} + stream = six.BytesIO() + stream.write(self.cmd_readline().encode("utf-8")) + attrs = { + 'return_value.__enter__.return_value.stdout': stream, + 'return_value.__enter__.return_value.wait.return_value': 1} + mock_subproc_open.configure_mock(**attrs) + resp = functest_utils.execute_command( + self.cmd, info=False, error_msg="", verbose=False, + output_file=None) self.assertEqual(resp, 1) - def _get_functest_config(self, var): - return var - - @mock.patch('functest.utils.functest_utils.logger.error') - def test_get_dict_by_test(self, mock_logger_error): - with mock.patch('six.moves.builtins.open', mock.mock_open()), \ - mock.patch('functest.utils.functest_utils.yaml.safe_load') \ - as mock_yaml: - mock_obj = mock.Mock() - attrs = {'get.return_value': [{'testcases': [self.testcase_dict]}]} - mock_obj.configure_mock(**attrs) - - mock_yaml.return_value = mock_obj - - self.assertDictEqual(functest_utils. - get_dict_by_test(self.testname), - self.testcase_dict) - - @mock.patch('functest.utils.functest_utils.get_dict_by_test') - def test_get_criteria_by_test_default(self, mock_get_dict_by_test): - mock_get_dict_by_test.return_value = self.testcase_dict - self.assertEqual(functest_utils.get_criteria_by_test(self.testname), - self.criteria) - - @mock.patch('functest.utils.functest_utils.get_dict_by_test') - def test_get_criteria_by_test_failed(self, mock_get_dict_by_test): - mock_get_dict_by_test.return_value = None - self.assertIsNone(functest_utils.get_criteria_by_test(self.testname)) - - def test_get_parameter_from_yaml_failed(self): + def test_get_param_from_yaml_failed(self): self.file_yaml['general'] = None with mock.patch('six.moves.builtins.open', mock.mock_open()), \ mock.patch('functest.utils.functest_utils.yaml.safe_load') \ @@ -385,11 +177,11 @@ class FunctestUtilsTesting(unittest.TestCase): mock_yaml.return_value = self.file_yaml functest_utils.get_parameter_from_yaml(self.parameter, self.test_file) - self.assertTrue(("The parameter %s is not" - " defined in config_functest.yaml" % - self.parameter) in excep.exception) + self.assertTrue((f"The parameter {self.parameter} is not" + " defined in config_functest.yaml" + ) in excep.exception) - def test_get_parameter_from_yaml_default(self): + def test_get_param_from_yaml_def(self): with mock.patch('six.moves.builtins.open', mock.mock_open()), \ mock.patch('functest.utils.functest_utils.yaml.safe_load') \ as mock_yaml: @@ -399,28 +191,217 @@ class FunctestUtilsTesting(unittest.TestCase): self.test_file), 'test_image_name') - @mock.patch('functest.utils.functest_utils.get_parameter_from_yaml') - def test_get_functest_config_default(self, mock_get_parameter_from_yaml): - with mock.patch.dict(os.environ, - {'CONFIG_FUNCTEST_YAML': self.config_yaml}): - functest_utils.get_functest_config(self.parameter) - mock_get_parameter_from_yaml. \ - assert_called_once_with(self.parameter, - self.config_yaml) - - def test_get_functest_yaml(self): - with mock.patch('six.moves.builtins.open', mock.mock_open()), \ - mock.patch('functest.utils.functest_utils.yaml.safe_load') \ - as mock_yaml: - mock_yaml.return_value = self.file_yaml - resp = functest_utils.get_functest_yaml() - self.assertEqual(resp, self.file_yaml) - - @mock.patch('functest.utils.functest_utils.logger.info') - def test_print_separator(self, mock_logger_info): - functest_utils.print_separator() - mock_logger_info.assert_called_once_with("=======================" - "=======================") + def test_nova_version_exc1(self): + # pylint: disable=protected-access + cloud = mock.Mock() + cloud._compute_client.request.return_value = None + self.assertEqual(functest_utils.get_nova_version(cloud), None) + cloud._compute_client.request.assert_called_once_with('/', 'GET') + + def test_nova_version_exc2(self): + # pylint: disable=protected-access + cloud = mock.Mock() + cloud._compute_client.request.return_value = {"version": None} + self.assertEqual(functest_utils.get_nova_version(cloud), None) + cloud._compute_client.request.assert_called_once_with('/', 'GET') + + def test_nova_version_exc3(self): + # pylint: disable=protected-access + cloud = mock.Mock() + cloud._compute_client.request.return_value = { + "version": {"version": None}} + self.assertEqual(functest_utils.get_nova_version(cloud), None) + cloud._compute_client.request.assert_called_once_with('/', 'GET') + + def test_nova_version_exc4(self): + # pylint: disable=protected-access + cloud = mock.Mock() + cloud._compute_client.request.return_value = { + "version": {"version": "a.b"}} + self.assertEqual(functest_utils.get_nova_version(cloud), None) + cloud._compute_client.request.assert_called_once_with('/', 'GET') + + def test_nova_version(self): + # pylint: disable=protected-access + cloud = mock.Mock() + cloud._compute_client.request.return_value = { + "version": {"version": "2.1"}} + self.assertEqual(functest_utils.get_nova_version(cloud), (2, 1)) + cloud._compute_client.request.assert_called_once_with('/', 'GET') + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 61)) + def test_openstack_version1(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Rocky") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 60)) + def test_openstack_version2(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version(cloud), "Queens") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 43)) + def test_openstack_version3(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version(cloud), "Pike") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 39)) + def test_openstack_version4(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version(cloud), "Ocata") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 26)) + def test_openstack_version5(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version(cloud), "Newton") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 13)) + def test_openstack_version6(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version(cloud), "Mitaka") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 4)) + def test_openstack_version7(self, *args): + cloud = mock.Mock() + self.assertEqual( + functest_utils.get_openstack_version(cloud), "Liberty") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 1)) + def test_openstack_version8(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version(cloud), "Kilo") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(1, 9)) + def test_openstack_version9(self, *args): + cloud = mock.Mock() + self.assertEqual( + functest_utils.get_openstack_version(cloud), "Unknown") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(3, 1)) + def test_openstack_version10(self, *args): + cloud = mock.Mock() + self.assertEqual( + functest_utils.get_openstack_version(cloud), "Master") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 66)) + def test_openstack_version11(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Stein") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 78)) + def test_openstack_version12(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Train") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 87)) + def test_openstack_version13(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Ussuri") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 88)) + def test_openstack_version14(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Wallaby") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 89)) + def test_openstack_version15(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Xena") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=(2, 92)) + def test_openstack_version16(self, *args): + cloud = mock.Mock() + self.assertEqual(functest_utils.get_openstack_version( + cloud), "Zed") + args[0].assert_called_once_with(cloud) + + @mock.patch('functest.utils.functest_utils.get_nova_version', + return_value=None) + def test_openstack_version_exc(self, *args): + cloud = mock.Mock() + self.assertEqual( + functest_utils.get_openstack_version(cloud), "Unknown") + args[0].assert_called_once_with(cloud) + + def test_convert_dict_to_ini(self): + self.assertEqual( + functest_utils.convert_dict_to_ini({}), "") + self.assertEqual( + functest_utils.convert_dict_to_ini({"a": "b"}), "a:b") + value = functest_utils.convert_dict_to_ini({"a": "b", "c": "d"}) + self.assertTrue(value in ('a:b,c:d', 'c:d,a:b')) + with self.assertRaises(AssertionError): + functest_utils.convert_list_to_ini("") + + def test_convert_list_to_ini(self): + self.assertEqual( + functest_utils.convert_list_to_ini([]), "") + self.assertEqual( + functest_utils.convert_list_to_ini(["a"]), "a") + self.assertEqual( + functest_utils.convert_list_to_ini(["a", "b"]), "a,b") + with self.assertRaises(AssertionError): + functest_utils.convert_list_to_ini("") + + def test_convert_ini_to_dict(self): + self.assertEqual( + functest_utils.convert_ini_to_dict(""), {}) + self.assertEqual( + functest_utils.convert_ini_to_dict("a:b"), {"a": "b"}) + self.assertEqual( + functest_utils.convert_ini_to_dict( + "a:b,c:d"), {"a": "b", "c": "d"}) + self.assertEqual( + functest_utils.convert_ini_to_dict( + "a:b:c,d:e:f"), {"a:b": "c", "d:e": "f"}) + with self.assertRaises(AssertionError): + functest_utils.convert_list_to_ini({}) + + def test_convert_ini_to_list(self): + self.assertEqual( + functest_utils.convert_ini_to_list(""), []) + self.assertEqual( + functest_utils.convert_ini_to_list("a"), ["a"]) + self.assertEqual( + functest_utils.convert_ini_to_list("a,b"), ["a", "b"]) + with self.assertRaises(AssertionError): + functest_utils.convert_ini_to_list([]) if __name__ == "__main__": diff --git a/functest/tests/unit/utils/test_openstack_utils.py b/functest/tests/unit/utils/test_openstack_utils.py deleted file mode 100644 index 01085bb7d..000000000 --- a/functest/tests/unit/utils/test_openstack_utils.py +++ /dev/null @@ -1,1811 +0,0 @@ -#!/usr/bin/env python - -# 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 copy -import logging -import os -import unittest - -import mock - -from functest.utils import openstack_utils -from functest.utils.constants import CONST - - -class OSUtilsTesting(unittest.TestCase): - - def _get_env_cred_dict(self, os_prefix=''): - return {'OS_USERNAME': os_prefix + 'username', - 'OS_PASSWORD': os_prefix + 'password', - 'OS_AUTH_URL': os_prefix + 'auth_url', - 'OS_TENANT_NAME': os_prefix + 'tenant_name', - 'OS_USER_DOMAIN_NAME': os_prefix + 'user_domain_name', - 'OS_PROJECT_DOMAIN_NAME': os_prefix + 'project_domain_name', - 'OS_PROJECT_NAME': os_prefix + 'project_name', - 'OS_ENDPOINT_TYPE': os_prefix + 'endpoint_type', - 'OS_REGION_NAME': os_prefix + 'region_name', - 'OS_CACERT': os_prefix + 'https_cacert', - 'OS_INSECURE': os_prefix + 'https_insecure'} - - def _get_os_env_vars(self): - return {'username': 'test_username', 'password': 'test_password', - 'auth_url': 'test_auth_url', 'tenant_name': 'test_tenant_name', - 'user_domain_name': 'test_user_domain_name', - 'project_domain_name': 'test_project_domain_name', - 'project_name': 'test_project_name', - 'endpoint_type': 'test_endpoint_type', - 'region_name': 'test_region_name', - 'https_cacert': 'test_https_cacert', - 'https_insecure': 'test_https_insecure'} - - def setUp(self): - self.env_vars = ['OS_AUTH_URL', 'OS_USERNAME', 'OS_PASSWORD'] - self.tenant_name = 'test_tenant_name' - self.env_cred_dict = self._get_env_cred_dict() - self.os_environs = self._get_env_cred_dict(os_prefix='test_') - self.os_env_vars = self._get_os_env_vars() - - mock_obj = mock.Mock() - attrs = {'name': 'test_flavor', - 'id': 'flavor_id', - 'ram': 2} - mock_obj.configure_mock(**attrs) - self.flavor = mock_obj - - mock_obj = mock.Mock() - attrs = {'name': 'test_aggregate', - 'id': 'aggregate_id', - 'hosts': ['host_name']} - mock_obj.configure_mock(**attrs) - self.aggregate = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'instance_id', - 'name': 'test_instance', - 'status': 'ok'} - mock_obj.configure_mock(**attrs) - self.instance = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'azone_id', - 'zoneName': 'test_azone', - 'status': 'ok'} - mock_obj.configure_mock(**attrs) - self.availability_zone = mock_obj - - mock_obj = mock.Mock() - attrs = {'floating_network_id': 'floating_id', - 'floating_ip_address': 'test_floating_ip'} - mock_obj.configure_mock(**attrs) - self.floating_ip = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'hypervisor_id', - 'hypervisor_hostname': 'test_hostname', - 'state': 'up'} - mock_obj.configure_mock(**attrs) - self.hypervisor = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'image_id', - 'name': 'test_image'} - mock_obj.configure_mock(**attrs) - self.image = mock_obj - - mock_obj = mock.Mock() - self.mock_return = mock_obj - - self.nova_client = mock.Mock() - attrs = {'servers.list.return_value': [self.instance], - 'servers.get.return_value': self.instance, - 'servers.find.return_value': self.instance, - 'servers.create.return_value': self.instance, - 'flavors.list.return_value': [self.flavor], - 'flavors.find.return_value': self.flavor, - 'servers.add_floating_ip.return_value': mock.Mock(), - 'servers.force_delete.return_value': mock.Mock(), - 'aggregates.list.return_value': [self.aggregate], - 'aggregates.add_host.return_value': mock.Mock(), - 'aggregates.remove_host.return_value': mock.Mock(), - 'aggregates.get.return_value': self.aggregate, - 'aggregates.delete.return_value': mock.Mock(), - 'availability_zones.list.return_value': - [self.availability_zone], - 'hypervisors.list.return_value': [self.hypervisor], - 'create.return_value': mock.Mock(), - 'add_security_group.return_value': mock.Mock(), - 'images.list.return_value': [self.image], - 'images.delete.return_value': mock.Mock(), - } - self.nova_client.configure_mock(**attrs) - - self.glance_client = mock.Mock() - attrs = {'images.list.return_value': [self.image], - 'images.create.return_value': self.image, - 'images.upload.return_value': mock.Mock()} - self.glance_client.configure_mock(**attrs) - - mock_obj = mock.Mock() - attrs = {'id': 'volume_id', - 'name': 'test_volume'} - mock_obj.configure_mock(**attrs) - self.volume = mock_obj - - self.cinder_client = mock.Mock() - attrs = {'volumes.list.return_value': [self.volume], - 'quotas.update.return_value': mock.Mock(), - 'volumes.detach.return_value': mock.Mock(), - 'volumes.force_delete.return_value': mock.Mock(), - 'volumes.delete.return_value': mock.Mock() - } - self.cinder_client.configure_mock(**attrs) - - self.resource = mock.Mock() - attrs = {'id': 'resource_test_id', - 'name': 'resource_test_name' - } - - self.heat_client = mock.Mock() - attrs = {'resources.get.return_value': self.resource} - self.heat_client.configure_mock(**attrs) - - mock_obj = mock.Mock() - attrs = {'id': 'tenant_id', - 'name': 'test_tenant'} - mock_obj.configure_mock(**attrs) - self.tenant = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'user_id', - 'name': 'test_user'} - mock_obj.configure_mock(**attrs) - self.user = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'role_id', - 'name': 'test_role'} - mock_obj.configure_mock(**attrs) - self.role = mock_obj - - mock_obj = mock.Mock() - attrs = {'id': 'domain_id', - 'name': 'test_domain'} - mock_obj.configure_mock(**attrs) - self.domain = mock_obj - - self.keystone_client = mock.Mock() - attrs = {'projects.list.return_value': [self.tenant], - 'tenants.list.return_value': [self.tenant], - 'users.list.return_value': [self.user], - 'roles.list.return_value': [self.role], - 'domains.list.return_value': [self.domain], - 'projects.create.return_value': self.tenant, - 'tenants.create.return_value': self.tenant, - 'users.create.return_value': self.user, - 'roles.grant.return_value': mock.Mock(), - 'roles.add_user_role.return_value': mock.Mock(), - 'projects.delete.return_value': mock.Mock(), - 'tenants.delete.return_value': mock.Mock(), - 'users.delete.return_value': mock.Mock(), - } - self.keystone_client.configure_mock(**attrs) - - self.router = {'id': 'router_id', - 'name': 'test_router'} - - self.subnet = {'id': 'subnet_id', - 'name': 'test_subnet'} - - self.networks = [{'id': 'network_id', - 'name': 'test_network', - 'router:external': False, - 'shared': True, - 'subnets': [self.subnet]}, - {'id': 'network_id1', - 'name': 'test_network1', - 'router:external': True, - 'shared': True, - 'subnets': [self.subnet]}] - - self.port = {'id': 'port_id', - 'name': 'test_port'} - - self.sec_group = {'id': 'sec_group_id', - 'name': 'test_sec_group'} - - self.sec_group_rule = {'id': 'sec_group_rule_id', - 'direction': 'direction', - 'protocol': 'protocol', - 'port_range_max': 'port_max', - 'security_group_id': self.sec_group['id'], - 'port_range_min': 'port_min'} - self.neutron_floatingip = {'id': 'fip_id', - 'floating_ip_address': 'test_ip'} - self.neutron_client = mock.Mock() - attrs = {'list_networks.return_value': {'networks': self.networks}, - 'list_routers.return_value': {'routers': [self.router]}, - 'list_ports.return_value': {'ports': [self.port]}, - 'list_subnets.return_value': {'subnets': [self.subnet]}, - 'create_network.return_value': {'network': self.networks[0]}, - 'create_subnet.return_value': {'subnets': [self.subnet]}, - 'create_router.return_value': {'router': self.router}, - 'create_port.return_value': {'port': self.port}, - 'create_floatingip.return_value': {'floatingip': - self.neutron_floatingip}, - 'update_network.return_value': mock.Mock(), - 'update_port.return_value': {'port': self.port}, - 'add_interface_router.return_value': mock.Mock(), - 'add_gateway_router.return_value': mock.Mock(), - 'delete_network.return_value': mock.Mock(), - 'delete_subnet.return_value': mock.Mock(), - 'delete_router.return_value': mock.Mock(), - 'delete_port.return_value': mock.Mock(), - 'remove_interface_router.return_value': mock.Mock(), - 'remove_gateway_router.return_value': mock.Mock(), - 'list_security_groups.return_value': {'security_groups': - [self.sec_group]}, - 'list_security_group_rules.' - 'return_value': {'security_group_rules': - [self.sec_group_rule]}, - 'create_security_group_rule.return_value': mock.Mock(), - 'create_security_group.return_value': {'security_group': - self.sec_group}, - 'update_quota.return_value': mock.Mock(), - 'delete_security_group.return_value': mock.Mock(), - 'list_floatingips.return_value': {'floatingips': - [self.floating_ip]}, - 'delete_floatingip.return_value': mock.Mock(), - } - self.neutron_client.configure_mock(**attrs) - - self.empty_client = mock.Mock() - attrs = {'list_networks.return_value': {'networks': []}, - 'list_routers.return_value': {'routers': []}, - 'list_ports.return_value': {'ports': []}, - 'list_subnets.return_value': {'subnets': []}} - self.empty_client.configure_mock(**attrs) - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_is_keystone_v3_missing_identity(self, mock_os_getenv): - self.assertEqual(openstack_utils.is_keystone_v3(), False) - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='3') - def test_is_keystone_v3_default(self, mock_os_getenv): - self.assertEqual(openstack_utils.is_keystone_v3(), True) - - @mock.patch('functest.utils.openstack_utils.is_keystone_v3', - return_value=False) - def test_get_rc_env_vars_missing_identity(self, mock_get_rc_env): - exp_resp = self.env_vars - exp_resp.extend(['OS_TENANT_NAME']) - self.assertEqual(openstack_utils.get_rc_env_vars(), exp_resp) - - @mock.patch('functest.utils.openstack_utils.is_keystone_v3', - return_value=True) - def test_get_rc_env_vars_default(self, mock_get_rc_env): - exp_resp = self.env_vars - exp_resp.extend(['OS_PROJECT_NAME', - 'OS_USER_DOMAIN_NAME', - 'OS_PROJECT_DOMAIN_NAME']) - self.assertEqual(openstack_utils.get_rc_env_vars(), exp_resp) - - @mock.patch('functest.utils.openstack_utils.get_rc_env_vars') - def test_check_credentials_missing_env(self, mock_get_rc_env): - exp_resp = self.env_vars - exp_resp.extend(['OS_TENANT_NAME']) - mock_get_rc_env.return_value = exp_resp - with mock.patch.dict('functest.utils.openstack_utils.os.environ', {}, - clear=True): - self.assertEqual(openstack_utils.check_credentials(), False) - - @mock.patch('functest.utils.openstack_utils.get_rc_env_vars') - def test_check_credentials_default(self, mock_get_rc_env): - exp_resp = ['OS_TENANT_NAME'] - mock_get_rc_env.return_value = exp_resp - with mock.patch.dict('functest.utils.openstack_utils.os.environ', - {'OS_TENANT_NAME': self.tenant_name}, - clear=True): - self.assertEqual(openstack_utils.check_credentials(), True) - - def test_get_env_cred_dict(self): - self.assertDictEqual(openstack_utils.get_env_cred_dict(), - self.env_cred_dict) - - @mock.patch('functest.utils.openstack_utils.get_rc_env_vars') - def test_get_credentials_default(self, mock_get_rc_env): - mock_get_rc_env.return_value = self.env_cred_dict.keys() - with mock.patch.dict('functest.utils.openstack_utils.os.environ', - self.os_environs, - clear=True): - self.assertDictEqual(openstack_utils.get_credentials(), - self.os_env_vars) - - def _get_credentials_missing_env(self, var): - dic = copy.deepcopy(self.os_environs) - dic.pop(var) - with mock.patch('functest.utils.openstack_utils.get_rc_env_vars', - return_value=self.env_cred_dict.keys()), \ - mock.patch.dict('functest.utils.openstack_utils.os.environ', - dic, - clear=True): - self.assertRaises(openstack_utils.MissingEnvVar, - lambda: openstack_utils.get_credentials()) - - def test_get_credentials_missing_username(self): - self._get_credentials_missing_env('OS_USERNAME') - - def test_get_credentials_missing_password(self): - self._get_credentials_missing_env('OS_PASSWORD') - - def test_get_credentials_missing_auth_url(self): - self._get_credentials_missing_env('OS_AUTH_URL') - - def test_get_credentials_missing_tenantname(self): - self._get_credentials_missing_env('OS_TENANT_NAME') - - def test_get_credentials_missing_domainname(self): - self._get_credentials_missing_env('OS_USER_DOMAIN_NAME') - - def test_get_credentials_missing_projectname(self): - self._get_credentials_missing_env('OS_PROJECT_NAME') - - def test_get_credentials_missing_endpoint_type(self): - self._get_credentials_missing_env('OS_ENDPOINT_TYPE') - - def _test_source_credentials(self, msg, key='OS_TENANT_NAME', - value='admin'): - try: - del os.environ[key] - except: - pass - f = 'rc_file' - with mock.patch('six.moves.builtins.open', - mock.mock_open(read_data=msg), - create=True) as m: - m.return_value.__iter__ = lambda self: iter(self.readline, '') - openstack_utils.source_credentials(f) - m.assert_called_once_with(f, 'r') - self.assertEqual(os.environ[key], value) - - def test_source_credentials(self): - self._test_source_credentials('OS_TENANT_NAME=admin') - self._test_source_credentials('OS_TENANT_NAME= admin') - self._test_source_credentials('OS_TENANT_NAME = admin') - self._test_source_credentials('OS_TENANT_NAME = "admin"') - self._test_source_credentials('export OS_TENANT_NAME=admin') - self._test_source_credentials('export OS_TENANT_NAME =admin') - self._test_source_credentials('export OS_TENANT_NAME = admin') - self._test_source_credentials('export OS_TENANT_NAME = "admin"') - # This test will fail as soon as rc_file is fixed - self._test_source_credentials( - 'export "\'OS_TENANT_NAME\'" = "\'admin\'"') - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_get_keystone_client_version_missing_env(self, mock_os_getenv): - self.assertEqual(openstack_utils.get_keystone_client_version(), - openstack_utils.DEFAULT_API_VERSION) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='3') - def test_get_keystone_client_version_default(self, mock_os_getenv, - mock_logger_info): - self.assertEqual(openstack_utils.get_keystone_client_version(), - '3') - mock_logger_info.assert_called_once_with("OS_IDENTITY_API_VERSION is " - "set in env as '%s'", '3') - - @mock.patch('functest.utils.openstack_utils.get_session') - @mock.patch('functest.utils.openstack_utils.keystoneclient.Client') - @mock.patch('functest.utils.openstack_utils.get_keystone_client_version', - return_value='3') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='public') - def test_get_keystone_client_with_interface(self, mock_os_getenv, - mock_keystoneclient_version, - mock_key_client, - mock_get_session): - mock_keystone_obj = mock.Mock() - mock_session_obj = mock.Mock() - mock_key_client.return_value = mock_keystone_obj - mock_get_session.return_value = mock_session_obj - self.assertEqual(openstack_utils.get_keystone_client(), - mock_keystone_obj) - mock_key_client.assert_called_once_with('3', - session=mock_session_obj, - interface='public') - - @mock.patch('functest.utils.openstack_utils.get_session') - @mock.patch('functest.utils.openstack_utils.keystoneclient.Client') - @mock.patch('functest.utils.openstack_utils.get_keystone_client_version', - return_value='3') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='admin') - def test_get_keystone_client_no_interface(self, mock_os_getenv, - mock_keystoneclient_version, - mock_key_client, - mock_get_session): - mock_keystone_obj = mock.Mock() - mock_session_obj = mock.Mock() - mock_key_client.return_value = mock_keystone_obj - mock_get_session.return_value = mock_session_obj - self.assertEqual(openstack_utils.get_keystone_client(), - mock_keystone_obj) - mock_key_client.assert_called_once_with('3', - session=mock_session_obj, - interface='admin') - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_get_nova_client_version_missing_env(self, mock_os_getenv): - self.assertEqual(openstack_utils.get_nova_client_version(), - openstack_utils.DEFAULT_API_VERSION) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='3') - def test_get_nova_client_version_default(self, mock_os_getenv, - mock_logger_info): - self.assertEqual(openstack_utils.get_nova_client_version(), - '3') - mock_logger_info.assert_called_once_with("OS_COMPUTE_API_VERSION is " - "set in env as '%s'", '3') - - def test_get_nova_client(self): - mock_nova_obj = mock.Mock() - mock_session_obj = mock.Mock() - with mock.patch('functest.utils.openstack_utils' - '.get_nova_client_version', return_value='3'), \ - mock.patch('functest.utils.openstack_utils' - '.novaclient.Client', - return_value=mock_nova_obj) \ - as mock_nova_client, \ - mock.patch('functest.utils.openstack_utils.get_session', - return_value=mock_session_obj): - self.assertEqual(openstack_utils.get_nova_client(), - mock_nova_obj) - mock_nova_client.assert_called_once_with('3', - session=mock_session_obj) - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_get_cinder_client_version_missing_env(self, mock_os_getenv): - self.assertEqual(openstack_utils.get_cinder_client_version(), - openstack_utils.DEFAULT_API_VERSION) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='3') - def test_get_cinder_client_version_default(self, mock_os_getenv, - mock_logger_info): - self.assertEqual(openstack_utils.get_cinder_client_version(), - '3') - mock_logger_info.assert_called_once_with("OS_VOLUME_API_VERSION is " - "set in env as '%s'", '3') - - def test_get_cinder_client(self): - mock_cinder_obj = mock.Mock() - mock_session_obj = mock.Mock() - with mock.patch('functest.utils.openstack_utils' - '.get_cinder_client_version', return_value='3'), \ - mock.patch('functest.utils.openstack_utils' - '.cinderclient.Client', - return_value=mock_cinder_obj) \ - as mock_cind_client, \ - mock.patch('functest.utils.openstack_utils.get_session', - return_value=mock_session_obj): - self.assertEqual(openstack_utils.get_cinder_client(), - mock_cinder_obj) - mock_cind_client.assert_called_once_with('3', - session=mock_session_obj) - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_get_neutron_client_version_missing_env(self, mock_os_getenv): - self.assertEqual(openstack_utils.get_neutron_client_version(), - openstack_utils.DEFAULT_API_VERSION) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='3') - def test_get_neutron_client_version_default(self, mock_os_getenv, - mock_logger_info): - self.assertEqual(openstack_utils.get_neutron_client_version(), - '3') - mock_logger_info.assert_called_once_with("OS_NETWORK_API_VERSION is " - "set in env as '%s'", '3') - - def test_get_neutron_client(self): - mock_neutron_obj = mock.Mock() - mock_session_obj = mock.Mock() - with mock.patch('functest.utils.openstack_utils' - '.get_neutron_client_version', return_value='3'), \ - mock.patch('functest.utils.openstack_utils' - '.neutronclient.Client', - return_value=mock_neutron_obj) \ - as mock_neut_client, \ - mock.patch('functest.utils.openstack_utils.get_session', - return_value=mock_session_obj): - self.assertEqual(openstack_utils.get_neutron_client(), - mock_neutron_obj) - mock_neut_client.assert_called_once_with('3', - session=mock_session_obj) - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_get_glance_client_version_missing_env(self, mock_os_getenv): - self.assertEqual(openstack_utils.get_glance_client_version(), - openstack_utils.DEFAULT_API_VERSION) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value='3') - def test_get_glance_client_version_default(self, mock_os_getenv, - mock_logger_info): - self.assertEqual(openstack_utils.get_glance_client_version(), - '3') - mock_logger_info.assert_called_once_with("OS_IMAGE_API_VERSION is " - "set in env as '%s'", '3') - - def test_get_glance_client(self): - mock_glance_obj = mock.Mock() - mock_session_obj = mock.Mock() - with mock.patch('functest.utils.openstack_utils' - '.get_glance_client_version', return_value='3'), \ - mock.patch('functest.utils.openstack_utils' - '.glanceclient.Client', - return_value=mock_glance_obj) \ - as mock_glan_client, \ - mock.patch('functest.utils.openstack_utils.get_session', - return_value=mock_session_obj): - self.assertEqual(openstack_utils.get_glance_client(), - mock_glance_obj) - mock_glan_client.assert_called_once_with('3', - session=mock_session_obj) - - @mock.patch('functest.utils.openstack_utils.os.getenv', - return_value=None) - def test_get_heat_client_version_missing_env(self, mock_os_getenv): - self.assertEqual(openstack_utils.get_heat_client_version(), - openstack_utils.DEFAULT_HEAT_API_VERSION) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.os.getenv', return_value='1') - def test_get_heat_client_version_default(self, mock_os_getenv, - mock_logger_info): - self.assertEqual(openstack_utils.get_heat_client_version(), '1') - mock_logger_info.assert_called_once_with( - "OS_ORCHESTRATION_API_VERSION is set in env as '%s'", '1') - - def test_get_heat_client(self): - mock_heat_obj = mock.Mock() - mock_session_obj = mock.Mock() - with mock.patch('functest.utils.openstack_utils' - '.get_heat_client_version', return_value='1'), \ - mock.patch('functest.utils.openstack_utils' - '.heatclient.Client', - return_value=mock_heat_obj) \ - as mock_heat_client, \ - mock.patch('functest.utils.openstack_utils.get_session', - return_value=mock_session_obj): - self.assertEqual(openstack_utils.get_heat_client(), - mock_heat_obj) - mock_heat_client.assert_called_once_with('1', - session=mock_session_obj) - - def test_get_instances_default(self): - self.assertEqual(openstack_utils.get_instances(self.nova_client), - [self.instance]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_instances_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_instances(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_instance_status_default(self): - self.assertEqual(openstack_utils.get_instance_status(self.nova_client, - self.instance), - 'ok') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_instance_status_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_instance_status(Exception, - self.instance), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_instance_by_name_default(self): - self.assertEqual(openstack_utils. - get_instance_by_name(self.nova_client, - 'test_instance'), - self.instance) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_instance_by_name_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_instance_by_name(Exception, - 'test_instance'), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_flavor_id_default(self): - self.assertEqual(openstack_utils. - get_flavor_id(self.nova_client, - 'test_flavor'), - self.flavor.id) - - def test_get_flavor_id_by_ram_range_default(self): - self.assertEqual(openstack_utils. - get_flavor_id_by_ram_range(self.nova_client, - 1, 3), - self.flavor.id) - - def test_get_aggregates_default(self): - self.assertEqual(openstack_utils. - get_aggregates(self.nova_client), - [self.aggregate]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_aggregates_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_aggregates(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_aggregate_id_default(self): - with mock.patch('functest.utils.openstack_utils.get_aggregates', - return_value=[self.aggregate]): - self.assertEqual(openstack_utils. - get_aggregate_id(self.nova_client, - 'test_aggregate'), - 'aggregate_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_aggregate_id_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_aggregate_id(Exception, - 'test_aggregate'), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_availability_zone_names_default(self): - with mock.patch('functest.utils.openstack_utils' - '.get_availability_zones', - return_value=[self.availability_zone]): - self.assertEqual(openstack_utils. - get_availability_zone_names(self.nova_client), - ['test_azone']) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_availability_zone_names_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_availability_zone_names(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_availability_zones_default(self): - self.assertEqual(openstack_utils. - get_availability_zones(self.nova_client), - [self.availability_zone]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_availability_zones_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_availability_zones(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_floating_ips_default(self): - self.assertEqual(openstack_utils. - get_floating_ips(self.neutron_client), - [self.floating_ip]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_floating_ips_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_floating_ips(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_hypervisors_default(self): - self.assertEqual(openstack_utils. - get_hypervisors(self.nova_client), - ['test_hostname']) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_hypervisors_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_hypervisors(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_aggregate_default(self): - self.assertTrue(openstack_utils. - create_aggregate(self.nova_client, - 'test_aggregate', - 'azone')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_aggregate_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_aggregate(Exception, - 'test_aggregate', - 'azone'), - None) - self.assertTrue(mock_logger_error.called) - - def test_add_host_to_aggregate_default(self): - with mock.patch('functest.utils.openstack_utils.get_aggregate_id'): - self.assertTrue(openstack_utils. - add_host_to_aggregate(self.nova_client, - 'test_aggregate', - 'test_hostname')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_add_host_to_aggregate_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - add_host_to_aggregate(Exception, - 'test_aggregate', - 'test_hostname'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_aggregate_with_host_default(self): - with mock.patch('functest.utils.openstack_utils.create_aggregate'), \ - mock.patch('functest.utils.openstack_utils.' - 'add_host_to_aggregate'): - self.assertTrue(openstack_utils. - create_aggregate_with_host(self.nova_client, - 'test_aggregate', - 'test_azone', - 'test_hostname')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_aggregate_with_host_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.create_aggregate', - side_effect=Exception): - self.assertEqual(openstack_utils. - create_aggregate_with_host(Exception, - 'test_aggregate', - 'test_azone', - 'test_hostname'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_instance_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_nova_client', - return_value=self.nova_client): - self.assertEqual(openstack_utils. - create_instance('test_flavor', - 'image_id', - 'network_id'), - self.instance) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_instance_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'get_nova_client', - return_value=self.nova_client): - self.nova_client.flavors.find.side_effect = Exception - self.assertEqual(openstack_utils. - create_instance('test_flavor', - 'image_id', - 'network_id'), - None) - self.assertTrue(mock_logger_error) - - def test_create_floating_ip_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_external_net_id', - return_value='external_net_id'): - exp_resp = {'fip_addr': 'test_ip', 'fip_id': 'fip_id'} - self.assertEqual(openstack_utils. - create_floating_ip(self.neutron_client), - exp_resp) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_floating_ip_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'get_external_net_id', - return_value='external_net_id'): - self.assertEqual(openstack_utils. - create_floating_ip(Exception), - None) - self.assertTrue(mock_logger_error) - - def test_add_floating_ip_default(self): - with mock.patch('functest.utils.openstack_utils.get_aggregate_id'): - self.assertTrue(openstack_utils. - add_floating_ip(self.nova_client, - 'test_serverid', - 'test_floatingip_addr')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_add_floating_ip_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - add_floating_ip(Exception, - 'test_serverid', - 'test_floatingip_addr')) - self.assertTrue(mock_logger_error.called) - - def test_delete_instance_default(self): - self.assertTrue(openstack_utils. - delete_instance(self.nova_client, - 'instance_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_instance_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_instance(Exception, - 'instance_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_floating_ip_default(self): - self.assertTrue(openstack_utils. - delete_floating_ip(self.neutron_client, - 'floating_ip_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_floating_ip_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_floating_ip(Exception, - 'floating_ip_id')) - self.assertTrue(mock_logger_error.called) - - def test_remove_host_from_aggregate_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_aggregate_id'): - self.assertTrue(openstack_utils. - remove_host_from_aggregate(self.nova_client, - 'agg_name', - 'host_name')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_remove_host_from_aggregate_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'get_aggregate_id', side_effect=Exception): - self.assertFalse(openstack_utils. - remove_host_from_aggregate(self.nova_client, - 'agg_name', - 'host_name')) - self.assertTrue(mock_logger_error.called) - - def test_remove_hosts_from_aggregate_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_aggregate_id'), \ - mock.patch('functest.utils.openstack_utils.' - 'remove_host_from_aggregate', - return_value=True) \ - as mock_method: - openstack_utils.remove_hosts_from_aggregate(self.nova_client, - 'test_aggregate') - mock_method.assert_any_call(self.nova_client, - 'test_aggregate', - 'host_name') - - def test_delete_aggregate_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'remove_hosts_from_aggregate'): - self.assertTrue(openstack_utils. - delete_aggregate(self.nova_client, - 'agg_name')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_aggregate_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'remove_hosts_from_aggregate', side_effect=Exception): - self.assertFalse(openstack_utils. - delete_aggregate(self.nova_client, - 'agg_name')) - self.assertTrue(mock_logger_error.called) - - def test_get_network_list_default(self): - self.assertEqual(openstack_utils. - get_network_list(self.neutron_client), - self.networks) - - def test_get_network_list_missing_network(self): - self.assertEqual(openstack_utils. - get_network_list(self.empty_client), - None) - - def test_get_router_list_default(self): - self.assertEqual(openstack_utils. - get_router_list(self.neutron_client), - [self.router]) - - def test_get_router_list_missing_router(self): - self.assertEqual(openstack_utils. - get_router_list(self.empty_client), - None) - - def test_get_port_list_default(self): - self.assertEqual(openstack_utils. - get_port_list(self.neutron_client), - [self.port]) - - def test_get_port_list_missing_port(self): - self.assertEqual(openstack_utils. - get_port_list(self.empty_client), - None) - - def test_get_network_id_default(self): - self.assertEqual(openstack_utils. - get_network_id(self.neutron_client, - 'test_network'), - 'network_id') - - def test_get_subnet_id_default(self): - self.assertEqual(openstack_utils. - get_subnet_id(self.neutron_client, - 'test_subnet'), - 'subnet_id') - - def test_get_router_id_default(self): - self.assertEqual(openstack_utils. - get_router_id(self.neutron_client, - 'test_router'), - 'router_id') - - def test_get_private_net_default(self): - self.assertEqual(openstack_utils. - get_private_net(self.neutron_client), - self.networks[0]) - - def test_get_private_net_missing_net(self): - self.assertEqual(openstack_utils. - get_private_net(self.empty_client), - None) - - def test_get_external_net_default(self): - self.assertEqual(openstack_utils. - get_external_net(self.neutron_client), - 'test_network1') - - def test_get_external_net_missing_net(self): - self.assertEqual(openstack_utils. - get_external_net(self.empty_client), - None) - - def test_get_external_net_id_default(self): - self.assertEqual(openstack_utils. - get_external_net_id(self.neutron_client), - 'network_id1') - - def test_get_external_net_id_missing_net(self): - self.assertEqual(openstack_utils. - get_external_net_id(self.empty_client), - None) - - def test_check_neutron_net_default(self): - self.assertTrue(openstack_utils. - check_neutron_net(self.neutron_client, - 'test_network')) - - def test_check_neutron_net_missing_net(self): - self.assertFalse(openstack_utils. - check_neutron_net(self.empty_client, - 'test_network')) - - def test_create_neutron_net_default(self): - self.assertEqual(openstack_utils. - create_neutron_net(self.neutron_client, - 'test_network'), - 'network_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_neutron_net_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_neutron_net(Exception, - 'test_network'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_neutron_subnet_default(self): - self.assertEqual(openstack_utils. - create_neutron_subnet(self.neutron_client, - 'test_subnet', - 'test_cidr', - 'network_id'), - 'subnet_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_neutron_subnet_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_neutron_subnet(Exception, - 'test_subnet', - 'test_cidr', - 'network_id'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_neutron_router_default(self): - self.assertEqual(openstack_utils. - create_neutron_router(self.neutron_client, - 'test_router'), - 'router_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_neutron_router_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_neutron_router(Exception, - 'test_router'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_neutron_port_default(self): - self.assertEqual(openstack_utils. - create_neutron_port(self.neutron_client, - 'test_port', - 'network_id', - 'test_ip'), - 'port_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_neutron_port_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_neutron_port(Exception, - 'test_port', - 'network_id', - 'test_ip'), - None) - self.assertTrue(mock_logger_error.called) - - def test_update_neutron_net_default(self): - self.assertTrue(openstack_utils. - update_neutron_net(self.neutron_client, - 'network_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_update_neutron_net_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - update_neutron_net(Exception, - 'network_id')) - self.assertTrue(mock_logger_error.called) - - def test_update_neutron_port_default(self): - self.assertEqual(openstack_utils. - update_neutron_port(self.neutron_client, - 'port_id', - 'test_owner'), - 'port_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_update_neutron_port_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - update_neutron_port(Exception, - 'port_id', - 'test_owner'), - None) - self.assertTrue(mock_logger_error.called) - - def test_add_interface_router_default(self): - self.assertTrue(openstack_utils. - add_interface_router(self.neutron_client, - 'router_id', - 'subnet_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_add_interface_router_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - add_interface_router(Exception, - 'router_id', - 'subnet_id')) - self.assertTrue(mock_logger_error.called) - - def test_add_gateway_router_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_external_net_id', - return_value='network_id'): - self.assertTrue(openstack_utils. - add_gateway_router(self.neutron_client, - 'router_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_add_gateway_router_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'get_external_net_id', - return_value='network_id'): - self.assertFalse(openstack_utils. - add_gateway_router(Exception, - 'router_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_neutron_net_default(self): - self.assertTrue(openstack_utils. - delete_neutron_net(self.neutron_client, - 'network_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_neutron_net_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_neutron_net(Exception, - 'network_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_neutron_subnet_default(self): - self.assertTrue(openstack_utils. - delete_neutron_subnet(self.neutron_client, - 'subnet_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_neutron_subnet_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_neutron_subnet(Exception, - 'subnet_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_neutron_router_default(self): - self.assertTrue(openstack_utils. - delete_neutron_router(self.neutron_client, - 'router_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_neutron_router_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_neutron_router(Exception, - 'router_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_neutron_port_default(self): - self.assertTrue(openstack_utils. - delete_neutron_port(self.neutron_client, - 'port_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_neutron_port_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_neutron_port(Exception, - 'port_id')) - self.assertTrue(mock_logger_error.called) - - def test_remove_interface_router_default(self): - self.assertTrue(openstack_utils. - remove_interface_router(self.neutron_client, - 'router_id', - 'subnet_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_remove_interface_router_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - remove_interface_router(Exception, - 'router_id', - 'subnet_id')) - self.assertTrue(mock_logger_error.called) - - def test_remove_gateway_router_default(self): - self.assertTrue(openstack_utils. - remove_gateway_router(self.neutron_client, - 'router_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_remove_gateway_router_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - remove_gateway_router(Exception, - 'router_id')) - self.assertTrue(mock_logger_error.called) - - def test_get_security_groups_default(self): - self.assertEqual(openstack_utils. - get_security_groups(self.neutron_client), - [self.sec_group]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_security_groups_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_security_groups(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_security_group_id_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_security_groups', - return_value=[self.sec_group]): - self.assertEqual(openstack_utils. - get_security_group_id(self.neutron_client, - 'test_sec_group'), - 'sec_group_id') - - def test_get_security_group_rules_default(self): - self.assertEqual(openstack_utils. - get_security_group_rules(self.neutron_client, - self.sec_group['id']), - [self.sec_group_rule]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_security_group_rules_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_security_group_rules(Exception, - 'sec_group_id'), - None) - self.assertTrue(mock_logger_error.called) - - def test_check_security_group_rules_not_exists(self): - self.assertEqual(openstack_utils. - check_security_group_rules(self.neutron_client, - 'sec_group_id_2', - 'direction', - 'protocol', - 'port_min', - 'port_max'), - True) - - def test_check_security_group_rules_exists(self): - self.assertEqual(openstack_utils. - check_security_group_rules(self.neutron_client, - self.sec_group['id'], - 'direction', - 'protocol', - 'port_min', - 'port_max'), - False) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_check_security_group_rules_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - check_security_group_rules(Exception, - 'sec_group_id', - 'direction', - 'protocol', - 'port_max', - 'port_min'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_security_group_default(self): - self.assertEqual(openstack_utils. - create_security_group(self.neutron_client, - 'test_sec_group', - 'sec_group_desc'), - self.sec_group) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_security_group_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_security_group(Exception, - 'test_sec_group', - 'sec_group_desc'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_secgroup_rule_default(self): - self.assertTrue(openstack_utils. - create_secgroup_rule(self.neutron_client, - 'sg_id', - 'direction', - 'protocol', - 80, - 80)) - self.assertTrue(openstack_utils. - create_secgroup_rule(self.neutron_client, - 'sg_id', - 'direction', - 'protocol')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_secgroup_rule_invalid_port_range(self, mock_logger_error): - self.assertFalse(openstack_utils. - create_secgroup_rule(self.neutron_client, - 'sg_id', - 'direction', - 'protocol', - 80)) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_secgroup_rule_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - create_secgroup_rule(Exception, - 'sg_id', - 'direction', - 'protocol')) - - @mock.patch('functest.utils.openstack_utils.logger.info') - def test_create_security_group_full_default(self, mock_logger_info): - with mock.patch('functest.utils.openstack_utils.' - 'get_security_group_id', - return_value='sg_id'): - self.assertEqual(openstack_utils. - create_security_group_full(self.neutron_client, - 'sg_name', - 'sg_desc'), - 'sg_id') - self.assertTrue(mock_logger_info) - - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_security_group_full_sec_group_fail(self, - mock_logger_error, - mock_logger_info): - with mock.patch('functest.utils.openstack_utils.' - 'get_security_group_id', - return_value=''), \ - mock.patch('functest.utils.openstack_utils.' - 'create_security_group', - return_value=False): - self.assertEqual(openstack_utils. - create_security_group_full(self.neutron_client, - 'sg_name', - 'sg_desc'), - None) - self.assertTrue(mock_logger_error) - self.assertTrue(mock_logger_info) - - @mock.patch('functest.utils.openstack_utils.logger.debug') - @mock.patch('functest.utils.openstack_utils.logger.info') - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_security_group_full_secgroup_rule_fail(self, - mock_logger_error, - mock_logger_info, - mock_logger_debug): - with mock.patch('functest.utils.openstack_utils.' - 'get_security_group_id', - return_value=''), \ - mock.patch('functest.utils.openstack_utils.' - 'create_security_group', - return_value={'id': 'sg_id', - 'name': 'sg_name'}), \ - mock.patch('functest.utils.openstack_utils.' - 'create_secgroup_rule', - return_value=False): - self.assertEqual(openstack_utils. - create_security_group_full(self.neutron_client, - 'sg_name', - 'sg_desc'), - None) - self.assertTrue(mock_logger_error) - self.assertTrue(mock_logger_info) - self.assertTrue(mock_logger_debug) - - def test_add_secgroup_to_instance_default(self): - self.assertTrue(openstack_utils. - add_secgroup_to_instance(self.nova_client, - 'instance_id', - 'sec_group_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_add_secgroup_to_instance_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - add_secgroup_to_instance(Exception, - 'instance_id', - 'sec_group_id')) - self.assertTrue(mock_logger_error.called) - - def test_update_sg_quota_default(self): - self.assertTrue(openstack_utils. - update_sg_quota(self.neutron_client, - 'tenant_id', - 'sg_quota', - 'sg_rule_quota')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_update_sg_quota_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - update_sg_quota(Exception, - 'tenant_id', - 'sg_quota', - 'sg_rule_quota')) - self.assertTrue(mock_logger_error.called) - - def test_delete_security_group_default(self): - self.assertTrue(openstack_utils. - delete_security_group(self.neutron_client, - 'sec_group_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_security_group_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_security_group(Exception, - 'sec_group_id')) - self.assertTrue(mock_logger_error.called) - - def test_get_images_default(self): - self.assertEqual(openstack_utils. - get_images(self.glance_client), - [self.image]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_images_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_images(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_image_id_default(self): - self.assertEqual(openstack_utils. - get_image_id(self.glance_client, - 'test_image'), - 'image_id') - - # create_glance_image, get_or_create_image - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_glance_image_file_present(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'os.path.isfile', - return_value=False): - self.assertEqual(openstack_utils. - create_glance_image(self.glance_client, - 'test_image', - 'file_path'), - None) - self.assertTrue(mock_logger_error.called) - - @mock.patch('functest.utils.openstack_utils.logger.info') - def test_create_glance_image_already_exist(self, mock_logger_info): - with mock.patch('functest.utils.openstack_utils.' - 'os.path.isfile', - return_value=True), \ - mock.patch('functest.utils.openstack_utils.get_image_id', - return_value='image_id'): - self.assertEqual(openstack_utils. - create_glance_image(self.glance_client, - 'test_image', - 'file_path'), - 'image_id') - self.assertTrue(mock_logger_info.called) - - @mock.patch('functest.utils.openstack_utils.logger.info') - def test_create_glance_image_default(self, mock_logger_info): - with mock.patch('functest.utils.openstack_utils.' - 'os.path.isfile', - return_value=True), \ - mock.patch('functest.utils.openstack_utils.get_image_id', - return_value=''), \ - mock.patch('six.moves.builtins.open', - mock.mock_open(read_data='1')) as m: - self.assertEqual(openstack_utils. - create_glance_image(self.glance_client, - 'test_image', - 'file_path'), - 'image_id') - m.assert_called_once_with('file_path') - self.assertTrue(mock_logger_info.called) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_glance_image_exception(self, mock_logger_error): - with mock.patch('functest.utils.openstack_utils.' - 'os.path.isfile', - return_value=True), \ - mock.patch('functest.utils.openstack_utils.get_image_id', - side_effect=Exception): - self.assertEqual(openstack_utils. - create_glance_image(self.glance_client, - 'test_image', - 'file_path'), - None) - self.assertTrue(mock_logger_error.called) - - def test_delete_glance_image_default(self): - self.assertTrue(openstack_utils. - delete_glance_image(self.nova_client, - 'image_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_glance_image_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_glance_image(Exception, - 'image_id')) - self.assertTrue(mock_logger_error.called) - - def test_get_volumes_default(self): - self.assertEqual(openstack_utils. - get_volumes(self.cinder_client), - [self.volume]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_volumes_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_volumes(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_update_cinder_quota_default(self): - self.assertTrue(openstack_utils. - update_cinder_quota(self.cinder_client, - 'tenant_id', - 'vols_quota', - 'snap_quota', - 'giga_quota')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_update_cinder_quota_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - update_cinder_quota(Exception, - 'tenant_id', - 'vols_quota', - 'snap_quota', - 'giga_quota')) - self.assertTrue(mock_logger_error.called) - - def test_delete_volume_default(self): - self.assertTrue(openstack_utils. - delete_volume(self.cinder_client, - 'volume_id', - forced=False)) - - self.assertTrue(openstack_utils. - delete_volume(self.cinder_client, - 'volume_id', - forced=True)) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_volume_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_volume(Exception, - 'volume_id', - forced=True)) - self.assertTrue(mock_logger_error.called) - - def test_get_tenants_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=True): - self.assertEqual(openstack_utils. - get_tenants(self.keystone_client), - [self.tenant]) - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=False): - self.assertEqual(openstack_utils. - get_tenants(self.keystone_client), - [self.tenant]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_tenants_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_tenants(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_users_default(self): - self.assertEqual(openstack_utils. - get_users(self.keystone_client), - [self.user]) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_users_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_users(Exception), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_tenant_id_default(self): - self.assertEqual(openstack_utils. - get_tenant_id(self.keystone_client, - 'test_tenant'), - 'tenant_id') - - def test_get_user_id_default(self): - self.assertEqual(openstack_utils. - get_user_id(self.keystone_client, - 'test_user'), - 'user_id') - - def test_get_role_id_default(self): - self.assertEqual(openstack_utils. - get_role_id(self.keystone_client, - 'test_role'), - 'role_id') - - def test_get_domain_id_default(self): - self.assertEqual(openstack_utils. - get_domain_id(self.keystone_client, - 'test_domain'), - 'domain_id') - - def test_create_tenant_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=True): - CONST.__setattr__('OS_PROJECT_DOMAIN_NAME', 'Default') - self.assertEqual(openstack_utils. - create_tenant(self.keystone_client, - 'test_tenant', - 'tenant_desc'), - 'tenant_id') - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=False): - self.assertEqual(openstack_utils. - create_tenant(self.keystone_client, - 'test_tenant', - 'tenant_desc'), - 'tenant_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_tenant_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_tenant(Exception, - 'test_tenant', - 'tenant_desc'), - None) - self.assertTrue(mock_logger_error.called) - - def test_create_user_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=True): - self.assertEqual(openstack_utils. - create_user(self.keystone_client, - 'test_user', - 'password', - 'email', - 'tenant_id'), - 'user_id') - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=False): - self.assertEqual(openstack_utils. - create_user(self.keystone_client, - 'test_user', - 'password', - 'email', - 'tenant_id'), - 'user_id') - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_create_user_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - create_user(Exception, - 'test_user', - 'password', - 'email', - 'tenant_id'), - None) - self.assertTrue(mock_logger_error.called) - - def test_add_role_user_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=True): - self.assertTrue(openstack_utils. - add_role_user(self.keystone_client, - 'user_id', - 'role_id', - 'tenant_id')) - - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=False): - self.assertTrue(openstack_utils. - add_role_user(self.keystone_client, - 'user_id', - 'role_id', - 'tenant_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_add_role_user_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - add_role_user(Exception, - 'user_id', - 'role_id', - 'tenant_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_tenant_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=True): - self.assertTrue(openstack_utils. - delete_tenant(self.keystone_client, - 'tenant_id')) - - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=False): - self.assertTrue(openstack_utils. - delete_tenant(self.keystone_client, - 'tenant_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_tenant_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_tenant(Exception, - 'tenant_id')) - self.assertTrue(mock_logger_error.called) - - def test_delete_user_default(self): - self.assertTrue(openstack_utils. - delete_user(self.keystone_client, - 'user_id')) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_delete_user_exception(self, mock_logger_error): - self.assertFalse(openstack_utils. - delete_user(Exception, - 'user_id')) - self.assertTrue(mock_logger_error.called) - - def test_get_resource_default(self): - with mock.patch('functest.utils.openstack_utils.' - 'is_keystone_v3', return_value=True): - self.assertEqual(openstack_utils. - get_resource(self.heat_client, - 'stack_id', - 'resource'), - self.resource) - - @mock.patch('functest.utils.openstack_utils.logger.error') - def test_get_resource_exception(self, mock_logger_error): - self.assertEqual(openstack_utils. - get_resource(Exception, - 'stack_id', - 'resource'), - None) - self.assertTrue(mock_logger_error.called) - - def test_get_or_create_user_for_vnf_get(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_user_id', - return_value='user_id'), \ - mock.patch('functest.utils.openstack_utils.get_tenant_id', - return_value='tenant_id'): - self.assertFalse(openstack_utils. - get_or_create_user_for_vnf(self.keystone_client, - 'my_vnf')) - - def test_get_or_create_user_for_vnf_create(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_user_id', - return_value=None), \ - mock.patch('functest.utils.openstack_utils.get_tenant_id', - return_value='tenant_id'): - self.assertTrue(openstack_utils. - get_or_create_user_for_vnf(self.keystone_client, - 'my_vnf')) - - def test_get_or_create_user_for_vnf_error_get_user_id(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_user_id', - side_effect=Exception): - self.assertRaises(Exception) - - def test_get_or_create_user_for_vnf_error_get_tenant_id(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_user_id', - return_value='user_id'), \ - mock.patch('functest.utils.openstack_utils.get_tenant_id', - side_effect='Exception'): - self.assertRaises(Exception) - - def test_get_or_create_tenant_for_vnf_get(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_tenant_id', - return_value='tenant_id'): - self.assertFalse( - openstack_utils.get_or_create_tenant_for_vnf( - self.keystone_client, 'tenant_name', 'tenant_description')) - - def test_get_or_create_tenant_for_vnf_create(self): - with mock.patch('functest.utils.openstack_utils.get_tenant_id', - return_value=None): - self.assertTrue( - openstack_utils.get_or_create_tenant_for_vnf( - self.keystone_client, 'tenant_name', 'tenant_description')) - - def test_get_or_create_tenant_for_vnf_error_get_tenant_id(self): - with mock.patch('functest.utils.openstack_utils.' - 'get_tenant_id', - side_effect=Exception): - self.assertRaises(Exception) - - def test_download_and_add_image_on_glance_image_creation_failure(self): - with mock.patch('functest.utils.openstack_utils.' - 'os.makedirs'), \ - mock.patch('functest.utils.openstack_utils.' - 'ft_utils.download_url', - return_value=True), \ - mock.patch('functest.utils.openstack_utils.' - 'create_glance_image', - return_value=''): - resp = openstack_utils.download_and_add_image_on_glance( - self.glance_client, - 'image_name', - 'http://url', - 'data_dir') - self.assertEqual(resp, False) - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/opnfv_tests/openstack/refstack_client/__init__.py b/functest/tests/unit/vnf/epc/__init__.py index e69de29bb..e69de29bb 100644 --- a/functest/opnfv_tests/openstack/refstack_client/__init__.py +++ b/functest/tests/unit/vnf/epc/__init__.py diff --git a/functest/tests/unit/vnf/epc/test_juju_epc.py b/functest/tests/unit/vnf/epc/test_juju_epc.py index 2b7453128..a72c61586 100644 --- a/functest/tests/unit/vnf/epc/test_juju_epc.py +++ b/functest/tests/unit/vnf/epc/test_juju_epc.py @@ -18,7 +18,7 @@ from functest.opnfv_tests.vnf.epc import juju_epc class JujuEpcTesting(unittest.TestCase): - + # pylint: disable=missing-docstring """Unittest for ABoT EPC with juju orchestrator""" def setUp(self): @@ -52,15 +52,7 @@ class JujuEpcTesting(unittest.TestCase): return_value={'tenant_images': 'foo', 'orchestrator': self.orchestrator, 'vnf': self.vnf, 'vnf_test_suite': '', - 'version': 'whatever'}), \ - mock.patch('functest.utils.openstack_utils.get_keystone_client', - return_value='test'), \ - mock.patch('functest.utils.openstack_utils.get_glance_client', - return_value='test'), \ - mock.patch('functest.utils.openstack_utils.get_neutron_client', - return_value='test'), \ - mock.patch('functest.utils.openstack_utils.get_nova_client', - return_value='test'): + 'version': 'whatever'}): self.epc_vnf = juju_epc.JujuEpc() self.images = {'image1': 'url1', @@ -69,16 +61,7 @@ class JujuEpcTesting(unittest.TestCase): 'vnf': {}, 'test_vnf': {}} - @mock.patch('functest.utils.openstack_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.utils.openstack_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.utils.openstack_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.utils.openstack_utils.get_credentials', - return_value={'auth_url': 'test/v1', - 'project_name': 'test_tenant'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') + @unittest.skip("It must be fixed. Please see JIRA FUNCTEST-915") @mock.patch('os.system') def test_prepare_default(self, *args): """ Unittest for Prepare testcase """ diff --git a/functest/tests/unit/vnf/ims/test_ims_base.py b/functest/tests/unit/vnf/ims/test_clearwater.py index 66d35e39f..f590a2857 100644 --- a/functest/tests/unit/vnf/ims/test_ims_base.py +++ b/functest/tests/unit/vnf/ims/test_clearwater.py @@ -5,20 +5,23 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + import logging import unittest import mock -from functest.opnfv_tests.vnf.ims import clearwater_ims_base as ims_base +from functest.opnfv_tests.vnf.ims import clearwater -class ClearwaterOnBoardingBaseTesting(unittest.TestCase): +class ClearwaterTesting(unittest.TestCase): def setUp(self): with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' 'os.makedirs'): - self.ims_vnf = ims_base.ClearwaterOnBoardingBase() + self.ims_vnf = clearwater.ClearwaterTesting( + "foo", "0.0.0.0", "0.0.0.0") self.mock_post = mock.Mock() attrs = {'status_code': 201, @@ -35,6 +38,7 @@ class ClearwaterOnBoardingBaseTesting(unittest.TestCase): 'cookies': ""} self.mock_post_200.configure_mock(**attrs) + if __name__ == "__main__": logging.disable(logging.CRITICAL) unittest.main(verbosity=2) diff --git a/functest/tests/unit/vnf/ims/test_cloudify_ims.py b/functest/tests/unit/vnf/ims/test_cloudify_ims.py index cdd657aac..c84adf0ff 100644 --- a/functest/tests/unit/vnf/ims/test_cloudify_ims.py +++ b/functest/tests/unit/vnf/ims/test_cloudify_ims.py @@ -5,59 +5,14 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + import logging import unittest -import mock - -from functest.core import vnf -from functest.opnfv_tests.vnf.ims import cloudify_ims - class CloudifyImsTesting(unittest.TestCase): - - def setUp(self): - - self.tenant = 'cloudify_ims' - self.creds = {'username': 'user', - 'password': 'pwd'} - self.orchestrator = {'name': 'cloudify', - 'version': '4.0', - 'object': 'foo', - 'requirements': {'flavor': {'name': 'm1.medium', - 'ram_min': 4096}, - 'os_image': 'manager_4.0'}} - - self.vnf = {'name': 'clearwater', - 'descriptor': {'version': '108', - 'file_name': 'openstack-blueprint.yaml', - 'name': 'clearwater-opnfv', - 'url': 'https://foo', - 'requirements': {'flavor': - {'name': 'm1.medium', - 'ram_min': 2048}}}} - - with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' - 'os.makedirs'), \ - mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.' - 'get_config', return_value={ - 'tenant_images': 'foo', - 'orchestrator': self.orchestrator, - 'vnf': self.vnf, - 'vnf_test_suite': '', - 'version': 'whatever'}): - - self.ims_vnf = cloudify_ims.CloudifyIms() - - self.images = {'image1': 'url1', - 'image2': 'url2'} - self.details = {'orchestrator': {'status': 'PASS', 'duration': 120}, - 'vnf': {}, - 'test_vnf': {}} - - def test_prepare_missing_param(self): - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() + pass if __name__ == "__main__": diff --git a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py b/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py deleted file mode 100644 index 2e83f30a4..000000000 --- a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python - -# 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 - -"""Test module for orchestra_clearwaterims""" - -import logging -import unittest - -import mock - -from functest.core import vnf -from functest.opnfv_tests.vnf.ims import orchestra_clearwaterims - - -class OrchestraClearwaterImsTesting(unittest.TestCase): - """Test class for orchestra_clearwaterims""" - def setUp(self): - - self.tenant = 'orchestra_clearwaterims' - self.creds = {'username': 'mocked_username', - 'password': 'mocked_password'} - self.tenant_images = { - 'image1': 'mocked_image_url_1', - 'image2': 'mocked_image_url_2' - } - self.mano = { - 'name': 'openbaton', - 'version': '3.2.0', - 'object': 'foo', - 'requirements': { - 'flavor': { - 'name': 'mocked_flavor', - 'ram_min': 4096, - 'disk': 5, - 'vcpus': 2 - }, - 'os_image': 'mocked_image' - }, - 'bootstrap': { - 'url': 'mocked_bootstrap_url', - 'config': { - 'url': 'mocked_config_url'} - }, - 'gvnfm': { - 'userdata': { - 'url': 'mocked_userdata_url' - } - }, - 'credentials': { - 'username': 'mocked_username', - 'password': 'mocked_password' - } - } - self.vnf = { - 'name': 'openims', - 'descriptor': { - 'url': 'mocked_descriptor_url' - }, - 'requirements': { - 'flavor': { - 'name': 'mocked_flavor', - 'ram_min': 2048, - 'disk': 5, - 'vcpus': 2} - } - } - self.clearwaterims = { - 'scscf': { - 'ports': [3870, 6060] - }, - 'pcscf': { - 'ports': [4060] - }, - 'icscf': { - 'ports': [3869, 5060] - }, - 'fhoss': { - 'ports': [3868] - }, - 'bind9': { - 'ports': [] - } - } - with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_clearwaterims.' - 'os.makedirs'),\ - mock.patch('functest.opnfv_tests.vnf.ims.orchestra_clearwaterims.' - 'get_config', return_value={ - 'orchestrator': self.mano, - 'name': self.mano['name'], - 'version': self.mano['version'], - 'requirements': self.mano['requirements'], - 'credentials': self.mano['credentials'], - 'bootstrap': self.mano['bootstrap'], - 'gvnfm': self.mano['gvnfm'], - 'os_image': self.mano['requirements']['os_image'], - 'flavor': self.mano['requirements']['flavor'], - 'url': self.mano['bootstrap']['url'], - 'config': self.mano['bootstrap']['config'], - 'tenant_images': self.tenant_images, - 'vnf': self.vnf, - 'orchestra_clearwaterims': self.clearwaterims}): - self.ims_vnf = orchestra_clearwaterims.ClearwaterImsVnf() - - self.details = {'orchestrator': {'status': 'PASS', 'duration': 120}, - 'vnf': {}, - 'test_vnf': {}} - - def test_prepare_missing_param(self): - """Testing prepare function with missing param""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/vnf/ims/test_orchestra_openims.py b/functest/tests/unit/vnf/ims/test_orchestra_openims.py deleted file mode 100644 index 47a8d0338..000000000 --- a/functest/tests/unit/vnf/ims/test_orchestra_openims.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python - -# 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 - -"""Test module for orchestra_openims""" - -import logging -import unittest - -import mock - -from functest.core import vnf -from functest.opnfv_tests.vnf.ims import orchestra_openims - - -class OrchestraOpenImsTesting(unittest.TestCase): - """Test class for orchestra_openims""" - def setUp(self): - - self.tenant = 'orchestra_openims' - self.creds = {'username': 'mocked_username', - 'password': 'mocked_password'} - self.tenant_images = { - 'image1': 'mocked_image_url_1', - 'image2': 'mocked_image_url_2' - } - self.mano = { - 'name': 'openbaton', - 'version': '3.2.0', - 'object': 'foo', - 'requirements': { - 'flavor': { - 'name': 'mocked_flavor', - 'ram_min': 4096, - 'disk': 5, - 'vcpus': 2 - }, - 'os_image': 'mocked_image' - }, - 'bootstrap': { - 'url': 'mocked_bootstrap_url', - 'config': { - 'url': 'mocked_config_url'} - }, - 'gvnfm': { - 'userdata': { - 'url': 'mocked_userdata_url' - } - }, - 'credentials': { - 'username': 'mocked_username', - 'password': 'mocked_password' - } - } - self.vnf = { - 'name': 'openims', - 'descriptor': { - 'url': 'mocked_descriptor_url' - }, - 'requirements': { - 'flavor': { - 'name': 'mocked_flavor', - 'ram_min': 2048, - 'disk': 5, - 'vcpus': 2} - } - } - self.openims = { - 'scscf': { - 'ports': [3870, 6060] - }, - 'pcscf': { - 'ports': [4060] - }, - 'icscf': { - 'ports': [3869, 5060] - }, - 'fhoss': { - 'ports': [3868] - }, - 'bind9': { - 'ports': [] - } - } - with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_openims.' - 'os.makedirs'),\ - mock.patch('functest.opnfv_tests.vnf.ims.orchestra_openims.' - 'get_config', return_value={ - 'orchestrator': self.mano, - 'name': self.mano['name'], - 'version': self.mano['version'], - 'requirements': self.mano['requirements'], - 'credentials': self.mano['credentials'], - 'bootstrap': self.mano['bootstrap'], - 'gvnfm': self.mano['gvnfm'], - 'os_image': - self.mano['requirements']['os_image'], - 'flavor': - self.mano['requirements']['flavor'], - 'url': self.mano['bootstrap']['url'], - 'config': self.mano['bootstrap']['config'], - 'tenant_images': self.tenant_images, - 'vnf': self.vnf, - 'orchestra_openims': self.openims}): - self.ims_vnf = orchestra_openims.OpenImsVnf() - - self.details = {'orchestrator': {'status': 'PASS', 'duration': 120}, - 'vnf': {}, - 'test_vnf': {}} - - def test_prepare_missing_param(self): - """Testing prepare function with missing param""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - - -if __name__ == "__main__": - logging.disable(logging.CRITICAL) - unittest.main(verbosity=2) diff --git a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py index 4d8e9405b..b3f83e946 100644 --- a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py +++ b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py @@ -7,62 +7,15 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + import logging import unittest -import mock - -from functest.core import vnf -from functest.opnfv_tests.vnf.router import cloudify_vrouter - class CloudifyVrouterTesting(unittest.TestCase): - @mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.Utilvnf') - @mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.vrouter_base' - '.Utilvnf') - @mock.patch('os.makedirs') - def setUp(self, *args): - - self.tenant = 'cloudify_vrouter' - self.creds = {'username': 'user', - 'password': 'pwd'} - self.orchestrator = {'name': 'cloudify', - 'version': '4.0', - 'object': 'foo', - 'requirements': {'flavor': {'name': 'm1.medium', - 'ram_min': 4096}, - 'os_image': 'manager_4.0'}} - - self.vnf = {'name': 'vrouter', - 'descriptor': {'version': '100', - 'file_name': 'function-test-' + - 'openstack-blueprint.yaml', - 'name': 'vrouter-opnfv', - 'url': 'https://foo', - 'requirements': {'flavor': - {'name': 'm1.medium', - 'ram_min': 2048}}}} - - with mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.' - 'get_config', return_value={ - 'tenant_images': 'foo', - 'orchestrator': self.orchestrator, - 'vnf': self.vnf, - 'vnf_test_suite': '', - 'version': 'whatever'}): - - self.router_vnf = cloudify_vrouter.CloudifyVrouter() - - self.images = {'image1': 'url1', - 'image2': 'url2'} - self.details = {'orchestrator': {'status': 'PASS', 'duration': 120}, - 'vnf': {}, - 'test_vnf': {}} - - def test_prepare_missing_param(self): - with self.assertRaises(vnf.VnfPreparationException): - self.router_vnf.prepare() + pass if __name__ == "__main__": diff --git a/functest/tests/unit/vnf/router/test_vrouter_base.py b/functest/tests/unit/vnf/router/test_vrouter_base.py index def201d16..330093658 100644 --- a/functest/tests/unit/vnf/router/test_vrouter_base.py +++ b/functest/tests/unit/vnf/router/test_vrouter_base.py @@ -7,20 +7,14 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 +# pylint: disable=missing-docstring + import logging import unittest -import mock - -from functest.opnfv_tests.vnf.router import vrouter_base - class VrouterOnBoardingBaseTesting(unittest.TestCase): - - def setUp(self): - with mock.patch('functest.opnfv_tests.vnf.router.cloudify_vrouter.' - 'os.makedirs'): - self.vrouter_vnf = vrouter_base.VrouterOnBoardingBase() + pass if __name__ == "__main__": diff --git a/functest/utils/config.py b/functest/utils/config.py index f4749a75b..40414b88b 100644 --- a/functest/utils/config.py +++ b/functest/utils/config.py @@ -2,21 +2,24 @@ # pylint: disable=missing-docstring -import os import pkg_resources import yaml import six +from functest.utils import env -class Config(object): + +class Config(): def __init__(self): try: with open(pkg_resources.resource_filename( - 'functest', 'ci/config_functest.yaml')) as yfile: + 'functest', 'ci/config_functest.yaml'), + encoding='utf-8') as yfile: self.functest_yaml = yaml.safe_load(yfile) except Exception as error: - raise Exception('Parse config failed: {}'.format(str(error))) + raise Exception( + f'Parse config failed: {str(error)}') from error @staticmethod def _merge_dicts(dict1, dict2): @@ -32,11 +35,11 @@ class Config(object): yield (k, dict2[k]) def patch_file(self, patch_file_path): - with open(patch_file_path) as yfile: + with open(patch_file_path, encoding='utf-8') as yfile: patch_file = yaml.safe_load(yfile) for key in patch_file: - if key in os.environ.get('DEPLOY_SCENARIO', ""): + if key in env.get('DEPLOY_SCENARIO'): self.functest_yaml = dict(Config._merge_dicts( self.functest_yaml, patch_file[key])) @@ -44,26 +47,27 @@ class Config(object): for param_n, param_v in six.iteritems(left_parametes): attr_further = self._get_attr_further(attr_now, param_n) if attr_further: - self.__setattr__(attr_further, param_v) + setattr(self, attr_further, param_v) if isinstance(param_v, dict): self._parse(attr_further, param_v) @staticmethod def _get_attr_further(attr_now, next): # pylint: disable=redefined-builtin return attr_now if next == 'general' else ( - '{}_{}'.format(attr_now, next) if attr_now else next) + f'{attr_now}_{next}' if attr_now else next) def fill(self): try: self._parse(None, self.functest_yaml) except Exception as error: - raise Exception('Parse config failed: {}'.format(str(error))) + raise Exception( + f'Parse config failed: {str(error)}') from error CONF = Config() CONF.patch_file(pkg_resources.resource_filename( 'functest', 'ci/config_patch.yaml')) -if os.getenv("POD_ARCH", None) and os.getenv("POD_ARCH", None) in ['aarch64']: +if env.get("POD_ARCH") in ['aarch64']: CONF.patch_file(pkg_resources.resource_filename( 'functest', 'ci/config_aarch64_patch.yaml')) CONF.fill() diff --git a/functest/utils/constants.py b/functest/utils/constants.py index 75c97c765..5e7c24422 100644 --- a/functest/utils/constants.py +++ b/functest/utils/constants.py @@ -1,17 +1,11 @@ #!/usr/bin/env python -import six +# pylint: disable=missing-docstring -from functest.utils import config -from functest.utils import env +import pkg_resources +from xtesting.utils import constants +CONFIG_FUNCTEST_YAML = pkg_resources.resource_filename( + 'functest', 'ci/config_functest.yaml') -class Constants(object): - def __init__(self): - for attr_n, attr_v in six.iteritems(config.CONF.__dict__): - self.__setattr__(attr_n, attr_v) - for env_n, env_v in six.iteritems(env.ENV.__dict__): - self.__setattr__(env_n, env_v) - - -CONST = Constants() +ENV_FILE = constants.ENV_FILE diff --git a/functest/utils/decorators.py b/functest/utils/decorators.py deleted file mode 100644 index 230a99e75..000000000 --- a/functest/utils/decorators.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017 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 - -# pylint: disable=missing-docstring - -import errno -import functools -import os - -import mock -import requests.sessions -from six.moves import urllib - - -def can_dump_request_to_file(method): - - def dump_preparedrequest(request, **kwargs): - # pylint: disable=unused-argument - parseresult = urllib.parse.urlparse(request.url) - if parseresult.scheme == "file": - try: - dirname = os.path.dirname(parseresult.path) - os.makedirs(dirname) - except OSError as ex: - if ex.errno != errno.EEXIST: - raise - with open(parseresult.path, 'a') as dumpfile: - headers = "" - for key in request.headers: - headers += key + " " + request.headers[key] + "\n" - message = "{} {}\n{}\n{}\n\n\n".format( - request.method, request.url, headers, request.body) - dumpfile.write(message) - return mock.Mock() - - def patch_request(method, url, **kwargs): - with requests.sessions.Session() as session: - parseresult = urllib.parse.urlparse(url) - if parseresult.scheme == "file": - with mock.patch.object(session, 'send', - side_effect=dump_preparedrequest): - return session.request(method=method, url=url, **kwargs) - else: - return session.request(method=method, url=url, **kwargs) - - @functools.wraps(method) - def hook(*args, **kwargs): - with mock.patch('requests.api.request', side_effect=patch_request): - return method(*args, **kwargs) - - return hook diff --git a/functest/utils/env.py b/functest/utils/env.py index f0952500c..2e312726c 100644 --- a/functest/utils/env.py +++ b/functest/utils/env.py @@ -1,52 +1,60 @@ #!/usr/bin/env python -import pkg_resources -import os -import re - -import six - - -default_envs = { - 'NODE_NAME': 'unknown_pod', - 'CI_DEBUG': 'false', - 'DEPLOY_SCENARIO': 'os-nosdn-nofeature-noha', - 'DEPLOY_TYPE': 'virt', - 'INSTALLER_TYPE': None, - 'INSTALLER_IP': None, - 'BUILD_TAG': None, - 'OS_ENDPOINT_TYPE': None, - 'OS_AUTH_URL': None, - 'CONFIG_FUNCTEST_YAML': pkg_resources.resource_filename( - 'functest', 'ci/config_functest.yaml'), - 'OS_INSECURE': '', - 'OS_REGION_NAME': 'RegionOne' -} +# Copyright (c) 2018 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 +# pylint: disable=missing-docstring -class Environment(object): +import os - def __init__(self): - for k, v in six.iteritems(os.environ): - self.__setattr__(k, v) - for k, v in six.iteritems(default_envs): - if k not in os.environ: - self.__setattr__(k, v) - self._set_ci_run() - if 'CI_LOOP' not in os.environ: - self._set_ci_loop() +import prettytable +from xtesting.utils import env + +INPUTS = { + 'EXTERNAL_NETWORK': None, + 'CI_LOOP': env.INPUTS['CI_LOOP'], + 'DEBUG': env.INPUTS['DEBUG'], + 'DEPLOY_SCENARIO': env.INPUTS['DEPLOY_SCENARIO'], + 'INSTALLER_TYPE': env.INPUTS['INSTALLER_TYPE'], + 'SDN_CONTROLLER_IP': None, + 'SDN_CONTROLLER_USER': 'admin', + 'SDN_CONTROLLER_PASSWORD': 'admin', + 'SDN_CONTROLLER_WEBPORT': '8080', + 'SDN_CONTROLLER_RESTCONFPORT': '8181', + 'BUILD_TAG': env.INPUTS['BUILD_TAG'], + 'NODE_NAME': env.INPUTS['NODE_NAME'], + 'POD_ARCH': None, + 'TEST_DB_URL': env.INPUTS['TEST_DB_URL'], + 'VOLUME_DEVICE_NAME': 'vdb', + 'IMAGE_PROPERTIES': '', + 'FLAVOR_EXTRA_SPECS': '', + 'NAMESERVER': '8.8.8.8', + 'NEW_USER_ROLE': 'Member', + 'USE_DYNAMIC_CREDENTIALS': 'True', + 'BLOCK_MIGRATION': 'False', + 'CLEAN_ORPHAN_SECURITY_GROUPS': 'True', + 'SKIP_DOWN_HYPERVISORS': 'False', + 'PUBLIC_ENDPOINT_ONLY': 'False', + 'DASHBOARD_URL': '', + 'VMTP_HYPERVISORS': '', + 'NO_TENANT_NETWORK': 'False' +} - def _set_ci_run(self): - if self.BUILD_TAG: - self.IS_CI_RUN = True - else: - self.IS_CI_RUN = False - def _set_ci_loop(self): - if self.BUILD_TAG and re.search("daily", self.BUILD_TAG): - self.CI_LOOP = "daily" - else: - self.CI_LOOP = "weekly" +def get(env_var): + if env_var not in INPUTS.keys(): + return os.environ.get(env_var, None) + return os.environ.get(env_var, INPUTS[env_var]) -ENV = Environment() +def string(): + msg = prettytable.PrettyTable( + header_style='upper', padding_width=5, + field_names=['env var', 'value']) + for env_var in INPUTS: + msg.add_row([env_var, get(env_var) if get(env_var) else '']) + return msg diff --git a/functest/utils/functest_utils.py b/functest/utils/functest_utils.py index 6d0b345d5..eec544489 100644 --- a/functest/utils/functest_utils.py +++ b/functest/utils/functest_utils.py @@ -6,194 +6,20 @@ # 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 functools -import json + +# pylint: disable=missing-docstring + +from __future__ import print_function import logging import os -import pkg_resources -import re -import shutil import subprocess import sys -import time -from datetime import datetime as dt - -import dns.resolver -import requests -from six.moves import urllib import yaml -from functest.utils import constants -from functest.utils import decorators -from functest.utils.constants import CONST - -logger = logging.getLogger(__name__) - - -# ---------------------------------------------------------- -# -# INTERNET UTILS -# -# ----------------------------------------------------------- -def check_internet_connectivity(url='http://www.opnfv.org/'): - """ - Check if there is access to the internet - """ - try: - urllib.request.urlopen(url, timeout=5) - return True - except urllib.error.URLError: - return False - +from shade import _utils +import six -def download_url(url, dest_path): - """ - Download a file to a destination path given a URL - """ - name = url.rsplit('/')[-1] - dest = dest_path + "/" + name - try: - response = urllib.request.urlopen(url) - except (urllib.error.HTTPError, urllib.error.URLError): - return False - - with open(dest, 'wb') as f: - shutil.copyfileobj(response, f) - return True - - -# ---------------------------------------------------------- -# -# CI UTILS -# -# ----------------------------------------------------------- -def get_version(): - """ - Get version - """ - # Use the build tag to retrieve the version - # By default version is unknown - # if launched through CI the build tag has the following format - # jenkins-<project>-<installer>-<pod>-<job>-<branch>-<id> - # e.g. jenkins-functest-fuel-opnfv-jump-2-daily-master-190 - # jenkins-functest-fuel-baremetal-weekly-master-8 - # use regex to match branch info - rule = "(dai|week)ly-(.+?)-[0-9]*" - build_tag = CONST.__getattribute__('BUILD_TAG') - if not build_tag: - build_tag = 'none' - m = re.search(rule, build_tag) - if m: - return m.group(2) - else: - return "unknown" - - -@decorators.can_dump_request_to_file -def push_results_to_db(project, case_name, - start_date, stop_date, result, details): - """ - POST results to the Result target DB - """ - # Retrieve params from CI and conf - if (hasattr(CONST, 'TEST_DB_URL')): - url = CONST.__getattribute__('TEST_DB_URL') - else: - url = CONST.__getattribute__("results_test_db_url") - - try: - installer = os.environ['INSTALLER_TYPE'] - scenario = os.environ['DEPLOY_SCENARIO'] - pod_name = os.environ['NODE_NAME'] - build_tag = os.environ['BUILD_TAG'] - except KeyError as e: - logger.error("Please set env var: " + str(e)) - return False - version = get_version() - test_start = dt.fromtimestamp(start_date).strftime('%Y-%m-%d %H:%M:%S') - test_stop = dt.fromtimestamp(stop_date).strftime('%Y-%m-%d %H:%M:%S') - - params = {"project_name": project, "case_name": case_name, - "pod_name": pod_name, "installer": installer, - "version": version, "scenario": scenario, "criteria": result, - "build_tag": build_tag, "start_date": test_start, - "stop_date": test_stop, "details": details} - - error = None - headers = {'Content-Type': 'application/json'} - try: - r = requests.post(url, data=json.dumps(params, sort_keys=True), - headers=headers) - logger.debug(r) - r.raise_for_status() - except requests.RequestException as exc: - if 'r' in locals(): - error = ("Pushing Result to DB(%s) failed: %s" % - (r.url, r.content)) - else: - error = ("Pushing Result to DB(%s) failed: %s" % (url, exc)) - except Exception as e: - error = ("Error [push_results_to_db(" - "DB: '%(db)s', " - "project: '%(project)s', " - "case: '%(case)s', " - "pod: '%(pod)s', " - "version: '%(v)s', " - "scenario: '%(s)s', " - "criteria: '%(c)s', " - "build_tag: '%(t)s', " - "details: '%(d)s')]: " - "%(error)s" % - { - 'db': url, - 'project': project, - 'case': case_name, - 'pod': pod_name, - 'v': version, - 's': scenario, - 'c': result, - 't': build_tag, - 'd': details, - 'error': e - }) - finally: - if error: - logger.error(error) - return False - return True - - -def get_resolvconf_ns(): - """ - Get nameservers from current resolv.conf - """ - nameservers = [] - rconf = open("/etc/resolv.conf", "r") - line = rconf.readline() - resolver = dns.resolver.Resolver() - while line: - ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", line) - if ip: - resolver.nameservers = [ip.group(0)] - try: - result = resolver.query('opnfv.org')[0] - if result != "": - nameservers.append(ip.group()) - except dns.exception.Timeout: - pass - line = rconf.readline() - return nameservers - - -def get_ci_envvars(): - """ - Get the CI env variables - """ - ci_env_var = { - "installer": os.environ.get('INSTALLER_TYPE'), - "scenario": os.environ.get('DEPLOY_SCENARIO')} - return ci_env_var +LOGGER = logging.getLogger(__name__) def execute_command_raise(cmd, info=False, error_msg="", @@ -206,104 +32,194 @@ def execute_command_raise(cmd, info=False, error_msg="", def execute_command(cmd, info=False, error_msg="", verbose=True, output_file=None): if not error_msg: - error_msg = ("The command '%s' failed." % cmd) - msg_exec = ("Executing command: '%s'" % cmd) + error_msg = f"The command '{cmd}' failed." + msg_exec = f"Executing command: '{cmd}'" if verbose: if info: - logger.info(msg_exec) + LOGGER.info(msg_exec) else: - logger.debug(msg_exec) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - if output_file: - f = open(output_file, "w") - for line in iter(p.stdout.readline, b''): + LOGGER.debug(msg_exec) + with subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) as popen: if output_file: - f.write(line) - else: - line = line.replace('\n', '') - print(line) - sys.stdout.flush() - if output_file: - f.close() - p.stdout.close() - returncode = p.wait() + with open(output_file, "w", encoding='utf-8') as ofd: + for line in iter(popen.stdout.readline, b''): + if output_file: + ofd.write(line.decode("utf-8")) + else: + line = line.decode("utf-8").replace('\n', '') + print(line) + sys.stdout.flush() + returncode = popen.wait() if returncode != 0: if verbose: - logger.error(error_msg) + LOGGER.error(error_msg) return returncode -def get_dict_by_test(testname): - with open(pkg_resources.resource_filename( - 'functest', 'ci/testcases.yaml')) as f: - testcases_yaml = yaml.safe_load(f) - - for dic_tier in testcases_yaml.get("tiers"): - for dic_testcase in dic_tier['testcases']: - if dic_testcase['case_name'] == testname: - return dic_testcase - - logger.error('Project %s is not defined in testcases.yaml' % testname) - return None - - -def get_criteria_by_test(testname): - dict = get_dict_by_test(testname) - if dict: - return dict['criteria'] - return None - - -# ---------------------------------------------------------- -# -# YAML UTILS -# -# ----------------------------------------------------------- -def get_parameter_from_yaml(parameter, file): +def get_parameter_from_yaml(parameter, yfile): """ 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) as f: - file_yaml = yaml.safe_load(f) - f.close() + with open(yfile, encoding='utf-8') as yfd: + file_yaml = yaml.safe_load(yfd) 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" - " %s" % (parameter, file)) + raise ValueError(f"The parameter {parameter} is not defined in" + f" {yfile}") return value -def get_functest_config(parameter): - yaml_ = constants.CONST.__getattribute__('CONFIG_FUNCTEST_YAML') - return get_parameter_from_yaml(parameter, yaml_) +def get_nova_version(cloud): + """ Get Nova API microversion + + Returns: + + - Nova API microversion + - None on operation error + """ + # pylint: disable=protected-access + try: + request = cloud._compute_client.request("/", "GET") + LOGGER.debug('cloud._compute_client.request: %s', request) + version = request["version"]["version"] + major, minor = version.split('.') + LOGGER.debug('nova version: %s', (int(major), int(minor))) + return (int(major), int(minor)) + except Exception: # pylint: disable=broad-except + LOGGER.exception("Cannot detect Nova version") + return None + + +def get_openstack_version(cloud): + """ Detect OpenStack version via Nova API microversion + + It follows `MicroversionHistory + <https://docs.openstack.org/nova/latest/reference/api-microversion-history.html>`_. + Returns: + + - OpenStack release + - Unknown on operation error + """ + # pylint: disable=too-many-branches + version = get_nova_version(cloud) + try: + assert version + if version > (2, 93): + osversion = "Master" + elif version > (2, 90): + osversion = "Zed" + elif version > (2, 88): + osversion = "Xena" + elif version > (2, 87): + osversion = "Wallaby" + elif version > (2, 79): + osversion = "Ussuri" + elif version > (2, 72): + osversion = "Train" + elif version > (2, 65): + osversion = "Stein" + elif version > (2, 60): + osversion = "Rocky" + elif version > (2, 53): + osversion = "Queens" + elif version > (2, 42): + osversion = "Pike" + elif version > (2, 38): + osversion = "Ocata" + elif version > (2, 25): + osversion = "Newton" + elif version > (2, 12): + osversion = "Mitaka" + elif version > (2, 3): + osversion = "Liberty" + elif version >= (2, 1): + osversion = "Kilo" + else: + osversion = "Unknown" + LOGGER.info('Detect OpenStack version: %s', osversion) + return osversion + except AssertionError: + LOGGER.exception("Cannot detect OpenStack version") + return "Unknown" -def get_functest_yaml(): - with open(constants.CONST.__getattribute__('CONFIG_FUNCTEST_YAML')) as f: - functest_yaml = yaml.safe_load(f) - f.close() - return functest_yaml +def list_services(cloud): + # pylint: disable=protected-access + """Search Keystone services via $OS_INTERFACE. -def print_separator(): - logger.info("==============================================") + It mainly conforms with `Shade + <https://docs.openstack.org/shade/latest>`_ but allows testing vs + public endpoints. It's worth mentioning that it doesn't support keystone + v2. + + :returns: a list of ``munch.Munch`` containing the services description + + :raises: ``OpenStackCloudException`` if something goes wrong during the + openstack API call. + """ + url, key = '/services', 'services' + data = cloud._identity_client.get( + url, endpoint_filter={ + 'interface': os.environ.get('OS_INTERFACE', 'public')}, + error_message="Failed to list services") + services = cloud._get_and_munchify(key, data) + return _utils.normalize_keystone_services(services) + + +def search_services(cloud, name_or_id=None, filters=None): + # pylint: disable=protected-access + """Search Keystone services ia $OS_INTERFACE. + + It mainly conforms with `Shade + <https://docs.openstack.org/shade/latest>`_ but allows testing vs + public endpoints. It's worth mentioning that it doesn't support keystone + v2. + + :param name_or_id: Name or id of the desired service. + :param filters: a dict containing additional filters to use. e.g. + {'type': 'network'}. + + :returns: a list of ``munch.Munch`` containing the services description + + :raises: ``OpenStackCloudException`` if something goes wrong during the + openstack API call. + """ + services = list_services(cloud) + return _utils._filter_list(services, name_or_id, filters) + + +def convert_dict_to_ini(value): + "Convert dict to oslo.conf input" + assert isinstance(value, dict) + return ",".join(f"{key}:{val}" for (key, val) in six.iteritems(value)) + + +def convert_list_to_ini(value): + "Convert list to oslo.conf input" + assert isinstance(value, list) + return ",".join(val for val in value) + + +def convert_ini_to_dict(value): + "Convert oslo.conf input to dict" + assert isinstance(value, str) + try: + return dict((x.rsplit(':', 1) for x in value.split(','))) + except ValueError: + return {} -def timethis(func): - """Measure the time it takes for a function to complete""" - @functools.wraps(func) - def timed(*args, **kwargs): - ts = time.time() - result = func(*args, **kwargs) - te = time.time() - elapsed = '{0}'.format(te - ts) - logger.info('{f}(*{a}, **{kw}) took: {t} sec'.format( - f=func.__name__, a=args, kw=kwargs, t=elapsed)) - return result, elapsed - return timed +def convert_ini_to_list(value): + "Convert list to oslo.conf input" + assert isinstance(value, str) + if not value: + return [] + return list(value.split(',')) diff --git a/functest/utils/functest_vacation.py b/functest/utils/functest_vacation.py deleted file mode 100644 index 71861ba7c..000000000 --- a/functest/utils/functest_vacation.py +++ /dev/null @@ -1,53 +0,0 @@ -from os import environ -from curses import initscr, curs_set, newwin, endwin -from curses import KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP -from random import randrange - - -def main(): - environ["TERM"] = 'Eterm' - initscr() - curs_set(0) - try: - win = newwin(16, 60, 0, 0) - win.keypad(True) - win.nodelay(True) - win.border('|', '|', '-', '-', '+', '+', '+', '+') - win.addch(4, 44, '@') - win.addstr(0, 5, ' Eat all the OPNFV bugs by FunTest! ') - win.addstr(15, 7, ' Left,Right,Up,Down: move; other keys: quit ') - snake = [[20, 7], [19, 7], [18, 7], [17, 7], - [16, 7], [15, 7], [14, 7], [13, 7]] - key = KEY_RIGHT - body = '~FUNTEST' - ind = 0 - while key != 27: - win.addstr(0, 44, ' Score: ' + str(len(snake) - len(body)) + ' ') - win.timeout(140 - 2 * len(snake)) - getkey = win.getch() - key = key if getkey == -1 else getkey - snake.insert( - 0, [snake[0][0] + (key == KEY_RIGHT and 1 or - key == KEY_LEFT and -1), - snake[0][1] + (key == KEY_DOWN and 1 or - key == KEY_UP and -1)]) - win.addch(snake[len(snake) - 1][1], snake[len(snake) - 1][0], ' ') - if win.inch(snake[0][1], snake[0][0]) & 255 == 32: - snake.pop() - elif win.inch(snake[0][1], snake[0][0]) & 255 == ord('@'): - c = [n for n in [[randrange(1, 58, 1), randrange(1, 14, 1)] - for x in range(len(snake))] if n not in snake] - win.addch(c == [] and 4 or c[0][1], - c == [] and 44 or c[0][0], '@') - else: - break - ind += 1 - win.addch(snake[0][1], snake[0][0], body[ind % len(body)]) - finally: - endwin() - - print('\nSnake.PY-26ines by Kris Cieslak (defaultset.blogspot.com).') - print('OPNFV adaptation by Functest dream team.') - score = str(len(snake) - len(body) - 1) - print ('Thanks for playing, your score: %s.' % score) - print('Find and fix more bugs in your real OPNFV setup!\n') diff --git a/functest/utils/openstack_utils.py b/functest/utils/openstack_utils.py deleted file mode 100644 index 1d7cdafb9..000000000 --- a/functest/utils/openstack_utils.py +++ /dev/null @@ -1,1499 +0,0 @@ -#!/usr/bin/env python -# -# jose.lausuch@ericsson.com -# 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 logging -import os.path -import re -import sys -import time - -from keystoneauth1 import loading -from keystoneauth1 import session -from cinderclient import client as cinderclient -from glanceclient import client as glanceclient -from heatclient import client as heatclient -from novaclient import client as novaclient -from keystoneclient import client as keystoneclient -from neutronclient.neutron import client as neutronclient - -from functest.utils.constants import CONST -import functest.utils.functest_utils as ft_utils - -logger = logging.getLogger(__name__) - -DEFAULT_API_VERSION = '2' -DEFAULT_HEAT_API_VERSION = '1' - - -# ********************************************* -# CREDENTIALS -# ********************************************* -class MissingEnvVar(Exception): - - def __init__(self, var): - self.var = var - - def __str__(self): - return str.format("Please set the mandatory env var: {}", self.var) - - -def is_keystone_v3(): - keystone_api_version = os.getenv('OS_IDENTITY_API_VERSION') - if (keystone_api_version is None or - keystone_api_version == '2'): - return False - else: - return True - - -def get_rc_env_vars(): - env_vars = ['OS_AUTH_URL', 'OS_USERNAME', 'OS_PASSWORD'] - if is_keystone_v3(): - env_vars.extend(['OS_PROJECT_NAME', - 'OS_USER_DOMAIN_NAME', - 'OS_PROJECT_DOMAIN_NAME']) - else: - env_vars.extend(['OS_TENANT_NAME']) - return env_vars - - -def check_credentials(): - """ - Check if the OpenStack credentials (openrc) are sourced - """ - env_vars = get_rc_env_vars() - return all(map(lambda v: v in os.environ and os.environ[v], env_vars)) - - -def get_env_cred_dict(): - env_cred_dict = { - 'OS_USERNAME': 'username', - 'OS_PASSWORD': 'password', - 'OS_AUTH_URL': 'auth_url', - 'OS_TENANT_NAME': 'tenant_name', - 'OS_USER_DOMAIN_NAME': 'user_domain_name', - 'OS_PROJECT_DOMAIN_NAME': 'project_domain_name', - 'OS_PROJECT_NAME': 'project_name', - 'OS_ENDPOINT_TYPE': 'endpoint_type', - 'OS_REGION_NAME': 'region_name', - 'OS_CACERT': 'https_cacert', - 'OS_INSECURE': 'https_insecure' - } - return env_cred_dict - - -def get_credentials(other_creds={}): - """Returns a creds dictionary filled with parsed from env - """ - creds = {} - env_vars = get_rc_env_vars() - env_cred_dict = get_env_cred_dict() - - for envvar in env_vars: - if os.getenv(envvar) is None: - raise MissingEnvVar(envvar) - else: - creds_key = env_cred_dict.get(envvar) - creds.update({creds_key: os.getenv(envvar)}) - - if 'tenant' in other_creds.keys(): - if is_keystone_v3(): - tenant = 'project_name' - else: - tenant = 'tenant_name' - other_creds[tenant] = other_creds.pop('tenant') - - creds.update(other_creds) - - return creds - - -def source_credentials(rc_file): - with open(rc_file, "r") as f: - for line in f: - var = (line.rstrip('"\n').replace('export ', '').split("=") - if re.search(r'(.*)=(.*)', line) else None) - # The two next lines should be modified as soon as rc_file - # conforms with common rules. Be aware that it could induce - # issues if value starts with ' - if var: - key = re.sub(r'^["\' ]*|[ \'"]*$', '', var[0]) - value = re.sub(r'^["\' ]*|[ \'"]*$', '', "".join(var[1:])) - os.environ[key] = value - CONST.__setattr__(key, value) - - -def get_session_auth(other_creds={}): - loader = loading.get_plugin_loader('password') - creds = get_credentials(other_creds) - auth = loader.load_from_options(**creds) - return auth - - -def get_endpoint(service_type, interface='public'): - auth = get_session_auth() - return get_session().get_endpoint(auth=auth, - service_type=service_type, - interface=interface) - - -def get_session(other_creds={}): - auth = get_session_auth(other_creds) - https_cacert = os.getenv('OS_CACERT', '') - https_insecure = os.getenv('OS_INSECURE', '').lower() == 'true' - return session.Session(auth=auth, - verify=(https_cacert or not https_insecure)) - - -# ********************************************* -# CLIENTS -# ********************************************* -def get_keystone_client_version(): - api_version = os.getenv('OS_IDENTITY_API_VERSION') - if api_version is not None: - logger.info("OS_IDENTITY_API_VERSION is set in env as '%s'", - api_version) - return api_version - return DEFAULT_API_VERSION - - -def get_keystone_client(other_creds={}): - sess = get_session(other_creds) - return keystoneclient.Client(get_keystone_client_version(), - session=sess, - interface=os.getenv('OS_INTERFACE', 'admin')) - - -def get_nova_client_version(): - api_version = os.getenv('OS_COMPUTE_API_VERSION') - if api_version is not None: - logger.info("OS_COMPUTE_API_VERSION is set in env as '%s'", - api_version) - return api_version - return DEFAULT_API_VERSION - - -def get_nova_client(other_creds={}): - sess = get_session(other_creds) - return novaclient.Client(get_nova_client_version(), session=sess) - - -def get_cinder_client_version(): - api_version = os.getenv('OS_VOLUME_API_VERSION') - if api_version is not None: - logger.info("OS_VOLUME_API_VERSION is set in env as '%s'", - api_version) - return api_version - return DEFAULT_API_VERSION - - -def get_cinder_client(other_creds={}): - sess = get_session(other_creds) - return cinderclient.Client(get_cinder_client_version(), session=sess) - - -def get_neutron_client_version(): - api_version = os.getenv('OS_NETWORK_API_VERSION') - if api_version is not None: - logger.info("OS_NETWORK_API_VERSION is set in env as '%s'", - api_version) - return api_version - return DEFAULT_API_VERSION - - -def get_neutron_client(other_creds={}): - sess = get_session(other_creds) - return neutronclient.Client(get_neutron_client_version(), session=sess) - - -def get_glance_client_version(): - api_version = os.getenv('OS_IMAGE_API_VERSION') - if api_version is not None: - logger.info("OS_IMAGE_API_VERSION is set in env as '%s'", api_version) - return api_version - return DEFAULT_API_VERSION - - -def get_glance_client(other_creds={}): - sess = get_session(other_creds) - return glanceclient.Client(get_glance_client_version(), session=sess) - - -def get_heat_client_version(): - api_version = os.getenv('OS_ORCHESTRATION_API_VERSION') - if api_version is not None: - logger.info("OS_ORCHESTRATION_API_VERSION is set in env as '%s'", - api_version) - return api_version - return DEFAULT_HEAT_API_VERSION - - -def get_heat_client(other_creds={}): - sess = get_session(other_creds) - return heatclient.Client(get_heat_client_version(), session=sess) - - -def download_and_add_image_on_glance(glance, image_name, image_url, data_dir): - try: - dest_path = data_dir - 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): - return False - except Exception: - raise Exception("Impossible to download image from {}".format( - image_url)) - - try: - image = create_glance_image( - glance, image_name, dest_path + file_name) - if not image: - return False - else: - return image - except Exception: - raise Exception("Impossible to put image {} in glance".format( - image_name)) - - -# ********************************************* -# NOVA -# ********************************************* -def get_instances(nova_client): - try: - instances = nova_client.servers.list(search_opts={'all_tenants': 1}) - return instances - except Exception as e: - logger.error("Error [get_instances(nova_client)]: %s" % e) - return None - - -def get_instance_status(nova_client, instance): - try: - instance = nova_client.servers.get(instance.id) - return instance.status - except Exception as e: - logger.error("Error [get_instance_status(nova_client)]: %s" % e) - return None - - -def get_instance_by_name(nova_client, instance_name): - try: - instance = nova_client.servers.find(name=instance_name) - return instance - except Exception as e: - logger.error("Error [get_instance_by_name(nova_client, '%s')]: %s" - % (instance_name, e)) - return None - - -def get_flavor_id(nova_client, flavor_name): - flavors = nova_client.flavors.list(detailed=True) - id = '' - for f in flavors: - if f.name == flavor_name: - id = f.id - break - return id - - -def get_flavor_id_by_ram_range(nova_client, min_ram, max_ram): - flavors = nova_client.flavors.list(detailed=True) - id = '' - for f in flavors: - if min_ram <= f.ram and f.ram <= max_ram: - id = f.id - break - return id - - -def get_aggregates(nova_client): - try: - aggregates = nova_client.aggregates.list() - return aggregates - except Exception as e: - logger.error("Error [get_aggregates(nova_client)]: %s" % e) - return None - - -def get_aggregate_id(nova_client, aggregate_name): - try: - aggregates = get_aggregates(nova_client) - _id = [ag.id for ag in aggregates if ag.name == aggregate_name][0] - return _id - except Exception as e: - logger.error("Error [get_aggregate_id(nova_client, %s)]:" - " %s" % (aggregate_name, e)) - return None - - -def get_availability_zones(nova_client): - try: - availability_zones = nova_client.availability_zones.list() - return availability_zones - except Exception as e: - logger.error("Error [get_availability_zones(nova_client)]: %s" % e) - return None - - -def get_availability_zone_names(nova_client): - try: - az_names = [az.zoneName for az in get_availability_zones(nova_client)] - return az_names - except Exception as e: - logger.error("Error [get_availability_zone_names(nova_client)]:" - " %s" % e) - return None - - -def create_flavor(nova_client, flavor_name, ram, disk, vcpus, public=True): - try: - flavor = nova_client.flavors.create( - flavor_name, ram, vcpus, disk, is_public=public) - try: - extra_specs = ft_utils.get_functest_config( - 'general.flavor_extra_specs') - flavor.set_keys(extra_specs) - except ValueError: - # flavor extra specs are not configured, therefore skip the update - pass - - except Exception as e: - logger.error("Error [create_flavor(nova_client, '%s', '%s', '%s', " - "'%s')]: %s" % (flavor_name, ram, disk, vcpus, e)) - return None - return flavor.id - - -def get_or_create_flavor(flavor_name, ram, disk, vcpus, public=True): - flavor_exists = False - nova_client = get_nova_client() - - flavor_id = get_flavor_id(nova_client, flavor_name) - if flavor_id != '': - logger.info("Using existing flavor '%s'..." % flavor_name) - flavor_exists = True - else: - logger.info("Creating flavor '%s' with '%s' RAM, '%s' disk size, " - "'%s' vcpus..." % (flavor_name, ram, disk, vcpus)) - flavor_id = create_flavor( - nova_client, flavor_name, ram, disk, vcpus, public=public) - if not flavor_id: - raise Exception("Failed to create flavor '%s'..." % (flavor_name)) - else: - logger.debug("Flavor '%s' with ID=%s created successfully." - % (flavor_name, flavor_id)) - - return flavor_exists, flavor_id - - -def get_floating_ips(neutron_client): - try: - floating_ips = neutron_client.list_floatingips() - return floating_ips['floatingips'] - except Exception as e: - logger.error("Error [get_floating_ips(neutron_client)]: %s" % e) - return None - - -def get_hypervisors(nova_client): - try: - nodes = [] - hypervisors = nova_client.hypervisors.list() - for hypervisor in hypervisors: - if hypervisor.state == "up": - nodes.append(hypervisor.hypervisor_hostname) - return nodes - except Exception as e: - logger.error("Error [get_hypervisors(nova_client)]: %s" % e) - return None - - -def create_aggregate(nova_client, aggregate_name, av_zone): - try: - nova_client.aggregates.create(aggregate_name, av_zone) - return True - except Exception as e: - logger.error("Error [create_aggregate(nova_client, %s, %s)]: %s" - % (aggregate_name, av_zone, e)) - return None - - -def add_host_to_aggregate(nova_client, aggregate_name, compute_host): - try: - aggregate_id = get_aggregate_id(nova_client, aggregate_name) - nova_client.aggregates.add_host(aggregate_id, compute_host) - return True - except Exception as e: - logger.error("Error [add_host_to_aggregate(nova_client, %s, %s)]: %s" - % (aggregate_name, compute_host, e)) - return None - - -def create_aggregate_with_host( - nova_client, aggregate_name, av_zone, compute_host): - try: - create_aggregate(nova_client, aggregate_name, av_zone) - add_host_to_aggregate(nova_client, aggregate_name, compute_host) - return True - except Exception as e: - logger.error("Error [create_aggregate_with_host(" - "nova_client, %s, %s, %s)]: %s" - % (aggregate_name, av_zone, compute_host, e)) - return None - - -def create_instance(flavor_name, - image_id, - network_id, - instance_name="functest-vm", - confdrive=True, - userdata=None, - av_zone='', - fixed_ip=None, - files=None): - nova_client = get_nova_client() - try: - flavor = nova_client.flavors.find(name=flavor_name) - except: - flavors = nova_client.flavors.list() - logger.error("Error: Flavor '%s' not found. Available flavors are: " - "\n%s" % (flavor_name, flavors)) - return None - if fixed_ip is not None: - nics = {"net-id": network_id, "v4-fixed-ip": fixed_ip} - else: - nics = {"net-id": network_id} - if userdata is None: - instance = nova_client.servers.create( - name=instance_name, - flavor=flavor, - image=image_id, - nics=[nics], - availability_zone=av_zone, - files=files - ) - else: - instance = nova_client.servers.create( - name=instance_name, - flavor=flavor, - image=image_id, - nics=[nics], - config_drive=confdrive, - userdata=userdata, - availability_zone=av_zone, - files=files - ) - return instance - - -def create_instance_and_wait_for_active(flavor_name, - image_id, - network_id, - instance_name="", - config_drive=False, - userdata="", - av_zone='', - fixed_ip=None, - files=None): - SLEEP = 3 - VM_BOOT_TIMEOUT = 180 - nova_client = get_nova_client() - instance = create_instance(flavor_name, - image_id, - network_id, - instance_name, - config_drive, - userdata, - av_zone=av_zone, - fixed_ip=fixed_ip, - files=files) - count = VM_BOOT_TIMEOUT / SLEEP - for n in range(count, -1, -1): - status = get_instance_status(nova_client, instance) - if status.lower() == "active": - return instance - elif status.lower() == "error": - logger.error("The instance %s went to ERROR status." - % instance_name) - return None - time.sleep(SLEEP) - logger.error("Timeout booting the instance %s." % instance_name) - return None - - -def create_floating_ip(neutron_client): - extnet_id = get_external_net_id(neutron_client) - props = {'floating_network_id': extnet_id} - try: - ip_json = neutron_client.create_floatingip({'floatingip': props}) - fip_addr = ip_json['floatingip']['floating_ip_address'] - fip_id = ip_json['floatingip']['id'] - except Exception as e: - logger.error("Error [create_floating_ip(neutron_client)]: %s" % e) - return None - return {'fip_addr': fip_addr, 'fip_id': fip_id} - - -def add_floating_ip(nova_client, server_id, floatingip_addr): - try: - nova_client.servers.add_floating_ip(server_id, floatingip_addr) - return True - except Exception as e: - logger.error("Error [add_floating_ip(nova_client, '%s', '%s')]: %s" - % (server_id, floatingip_addr, e)) - return False - - -def delete_instance(nova_client, instance_id): - try: - nova_client.servers.force_delete(instance_id) - return True - except Exception as e: - logger.error("Error [delete_instance(nova_client, '%s')]: %s" - % (instance_id, e)) - return False - - -def delete_floating_ip(neutron_client, floatingip_id): - try: - neutron_client.delete_floatingip(floatingip_id) - return True - except Exception as e: - logger.error("Error [delete_floating_ip(neutron_client, '%s')]: %s" - % (floatingip_id, e)) - return False - - -def remove_host_from_aggregate(nova_client, aggregate_name, compute_host): - try: - aggregate_id = get_aggregate_id(nova_client, aggregate_name) - nova_client.aggregates.remove_host(aggregate_id, compute_host) - return True - except Exception as e: - logger.error("Error [remove_host_from_aggregate(nova_client, %s, %s)]:" - " %s" % (aggregate_name, compute_host, e)) - return False - - -def remove_hosts_from_aggregate(nova_client, aggregate_name): - aggregate_id = get_aggregate_id(nova_client, aggregate_name) - hosts = nova_client.aggregates.get(aggregate_id).hosts - assert( - all(remove_host_from_aggregate(nova_client, aggregate_name, host) - for host in hosts)) - - -def delete_aggregate(nova_client, aggregate_name): - try: - remove_hosts_from_aggregate(nova_client, aggregate_name) - nova_client.aggregates.delete(aggregate_name) - return True - except Exception as e: - logger.error("Error [delete_aggregate(nova_client, %s)]: %s" - % (aggregate_name, e)) - return False - - -# ********************************************* -# NEUTRON -# ********************************************* -def get_network_list(neutron_client): - network_list = neutron_client.list_networks()['networks'] - if len(network_list) == 0: - return None - else: - return network_list - - -def get_router_list(neutron_client): - router_list = neutron_client.list_routers()['routers'] - if len(router_list) == 0: - return None - else: - return router_list - - -def get_port_list(neutron_client): - port_list = neutron_client.list_ports()['ports'] - if len(port_list) == 0: - return None - else: - return port_list - - -def get_network_id(neutron_client, network_name): - networks = neutron_client.list_networks()['networks'] - id = '' - for n in networks: - if n['name'] == network_name: - id = n['id'] - break - return id - - -def get_subnet_id(neutron_client, subnet_name): - subnets = neutron_client.list_subnets()['subnets'] - id = '' - for s in subnets: - if s['name'] == subnet_name: - id = s['id'] - break - return id - - -def get_router_id(neutron_client, router_name): - routers = neutron_client.list_routers()['routers'] - id = '' - for r in routers: - if r['name'] == router_name: - id = r['id'] - break - return id - - -def get_private_net(neutron_client): - # Checks if there is an existing shared private network - networks = neutron_client.list_networks()['networks'] - if len(networks) == 0: - return None - for net in networks: - if (net['router:external'] is False) and (net['shared'] is True): - return net - return None - - -def get_external_net(neutron_client): - if (hasattr(CONST, 'EXTERNAL_NETWORK')): - return CONST.__getattribute__('EXTERNAL_NETWORK') - for network in neutron_client.list_networks()['networks']: - if network['router:external']: - return network['name'] - return None - - -def get_external_net_id(neutron_client): - if (hasattr(CONST, 'EXTERNAL_NETWORK')): - networks = neutron_client.list_networks( - name=CONST.__getattribute__('EXTERNAL_NETWORK')) - net_id = networks['networks'][0]['id'] - return net_id - for network in neutron_client.list_networks()['networks']: - if network['router:external']: - return network['id'] - return None - - -def check_neutron_net(neutron_client, net_name): - for network in neutron_client.list_networks()['networks']: - if network['name'] == net_name: - for subnet in network['subnets']: - return True - return False - - -def create_neutron_net(neutron_client, name): - json_body = {'network': {'name': name, - 'admin_state_up': True}} - try: - network = neutron_client.create_network(body=json_body) - network_dict = network['network'] - return network_dict['id'] - except Exception as e: - logger.error("Error [create_neutron_net(neutron_client, '%s')]: %s" - % (name, e)) - return None - - -def create_neutron_subnet(neutron_client, name, cidr, net_id, - dns=['8.8.8.8', '8.8.4.4']): - json_body = {'subnets': [{'name': name, 'cidr': cidr, - 'ip_version': 4, 'network_id': net_id, - 'dns_nameservers': dns}]} - - try: - subnet = neutron_client.create_subnet(body=json_body) - return subnet['subnets'][0]['id'] - except Exception as e: - logger.error("Error [create_neutron_subnet(neutron_client, '%s', " - "'%s', '%s')]: %s" % (name, cidr, net_id, e)) - return None - - -def create_neutron_router(neutron_client, name): - json_body = {'router': {'name': name, 'admin_state_up': True}} - try: - router = neutron_client.create_router(json_body) - return router['router']['id'] - except Exception as e: - logger.error("Error [create_neutron_router(neutron_client, '%s')]: %s" - % (name, e)) - return None - - -def create_neutron_port(neutron_client, name, network_id, ip): - json_body = {'port': { - 'admin_state_up': True, - 'name': name, - 'network_id': network_id, - 'fixed_ips': [{"ip_address": ip}] - }} - try: - port = neutron_client.create_port(body=json_body) - return port['port']['id'] - except Exception as e: - logger.error("Error [create_neutron_port(neutron_client, '%s', '%s', " - "'%s')]: %s" % (name, network_id, ip, e)) - return None - - -def update_neutron_net(neutron_client, network_id, shared=False): - json_body = {'network': {'shared': shared}} - try: - neutron_client.update_network(network_id, body=json_body) - return True - except Exception as e: - logger.error("Error [update_neutron_net(neutron_client, '%s', '%s')]: " - "%s" % (network_id, str(shared), e)) - return False - - -def update_neutron_port(neutron_client, port_id, device_owner): - json_body = {'port': { - 'device_owner': device_owner, - }} - try: - port = neutron_client.update_port(port=port_id, - body=json_body) - return port['port']['id'] - except Exception as e: - logger.error("Error [update_neutron_port(neutron_client, '%s', '%s')]:" - " %s" % (port_id, device_owner, e)) - return None - - -def add_interface_router(neutron_client, router_id, subnet_id): - json_body = {"subnet_id": subnet_id} - try: - neutron_client.add_interface_router(router=router_id, body=json_body) - return True - except Exception as e: - logger.error("Error [add_interface_router(neutron_client, '%s', " - "'%s')]: %s" % (router_id, subnet_id, e)) - return False - - -def add_gateway_router(neutron_client, router_id): - ext_net_id = get_external_net_id(neutron_client) - router_dict = {'network_id': ext_net_id} - try: - neutron_client.add_gateway_router(router_id, router_dict) - return True - except Exception as e: - logger.error("Error [add_gateway_router(neutron_client, '%s')]: %s" - % (router_id, e)) - return False - - -def delete_neutron_net(neutron_client, network_id): - try: - neutron_client.delete_network(network_id) - return True - except Exception as e: - logger.error("Error [delete_neutron_net(neutron_client, '%s')]: %s" - % (network_id, e)) - return False - - -def delete_neutron_subnet(neutron_client, subnet_id): - try: - neutron_client.delete_subnet(subnet_id) - return True - except Exception as e: - logger.error("Error [delete_neutron_subnet(neutron_client, '%s')]: %s" - % (subnet_id, e)) - return False - - -def delete_neutron_router(neutron_client, router_id): - try: - neutron_client.delete_router(router=router_id) - return True - except Exception as e: - logger.error("Error [delete_neutron_router(neutron_client, '%s')]: %s" - % (router_id, e)) - return False - - -def delete_neutron_port(neutron_client, port_id): - try: - neutron_client.delete_port(port_id) - return True - except Exception as e: - logger.error("Error [delete_neutron_port(neutron_client, '%s')]: %s" - % (port_id, e)) - return False - - -def remove_interface_router(neutron_client, router_id, subnet_id): - json_body = {"subnet_id": subnet_id} - try: - neutron_client.remove_interface_router(router=router_id, - body=json_body) - return True - except Exception as e: - logger.error("Error [remove_interface_router(neutron_client, '%s', " - "'%s')]: %s" % (router_id, subnet_id, e)) - return False - - -def remove_gateway_router(neutron_client, router_id): - try: - neutron_client.remove_gateway_router(router_id) - return True - except Exception as e: - logger.error("Error [remove_gateway_router(neutron_client, '%s')]: %s" - % (router_id, e)) - return False - - -def create_network_full(neutron_client, - net_name, - subnet_name, - router_name, - cidr, - dns=['8.8.8.8', '8.8.4.4']): - - # Check if the network already exists - network_id = get_network_id(neutron_client, net_name) - subnet_id = get_subnet_id(neutron_client, subnet_name) - router_id = get_router_id(neutron_client, router_name) - - if network_id != '' and subnet_id != '' and router_id != '': - logger.info("A network with name '%s' already exists..." % net_name) - else: - neutron_client.format = 'json' - logger.info('Creating neutron network %s...' % net_name) - network_id = create_neutron_net(neutron_client, net_name) - - if not network_id: - return False - - logger.debug("Network '%s' created successfully" % network_id) - logger.debug('Creating Subnet....') - subnet_id = create_neutron_subnet(neutron_client, subnet_name, - cidr, network_id, dns) - if not subnet_id: - return None - - logger.debug("Subnet '%s' created successfully" % subnet_id) - logger.debug('Creating Router...') - router_id = create_neutron_router(neutron_client, router_name) - - if not router_id: - return None - - logger.debug("Router '%s' created successfully" % router_id) - logger.debug('Adding router to subnet...') - - if not add_interface_router(neutron_client, router_id, subnet_id): - return None - - logger.debug("Interface added successfully.") - - logger.debug('Adding gateway to router...') - if not add_gateway_router(neutron_client, router_id): - return None - - logger.debug("Gateway added successfully.") - - network_dic = {'net_id': network_id, - 'subnet_id': subnet_id, - 'router_id': router_id} - return network_dic - - -def create_shared_network_full(net_name, subnt_name, router_name, subnet_cidr): - neutron_client = get_neutron_client() - - network_dic = create_network_full(neutron_client, - net_name, - subnt_name, - router_name, - subnet_cidr) - if network_dic: - if not update_neutron_net(neutron_client, - network_dic['net_id'], - shared=True): - logger.error("Failed to update network %s..." % net_name) - return None - else: - logger.debug("Network '%s' is available..." % net_name) - else: - logger.error("Network %s creation failed" % net_name) - return None - return network_dic - - -# ********************************************* -# SEC GROUPS -# ********************************************* - - -def get_security_groups(neutron_client): - try: - security_groups = neutron_client.list_security_groups()[ - 'security_groups'] - return security_groups - except Exception as e: - logger.error("Error [get_security_groups(neutron_client)]: %s" % e) - return None - - -def get_security_group_id(neutron_client, sg_name): - security_groups = get_security_groups(neutron_client) - id = '' - for sg in security_groups: - if sg['name'] == sg_name: - id = sg['id'] - break - return id - - -def create_security_group(neutron_client, sg_name, sg_description): - json_body = {'security_group': {'name': sg_name, - 'description': sg_description}} - try: - secgroup = neutron_client.create_security_group(json_body) - return secgroup['security_group'] - except Exception as e: - logger.error("Error [create_security_group(neutron_client, '%s', " - "'%s')]: %s" % (sg_name, sg_description, e)) - return None - - -def create_secgroup_rule(neutron_client, sg_id, direction, protocol, - port_range_min=None, port_range_max=None): - # We create a security group in 2 steps - # 1 - we check the format and set the json body accordingly - # 2 - we call neturon client to create the security group - - # Format check - json_body = {'security_group_rule': {'direction': direction, - 'security_group_id': sg_id, - 'protocol': protocol}} - # parameters may be - # - both None => we do nothing - # - both Not None => we add them to the json description - # but one cannot be None is the other is not None - if (port_range_min is not None and port_range_max is not None): - # add port_range in json description - json_body['security_group_rule']['port_range_min'] = port_range_min - json_body['security_group_rule']['port_range_max'] = port_range_max - logger.debug("Security_group format set (port range included)") - else: - # either both port range are set to None => do nothing - # or one is set but not the other => log it and return False - if port_range_min is None and port_range_max is None: - logger.debug("Security_group format set (no port range mentioned)") - else: - logger.error("Bad security group format." - "One of the port range is not properly set:" - "range min: {}," - "range max: {}".format(port_range_min, - port_range_max)) - return False - - # Create security group using neutron client - try: - neutron_client.create_security_group_rule(json_body) - return True - except: - logger.exception("Impossible to create_security_group_rule," - "security group rule probably already exists") - return False - - -def get_security_group_rules(neutron_client, sg_id): - try: - security_rules = neutron_client.list_security_group_rules()[ - 'security_group_rules'] - security_rules = [rule for rule in security_rules - if rule["security_group_id"] == sg_id] - return security_rules - except Exception as e: - logger.error("Error [get_security_group_rules(neutron_client, sg_id)]:" - " %s" % e) - return None - - -def check_security_group_rules(neutron_client, sg_id, direction, protocol, - port_min=None, port_max=None): - try: - security_rules = get_security_group_rules(neutron_client, sg_id) - security_rules = [rule for rule in security_rules - if (rule["direction"].lower() == direction and - rule["protocol"].lower() == protocol and - rule["port_range_min"] == port_min and - rule["port_range_max"] == port_max)] - if len(security_rules) == 0: - return True - else: - return False - except Exception as e: - logger.error("Error [check_security_group_rules(" - " neutron_client, sg_id, direction," - " protocol, port_min=None, port_max=None)]: " - "%s" % e) - return None - - -def create_security_group_full(neutron_client, - sg_name, sg_description): - sg_id = get_security_group_id(neutron_client, sg_name) - if sg_id != '': - logger.info("Using existing security group '%s'..." % sg_name) - else: - logger.info("Creating security group '%s'..." % sg_name) - SECGROUP = create_security_group(neutron_client, - sg_name, - sg_description) - if not SECGROUP: - logger.error("Failed to create the security group...") - return None - - sg_id = SECGROUP['id'] - - logger.debug("Security group '%s' with ID=%s created successfully." - % (SECGROUP['name'], sg_id)) - - logger.debug("Adding ICMP rules in security group '%s'..." - % sg_name) - if not create_secgroup_rule(neutron_client, sg_id, - 'ingress', 'icmp'): - logger.error("Failed to create the security group rule...") - return None - - logger.debug("Adding SSH rules in security group '%s'..." - % sg_name) - if not create_secgroup_rule( - neutron_client, sg_id, 'ingress', 'tcp', '22', '22'): - logger.error("Failed to create the security group rule...") - return None - - if not create_secgroup_rule( - neutron_client, sg_id, 'egress', 'tcp', '22', '22'): - logger.error("Failed to create the security group rule...") - return None - return sg_id - - -def add_secgroup_to_instance(nova_client, instance_id, secgroup_id): - try: - nova_client.servers.add_security_group(instance_id, secgroup_id) - return True - except Exception as e: - logger.error("Error [add_secgroup_to_instance(nova_client, '%s', " - "'%s')]: %s" % (instance_id, secgroup_id, e)) - return False - - -def update_sg_quota(neutron_client, tenant_id, sg_quota, sg_rule_quota): - json_body = {"quota": { - "security_group": sg_quota, - "security_group_rule": sg_rule_quota - }} - - try: - neutron_client.update_quota(tenant_id=tenant_id, - body=json_body) - return True - except Exception as e: - logger.error("Error [update_sg_quota(neutron_client, '%s', '%s', " - "'%s')]: %s" % (tenant_id, sg_quota, sg_rule_quota, e)) - return False - - -def delete_security_group(neutron_client, secgroup_id): - try: - neutron_client.delete_security_group(secgroup_id) - return True - except Exception as e: - logger.error("Error [delete_security_group(neutron_client, '%s')]: %s" - % (secgroup_id, e)) - return False - - -# ********************************************* -# GLANCE -# ********************************************* -def get_images(glance_client): - try: - images = glance_client.images.list() - return images - except Exception as e: - logger.error("Error [get_images]: %s" % e) - return None - - -def get_image_id(glance_client, image_name): - images = glance_client.images.list() - id = '' - for i in images: - if i.name == image_name: - id = i.id - break - return id - - -def create_glance_image(glance_client, - image_name, - file_path, - disk="qcow2", - extra_properties={}, - container="bare", - public="public"): - if not os.path.isfile(file_path): - logger.error("Error: file %s does not exist." % file_path) - return None - try: - image_id = get_image_id(glance_client, image_name) - if image_id != '': - logger.info("Image %s already exists." % image_name) - else: - logger.info("Creating image '%s' from '%s'..." % (image_name, - file_path)) - - image = glance_client.images.create(name=image_name, - visibility=public, - disk_format=disk, - container_format=container, - **extra_properties) - image_id = image.id - with open(file_path) as image_data: - glance_client.images.upload(image_id, image_data) - return image_id - except Exception as e: - logger.error("Error [create_glance_image(glance_client, '%s', '%s', " - "'%s')]: %s" % (image_name, file_path, public, e)) - return None - - -def get_or_create_image(name, path, format, extra_properties): - image_exists = False - glance_client = get_glance_client() - - image_id = get_image_id(glance_client, name) - if image_id != '': - logger.info("Using existing image '%s'..." % name) - image_exists = True - else: - logger.info("Creating image '%s' from '%s'..." % (name, path)) - image_id = create_glance_image(glance_client, - name, - path, - format, - extra_properties) - if not image_id: - logger.error("Failed to create a Glance image...") - else: - logger.debug("Image '%s' with ID=%s created successfully." - % (name, image_id)) - - return image_exists, image_id - - -def delete_glance_image(glance_client, image_id): - try: - glance_client.images.delete(image_id) - return True - except Exception as e: - logger.error("Error [delete_glance_image(glance_client, '%s')]: %s" - % (image_id, e)) - return False - - -# ********************************************* -# CINDER -# ********************************************* -def get_volumes(cinder_client): - try: - volumes = cinder_client.volumes.list(search_opts={'all_tenants': 1}) - return volumes - except Exception as e: - logger.error("Error [get_volumes(cinder_client)]: %s" % e) - return None - - -def update_cinder_quota(cinder_client, tenant_id, vols_quota, - snapshots_quota, gigabytes_quota): - quotas_values = {"volumes": vols_quota, - "snapshots": snapshots_quota, - "gigabytes": gigabytes_quota} - - try: - cinder_client.quotas.update(tenant_id, **quotas_values) - return True - except Exception as e: - logger.error("Error [update_cinder_quota(cinder_client, '%s', '%s', " - "'%s' '%s')]: %s" % (tenant_id, vols_quota, - snapshots_quota, gigabytes_quota, e)) - return False - - -def delete_volume(cinder_client, volume_id, forced=False): - try: - if forced: - try: - cinder_client.volumes.detach(volume_id) - except: - logger.error(sys.exc_info()[0]) - cinder_client.volumes.force_delete(volume_id) - else: - cinder_client.volumes.delete(volume_id) - return True - except Exception as e: - logger.error("Error [delete_volume(cinder_client, '%s', '%s')]: %s" - % (volume_id, str(forced), e)) - return False - - -# ********************************************* -# KEYSTONE -# ********************************************* -def get_tenants(keystone_client): - try: - if is_keystone_v3(): - tenants = keystone_client.projects.list() - else: - tenants = keystone_client.tenants.list() - return tenants - except Exception as e: - logger.error("Error [get_tenants(keystone_client)]: %s" % e) - return None - - -def get_users(keystone_client): - try: - users = keystone_client.users.list() - return users - except Exception as e: - logger.error("Error [get_users(keystone_client)]: %s" % e) - return None - - -def get_tenant_id(keystone_client, tenant_name): - tenants = get_tenants(keystone_client) - id = '' - for t in tenants: - if t.name == tenant_name: - id = t.id - break - return id - - -def get_user_id(keystone_client, user_name): - users = get_users(keystone_client) - id = '' - for u in users: - if u.name == user_name: - id = u.id - break - return id - - -def get_role_id(keystone_client, role_name): - roles = keystone_client.roles.list() - id = '' - for r in roles: - if r.name == role_name: - id = r.id - break - return id - - -def get_domain_id(keystone_client, domain_name): - domains = keystone_client.domains.list() - id = '' - for d in domains: - if d.name == domain_name: - id = d.id - break - return id - - -def create_tenant(keystone_client, tenant_name, tenant_description): - try: - if is_keystone_v3(): - domain_name = CONST.__getattribute__('OS_PROJECT_DOMAIN_NAME') - domain_id = get_domain_id(keystone_client, domain_name) - tenant = keystone_client.projects.create( - name=tenant_name, - description=tenant_description, - domain=domain_id, - enabled=True) - else: - tenant = keystone_client.tenants.create(tenant_name, - tenant_description, - enabled=True) - return tenant.id - except Exception as e: - logger.error("Error [create_tenant(keystone_client, '%s', '%s')]: %s" - % (tenant_name, tenant_description, e)) - return None - - -def get_or_create_tenant(keystone_client, tenant_name, tenant_description): - tenant_id = get_tenant_id(keystone_client, tenant_name) - if not tenant_id: - tenant_id = create_tenant(keystone_client, tenant_name, - tenant_description) - - return tenant_id - - -def get_or_create_tenant_for_vnf(keystone_client, tenant_name, - tenant_description): - """Get or Create a Tenant - - Args: - keystone_client: keystone client reference - tenant_name: the name of the tenant - tenant_description: the description of the tenant - - return False if tenant retrieved though get - return True if tenant created - raise Exception if error during processing - """ - try: - tenant_id = get_tenant_id(keystone_client, tenant_name) - if not tenant_id: - tenant_id = create_tenant(keystone_client, tenant_name, - tenant_description) - return True - else: - return False - except: - raise Exception("Impossible to create a Tenant for the VNF {}".format( - tenant_name)) - - -def create_user(keystone_client, user_name, user_password, - user_email, tenant_id): - try: - if is_keystone_v3(): - user = keystone_client.users.create(name=user_name, - password=user_password, - email=user_email, - project_id=tenant_id, - enabled=True) - else: - user = keystone_client.users.create(user_name, - user_password, - user_email, - tenant_id, - enabled=True) - return user.id - except Exception as e: - logger.error("Error [create_user(keystone_client, '%s', '%s', '%s'" - "'%s')]: %s" % (user_name, user_password, - user_email, tenant_id, e)) - return None - - -def get_or_create_user(keystone_client, user_name, user_password, - tenant_id, user_email=None): - user_id = get_user_id(keystone_client, user_name) - if not user_id: - user_id = create_user(keystone_client, user_name, user_password, - user_email, tenant_id) - return user_id - - -def get_or_create_user_for_vnf(keystone_client, vnf_ref): - """Get or Create user for VNF - - Args: - keystone_client: keystone client reference - vnf_ref: VNF reference used as user name & password, tenant name - - return False if user retrieved through get - return True if user created - raise Exception if error during processing - """ - try: - user_id = get_user_id(keystone_client, vnf_ref) - tenant_id = get_tenant_id(keystone_client, vnf_ref) - created = False - if not user_id: - user_id = create_user(keystone_client, vnf_ref, vnf_ref, - "", tenant_id) - created = True - try: - role_id = get_role_id(keystone_client, 'admin') - tenant_id = get_tenant_id(keystone_client, vnf_ref) - add_role_user(keystone_client, user_id, role_id, tenant_id) - except: - logger.warn("Cannot associate user to role admin on tenant") - return created - except: - raise Exception("Impossible to create a user for the VNF {}".format( - vnf_ref)) - - -def add_role_user(keystone_client, user_id, role_id, tenant_id): - try: - if is_keystone_v3(): - keystone_client.roles.grant(role=role_id, - user=user_id, - project=tenant_id) - else: - keystone_client.roles.add_user_role(user_id, role_id, tenant_id) - return True - except Exception as e: - logger.error("Error [add_role_user(keystone_client, '%s', '%s'" - "'%s')]: %s " % (user_id, role_id, tenant_id, e)) - return False - - -def delete_tenant(keystone_client, tenant_id): - try: - if is_keystone_v3(): - keystone_client.projects.delete(tenant_id) - else: - keystone_client.tenants.delete(tenant_id) - return True - except Exception as e: - logger.error("Error [delete_tenant(keystone_client, '%s')]: %s" - % (tenant_id, e)) - return False - - -def delete_user(keystone_client, user_id): - try: - keystone_client.users.delete(user_id) - return True - except Exception as e: - logger.error("Error [delete_user(keystone_client, '%s')]: %s" - % (user_id, e)) - return False - - -# ********************************************* -# HEAT -# ********************************************* -def get_resource(heat_client, stack_id, resource): - try: - resources = heat_client.resources.get(stack_id, resource) - return resources - except Exception as e: - logger.error("Error [get_resource]: %s" % e) - return None |