aboutsummaryrefslogtreecommitdiffstats
path: root/functest
diff options
context:
space:
mode:
Diffstat (limited to 'functest')
-rw-r--r--functest/api/base.py71
-rw-r--r--functest/api/common/api_utils.py101
-rw-r--r--functest/api/common/thread.py52
-rw-r--r--functest/api/database/db.py26
-rw-r--r--functest/api/database/v1/handlers.py43
-rw-r--r--functest/api/database/v1/models.py33
-rw-r--r--functest/api/resources/v1/creds.py80
-rw-r--r--functest/api/resources/v1/envs.py83
-rw-r--r--functest/api/resources/v1/tasks.py111
-rw-r--r--functest/api/resources/v1/testcases.py156
-rw-r--r--functest/api/resources/v1/tiers.py82
-rw-r--r--functest/api/server.py106
-rw-r--r--functest/api/swagger/creds.yaml36
-rw-r--r--functest/api/swagger/creds_action.yaml56
-rw-r--r--functest/api/swagger/envs.yaml27
-rw-r--r--functest/api/swagger/envs_action.yaml42
-rw-r--r--functest/api/swagger/task.yaml37
-rw-r--r--functest/api/swagger/task_log.yaml37
-rw-r--r--functest/api/swagger/testcase.yaml36
-rw-r--r--functest/api/swagger/testcase_run.yaml46
-rw-r--r--functest/api/swagger/testcases.yaml23
-rw-r--r--functest/api/swagger/testcases_in_tier.yaml30
-rw-r--r--functest/api/swagger/tier.yaml33
-rw-r--r--functest/api/swagger/tiers.yaml23
-rw-r--r--functest/api/urls.py70
-rw-r--r--functest/ci/add_proxy.sh138
-rw-r--r--functest/ci/check_deployment.py184
-rw-r--r--functest/ci/config_aarch64_patch.yaml151
-rw-r--r--functest/ci/config_functest.yaml123
-rw-r--r--functest/ci/config_patch.yaml516
-rw-r--r--functest/ci/convert_images.sh13
-rw-r--r--functest/ci/download_images.sh25
-rw-r--r--functest/ci/logging.debug.ini110
-rw-r--r--functest/ci/logging.ini48
-rw-r--r--functest/ci/rally_aarch64_patch.conf2
-rw-r--r--functest/ci/run_tests.py289
-rw-r--r--functest/ci/testcases.yaml1082
-rw-r--r--functest/ci/tier_builder.py107
-rw-r--r--functest/ci/tier_handler.py174
-rw-r--r--functest/cli/cli_base.py127
-rw-r--r--functest/cli/commands/cli_env.py60
-rw-r--r--functest/cli/commands/cli_os.py66
-rw-r--r--functest/cli/commands/cli_testcase.py73
-rw-r--r--functest/cli/commands/cli_tier.py90
-rw-r--r--functest/cli/functest-complete.sh8
-rw-r--r--functest/core/cloudify.py219
-rw-r--r--functest/core/feature.py134
-rw-r--r--functest/core/robotframework.py125
-rw-r--r--functest/core/singlevm.py549
-rw-r--r--functest/core/tenantnetwork.py326
-rw-r--r--functest/core/testcase.py186
-rw-r--r--functest/core/unit.py92
-rw-r--r--functest/core/vnf.py206
-rw-r--r--functest/energy/energy.py335
-rw-r--r--functest/opnfv_tests/openstack/api/__init__.py (renamed from functest/api/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/api/connection_check.py73
-rw-r--r--functest/opnfv_tests/openstack/barbican/__init__.py (renamed from functest/api/common/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/barbican/barbican.py37
-rw-r--r--functest/opnfv_tests/openstack/cinder/__init__.py (renamed from functest/api/database/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/cinder/cinder_test.py127
-rw-r--r--functest/opnfv_tests/openstack/cinder/read_data.sh26
-rw-r--r--functest/opnfv_tests/openstack/cinder/write_data.sh30
-rw-r--r--functest/opnfv_tests/openstack/patrole/__init__.py (renamed from functest/api/database/v1/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/patrole/patrole.py28
-rw-r--r--functest/opnfv_tests/openstack/rally/blacklist.txt71
-rw-r--r--functest/opnfv_tests/openstack/rally/blacklist.yaml40
-rw-r--r--functest/opnfv_tests/openstack/rally/macro/macro.yaml6
-rw-r--r--functest/opnfv_tests/openstack/rally/rally.py1059
-rw-r--r--functest/opnfv_tests/openstack/rally/rally_jobs.yaml3
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml458
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-cinder.yaml77
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-glance.yaml5
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-gnocchi.yaml181
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-neutron.yaml22
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-nova.yaml82
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-barbican.yaml98
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-quotas.yaml15
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-swift.yaml71
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/opnfv-vm.yaml41
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml247
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-cinder.yaml20
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-glance.yaml5
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-gnocchi.yaml119
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-neutron.yaml12
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-nova.yaml48
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/support/instance_dd_test.sh13
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/templates/server_with_ports.yaml.template2
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/templates/server_with_volume.yaml.template2
-rw-r--r--functest/opnfv_tests/openstack/rally/task.yaml18
-rw-r--r--functest/opnfv_tests/openstack/refstack/__init__.py (renamed from functest/api/resources/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/refstack/refstack.py81
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/defcore.txt313
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/refstack_client.py261
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/tempest_conf.py67
-rw-r--r--functest/opnfv_tests/openstack/shaker/__init__.py (renamed from functest/api/resources/v1/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/shaker/shaker.py147
-rw-r--r--functest/opnfv_tests/openstack/snaps/__init__.py0
-rw-r--r--functest/opnfv_tests/openstack/snaps/api_check.py41
-rw-r--r--functest/opnfv_tests/openstack/snaps/connection_check.py40
-rw-r--r--functest/opnfv_tests/openstack/snaps/health_check.py45
-rw-r--r--functest/opnfv_tests/openstack/snaps/smoke.py44
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py433
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_test_runner.py63
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_utils.py38
-rw-r--r--functest/opnfv_tests/openstack/tempest/conf_utils.py352
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt2
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.yaml19
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt249
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/public_blacklist.yaml15
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml117
-rw-r--r--functest/opnfv_tests/openstack/tempest/custom_tests/tempest_conf_ovn.yaml104
-rw-r--r--functest/opnfv_tests/openstack/tempest/tempest.py1128
-rw-r--r--functest/opnfv_tests/openstack/vmtp/__init__.py (renamed from functest/ci/__init__.py)0
-rw-r--r--functest/opnfv_tests/openstack/vmtp/vmtp.py213
-rw-r--r--functest/opnfv_tests/openstack/vping/ping.sh10
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_base.py215
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_ssh.py253
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_userdata.py170
-rw-r--r--functest/opnfv_tests/sdn/odl/odl.py82
-rw-r--r--functest/opnfv_tests/vnf/epc/juju_epc.py687
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater.py190
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater_ims_base.py165
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.py605
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.yaml35
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py498
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims_perf.yaml91
-rw-r--r--functest/opnfv_tests/vnf/ims/heat_ims.py253
-rw-r--r--functest/opnfv_tests/vnf/ims/heat_ims.yaml22
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/__init__.py0
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/files/REG_CALL_OPNFV_v13.rxf.template16731
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tstbin491520 -> 0 bytes
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tstbin573440 -> 0 bytes
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxChassisUtils.py150
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxLoadUtils.py398
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/IxRestUtils.py192
-rw-r--r--functest/opnfv_tests/vnf/ims/ixia/utils/__init__.py0
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra.yaml68
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py667
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_openims.py690
-rw-r--r--functest/opnfv_tests/vnf/router/cloudify_vrouter.py572
-rw-r--r--functest/opnfv_tests/vnf/router/cloudify_vrouter.yaml12
-rw-r--r--functest/opnfv_tests/vnf/router/test_controller/function_test_exec.py22
-rw-r--r--functest/opnfv_tests/vnf/router/utilvnf.py176
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/checker.py10
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/command_generator.py12
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/ssh_client.py37
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/vm_controller.py33
-rw-r--r--functest/opnfv_tests/vnf/router/vnf_controller/vnf_controller.py35
-rw-r--r--functest/opnfv_tests/vnf/router/vrouter_base.py47
-rw-r--r--functest/tests/unit/ci/__init__.py0
-rw-r--r--functest/tests/unit/ci/test_check_deployment.py199
-rw-r--r--functest/tests/unit/ci/test_run_tests.py250
-rw-r--r--functest/tests/unit/ci/test_tier_builder.py92
-rw-r--r--functest/tests/unit/ci/test_tier_handler.py142
-rw-r--r--functest/tests/unit/cli/__init__.py0
-rw-r--r--functest/tests/unit/cli/commands/__init__.py0
-rw-r--r--functest/tests/unit/cli/commands/test_cli_env.py70
-rw-r--r--functest/tests/unit/cli/commands/test_cli_os.py80
-rw-r--r--functest/tests/unit/cli/commands/test_cli_testcase.py81
-rw-r--r--functest/tests/unit/cli/commands/test_cli_tier.py104
-rw-r--r--functest/tests/unit/cli/test_cli_base.py98
-rw-r--r--functest/tests/unit/core/__init__.py0
-rw-r--r--functest/tests/unit/core/test_feature.py114
-rw-r--r--functest/tests/unit/core/test_robotframework.py191
-rw-r--r--functest/tests/unit/core/test_testcase.py232
-rw-r--r--functest/tests/unit/core/test_unit.py98
-rw-r--r--functest/tests/unit/core/test_vnf.py194
-rw-r--r--functest/tests/unit/energy/__init__.py0
-rw-r--r--functest/tests/unit/energy/test_functest_energy.py385
-rw-r--r--functest/tests/unit/odl/test_odl.py408
-rw-r--r--functest/tests/unit/openstack/cinder/__init__.py (renamed from functest/cli/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/cinder/test_cinder.py270
-rw-r--r--functest/tests/unit/openstack/rally/test_rally.py495
-rw-r--r--functest/tests/unit/openstack/refstack_client/__init__.py0
-rw-r--r--functest/tests/unit/openstack/refstack_client/test_refstack_client.py154
-rw-r--r--functest/tests/unit/openstack/snaps/__init__.py0
-rw-r--r--functest/tests/unit/openstack/snaps/test_snaps.py228
-rw-r--r--functest/tests/unit/openstack/tempest/test_conf_utils.py340
-rw-r--r--functest/tests/unit/openstack/tempest/test_tempest.py418
-rw-r--r--functest/tests/unit/openstack/vmtp/__init__.py (renamed from functest/cli/commands/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/vmtp/test_vmtp.py90
-rw-r--r--functest/tests/unit/openstack/vping/__init__.py (renamed from functest/energy/__init__.py)0
-rw-r--r--functest/tests/unit/openstack/vping/test_vping.py159
-rw-r--r--functest/tests/unit/openstack/vping/test_vping_ssh.py147
-rw-r--r--functest/tests/unit/test_utils.py29
-rw-r--r--functest/tests/unit/utils/test_decorators.py126
-rw-r--r--functest/tests/unit/utils/test_env.py57
-rw-r--r--functest/tests/unit/utils/test_functest_utils.py581
-rw-r--r--functest/tests/unit/utils/test_openstack_utils.py1811
-rw-r--r--functest/tests/unit/vnf/epc/__init__.py (renamed from functest/opnfv_tests/openstack/refstack_client/__init__.py)0
-rw-r--r--functest/tests/unit/vnf/epc/test_juju_epc.py23
-rw-r--r--functest/tests/unit/vnf/ims/test_clearwater.py (renamed from functest/tests/unit/vnf/ims/test_ims_base.py)10
-rw-r--r--functest/tests/unit/vnf/ims/test_cloudify_ims.py51
-rw-r--r--functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py120
-rw-r--r--functest/tests/unit/vnf/ims/test_orchestra_openims.py122
-rw-r--r--functest/tests/unit/vnf/router/test_cloudify_vrouter.py53
-rw-r--r--functest/tests/unit/vnf/router/test_vrouter_base.py12
-rw-r--r--functest/utils/config.py24
-rw-r--r--functest/utils/constants.py18
-rw-r--r--functest/utils/decorators.py57
-rw-r--r--functest/utils/env.py94
-rw-r--r--functest/utils/functest_utils.py424
-rw-r--r--functest/utils/functest_vacation.py53
-rw-r--r--functest/utils/openstack_utils.py1499
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">&lt;rpf&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.SMSession type=&quot;Ixia.Aptixia.StackManager.SMSession&quot; objectid=&quot;d0db76dc-f224-429f-91ba-e207cd4711db&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;doWaitLinkUp type=&quot;Bool&quot;&gt;0&lt;/doWaitLinkUp&gt;&#13;&#10; &lt;doGratArp type=&quot;Bool&quot;&gt;0&lt;/doGratArp&gt;&#13;&#10; &lt;subscribeToGratArpNotifications type=&quot;Bool&quot;&gt;0&lt;/subscribeToGratArpNotifications&gt;&#13;&#10; &lt;doInterfaceCheck type=&quot;Bool&quot;&gt;0&lt;/doInterfaceCheck&gt;&#13;&#10; &lt;rebootPortsBeforeConfigure type=&quot;Bool&quot;&gt;0&lt;/rebootPortsBeforeConfigure&gt;&#13;&#10; &lt;testDuration type=&quot;Int&quot;&gt;10000&lt;/testDuration&gt;&#13;&#10; &lt;checkLinkState type=&quot;Bool&quot;&gt;0&lt;/checkLinkState&gt;&#13;&#10; &lt;portGroupList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;e7fa1f9e-23d9-4742-96b2-6edce6c4424e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VM1&lt;/name&gt;&#13;&#10; &lt;category type=&quot;String&quot; /&gt;&#13;&#10; &lt;stack type=&quot;Ixia.Aptixia.StackManager.L1EthernetPlugin&quot; objectid=&quot;45426251-0720-4316-b8a5-d6bce32e3d2e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;autoNegotiate type=&quot;Bool&quot;&gt;1&lt;/autoNegotiate&gt;&#13;&#10; &lt;speed type=&quot;String&quot;&gt;k100FD&lt;/speed&gt;&#13;&#10; &lt;advertise10Half type=&quot;Bool&quot;&gt;1&lt;/advertise10Half&gt;&#13;&#10; &lt;advertise10Full type=&quot;Bool&quot;&gt;1&lt;/advertise10Full&gt;&#13;&#10; &lt;advertise100Half type=&quot;Bool&quot;&gt;1&lt;/advertise100Half&gt;&#13;&#10; &lt;advertise100Full type=&quot;Bool&quot;&gt;1&lt;/advertise100Full&gt;&#13;&#10; &lt;advertise1000Full type=&quot;Bool&quot;&gt;1&lt;/advertise1000Full&gt;&#13;&#10; &lt;advertise2500Full type=&quot;Bool&quot;&gt;1&lt;/advertise2500Full&gt;&#13;&#10; &lt;advertise5000Full type=&quot;Bool&quot;&gt;1&lt;/advertise5000Full&gt;&#13;&#10; &lt;advertise10000Full type=&quot;Bool&quot;&gt;0&lt;/advertise10000Full&gt;&#13;&#10; &lt;cardDualPhy type=&quot;Ixia.Aptixia.StackManager.DualPhyPlugin&quot; objectid=&quot;836ee0d6-1957-42eb-a7a4-53bcfbdd36e0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;medium type=&quot;String&quot;&gt;copper&lt;/medium&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardDualPhy&gt;&#13;&#10; &lt;cardElm type=&quot;Ixia.Aptixia.StackManager.EthernetELMPlugin&quot; objectid=&quot;8387c005-0df9-4fd2-977e-1c234c7be0cc&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;negotiateMasterSlave type=&quot;Bool&quot;&gt;1&lt;/negotiateMasterSlave&gt;&#13;&#10; &lt;negotiationType type=&quot;String&quot;&gt;master&lt;/negotiationType&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardElm&gt;&#13;&#10; &lt;enableFlowControl type=&quot;Bool&quot;&gt;0&lt;/enableFlowControl&gt;&#13;&#10; &lt;directedAddress type=&quot;String&quot;&gt;01:80:C2:00:00:01&lt;/directedAddress&gt;&#13;&#10; &lt;dataCenter type=&quot;Ixia.Aptixia.StackManager.DataCenterSettings&quot; objectid=&quot;df9be2ec-31d8-47f0-babe-79a1710303f3&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;dcSupported type=&quot;Bool&quot;&gt;1&lt;/dcSupported&gt;&#13;&#10; &lt;dcEnabled type=&quot;Bool&quot;&gt;0&lt;/dcEnabled&gt;&#13;&#10; &lt;dcFlowControl type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType&quot;&gt;0&lt;/dcFlowControl&gt;&#13;&#10; &lt;dcMode type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode&quot;&gt;2&lt;/dcMode&gt;&#13;&#10; &lt;dcPfcMapping type=&quot;IntList&quot; /&gt;&#13;&#10; &lt;dcPfcPauseEnable type=&quot;Bool&quot;&gt;0&lt;/dcPfcPauseEnable&gt;&#13;&#10; &lt;dcPfcPauseDelay type=&quot;Int&quot;&gt;1&lt;/dcPfcPauseDelay&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/dataCenter&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.L2EthernetPlugin type=&quot;Ixia.Aptixia.StackManager.L2EthernetPlugin&quot; objectid=&quot;166a11b6-4d30-40ea-b9e1-ac4fb44f112b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;macRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;ba896971-1d78-4e03-8f2a-28c65417612e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC-R11&lt;/name&gt;&#13;&#10; &lt;mac type=&quot;String&quot;&gt;00:0A:43:4F:1B:00&lt;/mac&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;00:00:00:00:00:01&lt;/incrementBy&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1410&lt;/mtu&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;2b81e36c-9cbb-4d78-a70c-904da8d41b28&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VLAN-R11&lt;/name&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;firstId type=&quot;Int&quot;&gt;1&lt;/firstId&gt;&#13;&#10; &lt;incrementStep type=&quot;Int&quot;&gt;1&lt;/incrementStep&gt;&#13;&#10; &lt;increment type=&quot;Int&quot;&gt;1&lt;/increment&gt;&#13;&#10; &lt;uniqueCount type=&quot;Int&quot;&gt;4094&lt;/uniqueCount&gt;&#13;&#10; &lt;priority type=&quot;Int&quot;&gt;1&lt;/priority&gt;&#13;&#10; &lt;tpid type=&quot;String&quot;&gt;0x8100&lt;/tpid&gt;&#13;&#10; &lt;innerEnable type=&quot;Bool&quot;&gt;0&lt;/innerEnable&gt;&#13;&#10; &lt;innerFirstId type=&quot;Int&quot;&gt;1&lt;/innerFirstId&gt;&#13;&#10; &lt;innerIncrementStep type=&quot;Int&quot;&gt;1&lt;/innerIncrementStep&gt;&#13;&#10; &lt;innerIncrement type=&quot;Int&quot;&gt;1&lt;/innerIncrement&gt;&#13;&#10; &lt;innerUniqueCount type=&quot;Int&quot;&gt;4094&lt;/innerUniqueCount&gt;&#13;&#10; &lt;innerPriority type=&quot;Int&quot;&gt;1&lt;/innerPriority&gt;&#13;&#10; &lt;idIncrMode type=&quot;Int&quot;&gt;2&lt;/idIncrMode&gt;&#13;&#10; &lt;innerTpid type=&quot;String&quot;&gt;0x8100&lt;/innerTpid&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/vlanRange&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacRange&gt;&#13;&#10; &lt;/macRangeList&gt;&#13;&#10; &lt;vlanRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.VlanIdRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;2b81e36c-9cbb-4d78-a70c-904da8d41b28&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/vlanRangeList&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Plugin type=&quot;Ixia.Aptixia.StackManager.IpV4V6Plugin&quot; objectid=&quot;9ea551b2-a0af-4a7d-9872-e9b94298d7bd&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;5affc0a7-68f6-46f6-b801-0e18e067a572&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-R13&lt;/name&gt;&#13;&#10; &lt;ipType type=&quot;String&quot;&gt;IPv4&lt;/ipType&gt;&#13;&#10; &lt;ipAddress type=&quot;String&quot;&gt;{{ipcard1}}&lt;/ipAddress&gt;&#13;&#10; &lt;prefix type=&quot;Int&quot;&gt;16&lt;/prefix&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;0.0.0.1&lt;/incrementBy&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;autoCountEnabled type=&quot;Bool&quot;&gt;0&lt;/autoCountEnabled&gt;&#13;&#10; &lt;gatewayAddress type=&quot;String&quot;&gt;{{ipgw}}&lt;/gatewayAddress&gt;&#13;&#10; &lt;gatewayIncrement type=&quot;String&quot;&gt;0.0.0.0&lt;/gatewayIncrement&gt;&#13;&#10; &lt;gatewayIncrementMode type=&quot;String&quot;&gt;perSubnet&lt;/gatewayIncrementMode&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;generateStatistics type=&quot;Bool&quot;&gt;0&lt;/generateStatistics&gt;&#13;&#10; &lt;mss type=&quot;Int&quot;&gt;1410&lt;/mss&gt;&#13;&#10; &lt;randomizeAddress type=&quot;Bool&quot;&gt;0&lt;/randomizeAddress&gt;&#13;&#10; &lt;randomizeSeed type=&quot;Int&quot;&gt;1007257123&lt;/randomizeSeed&gt;&#13;&#10; &lt;autoMacGeneration type=&quot;Bool&quot;&gt;1&lt;/autoMacGeneration&gt;&#13;&#10; &lt;macRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;ba896971-1d78-4e03-8f2a-28c65417612e&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;2b81e36c-9cbb-4d78-a70c-904da8d41b28&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;atmRange type=&quot;Ixia.Aptixia.StackManager.AtmRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;pvcRange type=&quot;Ixia.Aptixia.StackManager.PvcRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;autoIpTypeEnabled type=&quot;Bool&quot;&gt;0&lt;/autoIpTypeEnabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Range&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;rangeGroups type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.RangeGroup type=&quot;Ixia.Aptixia.StackManager.RangeGroup&quot; objectid=&quot;abf2b6e4-a102-4cbe-bf1b-a11f11b2faac&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Group1&lt;/name&gt;&#13;&#10; &lt;distribType type=&quot;Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType&quot;&gt;0&lt;/distribType&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;5affc0a7-68f6-46f6-b801-0e18e067a572&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;-1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.RangeGroup&gt;&#13;&#10; &lt;/rangeGroups&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-8&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;26&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Plugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC/VLAN-8&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;25&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.L2EthernetPlugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Ethernet-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/stack&gt;&#13;&#10; &lt;globalPluginList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.FilterPlugin type=&quot;Ixia.Aptixia.StackManager.FilterPlugin&quot; objectid=&quot;976ba0fd-58ea-44d4-ae43-1b36c2556072&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;auto type=&quot;Bool&quot;&gt;1&lt;/auto&gt;&#13;&#10; &lt;all type=&quot;Bool&quot;&gt;0&lt;/all&gt;&#13;&#10; &lt;pppoecontrol type=&quot;Bool&quot;&gt;0&lt;/pppoecontrol&gt;&#13;&#10; &lt;pppoenetwork type=&quot;Bool&quot;&gt;0&lt;/pppoenetwork&gt;&#13;&#10; &lt;isis type=&quot;Bool&quot;&gt;0&lt;/isis&gt;&#13;&#10; &lt;ip type=&quot;String&quot; /&gt;&#13;&#10; &lt;tcp type=&quot;String&quot; /&gt;&#13;&#10; &lt;udp type=&quot;String&quot; /&gt;&#13;&#10; &lt;mac type=&quot;String&quot; /&gt;&#13;&#10; &lt;icmp type=&quot;String&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Filter-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.FilterPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.GratArpPlugin type=&quot;Ixia.Aptixia.StackManager.GratArpPlugin&quot; objectid=&quot;3ebd05e7-88a6-49be-a50d-134908ac124c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;forwardGratArp type=&quot;Bool&quot;&gt;0&lt;/forwardGratArp&gt;&#13;&#10; &lt;rateControlEnabled type=&quot;Bool&quot;&gt;0&lt;/rateControlEnabled&gt;&#13;&#10; &lt;maxFramesPerSecond type=&quot;Int&quot;&gt;0&lt;/maxFramesPerSecond&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;GratARP-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.GratArpPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.TCPPlugin type=&quot;Ixia.Aptixia.StackManager.TCPPlugin&quot; objectid=&quot;1d9748c5-122e-4153-8ffd-67cd1309b8ce&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;bestPerfSettings type=&quot;Bool&quot;&gt;0&lt;/bestPerfSettings&gt;&#13;&#10; &lt;accept_ra_all type=&quot;Bool&quot;&gt;0&lt;/accept_ra_all&gt;&#13;&#10; &lt;tcp_abort_on_overflow type=&quot;Bool&quot;&gt;0&lt;/tcp_abort_on_overflow&gt;&#13;&#10; &lt;tcp_adv_win_scale type=&quot;Int&quot;&gt;2&lt;/tcp_adv_win_scale&gt;&#13;&#10; &lt;tcp_app_win type=&quot;Int&quot;&gt;31&lt;/tcp_app_win&gt;&#13;&#10; &lt;tcp_bic type=&quot;Int&quot;&gt;0&lt;/tcp_bic&gt;&#13;&#10; &lt;tcp_bic_fast_convergence type=&quot;Int&quot;&gt;1&lt;/tcp_bic_fast_convergence&gt;&#13;&#10; &lt;tcp_bic_low_window type=&quot;Int&quot;&gt;14&lt;/tcp_bic_low_window&gt;&#13;&#10; &lt;tcp_dsack type=&quot;Bool&quot;&gt;1&lt;/tcp_dsack&gt;&#13;&#10; &lt;tcp_ecn type=&quot;Bool&quot;&gt;0&lt;/tcp_ecn&gt;&#13;&#10; &lt;tcp_fack type=&quot;Bool&quot;&gt;1&lt;/tcp_fack&gt;&#13;&#10; &lt;tcp_fin_timeout type=&quot;Int&quot;&gt;60&lt;/tcp_fin_timeout&gt;&#13;&#10; &lt;tcp_frto type=&quot;Int&quot;&gt;0&lt;/tcp_frto&gt;&#13;&#10; &lt;tcp_keepalive_intvl type=&quot;Int&quot;&gt;75&lt;/tcp_keepalive_intvl&gt;&#13;&#10; &lt;tcp_keepalive_probes type=&quot;Int&quot;&gt;9&lt;/tcp_keepalive_probes&gt;&#13;&#10; &lt;tcp_keepalive_time type=&quot;Int&quot;&gt;7200&lt;/tcp_keepalive_time&gt;&#13;&#10; &lt;tcp_low_latency type=&quot;Int&quot;&gt;0&lt;/tcp_low_latency&gt;&#13;&#10; &lt;tcp_max_orphans type=&quot;Int&quot;&gt;8192&lt;/tcp_max_orphans&gt;&#13;&#10; &lt;tcp_max_syn_backlog type=&quot;Int&quot;&gt;1024&lt;/tcp_max_syn_backlog&gt;&#13;&#10; &lt;tcp_max_tw_buckets type=&quot;Int&quot;&gt;180000&lt;/tcp_max_tw_buckets&gt;&#13;&#10; &lt;tcp_mem_low type=&quot;Int&quot;&gt;24576&lt;/tcp_mem_low&gt;&#13;&#10; &lt;tcp_mem_pressure type=&quot;Int&quot;&gt;32768&lt;/tcp_mem_pressure&gt;&#13;&#10; &lt;tcp_mem_high type=&quot;Int&quot;&gt;49152&lt;/tcp_mem_high&gt;&#13;&#10; &lt;tcp_moderate_rcvbuf type=&quot;Int&quot;&gt;0&lt;/tcp_moderate_rcvbuf&gt;&#13;&#10; &lt;tcp_no_metrics_save type=&quot;Bool&quot;&gt;0&lt;/tcp_no_metrics_save&gt;&#13;&#10; &lt;tcp_orphan_retries type=&quot;Int&quot;&gt;0&lt;/tcp_orphan_retries&gt;&#13;&#10; &lt;tcp_reordering type=&quot;Int&quot;&gt;3&lt;/tcp_reordering&gt;&#13;&#10; &lt;tcp_retrans_collapse type=&quot;Bool&quot;&gt;1&lt;/tcp_retrans_collapse&gt;&#13;&#10; &lt;tcp_retries1 type=&quot;Int&quot;&gt;3&lt;/tcp_retries1&gt;&#13;&#10; &lt;tcp_retries2 type=&quot;Int&quot;&gt;5&lt;/tcp_retries2&gt;&#13;&#10; &lt;tcp_rfc1337 type=&quot;Bool&quot;&gt;0&lt;/tcp_rfc1337&gt;&#13;&#10; &lt;tcp_rmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_min&gt;&#13;&#10; &lt;tcp_rmem_default type=&quot;Int&quot;&gt;8192&lt;/tcp_rmem_default&gt;&#13;&#10; &lt;tcp_rmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_rmem_max&gt;&#13;&#10; &lt;tcp_sack type=&quot;Bool&quot;&gt;1&lt;/tcp_sack&gt;&#13;&#10; &lt;tcp_stdurg type=&quot;Bool&quot;&gt;0&lt;/tcp_stdurg&gt;&#13;&#10; &lt;tcp_synack_retries type=&quot;Int&quot;&gt;5&lt;/tcp_synack_retries&gt;&#13;&#10; &lt;tcp_syn_retries type=&quot;Int&quot;&gt;5&lt;/tcp_syn_retries&gt;&#13;&#10; &lt;tcp_timestamps type=&quot;Bool&quot;&gt;1&lt;/tcp_timestamps&gt;&#13;&#10; &lt;tcp_tw_recycle type=&quot;Bool&quot;&gt;1&lt;/tcp_tw_recycle&gt;&#13;&#10; &lt;tcp_tw_reuse type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_reuse&gt;&#13;&#10; &lt;tcp_vegas_alpha type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_alpha&gt;&#13;&#10; &lt;tcp_vegas_beta type=&quot;Int&quot;&gt;6&lt;/tcp_vegas_beta&gt;&#13;&#10; &lt;tcp_vegas_cong_avoid type=&quot;Int&quot;&gt;0&lt;/tcp_vegas_cong_avoid&gt;&#13;&#10; &lt;tcp_vegas_gamma type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_gamma&gt;&#13;&#10; &lt;tcp_westwood type=&quot;Int&quot;&gt;0&lt;/tcp_westwood&gt;&#13;&#10; &lt;tcp_window_scaling type=&quot;Bool&quot;&gt;0&lt;/tcp_window_scaling&gt;&#13;&#10; &lt;ip_no_pmtu_disc type=&quot;Bool&quot;&gt;1&lt;/ip_no_pmtu_disc&gt;&#13;&#10; &lt;tcp_wmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_min&gt;&#13;&#10; &lt;tcp_wmem_default type=&quot;Int&quot;&gt;8192&lt;/tcp_wmem_default&gt;&#13;&#10; &lt;tcp_wmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_wmem_max&gt;&#13;&#10; &lt;tcp_ipfrag_time type=&quot;Int&quot;&gt;30&lt;/tcp_ipfrag_time&gt;&#13;&#10; &lt;tcp_port_min type=&quot;Int&quot;&gt;1024&lt;/tcp_port_min&gt;&#13;&#10; &lt;tcp_port_max type=&quot;Int&quot;&gt;65535&lt;/tcp_port_max&gt;&#13;&#10; &lt;tcp_rto_min type=&quot;Int&quot;&gt;1000&lt;/tcp_rto_min&gt;&#13;&#10; &lt;tcp_rto_max type=&quot;Int&quot;&gt;60000&lt;/tcp_rto_max&gt;&#13;&#10; &lt;tcp_tw_rfc1323_strict type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_rfc1323_strict&gt;&#13;&#10; &lt;udp_port_randomization type=&quot;Bool&quot;&gt;0&lt;/udp_port_randomization&gt;&#13;&#10; &lt;disable_min_max_buffer_size type=&quot;Bool&quot;&gt;1&lt;/disable_min_max_buffer_size&gt;&#13;&#10; &lt;llm_hdr_gap type=&quot;Int&quot;&gt;8&lt;/llm_hdr_gap&gt;&#13;&#10; &lt;llm_hdr_gap_ns type=&quot;Int&quot;&gt;10&lt;/llm_hdr_gap_ns&gt;&#13;&#10; &lt;inter_packet_granular_delay type=&quot;Double&quot;&gt;0&lt;/inter_packet_granular_delay&gt;&#13;&#10; &lt;delayed_acks type=&quot;Bool&quot;&gt;1&lt;/delayed_acks&gt;&#13;&#10; &lt;accept_ra_default type=&quot;Bool&quot;&gt;0&lt;/accept_ra_default&gt;&#13;&#10; &lt;rps_needed type=&quot;Bool&quot;&gt;0&lt;/rps_needed&gt;&#13;&#10; &lt;delayed_acks_segments type=&quot;Int&quot;&gt;0&lt;/delayed_acks_segments&gt;&#13;&#10; &lt;delayed_acks_timeout type=&quot;Int&quot;&gt;0&lt;/delayed_acks_timeout&gt;&#13;&#10; &lt;tcp_large_icwnd type=&quot;Int&quot;&gt;0&lt;/tcp_large_icwnd&gt;&#13;&#10; &lt;tcp_mgmt_rmem type=&quot;Int&quot;&gt;87380&lt;/tcp_mgmt_rmem&gt;&#13;&#10; &lt;tcp_mgmt_wmem type=&quot;Int&quot;&gt;32768&lt;/tcp_mgmt_wmem&gt;&#13;&#10; &lt;adjust_tcp_buffers type=&quot;Bool&quot;&gt;1&lt;/adjust_tcp_buffers&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;TCP-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.TCPPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.DnsPlugin type=&quot;Ixia.Aptixia.StackManager.DnsPlugin&quot; objectid=&quot;9cc60113-3e53-4cf2-b3b7-6fd7d3953bb4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;domain type=&quot;String&quot; /&gt;&#13;&#10; &lt;timeout type=&quot;Int&quot;&gt;30&lt;/timeout&gt;&#13;&#10; &lt;nameServerList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;searchList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;hostList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DNS-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.DnsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type=&quot;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&quot; objectid=&quot;399db714-47a8-445d-a24b-90d00d3f2e9e&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;teardownInterfaceWithUser type=&quot;Bool&quot;&gt;0&lt;/teardownInterfaceWithUser&gt;&#13;&#10; &lt;interfaceBehavior type=&quot;Int&quot;&gt;0&lt;/interfaceBehavior&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Settings-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;5&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingPlugin type=&quot;Ixia.Aptixia.StackManager.MeshingPlugin&quot; objectid=&quot;39d2a556-cf85-4102-8461-b1f1413b2db5&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;trafficMaps type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingTrafficMap type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMap&quot; objectid=&quot;cdca1e00-77a3-49ef-8fe5-afb321a51af2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;CALLING!VoIP2_CALLED#{{sipportcalled}}&lt;/name&gt;&#13;&#10; &lt;configMapFilename type=&quot;String&quot;&gt;CALLINGScript.configmap&lt;/configMapFilename&gt;&#13;&#10; &lt;sourceActivityId type=&quot;Int&quot;&gt;1&lt;/sourceActivityId&gt;&#13;&#10; &lt;ipPreference type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eIpPreference&quot;&gt;0&lt;/ipPreference&gt;&#13;&#10; &lt;portRangesString type=&quot;String&quot;&gt;{{sipportcalled}}&lt;/portRangesString&gt;&#13;&#10; &lt;meshingType type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eMeshingType&quot;&gt;2&lt;/meshingType&gt;&#13;&#10; &lt;destinationActivityId type=&quot;Int&quot;&gt;0&lt;/destinationActivityId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingTrafficMap&gt;&#13;&#10; &lt;/trafficMaps&gt;&#13;&#10; &lt;activityRangeMapInfoList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Meshing-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;11&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingPlugin&gt;&#13;&#10; &lt;/globalPluginList&gt;&#13;&#10; &lt;portList type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot;&gt;&#13;&#10; &lt;String&gt;{{ipchassis}};1;1&lt;/String&gt;&#13;&#10; &lt;/portList&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecPortGroupData type=&quot;Ixia.Aptixia.StackManager.IPSecPortGroupData&quot; objectid=&quot;62e57abd-b4c6-45af-a720-7033259c203c&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;role type=&quot;String&quot;&gt;Initiator&lt;/role&gt;&#13;&#10; &lt;associates type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;overrideGlobalOptions type=&quot;Bool&quot;&gt;0&lt;/overrideGlobalOptions&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;enableESPPerStreamStats type=&quot;Bool&quot;&gt;0&lt;/enableESPPerStreamStats&gt;&#13;&#10; &lt;enableESPReplayStats type=&quot;Bool&quot;&gt;0&lt;/enableESPReplayStats&gt;&#13;&#10; &lt;activities type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;pcpuLogLevel type=&quot;String&quot;&gt;0&lt;/pcpuLogLevel&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecPortGroupData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;virtualMode type=&quot;Bool&quot;&gt;0&lt;/virtualMode&gt;&#13;&#10; &lt;allowedVirtualModeTypes type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot; /&gt;&#13;&#10; &lt;doOwnership type=&quot;Bool&quot;&gt;0&lt;/doOwnership&gt;&#13;&#10; &lt;branchToNicMap type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;cpuAggregation type=&quot;Bool&quot;&gt;0&lt;/cpuAggregation&gt;&#13;&#10; &lt;activePort type=&quot;String&quot; /&gt;&#13;&#10; &lt;networkLayersManager type=&quot;Ixia.Aptixia.StackManager.NetworkLayersManager&quot; objectid=&quot;f7999b28-d3d6-4a69-bd61-ab5516b7c540&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/networkLayersManager&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.PortGroup&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;b1fbd381-b769-4ec1-8715-299508ecb458&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VM2&lt;/name&gt;&#13;&#10; &lt;category type=&quot;String&quot; /&gt;&#13;&#10; &lt;stack type=&quot;Ixia.Aptixia.StackManager.L1EthernetPlugin&quot; objectid=&quot;48f486a6-f09b-4770-a091-e9ce609e9bec&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;autoNegotiate type=&quot;Bool&quot;&gt;1&lt;/autoNegotiate&gt;&#13;&#10; &lt;speed type=&quot;String&quot;&gt;k100FD&lt;/speed&gt;&#13;&#10; &lt;advertise10Half type=&quot;Bool&quot;&gt;1&lt;/advertise10Half&gt;&#13;&#10; &lt;advertise10Full type=&quot;Bool&quot;&gt;1&lt;/advertise10Full&gt;&#13;&#10; &lt;advertise100Half type=&quot;Bool&quot;&gt;1&lt;/advertise100Half&gt;&#13;&#10; &lt;advertise100Full type=&quot;Bool&quot;&gt;1&lt;/advertise100Full&gt;&#13;&#10; &lt;advertise1000Full type=&quot;Bool&quot;&gt;1&lt;/advertise1000Full&gt;&#13;&#10; &lt;advertise2500Full type=&quot;Bool&quot;&gt;1&lt;/advertise2500Full&gt;&#13;&#10; &lt;advertise5000Full type=&quot;Bool&quot;&gt;1&lt;/advertise5000Full&gt;&#13;&#10; &lt;advertise10000Full type=&quot;Bool&quot;&gt;1&lt;/advertise10000Full&gt;&#13;&#10; &lt;cardDualPhy type=&quot;Ixia.Aptixia.StackManager.DualPhyPlugin&quot; objectid=&quot;c500685a-4fcb-4335-abe0-70c98cf1ba43&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;medium type=&quot;String&quot;&gt;auto&lt;/medium&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardDualPhy&gt;&#13;&#10; &lt;cardElm type=&quot;Ixia.Aptixia.StackManager.EthernetELMPlugin&quot; objectid=&quot;92644bb5-bda6-4072-98f9-47b47e4597c7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;negotiateMasterSlave type=&quot;Bool&quot;&gt;1&lt;/negotiateMasterSlave&gt;&#13;&#10; &lt;negotiationType type=&quot;String&quot;&gt;master&lt;/negotiationType&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardElm&gt;&#13;&#10; &lt;enableFlowControl type=&quot;Bool&quot;&gt;0&lt;/enableFlowControl&gt;&#13;&#10; &lt;directedAddress type=&quot;String&quot;&gt;01:80:C2:00:00:01&lt;/directedAddress&gt;&#13;&#10; &lt;dataCenter type=&quot;Ixia.Aptixia.StackManager.DataCenterSettings&quot; objectid=&quot;3726f608-97b7-4bf2-b88e-4c0bf13b45a0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;dcSupported type=&quot;Bool&quot;&gt;1&lt;/dcSupported&gt;&#13;&#10; &lt;dcEnabled type=&quot;Bool&quot;&gt;0&lt;/dcEnabled&gt;&#13;&#10; &lt;dcFlowControl type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType&quot;&gt;0&lt;/dcFlowControl&gt;&#13;&#10; &lt;dcMode type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode&quot;&gt;2&lt;/dcMode&gt;&#13;&#10; &lt;dcPfcMapping type=&quot;IntList&quot; /&gt;&#13;&#10; &lt;dcPfcPauseEnable type=&quot;Bool&quot;&gt;0&lt;/dcPfcPauseEnable&gt;&#13;&#10; &lt;dcPfcPauseDelay type=&quot;Int&quot;&gt;1&lt;/dcPfcPauseDelay&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/dataCenter&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.L2EthernetPlugin type=&quot;Ixia.Aptixia.StackManager.L2EthernetPlugin&quot; objectid=&quot;820b0582-6a4c-4109-bd5d-587621a43ce2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;macRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;aa73bd95-9ffb-411e-8ab3-8a128767aacb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC-R2&lt;/name&gt;&#13;&#10; &lt;mac type=&quot;String&quot;&gt;00:0A:43:4F:2A:00&lt;/mac&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;00:00:00:00:00:01&lt;/incrementBy&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1410&lt;/mtu&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;7024f4b3-1a75-491a-8da1-17a45a15d5cc&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VLAN-R2&lt;/name&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;firstId type=&quot;Int&quot;&gt;1&lt;/firstId&gt;&#13;&#10; &lt;incrementStep type=&quot;Int&quot;&gt;1&lt;/incrementStep&gt;&#13;&#10; &lt;increment type=&quot;Int&quot;&gt;1&lt;/increment&gt;&#13;&#10; &lt;uniqueCount type=&quot;Int&quot;&gt;4094&lt;/uniqueCount&gt;&#13;&#10; &lt;priority type=&quot;Int&quot;&gt;1&lt;/priority&gt;&#13;&#10; &lt;tpid type=&quot;String&quot;&gt;0x8100&lt;/tpid&gt;&#13;&#10; &lt;innerEnable type=&quot;Bool&quot;&gt;0&lt;/innerEnable&gt;&#13;&#10; &lt;innerFirstId type=&quot;Int&quot;&gt;1&lt;/innerFirstId&gt;&#13;&#10; &lt;innerIncrementStep type=&quot;Int&quot;&gt;1&lt;/innerIncrementStep&gt;&#13;&#10; &lt;innerIncrement type=&quot;Int&quot;&gt;1&lt;/innerIncrement&gt;&#13;&#10; &lt;innerUniqueCount type=&quot;Int&quot;&gt;4094&lt;/innerUniqueCount&gt;&#13;&#10; &lt;innerPriority type=&quot;Int&quot;&gt;1&lt;/innerPriority&gt;&#13;&#10; &lt;idIncrMode type=&quot;Int&quot;&gt;2&lt;/idIncrMode&gt;&#13;&#10; &lt;innerTpid type=&quot;String&quot;&gt;0x8100&lt;/innerTpid&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/vlanRange&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacRange&gt;&#13;&#10; &lt;/macRangeList&gt;&#13;&#10; &lt;vlanRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.VlanIdRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;7024f4b3-1a75-491a-8da1-17a45a15d5cc&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/vlanRangeList&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Plugin type=&quot;Ixia.Aptixia.StackManager.IpV4V6Plugin&quot; objectid=&quot;e53ae54e-ab21-4997-b532-e9bd58210050&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;c69dae97-f1c2-4505-aedb-3f9ca3f4d02a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-R2&lt;/name&gt;&#13;&#10; &lt;ipType type=&quot;String&quot;&gt;IPv4&lt;/ipType&gt;&#13;&#10; &lt;ipAddress type=&quot;String&quot;&gt;{{ipcard2}}&lt;/ipAddress&gt;&#13;&#10; &lt;prefix type=&quot;Int&quot;&gt;16&lt;/prefix&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;0.0.0.1&lt;/incrementBy&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;autoCountEnabled type=&quot;Bool&quot;&gt;0&lt;/autoCountEnabled&gt;&#13;&#10; &lt;gatewayAddress type=&quot;String&quot;&gt;{{ipgw}}&lt;/gatewayAddress&gt;&#13;&#10; &lt;gatewayIncrement type=&quot;String&quot;&gt;0.0.0.0&lt;/gatewayIncrement&gt;&#13;&#10; &lt;gatewayIncrementMode type=&quot;String&quot;&gt;perSubnet&lt;/gatewayIncrementMode&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;generateStatistics type=&quot;Bool&quot;&gt;0&lt;/generateStatistics&gt;&#13;&#10; &lt;mss type=&quot;Int&quot;&gt;1410&lt;/mss&gt;&#13;&#10; &lt;randomizeAddress type=&quot;Bool&quot;&gt;0&lt;/randomizeAddress&gt;&#13;&#10; &lt;randomizeSeed type=&quot;Int&quot;&gt;3534372608&lt;/randomizeSeed&gt;&#13;&#10; &lt;autoMacGeneration type=&quot;Bool&quot;&gt;1&lt;/autoMacGeneration&gt;&#13;&#10; &lt;macRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;aa73bd95-9ffb-411e-8ab3-8a128767aacb&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;7024f4b3-1a75-491a-8da1-17a45a15d5cc&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;atmRange type=&quot;Ixia.Aptixia.StackManager.AtmRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;pvcRange type=&quot;Ixia.Aptixia.StackManager.PvcRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;autoIpTypeEnabled type=&quot;Bool&quot;&gt;0&lt;/autoIpTypeEnabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Range&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;rangeGroups type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.RangeGroup type=&quot;Ixia.Aptixia.StackManager.RangeGroup&quot; objectid=&quot;de9d629b-e0dc-41f5-99cb-5aa8a808ceee&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DistGroup1&lt;/name&gt;&#13;&#10; &lt;distribType type=&quot;Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType&quot;&gt;0&lt;/distribType&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;c69dae97-f1c2-4505-aedb-3f9ca3f4d02a&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.RangeGroup&gt;&#13;&#10; &lt;/rangeGroups&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;6&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Plugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC/VLAN-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;5&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.L2EthernetPlugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Ethernet-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/stack&gt;&#13;&#10; &lt;globalPluginList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type=&quot;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&quot; objectid=&quot;26685c48-95e7-4da5-a893-fc527b814b1c&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;teardownInterfaceWithUser type=&quot;Bool&quot;&gt;0&lt;/teardownInterfaceWithUser&gt;&#13;&#10; &lt;interfaceBehavior type=&quot;Int&quot;&gt;0&lt;/interfaceBehavior&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Settings-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;7&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.FilterPlugin type=&quot;Ixia.Aptixia.StackManager.FilterPlugin&quot; objectid=&quot;3f42c205-a9ad-433b-b7af-19ea7ec76940&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;auto type=&quot;Bool&quot;&gt;1&lt;/auto&gt;&#13;&#10; &lt;all type=&quot;Bool&quot;&gt;0&lt;/all&gt;&#13;&#10; &lt;pppoecontrol type=&quot;Bool&quot;&gt;0&lt;/pppoecontrol&gt;&#13;&#10; &lt;pppoenetwork type=&quot;Bool&quot;&gt;0&lt;/pppoenetwork&gt;&#13;&#10; &lt;isis type=&quot;Bool&quot;&gt;0&lt;/isis&gt;&#13;&#10; &lt;ip type=&quot;String&quot; /&gt;&#13;&#10; &lt;tcp type=&quot;String&quot; /&gt;&#13;&#10; &lt;udp type=&quot;String&quot; /&gt;&#13;&#10; &lt;mac type=&quot;String&quot; /&gt;&#13;&#10; &lt;icmp type=&quot;String&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Filter-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;8&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.FilterPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.GratArpPlugin type=&quot;Ixia.Aptixia.StackManager.GratArpPlugin&quot; objectid=&quot;fe43b342-829b-4ff4-8671-49ba1c4441e5&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;forwardGratArp type=&quot;Bool&quot;&gt;0&lt;/forwardGratArp&gt;&#13;&#10; &lt;rateControlEnabled type=&quot;Bool&quot;&gt;0&lt;/rateControlEnabled&gt;&#13;&#10; &lt;maxFramesPerSecond type=&quot;Int&quot;&gt;0&lt;/maxFramesPerSecond&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;GratARP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;9&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.GratArpPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.TCPPlugin type=&quot;Ixia.Aptixia.StackManager.TCPPlugin&quot; objectid=&quot;57601116-d86b-4c04-856b-2241507a0378&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;bestPerfSettings type=&quot;Bool&quot;&gt;0&lt;/bestPerfSettings&gt;&#13;&#10; &lt;accept_ra_all type=&quot;Bool&quot;&gt;0&lt;/accept_ra_all&gt;&#13;&#10; &lt;tcp_abort_on_overflow type=&quot;Bool&quot;&gt;0&lt;/tcp_abort_on_overflow&gt;&#13;&#10; &lt;tcp_adv_win_scale type=&quot;Int&quot;&gt;2&lt;/tcp_adv_win_scale&gt;&#13;&#10; &lt;tcp_app_win type=&quot;Int&quot;&gt;31&lt;/tcp_app_win&gt;&#13;&#10; &lt;tcp_bic type=&quot;Int&quot;&gt;0&lt;/tcp_bic&gt;&#13;&#10; &lt;tcp_bic_fast_convergence type=&quot;Int&quot;&gt;1&lt;/tcp_bic_fast_convergence&gt;&#13;&#10; &lt;tcp_bic_low_window type=&quot;Int&quot;&gt;14&lt;/tcp_bic_low_window&gt;&#13;&#10; &lt;tcp_dsack type=&quot;Bool&quot;&gt;1&lt;/tcp_dsack&gt;&#13;&#10; &lt;tcp_ecn type=&quot;Bool&quot;&gt;0&lt;/tcp_ecn&gt;&#13;&#10; &lt;tcp_fack type=&quot;Bool&quot;&gt;1&lt;/tcp_fack&gt;&#13;&#10; &lt;tcp_fin_timeout type=&quot;Int&quot;&gt;60&lt;/tcp_fin_timeout&gt;&#13;&#10; &lt;tcp_frto type=&quot;Int&quot;&gt;0&lt;/tcp_frto&gt;&#13;&#10; &lt;tcp_keepalive_intvl type=&quot;Int&quot;&gt;75&lt;/tcp_keepalive_intvl&gt;&#13;&#10; &lt;tcp_keepalive_probes type=&quot;Int&quot;&gt;9&lt;/tcp_keepalive_probes&gt;&#13;&#10; &lt;tcp_keepalive_time type=&quot;Int&quot;&gt;7200&lt;/tcp_keepalive_time&gt;&#13;&#10; &lt;tcp_low_latency type=&quot;Int&quot;&gt;0&lt;/tcp_low_latency&gt;&#13;&#10; &lt;tcp_max_orphans type=&quot;Int&quot;&gt;8192&lt;/tcp_max_orphans&gt;&#13;&#10; &lt;tcp_max_syn_backlog type=&quot;Int&quot;&gt;1024&lt;/tcp_max_syn_backlog&gt;&#13;&#10; &lt;tcp_max_tw_buckets type=&quot;Int&quot;&gt;180000&lt;/tcp_max_tw_buckets&gt;&#13;&#10; &lt;tcp_mem_low type=&quot;Int&quot;&gt;24576&lt;/tcp_mem_low&gt;&#13;&#10; &lt;tcp_mem_pressure type=&quot;Int&quot;&gt;32768&lt;/tcp_mem_pressure&gt;&#13;&#10; &lt;tcp_mem_high type=&quot;Int&quot;&gt;49152&lt;/tcp_mem_high&gt;&#13;&#10; &lt;tcp_moderate_rcvbuf type=&quot;Int&quot;&gt;0&lt;/tcp_moderate_rcvbuf&gt;&#13;&#10; &lt;tcp_no_metrics_save type=&quot;Bool&quot;&gt;0&lt;/tcp_no_metrics_save&gt;&#13;&#10; &lt;tcp_orphan_retries type=&quot;Int&quot;&gt;0&lt;/tcp_orphan_retries&gt;&#13;&#10; &lt;tcp_reordering type=&quot;Int&quot;&gt;3&lt;/tcp_reordering&gt;&#13;&#10; &lt;tcp_retrans_collapse type=&quot;Bool&quot;&gt;1&lt;/tcp_retrans_collapse&gt;&#13;&#10; &lt;tcp_retries1 type=&quot;Int&quot;&gt;3&lt;/tcp_retries1&gt;&#13;&#10; &lt;tcp_retries2 type=&quot;Int&quot;&gt;5&lt;/tcp_retries2&gt;&#13;&#10; &lt;tcp_rfc1337 type=&quot;Bool&quot;&gt;0&lt;/tcp_rfc1337&gt;&#13;&#10; &lt;tcp_rmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_min&gt;&#13;&#10; &lt;tcp_rmem_default type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_default&gt;&#13;&#10; &lt;tcp_rmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_rmem_max&gt;&#13;&#10; &lt;tcp_sack type=&quot;Bool&quot;&gt;1&lt;/tcp_sack&gt;&#13;&#10; &lt;tcp_stdurg type=&quot;Bool&quot;&gt;0&lt;/tcp_stdurg&gt;&#13;&#10; &lt;tcp_synack_retries type=&quot;Int&quot;&gt;5&lt;/tcp_synack_retries&gt;&#13;&#10; &lt;tcp_syn_retries type=&quot;Int&quot;&gt;5&lt;/tcp_syn_retries&gt;&#13;&#10; &lt;tcp_timestamps type=&quot;Bool&quot;&gt;1&lt;/tcp_timestamps&gt;&#13;&#10; &lt;tcp_tw_recycle type=&quot;Bool&quot;&gt;1&lt;/tcp_tw_recycle&gt;&#13;&#10; &lt;tcp_tw_reuse type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_reuse&gt;&#13;&#10; &lt;tcp_vegas_alpha type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_alpha&gt;&#13;&#10; &lt;tcp_vegas_beta type=&quot;Int&quot;&gt;6&lt;/tcp_vegas_beta&gt;&#13;&#10; &lt;tcp_vegas_cong_avoid type=&quot;Int&quot;&gt;0&lt;/tcp_vegas_cong_avoid&gt;&#13;&#10; &lt;tcp_vegas_gamma type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_gamma&gt;&#13;&#10; &lt;tcp_westwood type=&quot;Int&quot;&gt;0&lt;/tcp_westwood&gt;&#13;&#10; &lt;tcp_window_scaling type=&quot;Bool&quot;&gt;0&lt;/tcp_window_scaling&gt;&#13;&#10; &lt;ip_no_pmtu_disc type=&quot;Bool&quot;&gt;1&lt;/ip_no_pmtu_disc&gt;&#13;&#10; &lt;tcp_wmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_min&gt;&#13;&#10; &lt;tcp_wmem_default type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_default&gt;&#13;&#10; &lt;tcp_wmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_wmem_max&gt;&#13;&#10; &lt;tcp_ipfrag_time type=&quot;Int&quot;&gt;30&lt;/tcp_ipfrag_time&gt;&#13;&#10; &lt;tcp_port_min type=&quot;Int&quot;&gt;1024&lt;/tcp_port_min&gt;&#13;&#10; &lt;tcp_port_max type=&quot;Int&quot;&gt;65535&lt;/tcp_port_max&gt;&#13;&#10; &lt;tcp_rto_min type=&quot;Int&quot;&gt;200&lt;/tcp_rto_min&gt;&#13;&#10; &lt;tcp_rto_max type=&quot;Int&quot;&gt;120000&lt;/tcp_rto_max&gt;&#13;&#10; &lt;tcp_tw_rfc1323_strict type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_rfc1323_strict&gt;&#13;&#10; &lt;udp_port_randomization type=&quot;Bool&quot;&gt;0&lt;/udp_port_randomization&gt;&#13;&#10; &lt;disable_min_max_buffer_size type=&quot;Bool&quot;&gt;1&lt;/disable_min_max_buffer_size&gt;&#13;&#10; &lt;llm_hdr_gap type=&quot;Int&quot;&gt;8&lt;/llm_hdr_gap&gt;&#13;&#10; &lt;llm_hdr_gap_ns type=&quot;Int&quot;&gt;10&lt;/llm_hdr_gap_ns&gt;&#13;&#10; &lt;inter_packet_granular_delay type=&quot;Double&quot;&gt;0&lt;/inter_packet_granular_delay&gt;&#13;&#10; &lt;delayed_acks type=&quot;Bool&quot;&gt;1&lt;/delayed_acks&gt;&#13;&#10; &lt;accept_ra_default type=&quot;Bool&quot;&gt;0&lt;/accept_ra_default&gt;&#13;&#10; &lt;rps_needed type=&quot;Bool&quot;&gt;0&lt;/rps_needed&gt;&#13;&#10; &lt;delayed_acks_segments type=&quot;Int&quot;&gt;0&lt;/delayed_acks_segments&gt;&#13;&#10; &lt;delayed_acks_timeout type=&quot;Int&quot;&gt;0&lt;/delayed_acks_timeout&gt;&#13;&#10; &lt;tcp_large_icwnd type=&quot;Int&quot;&gt;0&lt;/tcp_large_icwnd&gt;&#13;&#10; &lt;tcp_mgmt_rmem type=&quot;Int&quot;&gt;87380&lt;/tcp_mgmt_rmem&gt;&#13;&#10; &lt;tcp_mgmt_wmem type=&quot;Int&quot;&gt;32768&lt;/tcp_mgmt_wmem&gt;&#13;&#10; &lt;adjust_tcp_buffers type=&quot;Bool&quot;&gt;1&lt;/adjust_tcp_buffers&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;TCP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;10&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.TCPPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.DnsPlugin type=&quot;Ixia.Aptixia.StackManager.DnsPlugin&quot; objectid=&quot;7682d113-cd50-4cc6-b23a-569c29f03886&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;domain type=&quot;String&quot; /&gt;&#13;&#10; &lt;timeout type=&quot;Int&quot;&gt;30&lt;/timeout&gt;&#13;&#10; &lt;nameServerList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;searchList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;hostList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DNS-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;12&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.DnsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingPlugin type=&quot;Ixia.Aptixia.StackManager.MeshingPlugin&quot; objectid=&quot;f5f1e4c2-eef8-4a34-ac13-e1e3eeb5328b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;trafficMaps type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;activityRangeMapInfoList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Meshing-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;13&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingPlugin&gt;&#13;&#10; &lt;/globalPluginList&gt;&#13;&#10; &lt;portList type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot;&gt;&#13;&#10; &lt;String&gt;{{ipchassis}};2;1&lt;/String&gt;&#13;&#10; &lt;/portList&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecPortGroupData type=&quot;Ixia.Aptixia.StackManager.IPSecPortGroupData&quot; objectid=&quot;c279f05c-d2a7-476d-b4af-9c8ff0d878dd&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;role type=&quot;String&quot;&gt;Initiator&lt;/role&gt;&#13;&#10; &lt;associates type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;overrideGlobalOptions type=&quot;Bool&quot;&gt;0&lt;/overrideGlobalOptions&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;enableESPPerStreamStats type=&quot;Bool&quot;&gt;0&lt;/enableESPPerStreamStats&gt;&#13;&#10; &lt;enableESPReplayStats type=&quot;Bool&quot;&gt;0&lt;/enableESPReplayStats&gt;&#13;&#10; &lt;activities type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;pcpuLogLevel type=&quot;String&quot;&gt;0&lt;/pcpuLogLevel&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecPortGroupData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;virtualMode type=&quot;Bool&quot;&gt;0&lt;/virtualMode&gt;&#13;&#10; &lt;allowedVirtualModeTypes type=&quot;Ixia.RpFramework.Server.Core.ShadowedPropertyStringList&quot; /&gt;&#13;&#10; &lt;doOwnership type=&quot;Bool&quot;&gt;0&lt;/doOwnership&gt;&#13;&#10; &lt;branchToNicMap type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;cpuAggregation type=&quot;Bool&quot;&gt;0&lt;/cpuAggregation&gt;&#13;&#10; &lt;activePort type=&quot;String&quot; /&gt;&#13;&#10; &lt;networkLayersManager type=&quot;Ixia.Aptixia.StackManager.NetworkLayersManager&quot; objectid=&quot;d581a4e6-0e4b-4692-a0e2-12fd25d7db35&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/networkLayersManager&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.PortGroup&gt;&#13;&#10; &lt;/portGroupList&gt;&#13;&#10; &lt;externalProperties type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyManager&quot; objectid=&quot;0c7c98dd-4e41-4fb8-adb7-918848d0ba3e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;properties type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;c7be9c3b-0335-4cf6-bbcb-d9a90d6b78a0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DHCPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d63defc3-039a-4af6-b0f6-19be5481d6bb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MobileSubscribersRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d62b40dc-41c2-48b0-b3a6-4aa74e171a8c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DHCPServerRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;45eba56d-c42f-4bbf-830b-1f102bf83c92&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a9e91079-1215-444b-a0a0-59f8ff4e7746&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPGRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;b91778ea-dac5-499a-8c54-b8ba0c78b44b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPRange_SGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;13f113b2-8ce8-4742-ac72-f8ee04caa5d6&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPSUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;f2723794-57ce-471c-b3ae-10cd5ee235a2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IpV4V6Range&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;3e8d5274-5483-41ca-8f4d-b1fce291dad1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PppoxRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;85b44e1f-0689-4feb-a14d-b43a1b837c1d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;L2tpRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;c0383f23-e15f-4a97-bbf8-6ade8f6f2b0c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatLTEUEUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;5912723b-fb9a-4e0a-bae4-38730c73cc0e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;SixRdRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;9a6cb101-a624-4978-8d0c-85c5b6c26906&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPSgsnS3RangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;4f85b4a9-d55e-494e-beb6-5ef5b5d04cf8&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EmulatedRouterRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;489dbc18-55b5-4902-99ab-9a289a8c2e2b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPNGAPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;2992f902-204b-4050-8798-0b24ee090922&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatRNCIuPSUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;8b53f68d-6027-4150-9ca3-5a62606526bd&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPNGUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;e85d740f-87a2-473a-a133-e08d5bb48ed2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange_S5S8_SGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;5a179c3f-82db-44b3-95fc-6e4dbfe17556&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPPcrfRange_S5S8_PGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;55d890fe-0faa-41bd-9fca-12463fd14b3d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DSLiteRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;8dc83b0a-45a9-46b7-9b52-731eb114d315&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPSGSNRangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a0883ed3-63b7-47cb-ab77-7ceebb8212e1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;SlaacRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;7bb58c6e-377f-46be-a2b1-7d86997b2fa1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;AtmRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;8a4c92be-449a-4f0e-bcf3-55fdfcc369cc&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatMMEApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;588aea0d-748b-4b82-9418-4f3a35185d2e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatENodeBUuApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;9046358f-dde4-4f17-b596-5903079d3bcf&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MacRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a28df47f-783e-4bc9-aa22-78636ceaf1b7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DualStackIPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;19deb9c9-8aef-41e2-8b8b-f01a8b274266&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange_S2a_TWAN&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;6abb9650-bc55-4e9e-9dfc-81964310e662&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatSGSNIuPSApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;35dc8f8d-44fd-4c73-9771-6c62bd227435&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatENodeBSimUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;3c48b615-2c03-4c1b-8712-e83f63841d13&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;S6dRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;cd5080c1-8de4-4eb3-985a-3e9fe38ebed4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;UERangeBase&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;24c2c3a6-f9fd-4b8e-bc9f-aeeac63bae01&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPMmeS10RangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;529a2786-eb8c-40cb-80b9-83415888012c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;S6aRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;6593d153-2b87-4171-a8bf-8ae2b1907487&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PptpRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;819a5c99-14bf-4efb-912a-5d2c985e97d1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;BmScRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;83ff7bd6-95cf-4d75-91e4-3e2a9f5f6b7d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MBmsGwRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;022d8e72-36c8-4117-b901-baffb9d0805c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPPMIPHostRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;/properties&gt;&#13;&#10; &lt;values type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;57badb9d-afb8-4c05-9182-df7469457e4c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;5affc0a7-68f6-46f6-b801-0e18e067a572&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;1efc6993-1480-469a-a6af-38b4093fb102&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;13&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;13&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;22a742ae-d9bd-4548-83f1-84da6cc07c5f&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;c69dae97-f1c2-4505-aedb-3f9ca3f4d02a&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;b664f3f9-4f42-48c1-a481-75ba76740055&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;77dd061e-b592-4d9e-9c38-24a46fec1121&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;aa73bd95-9ffb-411e-8ab3-8a128767aacb&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;b5f138be-a18b-46a3-b3f8-c90fa5711597&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;6dc25ae2-da26-4df6-8a25-cf296dd9430b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;ba896971-1d78-4e03-8f2a-28c65417612e&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;0858fb9d-2304-44d4-b413-569815c8b6a7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;/values&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/externalProperties&gt;&#13;&#10; &lt;availableNetworkTimelines type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSessionData type=&quot;Ixia.Aptixia.StackManager.IxLoadSessionData&quot; objectid=&quot;149d16d7-c594-4866-917f-fe1b44fac83f&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;portGroupList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;b1fbd381-b769-4ec1-8715-299508ecb458&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;e7fa1f9e-23d9-4742-96b2-6edce6c4424e&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/portGroupList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacSessionData type=&quot;Ixia.Aptixia.StackManager.MacSessionData&quot; objectid=&quot;7869d347-cce4-4cd3-9eed-88a3914ae956&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;duplicateCheckingScope type=&quot;Ixia.Aptixia.StackManager.MacSessionDataSkeleton+eMacValidationOptions&quot;&gt;2&lt;/duplicateCheckingScope&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpSessionData type=&quot;Ixia.Aptixia.StackManager.IpSessionData&quot; objectid=&quot;93416b84-eb4a-4637-ab56-4a4de6250c3b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;duplicateCheckingScope type=&quot;Ixia.Aptixia.StackManager.IpSessionDataSkeleton+eIpValidationOptions&quot;&gt;2&lt;/duplicateCheckingScope&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;gatewayArpRequestRate type=&quot;Int&quot;&gt;300&lt;/gatewayArpRequestRate&gt;&#13;&#10; &lt;maxOutstandingGatewayArpRequests type=&quot;Int&quot;&gt;300&lt;/maxOutstandingGatewayArpRequests&gt;&#13;&#10; &lt;ignoreUnresolvedIPs type=&quot;Bool&quot;&gt;0&lt;/ignoreUnresolvedIPs&gt;&#13;&#10; &lt;sendAllRequests type=&quot;Bool&quot;&gt;0&lt;/sendAllRequests&gt;&#13;&#10; &lt;individualARPTimeOut type=&quot;Int&quot;&gt;500&lt;/individualARPTimeOut&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecSessionData type=&quot;Ixia.Aptixia.StackManager.IPSecSessionData&quot; objectid=&quot;8611fd36-7f8c-48bc-ac46-f6e2f0816cb5&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;ipsecTunnelSetup type=&quot;Ixia.Aptixia.StackManager.IPSecTunnelSetup&quot; objectid=&quot;e08e1671-e189-4cba-8894-5dda9b24701a&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;tunnelSetupTimeout type=&quot;Int&quot;&gt;30&lt;/tunnelSetupTimeout&gt;&#13;&#10; &lt;tunnelRetransmissionTimeout type=&quot;Int&quot;&gt;30&lt;/tunnelRetransmissionTimeout&gt;&#13;&#10; &lt;numRetries type=&quot;Int&quot;&gt;0&lt;/numRetries&gt;&#13;&#10; &lt;retryInterval type=&quot;Int&quot;&gt;10&lt;/retryInterval&gt;&#13;&#10; &lt;retryDelay type=&quot;Int&quot;&gt;10&lt;/retryDelay&gt;&#13;&#10; &lt;testType type=&quot;String&quot;&gt;P2D&lt;/testType&gt;&#13;&#10; &lt;logLevel type=&quot;String&quot;&gt;3&lt;/logLevel&gt;&#13;&#10; &lt;sendCiscoVid type=&quot;Bool&quot;&gt;0&lt;/sendCiscoVid&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;enableRekey type=&quot;Bool&quot;&gt;1&lt;/enableRekey&gt;&#13;&#10; &lt;rekeyRetries type=&quot;Int&quot;&gt;3&lt;/rekeyRetries&gt;&#13;&#10; &lt;rekeyFuzzPercentage type=&quot;Int&quot;&gt;0&lt;/rekeyFuzzPercentage&gt;&#13;&#10; &lt;rekeyMargin type=&quot;Int&quot;&gt;10&lt;/rekeyMargin&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;7&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/ipsecTunnelSetup&gt;&#13;&#10; &lt;ipsecCertificates type=&quot;Ixia.Aptixia.StackManager.IPSecCertificates&quot; objectid=&quot;b53c8c74-6c81-4e4a-84cb-5beb05b38343&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;uniqueCert type=&quot;Bool&quot;&gt;0&lt;/uniqueCert&gt;&#13;&#10; &lt;certSource type=&quot;String&quot;&gt;kNewCert&lt;/certSource&gt;&#13;&#10; &lt;caURL type=&quot;String&quot; /&gt;&#13;&#10; &lt;caDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;certSubjectDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;certSubjectAltDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;remoteIkeId type=&quot;String&quot; /&gt;&#13;&#10; &lt;bitSize type=&quot;String&quot;&gt;k512&lt;/bitSize&gt;&#13;&#10; &lt;saveCert type=&quot;Bool&quot;&gt;1&lt;/saveCert&gt;&#13;&#10; &lt;cacheCertFolder type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts&lt;/cacheCertFolder&gt;&#13;&#10; &lt;certParentFolder type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts&lt;/certParentFolder&gt;&#13;&#10; &lt;certNumber type=&quot;String&quot; /&gt;&#13;&#10; &lt;caCertNumber type=&quot;String&quot; /&gt;&#13;&#10; &lt;earlyExpDate type=&quot;String&quot; /&gt;&#13;&#10; &lt;lateExpDate type=&quot;String&quot; /&gt;&#13;&#10; &lt;usePerRangeCertNameExp type=&quot;Bool&quot;&gt;0&lt;/usePerRangeCertNameExp&gt;&#13;&#10; &lt;checkCrl type=&quot;Bool&quot;&gt;0&lt;/checkCrl&gt;&#13;&#10; &lt;crlOverrideEnable type=&quot;Bool&quot;&gt;0&lt;/crlOverrideEnable&gt;&#13;&#10; &lt;crlOverrideUrl type=&quot;String&quot; /&gt;&#13;&#10; &lt;checkOcsp type=&quot;Bool&quot;&gt;0&lt;/checkOcsp&gt;&#13;&#10; &lt;ocspOverrideEnable type=&quot;Bool&quot;&gt;0&lt;/ocspOverrideEnable&gt;&#13;&#10; &lt;ocspOverrideUrl type=&quot;String&quot; /&gt;&#13;&#10; &lt;unknownIsRevoked type=&quot;Bool&quot;&gt;0&lt;/unknownIsRevoked&gt;&#13;&#10; &lt;certProto type=&quot;String&quot;&gt;kSCEP&lt;/certProto&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;7&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/ipsecCertificates&gt;&#13;&#10; &lt;ipsecCertManager type=&quot;Ixia.Aptixia.StackManager.IPSecCertManager&quot; objectid=&quot;21591e4a-9e87-48e6-8679-68685c5c8383&quot; version=&quot;6.70.0&quot;&gt;&#13;&#10; &lt;caURL type=&quot;String&quot; /&gt;&#13;&#10; &lt;caDN type=&quot;String&quot;&gt;CN=RootCA,C=RO,L=Bucharest,O=Ixia,OU=IxLoad,IP:201.121.87.2,email:ixia@ixiacom.com&lt;/caDN&gt;&#13;&#10; &lt;certSubjectDN type=&quot;String&quot;&gt;CN=IxiaVPN,C=RO,L=Bucharest,O=Ixia&lt;/certSubjectDN&gt;&#13;&#10; &lt;keyGenAlgo type=&quot;String&quot;&gt;kRSA_512&lt;/keyGenAlgo&gt;&#13;&#10; &lt;cacheCertFolder type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts&lt;/cacheCertFolder&gt;&#13;&#10; &lt;caKeyFile type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\ca-priv.key&lt;/caKeyFile&gt;&#13;&#10; &lt;caCrtFile type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\ca-cert.crt&lt;/caCrtFile&gt;&#13;&#10; &lt;certNumber type=&quot;Int&quot;&gt;1&lt;/certNumber&gt;&#13;&#10; &lt;certProto type=&quot;String&quot;&gt;kSCEP&lt;/certProto&gt;&#13;&#10; &lt;createRootCA type=&quot;Bool&quot;&gt;0&lt;/createRootCA&gt;&#13;&#10; &lt;uniqueCert type=&quot;Bool&quot;&gt;0&lt;/uniqueCert&gt;&#13;&#10; &lt;descFilePath type=&quot;String&quot;&gt;C:\Program Files (x86)\Ixia\CachedCerts\sample.desc&lt;/descFilePath&gt;&#13;&#10; &lt;useDescFile type=&quot;Bool&quot;&gt;0&lt;/useDescFile&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;6&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/ipsecCertManager&gt;&#13;&#10; &lt;eapSimTuples type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;eapAkaTuples type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;negotiationStartDelay type=&quot;Int&quot;&gt;0&lt;/negotiationStartDelay&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;burstInitiation type=&quot;Bool&quot;&gt;0&lt;/burstInitiation&gt;&#13;&#10; &lt;parallelInitiation type=&quot;Bool&quot;&gt;0&lt;/parallelInitiation&gt;&#13;&#10; &lt;enableWildcardTsi type=&quot;Bool&quot;&gt;0&lt;/enableWildcardTsi&gt;&#13;&#10; &lt;enableWildcardTsr type=&quot;Bool&quot;&gt;0&lt;/enableWildcardTsr&gt;&#13;&#10; &lt;enablePlutoWildcardTsi type=&quot;Bool&quot;&gt;0&lt;/enablePlutoWildcardTsi&gt;&#13;&#10; &lt;enablePlutoModeCfgWildcardTsr type=&quot;Bool&quot;&gt;1&lt;/enablePlutoModeCfgWildcardTsr&gt;&#13;&#10; &lt;enablePlutoS2SWildcardTsr type=&quot;Bool&quot;&gt;0&lt;/enablePlutoS2SWildcardTsr&gt;&#13;&#10; &lt;payloadAttrTypes type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;3&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecSessionData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;statViewManager type=&quot;Ixia.Aptixia.StackManager.StatViewManager&quot; objectid=&quot;32b6a125-39ad-4da3-9710-e09cc94bf306&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enableStats type=&quot;Bool&quot;&gt;1&lt;/enableStats&gt;&#13;&#10; &lt;enableOverviewStats type=&quot;Bool&quot;&gt;1&lt;/enableOverviewStats&gt;&#13;&#10; &lt;enablePerSessionStats type=&quot;Bool&quot;&gt;1&lt;/enablePerSessionStats&gt;&#13;&#10; &lt;/statViewManager&gt;&#13;&#10; &lt;waitForLinkUp type=&quot;Bool&quot;&gt;0&lt;/waitForLinkUp&gt;&#13;&#10; &lt;overloadProtection type=&quot;Bool&quot;&gt;1&lt;/overloadProtection&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.SMSession&gt;&#13;&#10;&lt;/rpf&gt;</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">&lt;None&gt;</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">&lt;</afterStr>
- <afterOccur type="str">1</afterOccur>
- <endBefore type="bool">False</endBefore>
- <endStr type="str">&gt;</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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</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">&lt;Default&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;</afterStr>
- <afterOccur type="str">1</afterOccur>
- <endBefore type="bool">False</endBefore>
- <endStr type="str">&gt;</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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</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">&lt;Default&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;</afterStr>
- <afterOccur type="str">1</afterOccur>
- <endBefore type="bool">False</endBefore>
- <endStr type="str">&gt;</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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</_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">&lt;None&gt;</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">&lt;Default&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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">&lt;None&gt;</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 &lt;data&gt;&#10;M&gt;)S=G6MOXSBRAO^*D(,9S&amp; GMJB[,ND,TD[2$W1NB-T]N]A&gt;--0VDVC;EKR2&#10;MG,L&gt;G/]^*-E.1+)DUTQ$&quot;LB'[C@65:5Z0Y;X4)?:_^UQ-C7N:9;':?)NA_3,&#10;MG=\.]H=%5'R.Z0/-7C9Y/&lt;_LF3TKM'98 YJ7WY[%&gt;6%\I$_O=J)Y$3_&amp;42^_&#10;M[\W+/?*&quot;)F/:J[7[(XOF;!/;&gt;7!Y,3J^&amp;!G]@_VKZ^,A^W@X.KV\$'__&gt;GQT&#10;M.CI\?W9&lt;;AA&lt;GK\_O3@^&gt;G:=/W_&quot;'(#D_&amp;#_)*/_6; V3\9]-%W0=SO63N4H&#10;MOS]+;V_CY';]_2A;T&amp;K3*)[1X5,R?D_OHOLXS=8-S.&gt;M&gt;1'-YE&lt;9'&lt;?5@:VV&#10;MV]7VX]N,'4NIZNAI3M?;2+7MDJD\3:/)5986=%S4]GUV_G)&lt;O\&gt;3&quot;4U*0_FZ&#10;MU4DTS9?-CI/HVY0&gt;144T+-*,R@VN7L2I'X&lt;#[;W1$SN@RT4Q7Q3/0IXOID4\&#10;MGXJQ58V.AEN:G4&gt;/9:_+V?$-%GF1SCZP/]G=&lt;QMO[?,DGM*KJ'C&gt;4GU_.*59&#10;MD:]_&amp;JQ+)_G&gt;8QZ_V[DKBOE&gt;O__P\-![L'MI=MNW3)/T_WY^-AS?T5FT&amp;R?L&#10;MC\;$V'G&gt;:[)]K\II?^WUB-Y$+*9*)_ZWJAF_&gt;9&quot;EJUZ04&lt;I:,ZU'I&gt;@'^X_Y&#10;M7EY9-V)V&quot;!?TH?H[T&amp;)U9&amp;6HZT/$'.&amp;R[2R?,&quot;OO=A99LK*&gt;[\[B,3N(]*;8&#10;M':&gt;S/=9N=]EJISH&amp;.J4SFA1&amp;$LTH?QC+5GNG^&gt;J;=SM%U3M7WY]'&lt;?(&lt;3MES&#10;M*:UB/DPF'[)T,&lt;^?6YZEXZALLG3(#H+UAL&gt;R-RY_OTOC,35F&lt;7(Y'B^RO!I@&#10;ML^AQ_=LB^98ND@F=0,&lt;+&gt; 6=Y,O.2 $3IT&lt;[1L':O=MAFZ9I&lt;KLC'$L?V.DJ&#10;MRM@O?VG7&quot;_9_;;&gt;\R&amp;+&lt;CF4P?VG'P1T=?R]'V\L?K_K#59:&amp;3RP[S'I_Q,DD&#10;M?&lt;A[)VDVRWLO&gt;_QB0 U^,3ZOSA-.KSQ+F+\8 ];G%QE]E]!%D4737XRKQ;=I&#10;M/&amp;;)&gt;I1^I\F[;[X?N6/7(Z'M4#,(:Y%$R=,R-HSNQ=U?TN RF[#SP&lt;N&gt;&lt;5)@&#10;M=EMFR$EMQV]I.J51 NS&lt;Y_I97^R%_1?CJZU5Q\&gt;T7([D@_U)?'-SF^TM?T2S&#10;MOS+F5_LL36S;9^UH]YZP8764CA?E,1VO#TT&gt;?,;J&quot;,N,)F\ES]TO2Q^J/T@E&#10;MW6J?NR@?W$7)+66&quot;LBS-&lt;FTUY$^/#LS]/OM_?SWF#G;)?O_YE_UR/!U4CO;[&#10;MU&gt;?]2L7*Y7Y_J&gt;A+?SZP]ONUW_;+#G70+^VQG_O5057VEY]69\C)09GY]OOK&#10;MWYA9*;@_+X&lt;%R$$0&lt;A!!#E-28W4*P@E&quot; $'6!@1A3&quot;VZV( N%D(72]!%[B57&#10;M:588@ZM/1ADKFQ7%8UZB\CC^K$*@S;IHKI[&gt;Y &quot;JV0C5;$$U2U+M!^,HSK\;&#10;MGXIX&amp;O\W*F&gt;KG&amp;AEW']6-,AD73-+BV0N()F#D,S9*MDH+:*I&lt;4YG:?;TT\?W&#10;M/[]:,-F@_G'I 7*Y&quot;+G&lt;K7(Q5J!MJB79JXNE9SCZ@%@&gt;0BQOJUAEKCEC\&amp;@&lt;&#10;MWM\:/Q'C/$X6!7V]:(UVZ^+96L0+ /%\A'C^GQ3/7069MZU&gt;W7!=/D&gt;+?&quot;$@&#10;M7X&quot;0+_BS?4^9?J1)0%&gt;+@,0$% P1&quot;H;;3Z;K0%]_#GVQ5%?(TZ,0-)&lt;GF,D\&#10;M$6?S\C3MS-JUJ^E4;MRDF3&amp;8QB60E1.MUT_7-MKN8-I&amp;0 I 88#( 40&amp;@;,X&#10;M^5Y%2U_=W&gt;JF],\]&quot; 0%!$,%1,(&quot;4&quot;9J#.&gt;4OGY4UDWIGW40B ((!@.(R &amp; &#10;M3&quot;&lt;9^S\WANR[%J9H-5OZI_X$FOL3S.2?B+/_S4(9UVT,/MF@_DD9@&gt;;_! , &#10;M1&quot;0 0++/T32&gt;&amp;*LXK^F8QO&lt;MC,8&amp;J_JG9 3B 8(! B(2 5:\=GK&gt;)M,=3,P@&#10;M,B 8-&quot; B&amp;P ROG\JVDIO=5,=S,X@ B 8!&quot; B T RQ44M%1D_??PV;P$ &amp;JS6&#10;MQ?/U+,M&quot;DW^&quot;F?T3&lt;?K?V,=:2W&quot;BN;I&lt;@1ZY(!*P,&quot;1@2230T-&gt;XM--J?X,M&#10;MUT4,]8@(48&quot;%H0 +00&amp;C+$KR65P8A]F&lt;A?R?!&lt;U?G^%@H]R45P\:6.#U M0%&#10;M P0:&quot;&amp;'.IT]M*U&gt;9Y'33=/D)8@4+PPH6@A56(ZO5+@?:Y)33 P\6! \6!AXL&#10;M!#SP4;;1X0&quot;+G&amp;IZ^,&amp;&quot;^,'&quot;\(,E\&lt;.V):,AS&gt;YIIF;)B+?=P9*1!;&amp;$A6$)&#10;M2[JZX+[=)2,+8@4+PPJ6=!T!E.EM+!E9$&quot;M8&amp;%:PI.L%LDQO:,G(AKC PG&quot;!&#10;M)5T6V&quot;C4VUDRLB$VL#%L8(ML $CVQI&gt;,;(@); P3V&quot;(38,5[BTM&amp;-H0'-@8/&#10;M;!$/ !G?S)*1#=X_A+J!2+J#&quot;)#I;2\9V1 0V!@@L*5[B9KZV!M:,K(A$K Q&#10;M)&amp;!+]Q(U]+6WOV1D0Q1@8RC 1E# VUXRLB$TL#%H8&quot;/0X.TN&amp;=D0*]@85K 1&#10;MK/&quot;6EXP&lt;&quot;!YL##S8&quot;'AXJTM&amp;#L0/#H8?'.1=1J,[YNCV;KXHEBL\[2P6R5:[&#10;MN&quot;$&lt;X@&lt;'PP^.R ^.O$JYNG%*S&lt;1NLW']2TD.Q! .AB$&lt;D2&amp;V2*EDWK+=@?YE&#10;M)P?B#0?#&amp;X[(&amp;X&quot;DJS5:-;USLW']&quot;U,.^!P#ZD$&amp;D3ZV2*FD=VYWH'_ARH$(&#10;MQ&lt;$0BK/]6L7G]/1J&amp;,]?_W#6RE G#VDY$'XX&amp;/QP1/QP (9;Y$_&amp;[^DB,P;1&#10;MM'SN)&lt;H76?7486[\M K[YU&gt;?J]?Z(;UQW=#4)#-$*@Z&amp;5!R15$K=19E_'QR^&#10;M?KEOK6)EK(.&gt;&quot;$&amp;)@X$21X026*)!FQ(-NCC9NA!].!CZ&lt;$3Z 9KN6M&quot;IRI&amp;&#10;M)F2:'X::!(1 Q,6 B&quot;N&quot;2*DH^+3@.M;6&gt;IMH5O_0=&quot;$$&lt;3$(XDH((LMV.&quot;Y*&#10;M1&amp;U=-\EN!P,6 @X7 QRN!!RR&lt;,/%&gt;$SS_&amp;:AH-.!MCMXM!?&quot;&quot;Q&gt;#%ZZ$%[* &#10;M?T194KXQJ'7U9,/ZY[XNA!,N!B=&lt;&quot;2=DZ4ZBF!UJ^\I)=O5?L'7!!Z113TB+&#10;MT !ENV]IN8.&quot;=&quot;&lt;9UG^1UH5HPL70A(N@B;,TG:N8G4AV^:F)IDP'$8*+(017&#10;M) 17GO[*Z=RHHE9XOE@[Z&amp;&quot;Z I&amp;$BR$)5R0)0$H^0[4L(VQ&lt;_\3%@TC#Q9&quot;&amp;&#10;M*Y(&amp;(*%P&gt;FQ9PP;K^B&lt;O'D0;'H8V/)$V !&amp;%?-^RB W6]4]C/(@]/ Q[&gt;&quot;)[&#10;M &quot;)R;-6RA*!M_=,9#V(0#\,@GL@@@(&quot;G24&amp;S*CCC:)%5KP R?CJ\O_W9^.&lt;L&#10;M_U=K6FYSHW^JXT%DXF'(Q)/(!%B+B:9J%F)$N_Q41U./A,C$PY&quot;))Y))J:68&#10;M%XN&quot;SN95[BJ#;2\CBG8[&gt;',31&quot;8&gt;ADP\D4P X08I2U3C]H63['8PG0%?XX1Z&#10;MCY/()8!PJTF;JH[79+Z#&quot;0W$*!Z&amp;43R140 9GR\:MBN?:+:#*0S$(QZ&amp;1SR1&#10;M1Z!\E^0/-&amp;L_W0EF]4]&lt;?(A!/ R#&gt;&quot;*#- ]:19VNP;K^:8H/,8B/81!?9!! &#10;MQ.-D%9IQFL1%S 1IX&lt;&amp;-E82@;?TWU/L0?_@8_O!%_M@H8'L/ODCZP?&gt;(Z[FE&#10;MWH?HP\?0AR_2QT;Y!M6+E]7TOYIM_3?9^Q!G^!C.\$7. 2L;DB^H5G[YP_ &#10;MLOZ;ZWV(-'P,:?@(TJCN-VE7M;K)#FZH]R' \#&amp; X2, 8WU!MMUY&quot;F&gt;T@YOI&#10;M?8@M? Q;^ BVN*;_5L%DHMD.;J7WP;?#HEX/BX*)29RI44XTW,$-]3Y$%#Z&amp;&#10;M*'P$42S/&gt;@]Q&lt;6&lt;&lt;+HH[MBD&gt;+Y?&lt;RD&lt;O6/3MG60QKCA]]:!' *&amp;'CT$/'X$&gt;&#10;MRZ#+XD'&amp;IZ.KEK5\,&lt;OIIH&lt;V H@V @QM! C:J 4X&amp;BC1K3++Z:8',@((,@(,&#10;M9 0(R*@'&gt;#94HEMIEM--#UT$$%T$&amp;+H($'11&quot;_ \?F0)OYK3SM/L]&lt;^S 1I*&#10;M+C@]]&lt;!&amp; ,%&amp;@(&amp;- 'E1HWHB0-65#=DX?WE#4Q*$H&quot;/ 0$&lt;@0D&gt;P]?*&amp;T&lt;_I&#10;M6-4UCI5Q_1&lt;Z HA# @R'!&quot;*' !(*%R3:E1 VKO^21P!A28#!DD#$$D!&quot;?F&amp;S&#10;M705!V_HO=@00GP08/@E$/H&amp;&amp;,;&gt;\WO(HAFSKO^P1@/4K4 4L1$@!!)36E]K5&#10;ML,F\_LL@(&lt;0B 89% I%% !E?%IS:U4^RJ__21PC!2(B!D5&quot;$$3 #_EO9.02T&#10;MK?_21PA128BADE&quot;D$E! ?B&amp;E;0E!Z_HO@(00HH081 E%1(&amp;F,EO73UJ&gt;W6#]&#10;MZ;]0$D+L$F+8)139I5'H]&gt;**&quot;E$%V_HOEH00MX08;@D1W,*OLB@3\,5V!Y=/&#10;M0@A;0@RVA!ALX=9;U&quot;GX;+N#BRDA1&quot;TAAEI&quot;!+4TK[8H4Q/VT\'EEA#&quot;F1&quot;#&#10;M,Z'T!'K#TLXHGJE;VI&amp;,\TL[FF9$$-*$&amp;*0)1:0I585$'-)B,:^B57$?]287&#10;M^I=YB D6Z$-5Z!/9!M!S%$V_*U,2-JY_G8&gt;8&lt; D_7 T_$70 %=?WP2A3LMF!&#10;M_D4?8H)U_$Q4(3]3I!ZH3RX?&quot;BG#5?F\Q#8W^E&gt;#B F6_C-1M?],Z6GXIM&gt;K&#10;M*GBKC&amp;B7/_'HH4AB@A4!351)0%.N\R$7-%V&amp;N7Y!99LWT@&amp;6NSC5@)4&quot;352I&#10;M0%,N]]$D8.NW&lt;6YZS:^N,PQ8,=!$E0PTI4?BH==&gt;WL9YL&lt;Q2*D9PHWU^).M9&#10;MIB F6$+01-40-.4B@K*&lt;+Q?QN, 57&quot;04['&lt;QJL%&quot;@B:JDJ IEQ*4Q:P]UZY&amp;&#10;MS68'78QTL.&quot;@B:HX:,HE!X'R&amp;.OG(E1(&quot;1OO8!()UAVOQ$7(*!&lt;?W#3$CZCJ&#10;M02YYZ&amp;#N&quot;)&lt;IQ]4IEPN5;Q[FJA3=Y$+_54724+ &lt;5[%&lt;+E;8.-15R=ED7O]U&#10;M1@(7-&lt;=5-9?*FF^9'RF[?VJS$WZFI.=Z!(&amp;KH./*H,MUT(D\96^8R:BZIPIR&#10;MTL&amp;&lt;&quot;:Z9CBN:+E=-!V1MFM*TJ^L6+QW,GN#*ZKC2ZG)M]8W]54A[JGHL[*:+&#10;M&amp;14(3;C&quot;ZW+E]&lt;U]5JFV6_UT,;L&quot;(0I7CEVJQ[[M_%5=QU%\^A)]&lt;)IJNA9,&#10;MX.+MN.KM&lt;OEV(B\E2R&amp;K6$C&gt;[*2#LQ=&lt;UAU7UUTN[ [(R@]+9&lt;)N&lt;]/!^0LL&#10;M 4]0-&gt;&quot;)5 0&gt;R /#TROCG&quot;6_Z%;)#+;)/#_Z=6D)XA6J%#R1:\%;0#T'%NVJ&#10;M$E)+A0OK.@J6NQCG(%2AZL$3N2#\-@'9MKS%17O0=A&lt;C&amp;B0H5'%X(E&gt;'WR;B&#10;M&gt;52,[U2I^&amp;R\@]DG6&quot;B&gt;H&quot;K%$[E4?*.,^9Q- ]LJ0\J+R)ON8(X)5HTGJ++Q&#10;M1*X;#TCX$F/+8UDVW,%J'5@KGJ&quot;*Q1.I6OSV'JAF)$O6.UBK ZO)$U0Y&gt;2+5&#10;MDX&gt;$/+WX?#HZ5G1JAHWK?S* @-7F&quot;:K&lt;/)'JS6-D;'E0-YG7_WP &gt;O1$U1!&#10;M&gt;B)5I,=(V?;@;K2O_QD E:J)ZA2]42J58\1\YH6JQM;%&quot;K*.]'_9 !:]@3&#10;M5!%[(E6QAV0]''Q4E#(!RQT\&amp;4# \O4$5;^&gt;2 7LMRK8&lt;K8$;7?P= !J]L3&#10;M5'E[(M6WWZIBVXD2-M[!LP $+'1/4)7NB53J?JN.2G+D!@\=O)&quot;)V&quot;#?V&quot;B^&#10;ML3%\\_X?JB:5@.4.7KE$;!!Q;!3BV!C$X&gt;)L.4.&quot;MCMX 1.Q0;ZQ47QC8_B&amp;&#10;MB[3M# D;[^&quot;%3,0&amp; &lt;=&amp; 8Z- 1PNU*J\01)-IT]J)87\=/#:)N* S&amp;.CF,?&amp;&#10;M, \7M9+SSP8/';RXB3@@^#@H\'$PX$,&gt;'U4M44*F.0TU48X#4HZ#HAP'0SE\&#10;MH&quot;V?@F#CW&amp;JY)M9Q0-9Q4*SC8%B'#[7MC-E@G5-2$^\X(.\X*-YQ,+S#QZHD&#10;M46YRP6FJB7T&lt;D'T&lt;%/LX&amp;/:QU&amp;5*R#2GH2;:&lt;4#:&lt;5&quot;TXV!HQU*9*6'CG(Z:&#10;MF,&lt;!F&lt;=!,8^#81Y+::9LL,XIJ8E[')!['!3W.!CNL=1GRDTN.$TU,9 #,I&quot;#&#10;M8B 'PT&quot;VNDP)F&gt;8TU$0Z+D@Z#HIT' SIV&quot;HS)6R&lt;TU$3W[@@W[@HOG$Q?&amp;,K&#10;MS90-UCDE-5&amp;.&quot;U*.BZ(&lt;%T,YMOI,N&lt;D%_ZB*)DU!XG%1Q.-BB,=1ERDAT_PM&#10;MDYHT!%G'1;&amp;.BV$=1V6FA(US.FKB&amp;Q?D&amp;Q?%-RZ&amp;;QREF;+!.J&gt;D)LIQ0&lt;IQ&#10;M493C8BC'49\I-[G@--5$/&quot;Y(/&quot;Z*&gt;%P,\;CJ,B5DFM-0$^NX(.NX*-9Q,:SC&#10;MJLR4L'%.1TU\XX)\XZ+XQL7PC:LT4S98YY341#D&gt;2#DNBG)&lt;#.6XZC/E)A&gt;&lt;&#10;MIIJ(QP.)QT,1CX&lt;A'D]=IH1,&lt;QIJ8AT/9!T/Q3H&gt;AG4\E9D2-L[=?:Z);SR0&#10;M;SP4WW@8OO&amp;49LH&amp;ZYR2FBC' RG'0U&amp;.AZ$&lt;3WVFW.2&quot;TU03\7@@\7@HXO$P&#10;MQ#,XO!@&lt;GQEJ;K^&quot;C7,Z:N(=#^0=#\4['H9WQ%!;SI=-YCDM-7&amp;.!W*.A^(&lt;&#10;M#\,Y8K!MY\Q&amp;^YR:FHC' XG'0Q&amp;/AR$&gt;,5HE&gt;7.S$TY7303D@03DH0C(PQ#0&#10;MY=7H]/)BJ&quot;AU-ECGE-1$0#Y(0!Z*@#P, 4FQMIP\&amp;^US:FIB'Q]D'Q_%/CZ&amp;&#10;M?:1HVTZ?S0XX/35QD ]RD(_B(!_#05*X2A+H%B_&lt;XZ2:R,@'R&lt;A'D9&amp;/(:/K&#10;MXP^GP]'QM:(4VF2&gt;TU(3&amp;_D@&amp;_DH-O(Q;&quot;0'V_:SXHT..#TU&lt;9$/&lt;I&amp;/XB(?&#10;MPT5RN&amp;VGT0T&gt;.$4U$9(/$I*/(B0?]18#*5XEB72;&amp;TY;3&lt;3D@\3DHXC)QQ#3&#10;MQ&gt;7H].0?BO(H;)S341,K^2 K^2A6\C&amp;L)(;:&lt;@YM,L]IJ8F/?)&quot;/?!0?^1@^&#10;M$H-M.W\VVN?4U,1( &lt;A(/HJ1? PCB=$JR9V;G7&quot;Z:J*E *2E $5+ 8:6AI_&gt;&#10;M#P?7I^]5/8'::)]34Q,K!2 K!2A6&quot;E!O;I.C;3F%;O# O2M&amp;$R,%(&quot;,%*$8*&#10;M4*]RD^-M_0U&amp;&amp;UQPFFIBI0!DI0#%2@'JS6YRP$K2Z58_G+J:R&quot;D R2E D5. &#10;M(Z&lt;3A4@/V.94U$1+ 4A+ 8J6 APMG2B%&gt;= ZIZ0F-@I -@I0;!1@V$B(M7V,&#10;MA\US6FKBHP#DHP#%1P&amp;&amp;CX1@%0'\!A^&lt;JII(*0!)*4&quot;14H AI?/CX?#P@ZH9&#10;M:(-U3DE-E!2&quot;E!2@*&quot;G 4)(4:\MYL]$^IZ8F-@I!-@I1;!1BV$B*MNW&lt;V&gt;R &#10;MTU,3'84@'84H.@HQ=&quot;2%JR1_;O'&quot;O092$R6%(&quot;6%*$H*,91T&gt;G%RJ2A]0J8Y&#10;M#35140A248BBHA!#17R@+2=.V#BGHR;^&quot;4'^&quot;5'\$V+XAP^U_3&gt;2@M8Y)34Q&#10;M4 @R4(ABH!##0'RLBEY'VNR&quot;TU03#84@#84H&amp;@HQ-/3IZNA0V3N&lt;8&gt;.&lt;CII(&#10;M* 1)*$214(@A(3'4EO-EDWE.2TW\$X+\$Z+X)\3PCQALVSFST3ZGIAX&amp;LDR0&#10;M@4(4 X48!A*C59(W-SOA=-5#0Y8)T5&quot;E]E9=62N$KE?7ZM[D#-KF5-3#0)8)&#10;M,5&quot;E+4)%# ,)D;:&lt;-ANLUY4,]#&quot;/94+,4^F+4!+#/$*L;2?-)O.&lt;EGK8QS(A&#10;M]JD41FB)81\A6&quot;4I&lt;Z,/3E4])&amp;29$ E56B-4Q9#0IXN/%Y=_7*B;)#79Y]34&#10;M0T.6&quot;=%0I3%&quot;30P-2=&amp;V/DUJ=,#IJ8&gt;$+!,BH4IEA)XH$GH.5]$SKLT..#WU&#10;M$)%E0D14J8S0$T5$4KCJ.NC&amp;YUT#/5QDF1 753HC%,5PT;*TU/HTP78VSO/;&#10;M]LK,-YGGM-1$102BHDIAA)88*BJ#/;U-TJPJ5KX*.L_+ZL2M&quot;MKH@U-5$Q,1&#10;MD(D(BHD(ZNZY&gt;AG#RVS.;+7=/T7CG(Z:J(B 5$105$3P%4_764V-D)+UNI*A&#10;M)BHB(!41%!41D8J@.KRT&amp;F\LW)N,YG&gt;4%[$\F+\LHFR9?Y6&lt;IED[ 5F(H%B(&#10;MB&quot;QD &gt;7B3Z*8':ZQ6&lt;G7=,=F!W5!=75($(((&quot;H*(&quot;$&amp;0G,/%&gt;,PBO5E,%4JZ&#10;MV4E=5DW$3D :(B@:(B(-0;)&gt;TS&amp;-[Y7VTTTNZI+J&amp;O@@$!$4$!$1B&quot;!)#]D&lt;&#10;M&lt;#8OE&amp;JZT0&gt;73S6)&quot;E(105$1$:D(.!\=9UF:J:@(+QOFST:Z] ,9B* 8B(@,&#10;M5&quot;DJ&quot;#C*XMM;FAG+&gt;%OKAZ+9#LX\%H@\!(4\1$0&gt;2+KKT57;LM5-=G!6L4&quot;&gt;&#10;ML5 \8XD\ TFV+B+5MFZ2W0[.'Q8(,18*8BP18L&quot;A&amp;L]HNBA:'ZJ&quot;V0[.$A9(&#10;M+1:*6BR16N LQXALGF;MBR&lt;9YM[1H4D^$%DL%+)8,K+(\I6 .XBF4^-DFCZT&#10;M+2%LG'M\3Y.,(*I8*%2Q9%2!9:R6J%L_W0*6N3M\-0D(0HF%@A)+AA)8P.%1&#10;MZV==T2QW8X FZ4#XL%#P8&lt;GPT2S=ARG[WABDR20N6E^&lt;A1UP*XJ:Y 2QPT)A&#10;MAR5B1Y.&lt;QX]%%HT+XW.4Q&gt;71YRKZ9;,3;GE1DZP@C5@H&amp;K$P-%*M\&quot;N:(X*V&#10;MN4FV)C&quot;Q03&quot;Q4&amp;!BB6 &quot;,/$1G49/*IA8-LPSL:;IC@U2BHVB%%NBE%)1\6Z5&#10;M-&quot;^,HYAUDRIBXZ?#^]N?C7_.\G^U=[/*!A&lt;=L+(-LHN-8A=;8A= TG,ZB:-5&#10;MK*._JU!T@X&lt;.2-H&amp;B&lt;9&amp;$8TM$0U&quot;T//H4;&amp;@-0\=T+4-,HZ-8AQ;8AR,H'&amp;B&#10;M6M 7#QTPMPW2CHVB'5NBG2V&quot;7BL?\M?-0U[7:0FD'QM%/[9$/PA!U0[YZ^8A&#10;MKXG';9&quot;);!03V1(38015.N2OFX&gt;\)CZW02JR451D2U34,'':O8K'WQ=SM5.G&#10;M9B&lt;=L+L-4I&amp;-HB);HB*&lt;K.V/_&lt;U..F!X!\0D&amp;X5)MG3]!BEKZQE@LY,.&amp;-X!&#10;MZ&lt;E!T9.#H:?/\82FAA9Q,:ZZ('P'Q&quot;D'A5,.!J&gt;: V\]+V!&lt;&lt;1IK(BP')&quot;P'&#10;M15@.AK : V__E(9QQ6FL&quot;;H&lt;$+H&lt;%'0Y&amp;.A:!JX&gt;O;;ZX=351&amp; .2&amp; .BL &lt;&#10;M#($U1*TH12#7&quot;W2M$CH@CCDH'',P. 9'K2HY8)&gt;W-+&amp;9 [*9@V(S!\-F&lt;M1J&#10;M&quot;&amp;VK'TY=3:#F@*#FH$#-P8!:0]0:,L.&amp;906BB=&lt;&lt;D-&lt;&lt;%*\Y&amp;%Z#H]:1&amp;3:L&#10;M@A%-V.:&quot;V.:@L,T1L0VHMK7(BW1F5$XY(2OW@)(FH&amp;3=2+^3&quot;RXN2&amp;$NBL)&lt;&#10;MD&lt;*:5'JE/H(R?VU&gt;WS]*QXL9.[;C*2U_L&amp;]6$2Y_1+.R#=-A5%IAGP=9FN&gt;E&#10;ME=+:P?YU-(G3RIBP(6:VV#0XKDPVMAI,8^;T),UFBVDTI$41)[&gt;Y&lt;1]-%_3=&#10;MSO_^^#^/1[^R_PY__?$_B[3X]3/-RGNFE[_L+7^0GKO\\(O4N@QUU?:?+QO_&#10;M]?+Q_UX^[AA]]H&gt;@&gt;7&amp;]2,3C^'%:_/K;XVQJW&quot;_]OUM[-I&lt;?#)J,TPG;8[5A&#10;M4=SL$F_Y^;&lt;?;XM?:T?&amp;3*V\G&quot;8WZ9!F&lt;32-_QN5MV*\CVX-YB7)]Q[S&gt;&amp;7J&#10;MKBCF&gt;_W^P\-#[\'NI=EMWS)-TO_[^=EP?$=GT2[K&gt;T64C.GJ2-;[3Y#[+UOQ&#10;MQV@8Y5'.OA8K-5C'B\=763K/Q7;+EF4\94&lt;NMY:?2?EEO_XMO,^ =&gt;C;-'LJ&#10;M6WQ.XS%=)\[G_&gt;LM9!N#F]N3&gt;$K+,5 V&amp;.Q]^&lt;3&amp;8?XERM-LDGY9=^S\R]&gt;O&#10;MRP%3;KS,RD'[Y?+JXN2S]?4L2A*F_)?KXP]?!X=G9U^K[[]&gt;7A]&gt;?#C^&gt;A_&gt;&#10;M];+'F^IP!&amp;=P1#1;1[P\AN= 7C;(.QXM*IV,?N/FWQ]6'7]#F^&amp;V-N5A7'[[&#10;M-QT7\3W--[7Z/;Z]F[)_16.KJ](5BXIEM G[+[Z):5:V=.W0_T9#?]&gt;]\2&gt;[&#10;MCNW:N]]N'']WXMV8MN&gt;0\8T75IHT&amp;9!=L0Y8[UOL5]&lt;A;F6DMDG&gt;K^P*P].C&#10;M&lt;N-PE^RZNQ;9M4V7&gt;*YK.^XNL^'Y[)A,?]&lt;F%H/AT#'-7&gt;('KE?9KNT.'A,;&#10;M%&amp;7&amp;OTS*%I9)_%UFR3)'A.R9WIYM]P+'M&lt;+0_9MI[9GF^G&quot;YO1KLIO-YV&lt;)@&#10;M.6 OB:&gt;K&lt;5RF\M40;_B;+#/I&gt;32^BQ.ZUN5X&gt;'YXM'LXO+P^NMP]6W9DJ-T6&#10;M&lt;X&gt;324;S:OB3T.H1+^B1'B'6RV[$[)D]EZ7BEV]6#=U&gt;K=D-#&lt;R]/6+&gt;F'L.&#10;MI=_V?/-FCUB1_X,CM0EO[#W+GY ]SYUX&gt;TY@^S\05VP5F1[=8WV-[OG^-[(7&#10;M3NP??#[9]IL&quot;D4,^?;R@Q4.:?5^?9EBKH&amp;&gt;7D1%OF=2@)AL,7=,IC?)*X=/'&#10;MLS2:&amp;$PXTS@^Y(W5FFTP5LMS+!F79V:CS$BY\=-CX/W\Y?0QCKXLO7PICWI7&#10;M]-*&lt;NDX?KVEYCS3-:F'9/;^,W'975H F&lt;/KX=#X&lt;1],J&amp;F*N^K[PO;SC\+ZV&#10;M^&gt;,W=JHI=^.^!&lt;=+&amp;90\(JJ=,2&gt;PVHF.YN7&lt;_7)&gt;W139,&quot;;2Z93ESW**5C8X&#10;MHD7U).&gt;RF_';&amp;G&lt;^HU&amp;6T$EY\B_;W413]H&gt;O&amp;1&quot;V-]HI;\9&gt;SN% ,_SF1BLL&#10;M#Y&lt;M2X6JAE6:J9D1MV\RM'J@;9,ML4FSN2PMTG$ZK&gt;X'O(G&amp;%+8(MFHT&gt;ITN&#10;M&quot;GI=S=DA:\)FR,QL7F:/T7-W$:6'MC?URXW];=DO)T])V6L_TB?@3,PU^5Q.&#10;M5*5&amp;ST.O8;99MJ[FO?W!Y&lt;7H^&amp;+$\.+Z&gt;,@^');%.,LM]=^_'A^=C@[?GQV7&#10;M&amp;P:7Y^]/+XX9T%33[.JK_/XRF3Y5OY/RB[,X^4XGS]O[+_NLGR9_^92#V\_8&#10;M).%@O^K(1L+.5&gt;]V*FL[SS/Q';+#;U_.]':,=(EL#..BZM'@,WI/IPSAEO%6&#10;M&gt;QSL#Y/9W&amp;#ROMN)V-^!)=!&gt;?M^;K^&lt;F8]HK&amp;ZSF*N4D&gt;Z&gt;,&gt;Z54N6F0)C?Q&#10;M[2*K!*W30LXVCMG&amp;ZN^Q^OT^RI;'N#R/E_NOSNA1-2&gt;3S_03FH^SN.HAJXVU&#10;MZ3JSRDYI4W8^6T_YRK_VRE'=[X3&gt;;]FAUJ)?/_+7]HUJ]S+.\@&lt;;\^7?CO'I&#10;&amp;_P,I\+)D&#10; &#10;end&#10;</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
deleted file mode 100644
index a7bce95a0..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/files/Registration_only_LPS.tst
+++ /dev/null
Binary files differ
diff --git a/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst b/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst
deleted file mode 100644
index 783918861..000000000
--- a/functest/opnfv_tests/vnf/ims/ixia/files/SIPCall.tst
+++ /dev/null
Binary files differ
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